View Javadoc
1   /*
2    *  Copyright 2012 Christopher Pheby
3    *
4    *  Licensed under the Apache License, Version 2.0 (the "License");
5    *  you may not use this file except in compliance with the License.
6    *  You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   *  Unless required by applicable law or agreed to in writing, software
11   *  distributed under the License is distributed on an "AS IS" BASIS,
12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *  See the License for the specific language governing permissions and
14   *  limitations under the License.
15   */
16  package org.jadira.cdt.country;
17  
18  import java.util.HashMap;
19  import java.util.Map;
20  
21  import com.google.i18n.phonenumbers.PhoneNumberUtil;
22  
23  import org.jadira.cdt.country.CountryCode;
24  
25  /**
26  * Enumeration of ISO <a href="http://en.wikipedia.org/wiki/ISO_3166-1">ISO 3166-1</a>
27  * country codes.
28  * <p>
29  * The Enum names of this enumeration themselves are represented by
30  * <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO 3166-1 alpha-2</a>
31  * codes. 
32  * Instance methods return country name (getName()), 
33  * <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-3" >ISO 3166-1 alpha-3</a> codes ({@link ISOCountryCode#getAlpha3Code()}),
34  * <a href="http://en.wikipedia.org/wiki/ISO_3166-1_numericCode">ISO 3166-1 numericCode</a> codes ({@link ISOCountryCode#getNumericCode()}),
35  * <a href="http://en.wikipedia.org/wiki/E.164">and E.164 the dialling region</a> code ({@link ISOCountryCode#getDiallingRegionCode()})
36  * Static factory methods can retrieve ISOCountryCode instances that
37  * corresponds to a given code.
38  * </p>
39  * <p>
40  * To update this class, populate using countrynames.txt, downloadable from <a href="http://opengeocode.org/download/countrynames.txt">OpenGeoCode</a>.
41  * For the purpose of FMPP, all but one line of header must be removed. 
42  * 
43  */
44  public enum ISOCountryCode implements CountryCode {
45  
46      AF("Afghanistan", "AFG", 4),
47      AX("Aland Islands", "ALA", 248),
48      AL("Albania", "ALB", 8),
49      DZ("Algeria", "DZA", 12),
50      AS("American Samoa", "ASM", 16),
51      AD("Andorra", "AND", 20),
52      AO("Angola", "AGO", 24),
53      AI("Anguilla", "AIA", 660),
54      AQ("Antarctica", "ATA", 10),
55      AG("Antigua and Barbuda", "ATG", 28),
56      AR("Argentina", "ARG", 32),
57      AM("Armenia", "ARM", 51),
58      AW("Aruba", "ABW", 533),
59      AU("Australia", "AUS", 36),
60      AT("Austria", "AUT", 40),
61      AZ("Azerbaijan", "AZE", 31),
62      BS("Bahamas", "BHS", 44),
63      BH("Bahrain", "BHR", 48),
64      BD("Bangladesh", "BGD", 50),
65      BB("Barbados", "BRB", 52),
66      BY("Belarus", "BLR", 112),
67      BE("Belgium", "BEL", 56),
68      BZ("Belize", "BLZ", 84),
69      BJ("Benin", "BEN", 204),
70      BM("Bermuda", "BMU", 60),
71      BT("Bhutan", "BTN", 64),
72      BO("Plurinational State of Bolivia", "BOL", 68),
73      BQ("Bonaire, Sint Eustatius and Saba", "BES", 535),
74      BA("Bosnia and Herzegovina", "BIH", 70),
75      BW("Botswana", "BWA", 72),
76      BV("Bouvet Island", "BVT", 74),
77      BR("Brazil", "BRA", 76),
78      IO("British Indian Ocean Territory", "IOT", 86),
79      BN("Brunei Darussalam", "BRN", 96),
80      BG("Bulgaria", "BGR", 100),
81      BF("Burkina Faso", "BFA", 854),
82      BI("Burundi", "BDI", 108),
83      KH("Cambodia", "KHM", 116),
84      CM("Cameroon", "CMR", 120),
85      CA("Canada", "CAN", 124),
86      CV("Cape Verde", "CPV", 132),
87      KY("Cayman Islands", "CYM", 136),
88      CF("Central African Republic", "CAF", 140),
89      TD("Chad", "TCD", 148),
90      CL("Chile", "CHL", 152),
91      CN("China", "CHN", 156),
92      CX("Christmas Island", "CXR", 162),
93      CC("Cocos (Keeling) Islands", "CCK", 166),
94      CO("Colombia", "COL", 170),
95      KM("Comoros", "COM", 174),
96      CG("Congo", "COG", 178),
97      CD("The Democratic Republic of the Congo", "COD", 180),
98      CK("Cook Islands", "COK", 184),
99      CR("Costa Rica", "CRI", 188),
100     CI("Cote d'Ivoire", "CIV", 384),
101     HR("Croatia", "HRV", 191),
102     CU("Cuba", "CUB", 192),
103     CW("Curacao", "CUW", 531),
104     CY("Cyprus", "CYP", 196),
105     CZ("Czech Republic", "CZE", 203),
106     DK("Denmark", "DNK", 208),
107     DJ("Djibouti", "DJI", 262),
108     DM("Dominica", "DMA", 212),
109     DO("Dominican Republic", "DOM", 214),
110     EC("Ecuador", "ECU", 218),
111     EG("Egypt", "EGY", 818),
112     SV("El Salvador", "SLV", 222),
113     GQ("Equatorial Guinea", "GNQ", 226),
114     ER("Eritrea", "ERI", 232),
115     EE("Estonia", "EST", 233),
116     ET("Ethiopia", "ETH", 231),
117     FK("Falkland Islands (Malvinas)", "FLK", 238),
118     FO("Faroe Islands", "534", 703),
119     FJ("Fiji", "FJI", 242),
120     FI("Finland", "FIN", 246),
121     FR("France", "FRA", 250),
122     GF("French Guiana", "GUF", 254),
123     PF("French Polynesia", "PYF", 258),
124     TF("French Southern Territories", "ATF", 260),
125     GA("Gabon", "GAB", 266),
126     GM("Gambia", "GMB", 270),
127     GE("Georgia", "GEO", 268),
128     DE("Germany", "DEU", 276),
129     GH("Ghana", "GHA", 288),
130     GI("Gibraltar", "GIB", 292),
131     GR("Greece", "GRC", 300),
132     GL("Greenland", "GRL", 304),
133     GD("Grenada", "GRD", 308),
134     GP("Guadeloupe", "GLP", 312),
135     GU("Guam", "GUM", 316),
136     GT("Guatemala", "GTM", 320),
137     GG("Guernsey", "GGY", 831),
138     GN("Guinea", "GIN", 324),
139     GW("Guinea-Bissau", "GNB", 624),
140     GY("Guyana", "GUY", 328),
141     HT("Haiti", "HTI", 332),
142     HM("Heard Island and McDonald Islands", "HMD", 334),
143     VA("Holy See (Vatican City State)", "VAT", 336),
144     HN("Honduras", "HND", 340),
145     HK("Hong Kong", "HKG", 344),
146     HU("Hungary", "HUN", 348),
147     IS("Iceland", "ISL", 352),
148     IN("India", "IND", 356),
149     ID("Indonesia", "IDN", 360),
150     IR("Islamic Republic of Iran", "IRN", 364),
151     IQ("Iraq", "IRQ", 368),
152     IE("Ireland", "IRL", 372),
153     IM("Isle of Man", "IMN", 833),
154     IL("Israel", "ISR", 376),
155     IT("Italy", "ITA", 380),
156     JM("Jamaica", "JAM", 388),
157     JP("Japan", "JPN", 392),
158     JE("Jersey", "JEY", 832),
159     JO("Jordan", "JOR", 400),
160     KZ("Kazakhstan", "KAZ", 398),
161     KE("Kenya", "KEN", 404),
162     KI("Kiribati", "KIR", 296),
163     KP("Democratic People's Republic of Korea", "PRK", 408),
164     KR("Republic of Korea", "KOR", 410),
165     KW("Kuwait", "KWT", 414),
166     KG("Kyrgyzstan", "KGZ", 417),
167     LA("Lao People's Democratic Republic", "LAO", 418),
168     LV("Latvia", "LVA", 428),
169     LB("Lebanon", "LBN", 422),
170     LS("Lesotho", "LSO", 426),
171     LR("Liberia", "LBR", 430),
172     LY("Libyan Arab Jamahiriya", "LBY", 434),
173     LI("Liechtenstein", "LIE", 438),
174     LT("Lithuania", "LTU", 440),
175     LU("Luxembourg", "LUX", 442),
176     MO("Macao", "MAC", 446),
177     MK("The Former Yugoslav Republic of Macedonia", "MKD", 807),
178     MG("Madagascar", "MDG", 450),
179     MW("Malawi", "MWI", 454),
180     MY("Malaysia", "MYS", 458),
181     MV("Maldives", "MDV", 462),
182     ML("Mali", "MLI", 466),
183     MT("Malta", "MLT", 470),
184     MH("Marshall Islands", "MHL", 584),
185     MQ("Martinique", "MTQ", 474),
186     MR("Mauritania", "MRT", 478),
187     MU("Mauritius", "MUS", 480),
188     YT("Mayotte", "MYT", 175),
189     MX("Mexico", "MEX", 484),
190     FM("Federated States of Micronesia", "FSM", 583),
191     MD("Republic of Moldova", "MDA", 498),
192     MC("Monaco", "MCO", 492),
193     MN("Mongolia", "MNG", 496),
194     ME("Montenegro", "MNE", 499),
195     MS("Montserrat", "MSR", 500),
196     MA("Morocco", "MAR", 504),
197     MZ("Mozambique", "MOZ", 508),
198     MM("Myanmar", "MMR", 104),
199     NA("Namibia", "NAM", 516),
200     NR("Nauru", "NRU", 520),
201     NP("Nepal", "NPL", 524),
202     NL("Netherlands", "NLD", 528),
203     NC("New Caledonia", "NCL", 540),
204     NZ("New Zealand", "NZL", 554),
205     NI("Nicaragua", "NIC", 558),
206     NE("Niger", "NER", 562),
207     NG("Nigeria", "NGA", 566),
208     NU("Niue", "NIU", 570),
209     NF("Norfolk Island", "NFK", 574),
210     MP("Northern Mariana Islands", "MNP", 580),
211     NO("Norway", "NOR", 578),
212     PS("Occupied Palestinian Territory", "PSE", 275),
213     OM("Oman", "OMN", 512),
214     PK("Pakistan", "PAK", 586),
215     PW("Palau", "PLW", 585),
216     PA("Panama", "PAN", 591),
217     PG("Papua New Guinea", "PNG", 598),
218     PY("Paraguay", "PRY", 600),
219     PE("Peru", "PER", 604),
220     PH("Philippines", "PHL", 608),
221     PN("Pitcairn", "PCN", 612),
222     PL("Poland", "POL", 616),
223     PT("Portugal", "PRT", 620),
224     PR("Puerto Rico", "PRI", 630),
225     QA("Qatar", "QAT", 634),
226     RE("Reunion", "REU", 638),
227     RO("Romania", "ROU", 642),
228     RU("Russian Federation", "RUS", 643),
229     RW("Rwanda", "RWA", 646),
230     BL("Saint Barthelemy", "534", 703),
231     SH("Saint Helena, Ascension and Tristan da Cunha", "SHN", 654),
232     KN("Saint Kitts and Nevis", "KNA", 659),
233     LC("Saint Lucia", "LCA", 662),
234     MF("Saint Martin (French part)", "MAF", 663),
235     PM("Saint Pierre and Miquelon", "SPM", 666),
236     VC("Saint Vincent and The Grenadines", "VCT", 670),
237     WS("Samoa", "WSM", 882),
238     SM("San Marino", "SMR", 674),
239     ST("Sao Tome and Principe", "STP", 678),
240     SA("Saudi Arabia", "SAU", 682),
241     SN("Senegal", "SEN", 686),
242     RS("Serbia", "SRB", 688),
243     SC("Seychelles", "SYC", 690),
244     SL("Sierra Leone", "SLE", 694),
245     SG("Singapore", "SGP", 702),
246     SX("Sint Maarten (Dutch part)", "SXM", 534),
247     SK("Slovakia", "SVK", 703),
248     SI("Slovenia", "SVN", 705),
249     SB("Solomon Islands", "SLB", 90),
250     SO("Somalia", "SOM", 706),
251     ZA("South Africa", "ZAF", 710),
252     GS("South Georgia and the South Sandwich Islands", "SGS", 239),
253     SS("South Sudan", "SSD", 728),
254     ES("Spain", "ESP", 724),
255     LK("Sri Lanka", "LKA", 144),
256     SD("Sudan", "SDN", 729),
257     SR("Suriname", "SUR", 740),
258     SJ("Svalbard and Jan Mayen", "534", 703),
259     SZ("Swaziland", "SWZ", 748),
260     SE("Sweden", "SWE", 752),
261     CH("Switzerland", "CHE", 756),
262     SY("Syrian Arab Republic", "SYR", 760),
263     TW("Taiwan, Province of China", "TWN", 158),
264     TJ("Tajikistan", "TJK", 762),
265     TZ("United Republic of Tanzania", "TZA", 834),
266     TH("Thailand", "THA", 764),
267     TL("Timor-Leste", "TLS", 626),
268     TG("Togo", "TGO", 768),
269     TK("Tokelau", "TKL", 772),
270     TO("Tonga", "TON", 776),
271     TT("Trinidad and Tobago", "TTO", 780),
272     TN("Tunisia", "TUN", 788),
273     TR("Turkey", "TUR", 792),
274     TM("Turkmenistan", "TKM", 795),
275     TC("Turks and Caicos Islands", "TCA", 796),
276     TV("Tuvalu", "TUV", 798),
277     UG("Uganda", "UGA", 800),
278     UA("Ukraine", "UKR", 804),
279     AE("United Arab Emirates", "ARE", 784),
280     GB("United Kingdom", "GBR", 826),
281     US("United States", "USA", 840),
282     UM("United States Minor Outlying Islands", "UMI", 581),
283     UY("Uruguay", "URY", 858),
284     UZ("Uzbekistan", "UZB", 860),
285     VU("Vanuatu", "VUT", 548),
286     VE("Bolivarian Republic of Venezuela", "VEN", 862),
287     VN("Viet Nam", "VNM", 704),
288     VG("British Virgin Islands", "VGB", 92),
289     VI("U.S. Virgin Islands", "VIR", 850),
290     WF("Wallis and Futuna", "WLF", 876),
291     EH("Western Sahara", "ESH", 732),
292     YE("Yemen", "YEM", 887),
293     ZM("Zambia", "ZMB", 894),
294     ZW("Zimbabwe", "ZWE", 716),
295 ;
296 
297     private static final Map<String, ISOCountryCode> alpha3CodeMap = new HashMap<String, ISOCountryCode>();
298     private static final Map<Integer, ISOCountryCode> numericCodeMap = new HashMap<Integer, ISOCountryCode>();
299 
300     private static final PhoneNumberUtil PHONE_NUMBER_UTIL = PhoneNumberUtil.getInstance();
301     
302     static {
303     	
304         for (ISOCountryCode next : values()) {
305             alpha3CodeMap.put(next.getAlpha3Code(), next);
306             numericCodeMap.put(next.getNumericCode(), next);
307         }
308     }
309 
310     private final String countryName;
311     private final String alpha3Code;
312     private final Integer numericCode;
313 
314     private ISOCountryCode(String countryName, String alpha3Code, Integer numericCode) {
315         this.countryName = countryName;
316         this.alpha3Code = alpha3Code;
317         this.numericCode = numericCode;
318     }
319 
320 	/**
321 	 * Get the country name.
322 	 * @return The country name.
323 	 */
324 	public String getCountryName() {
325         return countryName;
326     }
327 
328 	/**
329 	 * Get the <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2" >ISO 3166-1 alpha-2</a> code.
330 	 * @return The <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO 3166-1 alpha-2</a> code.
331 	 */
332 	public String getAlpha2Code() {
333 		return name();
334 	}
335 
336 	/**
337 	 * Get the <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-3" >ISO 3166-1 alpha-3</a> code.
338 	 * @return The <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-3">ISO 3166-1 alpha-3</a> code.
339 	 */
340 	public String getAlpha3Code() {
341 		return alpha3Code;
342 	}
343 
344 	/**
345 	 * Get the <a href="http://en.wikipedia.org/wiki/ISO_3166-1_numericCode" >ISO 3166-1 numericCode</a> code.
346 	 * @return The <a href="http://en.wikipedia.org/wiki/ISO_3166-1_numericCode">ISO 3166-1 numericCode</a> code.
347 	 */
348 	public Integer getNumericCode() {
349 		return numericCode;
350 	}
351 	
352 	/**
353 	 * Gets the <a href="http://en.wikipedia.org/wiki/E.164">International Direct Dial</a> prefix for the country
354 	 * @return
355 	 */
356 	public Integer getDiallingRegionCode() {
357 		return PHONE_NUMBER_UTIL.getCountryCodeForRegion(this.getAlpha2Code());
358 	}
359 
360 	/**
361 	 * Get a CountryCode that corresponds to a given ISO 3166-1 <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">alpha-2</a> or 
362 	 * <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-3">alpha-3</a> code.
363 	 * @param code An ISO 3166-1 <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">alpha-2</a> or 
364 	 * <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-3">alpha-3</a> code.
365 	 * @return A ISOCountryCode instance, or null if not found.
366 	 */
367 	public static ISOCountryCode getByCode(String code) {
368 		
369 		if (code == null) {
370 			return null;
371 		}
372 
373 		if (code.length() == 2) {
374 			return getByAlpha2Code(code);
375 		} else if (code.length() == 3) {
376 			return getByAlpha3Code(code);
377 		} else {
378 			return null;
379 		}
380 	}
381 
382 	/**
383 	 * Get a CountryCode that corresponds to a given ISO 3166-1 <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">alpha-2</a> code.
384 	 * @param code An ISO 3166-1 <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">alpha-2</a>.
385 	 * @return A ISOCountryCode instance, or null if not found.
386 	 */
387 	public static ISOCountryCode getByAlpha2Code(String code) {
388 		try {
389 			return Enum.valueOf(ISOCountryCode.class, code);
390 		} catch (IllegalArgumentException e) {
391 			return null;
392 		}
393 	}
394 
395 	/**
396 	 * Get a CountryCode that corresponds to a given ISO 3166-1 <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-3">alpha-3</a> code.
397 	 * @param code An ISO 3166-1 <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-3">alpha-3</a> code.
398 	 * @return A ISOCountryCode instance, or null if not found.
399 	 */
400 	public static ISOCountryCode getByAlpha3Code(String code) {
401 		return alpha3CodeMap.get(code);
402 	}
403 
404 	/**
405 	 * Get a CountryCode that corresponds to a given <a href="http://en.wikipedia.org/wiki/ISO_3166-1_numericCode">ISO 3166-1
406 	 * numericCode</a> code.
407 	 * @param code An <a href="http://en.wikipedia.org/wiki/ISO_3166-1_numericCode">ISO 3166-1 numericCode</a> code.
408 	 * @return A CountryCode instance, or null if not found.
409 	 */
410 	public static ISOCountryCode getByNumericCode(Integer code) {
411 		return numericCodeMap.get(code);
412 	}
413 
414 	/**
415 	 * Get a CountryCode that corresponds to a given <a href="http://en.wikipedia.org/wiki/E.164">Dialling Region</a> code.
416 	 * @param code An <a href="http://en.wikipedia.org/wiki/E.164">E.164 Dialling Region Code</a> code.
417 	 * @return A CountryCode instance, or null if not found.
418 	 */
419 	public static ISOCountryCode getByDiallingRegionCode(Integer code) {
420 		return getByCode(PHONE_NUMBER_UTIL.getRegionCodeForCountryCode(code));
421 	}
422 }