xref: /aosp_15_r20/external/cldr/tools/cldr-code/src/main/java/org/unicode/cldr/tool/CompareIso3166_1Status.java (revision 912701f9769bb47905792267661f0baf2b85bed5)
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