1 // © 2016 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html 3 /* 4 ******************************************************************************* 5 * Copyright (C) 2012-2013, International Business Machines Corporation and * 6 * others. All Rights Reserved. * 7 ******************************************************************************* 8 */ 9 package com.ibm.icu.dev.tool.currency; 10 11 import java.io.IOException; 12 import java.io.OutputStreamWriter; 13 import java.io.PrintWriter; 14 import java.util.Collection; 15 import java.util.Collections; 16 import java.util.GregorianCalendar; 17 import java.util.Map.Entry; 18 import java.util.SortedMap; 19 import java.util.TimeZone; 20 import java.util.TreeMap; 21 22 /** 23 * Container of ISO 4217 alpha3 - numeric3 code mapping data 24 */ 25 public class NumericCodeData { 26 private SortedMap<String, String> _codeMap; 27 NumericCodeData(SortedMap<String, String> codeMap)28 private NumericCodeData(SortedMap<String, String> codeMap) { 29 _codeMap = codeMap; 30 } 31 getDefaultInstance()32 public static NumericCodeData getDefaultInstance() { 33 SortedMap<String, String> map = new TreeMap<String, String>(); 34 for (String[] dataEntry : CODE_MAP_DATA) { 35 map.put(dataEntry[0], dataEntry[1]); 36 } 37 return new NumericCodeData(map); 38 } 39 createInstance(Collection<CurrencyDataEntry> dataEntries)40 public static NumericCodeData createInstance(Collection<CurrencyDataEntry> dataEntries) { 41 SortedMap<String, String> map = new TreeMap<String, String>(); 42 for (CurrencyDataEntry dataEntry : dataEntries) { 43 String alphaCode = dataEntry.alphabeticCode(); 44 Integer numCode = dataEntry.numericCode(); 45 if (alphaCode == null || numCode == null) { 46 continue; 47 } 48 map.put(alphaCode, String.format("%03d", numCode)); 49 } 50 return new NumericCodeData(map); 51 } 52 merge(NumericCodeData anotherData)53 public NumericCodeData merge(NumericCodeData anotherData) { 54 SortedMap<String, String> codeMap = anotherData.getAlphaNumericCodeMap(); 55 for (Entry<String, String> codeMapEntry : codeMap.entrySet()) { 56 String alphaCode = codeMapEntry.getKey(); 57 String numCode = codeMapEntry.getValue(); 58 if (!_codeMap.containsKey(alphaCode)) { 59 _codeMap.put(alphaCode, numCode); 60 } else { 61 String existingValue = _codeMap.get(alphaCode); 62 if (!existingValue.equals(numCode)) { 63 throw new RuntimeException("Duplicated definition for " + alphaCode + ": value=" + existingValue + "/another value=" + numCode); 64 } 65 } 66 } 67 return this; 68 } 69 getAlphaNumericCodeMap()70 public SortedMap<String, String> getAlphaNumericCodeMap() { 71 return Collections.unmodifiableSortedMap(_codeMap); 72 } 73 printArray()74 public void printArray() { 75 for (Entry<String, String> entry : getAlphaNumericCodeMap().entrySet()) { 76 System.out.println(" {\"" + entry.getKey() + "\", \"" + entry.getValue() + "\"},"); 77 } 78 } 79 writeResource(OutputStreamWriter osw, String resName)80 public void writeResource(OutputStreamWriter osw, String resName) throws IOException { 81 GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT")); 82 83 PrintWriter pw = new PrintWriter(osw, true); 84 85 // Header 86 pw.println("//---------------------------------------------------------"); 87 pw.println("// Copyright (C) 2016 and later: Unicode, Inc. and others."); 88 pw.println("// License & terms of use: http://www.unicode.org/copyright.html"); 89 pw.println("//---------------------------------------------------------"); 90 pw.println("// Copyright (C) 2013, International Business Machines"); 91 pw.println("// Corporation and others. All Rights Reserved."); 92 pw.println("//---------------------------------------------------------"); 93 pw.println("// Build tool: com.ibm.icu.dev.tool.currency.NumericCodeData"); 94 pw.println(String.format("// Build date: %1$tFT%1$tTZ", cal)); 95 pw.println("//---------------------------------------------------------"); 96 pw.println("// >> !!! >> THIS IS A MACHINE-GENERATED FILE << !!! <<"); 97 pw.println("// >> !!! >>> DO NOT EDIT <<< !!! <<"); 98 pw.println("//---------------------------------------------------------"); 99 pw.println(""); 100 101 // Resource root 102 pw.println(resName + ":table(nofallback){"); 103 104 // Map data 105 pw.println(" codeMap{"); 106 107 for (Entry<String, String> mapEntry : _codeMap.entrySet()) { 108 String alphaCode = mapEntry.getKey(); 109 int numericCodeVal = Integer.parseInt(mapEntry.getValue()); 110 pw.println(String.format(" %1$s:int{%2$d}", alphaCode, numericCodeVal)); 111 } 112 113 pw.println(" }"); 114 115 pw.println("}"); 116 } 117 118 private static final String[][] CODE_MAP_DATA = { 119 {"ADP", "020"}, 120 {"AED", "784"}, 121 {"AFA", "004"}, 122 {"AFN", "971"}, 123 {"ALL", "008"}, 124 {"ALK", "008"}, 125 {"AMD", "051"}, 126 {"ANG", "532"}, 127 {"AOA", "973"}, 128 {"AOK", "024"}, 129 {"AON", "024"}, 130 {"AOR", "982"}, 131 {"ARA", "032"}, 132 {"ARP", "032"}, 133 {"ARS", "032"}, 134 {"ARY", "032"}, 135 {"ATS", "040"}, 136 {"AUD", "036"}, 137 {"AWG", "533"}, 138 {"AYM", "945"}, 139 {"AZM", "031"}, 140 {"AZN", "944"}, 141 {"BAD", "070"}, 142 {"BAM", "977"}, 143 {"BBD", "052"}, 144 {"BDT", "050"}, 145 {"BEC", "993"}, 146 {"BEF", "056"}, 147 {"BEL", "992"}, 148 {"BGJ", "100"}, 149 {"BGK", "100"}, 150 {"BGL", "100"}, 151 {"BGN", "975"}, 152 {"BHD", "048"}, 153 {"BIF", "108"}, 154 {"BMD", "060"}, 155 {"BND", "096"}, 156 {"BOB", "068"}, 157 {"BOP", "068"}, 158 {"BOV", "984"}, 159 {"BRB", "076"}, 160 {"BRC", "076"}, 161 {"BRE", "076"}, 162 {"BRL", "986"}, 163 {"BRN", "076"}, 164 {"BRR", "987"}, 165 {"BSD", "044"}, 166 {"BTN", "064"}, 167 {"BUK", "104"}, 168 {"BWP", "072"}, 169 {"BYB", "112"}, 170 {"BYN", "933"}, 171 {"BYR", "974"}, 172 {"BZD", "084"}, 173 {"CAD", "124"}, 174 {"CDF", "976"}, 175 {"CHC", "948"}, 176 {"CHE", "947"}, 177 {"CHF", "756"}, 178 {"CHW", "948"}, 179 {"CLF", "990"}, 180 {"CLP", "152"}, 181 {"CNY", "156"}, 182 {"COP", "170"}, 183 {"COU", "970"}, 184 {"CRC", "188"}, 185 {"CSD", "891"}, 186 {"CSJ", "203"}, 187 {"CSK", "200"}, 188 {"CUC", "931"}, 189 {"CUP", "192"}, 190 {"CVE", "132"}, 191 {"CYP", "196"}, 192 {"CZK", "203"}, 193 {"DDM", "278"}, 194 {"DEM", "276"}, 195 {"DJF", "262"}, 196 {"DKK", "208"}, 197 {"DOP", "214"}, 198 {"DZD", "012"}, 199 {"ECS", "218"}, 200 {"ECV", "983"}, 201 {"EEK", "233"}, 202 {"EGP", "818"}, 203 {"ERN", "232"}, 204 {"ESA", "996"}, 205 {"ESB", "995"}, 206 {"ESP", "724"}, 207 {"ETB", "230"}, 208 {"EUR", "978"}, 209 {"FIM", "246"}, 210 {"FJD", "242"}, 211 {"FKP", "238"}, 212 {"FRF", "250"}, 213 {"GBP", "826"}, 214 {"GEK", "268"}, 215 {"GEL", "981"}, 216 {"GHC", "288"}, 217 {"GHP", "939"}, 218 {"GHS", "936"}, 219 {"GIP", "292"}, 220 {"GMD", "270"}, 221 {"GNE", "324"}, 222 {"GNF", "324"}, 223 {"GNS", "324"}, 224 {"GQE", "226"}, 225 {"GRD", "300"}, 226 {"GTQ", "320"}, 227 {"GWE", "624"}, 228 {"GWP", "624"}, 229 {"GYD", "328"}, 230 {"HKD", "344"}, 231 {"HNL", "340"}, 232 {"HRD", "191"}, 233 {"HRK", "191"}, 234 {"HTG", "332"}, 235 {"HUF", "348"}, 236 {"IDR", "360"}, 237 {"IEP", "372"}, 238 {"ILP", "376"}, 239 {"ILR", "376"}, 240 {"ILS", "376"}, 241 {"INR", "356"}, 242 {"IQD", "368"}, 243 {"IRR", "364"}, 244 {"ISJ", "352"}, 245 {"ISK", "352"}, 246 {"ITL", "380"}, 247 {"JMD", "388"}, 248 {"JOD", "400"}, 249 {"JPY", "392"}, 250 {"KES", "404"}, 251 {"KGS", "417"}, 252 {"KHR", "116"}, 253 {"KMF", "174"}, 254 {"KPW", "408"}, 255 {"KRW", "410"}, 256 {"KWD", "414"}, 257 {"KYD", "136"}, 258 {"KZT", "398"}, 259 {"LAJ", "418"}, 260 {"LAK", "418"}, 261 {"LBP", "422"}, 262 {"LKR", "144"}, 263 {"LRD", "430"}, 264 {"LSL", "426"}, 265 {"LSM", "426"}, 266 {"LTL", "440"}, 267 {"LTT", "440"}, 268 {"LUC", "989"}, 269 {"LUF", "442"}, 270 {"LUL", "988"}, 271 {"LVL", "428"}, 272 {"LVR", "428"}, 273 {"LYD", "434"}, 274 {"MAD", "504"}, 275 {"MDL", "498"}, 276 {"MGA", "969"}, 277 {"MGF", "450"}, 278 {"MKD", "807"}, 279 {"MLF", "466"}, 280 {"MMK", "104"}, 281 {"MNT", "496"}, 282 {"MOP", "446"}, 283 {"MRO", "478"}, 284 {"MRU", "929"}, 285 {"MTL", "470"}, 286 {"MTP", "470"}, 287 {"MUR", "480"}, 288 {"MVQ", "462"}, 289 {"MVR", "462"}, 290 {"MWK", "454"}, 291 {"MXN", "484"}, 292 {"MXP", "484"}, 293 {"MXV", "979"}, 294 {"MYR", "458"}, 295 {"MZE", "508"}, 296 {"MZM", "508"}, 297 {"MZN", "943"}, 298 {"NAD", "516"}, 299 {"NGN", "566"}, 300 {"NIC", "558"}, 301 {"NIO", "558"}, 302 {"NLG", "528"}, 303 {"NOK", "578"}, 304 {"NPR", "524"}, 305 {"NZD", "554"}, 306 {"OMR", "512"}, 307 {"PAB", "590"}, 308 {"PEH", "604"}, 309 {"PEI", "604"}, 310 {"PEN", "604"}, 311 {"PES", "604"}, 312 {"PGK", "598"}, 313 {"PHP", "608"}, 314 {"PKR", "586"}, 315 {"PLN", "985"}, 316 {"PLZ", "616"}, 317 {"PTE", "620"}, 318 {"PYG", "600"}, 319 {"QAR", "634"}, 320 {"RHD", "716"}, 321 {"ROK", "642"}, 322 {"ROL", "642"}, 323 {"RON", "946"}, 324 {"RSD", "941"}, 325 {"RUB", "643"}, 326 {"RUR", "810"}, 327 {"RWF", "646"}, 328 {"SAR", "682"}, 329 {"SBD", "090"}, 330 {"SCR", "690"}, 331 {"SDD", "736"}, 332 {"SDG", "938"}, 333 {"SDP", "736"}, 334 {"SEK", "752"}, 335 {"SGD", "702"}, 336 {"SHP", "654"}, 337 {"SIT", "705"}, 338 {"SKK", "703"}, 339 {"SLL", "694"}, 340 {"SOS", "706"}, 341 {"SRD", "968"}, 342 {"SRG", "740"}, 343 {"SSP", "728"}, 344 {"STD", "678"}, 345 {"STN", "930"}, 346 {"SUR", "810"}, 347 {"SVC", "222"}, 348 {"SYP", "760"}, 349 {"SZL", "748"}, 350 {"THB", "764"}, 351 {"TJR", "762"}, 352 {"TJS", "972"}, 353 {"TMM", "795"}, 354 {"TMT", "934"}, 355 {"TND", "788"}, 356 {"TOP", "776"}, 357 {"TPE", "626"}, 358 {"TRL", "792"}, 359 {"TRY", "949"}, 360 {"TTD", "780"}, 361 {"TWD", "901"}, 362 {"TZS", "834"}, 363 {"UAH", "980"}, 364 {"UAK", "804"}, 365 {"UGS", "800"}, 366 {"UGW", "800"}, 367 {"UGX", "800"}, 368 {"USD", "840"}, 369 {"USN", "997"}, 370 {"USS", "998"}, 371 {"UYI", "940"}, 372 {"UYN", "858"}, 373 {"UYP", "858"}, 374 {"UYU", "858"}, 375 {"UYW", "927"}, 376 {"UZS", "860"}, 377 {"VEB", "862"}, 378 {"VEF", "937"}, 379 {"VES", "928"}, 380 {"VNC", "704"}, 381 {"VND", "704"}, 382 {"VUV", "548"}, 383 {"WST", "882"}, 384 {"XAF", "950"}, 385 {"XAG", "961"}, 386 {"XAU", "959"}, 387 {"XBA", "955"}, 388 {"XBB", "956"}, 389 {"XBC", "957"}, 390 {"XBD", "958"}, 391 {"XCD", "951"}, 392 {"XDR", "960"}, 393 {"XEU", "954"}, 394 {"XOF", "952"}, 395 {"XPD", "964"}, 396 {"XPF", "953"}, 397 {"XPT", "962"}, 398 {"XSU", "994"}, 399 {"XTS", "963"}, 400 {"XUA", "965"}, 401 {"XXX", "999"}, 402 {"YDD", "720"}, 403 {"YER", "886"}, 404 {"YUD", "890"}, 405 {"YUM", "891"}, 406 {"YUN", "890"}, 407 {"ZAL", "991"}, 408 {"ZAR", "710"}, 409 {"ZMK", "894"}, 410 {"ZMW", "967"}, 411 {"ZRN", "180"}, 412 {"ZRZ", "180"}, 413 {"ZWC", "716"}, 414 {"ZWD", "716"}, 415 {"ZWL", "932"}, 416 {"ZWN", "942"}, 417 {"ZWR", "935"}, 418 }; 419 } 420