1 package org.unicode.cldr.tool; 2 3 import com.google.common.base.Joiner; 4 import com.ibm.icu.lang.CharSequences; 5 import java.util.HashSet; 6 import java.util.Map; 7 import java.util.Map.Entry; 8 import java.util.Set; 9 import java.util.TreeMap; 10 import java.util.TreeSet; 11 import org.unicode.cldr.util.ChainedMap; 12 import org.unicode.cldr.util.ChainedMap.M5; 13 import org.unicode.cldr.util.CldrUtility; 14 import org.unicode.cldr.util.Iso3166Data; 15 import org.unicode.cldr.util.Iso3166Data.Iso3166Status; 16 import org.unicode.cldr.util.StandardCodes; 17 import org.unicode.cldr.util.StandardCodes.LstrField; 18 import org.unicode.cldr.util.StandardCodes.LstrType; 19 import org.unicode.cldr.util.StringRange; 20 import org.unicode.cldr.util.StringRange.Adder; 21 import org.unicode.cldr.util.SupplementalDataInfo; 22 23 @SuppressWarnings("deprecation") 24 public class CompareIso3166_1Status { 25 26 private static final Joiner SPACE_JOINER = Joiner.on(" "); 27 28 public enum CldrStatus { 29 region, 30 macroregion, 31 deprecated, 32 privateUse, 33 unused, 34 } 35 main(String[] args)36 public static void main(String[] args) { 37 final Map<String, Iso3166Status> isoStatus = Iso3166Data.getIsoStatus(); 38 final Map<String, String> isoDescription = Iso3166Data.getIsoDescription(); 39 40 Map<String, Map<LstrField, String>> lstregRegions = 41 StandardCodes.getEnumLstreg().get(LstrType.region); 42 Map<String, Map<LstrField, String>> lstregRegionsRaw = 43 StandardCodes.getLstregEnumRaw().get(LstrType.region); 44 45 Set<String> seen = new HashSet<>(); 46 M5<CldrStatus, CldrStatus, Iso3166Status, String, Boolean> ordered = 47 ChainedMap.of( 48 new TreeMap<CldrStatus, Object>(), 49 new TreeMap<CldrStatus, Object>(), 50 new TreeMap<Iso3166Status, Object>(), 51 new TreeMap<String, Object>(), 52 Boolean.class); 53 54 Map<String, CldrStatus> cldrStatus = new TreeMap<>(); 55 Map<String, CldrStatus> bcp47Status = new TreeMap<>(); 56 for (Entry<String, Map<LstrField, String>> entry : lstregRegions.entrySet()) { 57 String regionCode = entry.getKey(); 58 final Map<LstrField, String> cldrData = entry.getValue(); 59 String description = setStatus(regionCode, cldrData, cldrStatus, true); 60 61 final Map<LstrField, String> bcp47Data = lstregRegionsRaw.get(regionCode); 62 setStatus(regionCode, bcp47Data, bcp47Status, false); 63 64 final Iso3166Status isoStatus2 = 65 CldrUtility.ifNull(isoStatus.get(regionCode), Iso3166Status.out_of_scope); 66 ordered.put( 67 cldrStatus.get(regionCode), 68 bcp47Status.get(regionCode), 69 isoStatus2, 70 regionCode, 71 Boolean.TRUE); 72 System.out.println( 73 regionCode 74 + "\t" 75 + cldrStatus.get(regionCode) 76 + "\t" 77 + bcp47Status.get(regionCode) 78 + "\t" 79 + isoStatus2 80 // + "\t" + description 81 + "\t" 82 + bcp47Data); 83 seen.add(regionCode); 84 } 85 86 for (Entry<String, Map<LstrField, String>> entry : lstregRegionsRaw.entrySet()) { 87 String regionCode = entry.getKey(); 88 final Map<LstrField, String> bcp47Data = entry.getValue(); 89 setStatus(regionCode, bcp47Data, bcp47Status, false); 90 } 91 92 Set<String> missing = new TreeSet<>(isoStatus.keySet()); 93 missing.removeAll(seen); 94 for (String regionCode : missing) { 95 Iso3166Status isoStatus2 = isoStatus.get(regionCode); 96 cldrStatus.put(regionCode, CldrStatus.unused); 97 bcp47Status.put(regionCode, CldrStatus.unused); 98 ordered.put( 99 cldrStatus.get(regionCode), 100 bcp47Status.get(regionCode), 101 isoStatus2, 102 regionCode, 103 Boolean.TRUE); 104 System.out.println( 105 regionCode 106 + "\t" 107 + cldrStatus.get(regionCode) 108 + "\t" 109 + bcp47Status.get(regionCode) 110 + "\t" 111 + isoStatus2 112 + "\t" 113 + isoDescription.get(regionCode)); 114 } 115 System.out.println(); 116 117 for (Entry<CldrStatus, Map<CldrStatus, Map<Iso3166Status, Map<String, Boolean>>>> entry : 118 ordered) { 119 CldrStatus cldrStatus2 = entry.getKey(); 120 for (Entry<CldrStatus, Map<Iso3166Status, Map<String, Boolean>>> entry2 : 121 entry.getValue().entrySet()) { 122 CldrStatus bcp47Status2 = entry2.getKey(); 123 for (Entry<Iso3166Status, Map<String, Boolean>> entry3 : 124 entry2.getValue().entrySet()) { 125 Iso3166Status isoStatus2 = entry3.getKey(); 126 Set<String> codes = entry3.getValue().keySet(); 127 System.out.println( 128 "||\t" 129 + cldrStatus2 130 + "\t||\t" 131 + bcp47Status2 132 + "\t||\t" 133 + isoStatus2 134 + "\t||\t" 135 + codes.size() 136 + "\t||\t" 137 + compactDisplay(codes) 138 + "\t||"); 139 } 140 } 141 } 142 } 143 compactDisplay(Set<String> codes)144 private static String compactDisplay(Set<String> codes) { 145 final StringBuilder b = new StringBuilder(); 146 Adder myAdder = new Adder() { // for testing: doesn't do quoting, etc 147 @Override 148 public void add(String start, String end) { 149 if (b.length() != 0) { 150 b.append(' '); 151 } 152 b.append(start); 153 if (end != null) { 154 b.append('-').append(end); 155 } 156 } 157 }; 158 StringRange.compact(codes, myAdder, false); 159 return b.toString(); 160 } 161 162 // guaranteed ascii! toNumber(String code)163 private static int toNumber(String code) { 164 int num = 0; 165 for (int cp : CharSequences.codePoints(code)) { 166 num <<= 7; 167 num += cp; 168 } 169 return num; 170 } 171 fromNumber(int cp)172 private static String fromNumber(int cp) { 173 StringBuilder b = new StringBuilder(); 174 while (cp != 0) { 175 int part = cp & 0x7F; 176 b.insert(0, (char) part); 177 cp >>= 7; 178 } 179 return b.toString(); 180 } 181 182 static SupplementalDataInfo SDI = SupplementalDataInfo.getInstance(); 183 setStatus( String regionCode, final Map<LstrField, String> cldrData, Map<String, CldrStatus> cldrStatus, boolean showMacro)184 private static String setStatus( 185 String regionCode, 186 final Map<LstrField, String> cldrData, 187 Map<String, CldrStatus> cldrStatus, 188 boolean showMacro) { 189 String description = cldrData.get(LstrField.Description); 190 191 if (cldrData.containsKey(LstrField.Deprecated)) { 192 cldrStatus.put(regionCode, CldrStatus.deprecated); 193 } else if (description.equalsIgnoreCase("Private use")) { 194 cldrStatus.put(regionCode, CldrStatus.privateUse); 195 } else if (showMacro && SDI.getContained(regionCode) != null) { 196 cldrStatus.put(regionCode, CldrStatus.macroregion); 197 } else { 198 cldrStatus.put(regionCode, CldrStatus.region); 199 } 200 return description; 201 } 202 } 203