1 package org.unicode.cldr.tool; 2 3 import java.io.IOException; 4 import java.util.Collections; 5 import java.util.LinkedHashSet; 6 import java.util.Locale; 7 import java.util.Map; 8 import java.util.Set; 9 import java.util.TreeMap; 10 11 import org.unicode.cldr.util.CldrUtility; 12 import org.unicode.cldr.util.CldrUtility.LineHandler; 13 import org.unicode.cldr.util.StandardCodes; 14 15 import com.ibm.icu.text.UTF16; 16 import com.ibm.icu.util.ICUUncheckedIOException; 17 import com.ibm.icu.util.ULocale; 18 19 public class CountryCodeConverter { 20 21 private static final boolean SHOW_SKIP = CldrUtility.getProperty("SHOW_SKIP", false); 22 23 private static Map<String, String> nameToCountryCode = new TreeMap<String, String>(new UTF16.StringComparator(true, true, 0)); 24 private static Set<String> parseErrors = new LinkedHashSet<String>(); 25 26 public static String getCodeFromName(String display) { 27 String trial = display.trim().toLowerCase(Locale.ENGLISH); 28 if (trial.startsWith("\"") && trial.endsWith("\"")) { 29 trial = trial.substring(1, trial.length() - 2); 30 } 31 if (trial.startsWith("the ")) { 32 trial = trial.substring(4); 33 } 34 String result = nameToCountryCode.get(trial); 35 if ("skip".equals(result)) { 36 return null; 37 } 38 if (result == null) { 39 trial = reverseComma(display); 40 if (trial != null) { 41 result = nameToCountryCode.get(trial); 42 // if (result != null) { 43 // addName(trial, result); 44 // } 45 } 46 } 47 if (SHOW_SKIP && result == null) { 48 System.out.println("Missing code; add to external/alternate_country_names.txt a line like:" + 49 "\t<code>;\t<name>;\t" + display); 50 } 51 return result; 52 } 53 54 public static Set<String> names() { 55 return nameToCountryCode.keySet(); 56 } 57 58 private static String reverseComma(String display) { 59 String trial; 60 trial = null; 61 int comma = display.indexOf(','); 62 if (comma >= 0) { 63 trial = display.substring(comma + 1).trim() + " " + display.substring(0, comma).trim(); 64 } 65 return trial; 66 } 67 68 static { 69 try { 70 loadNames(); 71 } catch (IOException e) { 72 throw new ICUUncheckedIOException(e); 73 } 74 } 75 76 static void loadNames() throws IOException { 77 for (String country : ULocale.getISOCountries()) { 78 addName(ULocale.getDisplayCountry("und-" + country, "en"), country); 79 } 80 StandardCodes sc = StandardCodes.make(); 81 Set<String> goodAvailableCodes = sc.getGoodAvailableCodes("territory"); 82 83 for (String country : goodAvailableCodes) { 84 String description = (String) sc.getFullData("territory", country).get(0); 85 if (country.equals("057")) continue; 86 addName(description, country); 87 } 88 CldrUtility.handleFile("external/alternate_country_names.txt", new MyHandler(goodAvailableCodes)); 89 nameToCountryCode = CldrUtility.protectCollection(nameToCountryCode); 90 parseErrors = Collections.unmodifiableSet(parseErrors); 91 } 92 93 static class MyHandler implements LineHandler { 94 private Set<String> goodAvailableCodes; 95 96 public MyHandler(Set<String> goodAvailableCodes) { 97 this.goodAvailableCodes = goodAvailableCodes; 98 } 99 100 public boolean handle(String line) { 101 if (line.trim().length() == 0) { 102 return true; // don't show skips 103 } 104 String[] pieces = line.split(";"); 105 String country = pieces[0].trim(); 106 if (!goodAvailableCodes.contains(country)) { 107 108 } 109 addName(pieces[2].trim(), country); 110 return true; 111 } 112 } 113 114 static void addName(String key, String code) { 115 addName2(key, code); 116 String trial = reverseComma(key); 117 if (trial != null) { 118 addName2(trial, code); 119 } 120 } 121 122 private static void addName2(String key, String code) { 123 key = key.toLowerCase(Locale.ENGLISH); 124 if (key.startsWith("the ")) { 125 key = key.substring(4); 126 } 127 String old = nameToCountryCode.get(key); 128 if (old != null && !code.equals(old)) { 129 System.err.println("Conflict!!" + key + "\t" + old + "\t" + code); 130 return; 131 } 132 nameToCountryCode.put(key, code); 133 } 134 135 public static Set<String> getParseErrors() { 136 return parseErrors; 137 } 138 139 } 140