package com.gisgraphy.helper;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* @author <a href="mailto:david.masclet@gisgraphy.com">David Masclet</a>
*
*/
public class CountriesStaticData {
public static Map<String, List<String>> countryAlternateNames = new HashMap<String, List<String>>();
public static void loadCountryNamesMap(){
String pathname = "countries-alternatenames.txt";
//InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(pathname);
File file = new File(pathname);
BufferedReader br = null;
InputStream is = null;
try {
if (file.exists()){
is = new BufferedInputStream(new FileInputStream(file));
} else {
is = Thread.currentThread().getClass().getResourceAsStream("/"+pathname);
if (is==null){
is = Thread.currentThread().getContextClassLoader().getResourceAsStream(pathname);
}
if (is==null){
throw new RuntimeException("file "+file.getPath()+" / " + file.getAbsolutePath() + " does not exists or is not present in classpath");
}
}
br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
String line ;
while ((line=br.readLine())!=null){
String[] fields = line.split("\t");
if (fields.length<=1){
continue;
}
String countrycode = fields[0];
List<String> alternateNames = new ArrayList<String>();
for (int i=1;i<fields.length;i++){
String alternateName = fields[i].replaceAll("\\s+", " ").replaceAll("[\\s\\-\\']+", " ").trim();
alternateNames.add(alternateName.toLowerCase());
}
countryAlternateNames.put(countrycode, mergeAndSort(alternateNames));
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage(),e);
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
}
}
if (br != null) {
try {
br.close();
} catch (IOException e) {
}
}
}
}
static{
loadCountryNamesMap();
}
public static List<String> mergeAndSort(Collection<String> collection) {
Set<String> union = new HashSet<String>(collection);
String[] set = new String[union.size()];
List<String> lst = Arrays.asList(union.toArray(set));
Collections.sort(lst, new Comparator<String>() {
public int compare(String o1, String o2) {
return Integer.valueOf(o2.length()).compareTo(o1.length());
}
});
return lst;
}
public final static List<String> countryCodeSortedByPopularity = new ArrayList<String>(){
{
add("US");
add("CA");
add("FR");
add("DE");
add("GB");
add("CN");
add("IN");
add("DK");
add("ES");
add("ID");
add("NL");
add("IT");
add("BR");
add("CO");
add("PK");
add("NG");
add("BD");
add("RU");
add("JP");
add("MX");
add("PH");
add("ET");
add("VN");
add("EG");
add("IR");
add("TR");
add("CD");
add("TH");
add("MM");
add("ZA");
add("TZ");
add("KR");
add("VE");
add("KE");
add("UA");
add("AR");
add("DZ");
add("PL");
add("UG");
add("IQ");
add("SD");
add("MA");
add("AF");
add("NP");
add("MY");
add("PE");
add("AU");
add("UZ");
add("SA");
add("YE");
add("GH");
add("MZ");
add("KP");
add("MG");
add("CM");
add("TW");
add("CI");
add("SE");
add("LK");
add("RO");
add("AO");
add("BF");
add("KZ");
add("NE");
add("MW");
add("CL");
add("SY");
add("ML");
add("EC");
add("KH");
add("ZM");
add("GT");
add("ZW");
add("SN");
add("RW");
add("SS");
add("GN");
add("TD");
add("BE");
add("TN");
add("CU");
add("PT");
add("BO");
add("GR");
add("BI");
add("CZ");
add("SO");
add("DO");
add("BJ");
add("HT");
add("HU");
add("AZ");
add("BY");
add("HN");
add("AT");
add("TJ");
add("CH");
add("JO");
add("IL");
add("TG");
add("BG");
add("RS");
add("HK");
add("LA");
add("PY");
add("PG");
add("ER");
add("LY");
add("LB");
add("SV");
add("NI");
add("SL");
add("AE");
add("SG");
add("KG");
add("FI");
add("SK");
add("CF");
add("TM");
add("NO");
add("GE");
add("IE");
add("CR");
add("CG");
add("HR");
add("NZ");
add("LR");
add("BA");
add("PA");
add("PR");
add("MR");
add("MD");
add("UY");
add("OM");
add("AM");
add("AL");
add("MN");
add("JM");
add("LT");
add("KW");
add("PS");
add("NA");
add("QA");
add("BW");
add("MK");
add("LV");
add("SI");
add("GM");
add("LS");
add("XK");
add("GW");
add("GA");
add("SZ");
add("BH");
add("MU");
add("EE");
add("TL");
add("TT");
add("CY");
add("FJ");
add("DJ");
add("KM");
add("BT");
add("GQ");
add("GY");
add("RE");
add("ME");
add("SB");
add("MO");
add("SR");
add("EH");
add("LU");
add("CV");
add("GP");
add("BN");
add("MT");
add("MQ");
add("MV");
add("BZ");
add("IS");
add("BS");
add("BB");
add("PF");
add("VU");
add("NC");
add("AN");
add("YT");
add("WS");
add("ST");
add("GF");
add("LC");
add("GU");
add("CW");
add("AW");
add("GD");
add("TO");
add("KI");
add("FM");
add("VI");
add("VC");
add("JE");
add("AG");
add("SC");
add("IM");
add("AD");
add("DM");
add("MH");
add("BM");
add("GG");
add("GL");
add("KY");
add("AS");
add("MP");
add("KN");
add("TC");
add("FO");
add("SX");
add("LI");
add("VG");
add("SM");
add("MC");
add("GI");
add("PW");
add("AI");
add("WF");
add("TV");
add("CK");
add("NR");
add("SH");
add("BL");
add("PM");
add("MS");
add("FK");
add("NF");
add("SJ");
add("CX");
add("TK");
add("NU");
add("VA");
add("CC");
add("PN");
add("GS");
add("AQ");
add("BV");
add("IO");
add("TF");
add("HM");
}
};
public final static Map<String, String> countriesnameToCountryCodeMap = new HashMap<String, String>() {
private static final long serialVersionUID = 4762318033721437587L;
{
put("Afghanistan", "AF");
put("Aland Islands", "AX");
put("Albania", "AL");
put("Algeria", "DZ");
put("American Samoa", "AS");
put("Andorra", "AD");
put("Angola", "AO");
put("Anguilla", "AI");
put("Antarctica", "AQ");
put("Antigua and Barbuda", "AG");
put("Argentina", "AR");
put("Armenia", "AM");
put("Aruba", "AW");
put("Australia", "AU");
put("Austria", "AT");
put("Azerbaijan", "AZ");
put("Bahamas", "BS");
put("Bahrain", "BH");
put("Bangladesh", "BD");
put("Barbados", "BB");
put("Belarus", "BY");
put("Belgium", "BE");
put("Belize", "BZ");
put("Benin", "BJ");
put("Bermuda", "BM");
put("Bhutan", "BT");
put("Bolivia", "BO");
put("Bosnia and Herzegovina", "BA");
put("Botswana", "BW");
put("Bouvet Island", "BV");
put("Brazil", "BR");
put("British Indian Ocean Territory", "IO");
put("British Virgin Islands", "VG");
put("Brunei", "BN");
put("Bulgaria", "BG");
put("Burkina Faso", "BF");
put("Burundi", "BI");
put("Cambodia", "KH");
put("Cameroon", "CM");
put("Canada", "CA");
put("Cape Verde", "CV");
put("Cayman Islands", "KY");
put("Central African Republic", "CF");
put("Chad", "TD");
put("Chile", "CL");
put("China", "CN");
put("Christmas Island", "CX");
put("Cocos Islands", "CC");
put("Colombia", "CO");
put("Comoros", "KM");
put("Cook Islands", "CK");
put("Costa Rica", "CR");
put("Croatia", "HR");
put("Cuba", "CU");
put("Cyprus", "CY");
put("Czech Republic", "CZ");
put("Democratic Republic of the Congo", "CD");
put("Denmark", "DK");
put("Djibouti", "DJ");
put("Dominica", "DM");
put("Dominican Republic", "DO");
put("East Timor", "TL");
put("Ecuador", "EC");
put("Egypt", "EG");
put("El Salvador", "SV");
put("Equatorial Guinea", "GQ");
put("Eritrea", "ER");
put("Estonia", "EE");
put("Ethiopia", "ET");
put("Falkland Islands", "FK");
put("Faroe Islands", "FO");
put("Fiji", "FJ");
put("Finland", "FI");
put("France", "FR");
put("French Guiana", "GF");
put("French Polynesia", "PF");
put("French Southern Territories", "TF");
put("Gabon", "GA");
put("Gambia", "GM");
put("Georgia", "GE");
put("Germany", "DE");
put("Ghana", "GH");
put("Gibraltar", "GI");
put("Greece", "GR");
put("Greenland", "GL");
put("Grenada", "GD");
put("Guadeloupe", "GP");
put("Guam", "GU");
put("Guatemala", "GT");
put("Guernsey", "GG");
put("Guinea", "GN");
put("Guinea-Bissau", "GW");
put("Guyana", "GY");
put("Haiti", "HT");
put("Heard Island and McDonald Islands", "HM");
put("Honduras", "HN");
put("Hong Kong", "HK");
put("Hungary", "HU");
put("Iceland", "IS");
put("India", "IN");
put("Indonesia", "ID");
put("Iran", "IR");
put("Iraq", "IQ");
put("Ireland", "IE");
put("Isle of Man", "IM");
put("Israel", "IL");
put("Italy", "IT");
put("Ivory Coast", "CI");
put("Jamaica", "JM");
put("Japan", "JP");
put("Jersey", "JE");
put("Jordan", "JO");
put("Kazakhstan", "KZ");
put("Kenya", "KE");
put("Kiribati", "KI");
put("Kosovo", "XK");
put("Kuwait", "KW");
put("Kyrgyzstan", "KG");
put("Laos", "LA");
put("Latvia", "LV");
put("Lebanon", "LB");
put("Lesotho", "LS");
put("Liberia", "LR");
put("Libya", "LY");
put("Liechtenstein", "LI");
put("Lithuania", "LT");
put("Luxembourg", "LU");
put("Macao", "MO");
put("Macedonia", "MK");
put("Madagascar", "MG");
put("Malawi", "MW");
put("Malaysia", "MY");
put("Maldives", "MV");
put("Mali", "ML");
put("Malta", "MT");
put("Marshall Islands", "MH");
put("Martinique", "MQ");
put("Mauritania", "MR");
put("Mauritius", "MU");
put("Mayotte", "YT");
put("Mexico", "MX");
put("Micronesia", "FM");
put("Moldova", "MD");
put("Monaco", "MC");
put("Mongolia", "MN");
put("Montenegro", "ME");
put("Montserrat", "MS");
put("Morocco", "MA");
put("Mozambique", "MO");
put("Myanmar", "MM");
put("Namibia", "NA");
put("Nauru", "NR");
put("Nepal", "NP");
put("Netherlands", "NL");
//put("Netherlands Antilles", "AN");
put("New Caledonia", "NC");
put("New Zealand", "NZ");
put("Nicaragua", "NI");
put("Niger", "NE");
put("Nigeria", "NG");
put("Niue", "NU");
put("Norfolk Island", "NF");
put("Northern Mariana Islands", "MP");
put("North Korea", "KP");
put("Norway", "NO");
put("Oman", "OM");
put("Pakistan", "PK");
put("Palau", "PW");
put("Palestinian Territory", "PS");
put("Panama", "PA");
put("Papua New Guinea", "PG");
put("Paraguay", "PY");
put("Peru", "PE");
put("Philippines", "PH");
put("Pitcairn", "PN");
put("Poland", "PL");
put("Portugal", "PT");
put("Puerto Rico", "PR");
put("Qatar", "QA");
put("Republic of the Congo", "CG");
put("Reunion", "RE");
put("Romania", "RO");
put("Russia", "RU");
put("Rwanda", "RW");
put("Saint Barthélemy", "BL");
put("Saint Helena", "SH");
put("Saint Kitts and Nevis", "KN");
put("Saint Lucia", "LC");
put("Saint Martin", "MF");
put("Saint Pierre and Miquelon", "PM");
put("Saint Vincent and the Grenadines", "VC");
put("Samoa", "WS");
put("San Marino", "SM");
put("Sao Tome and Principe", "ST");
put("Saudi Arabia", "SA");
put("Senegal", "SN");
put("Serbia", "RS");
//put("Serbia and Montenegro", "CS");
put("Seychelles", "SC");
put("Sierra Leone", "SL");
put("Singapore", "SG");
put("Slovakia", "SK");
put("Slovenia", "SI");
put("Solomon Islands", "SB");
put("Somalia", "SO");
put("South Africa", "ZA");
put("South Georgia and the South Sandwich Islands", "GS");
put("South Korea", "KR");
put("Spain", "ES");
put("Sri Lanka", "LK");
put("Sudan", "SD");
put("Suriname", "SR");
put("Svalbard and Jan Mayen", "SJ");
put("Swaziland", "SZ");
put("Sweden", "SE");
put("Switzerland", "CH");
put("Syria", "SY");
put("Taiwan", "TW");
put("Tajikistan", "TJ");
put("Tanzania", "TZ");
put("Thailand", "TH");
put("Togo", "TG");
put("Tokelau", "TK");
put("Tonga", "TO");
put("Trinidad and Tobago", "TT");
put("Tunisia", "TN");
put("Turkey", "TR");
put("Turkmenistan", "TM");
put("Turks and Caicos Islands", "TC");
put("Tuvalu", "TV");
put("Uganda", "UG");
put("Ukraine", "UA");
put("United Arab Emirates", "AE");
put("United Kingdom", "GB");
put("United States", "US");
put("United States Minor Outlying Islands", "UM");
put("Uruguay", "UY");
put("U.S. Virgin Islands", "VI");
put("Uzbekistan", "UZ");
put("Vanuatu", "VU");
put("Vatican", "VA");
put("Venezuela", "VE");
put("Vietnam", "VN");
put("Wallis and Futuna", "WF");
put("Western Sahara", "EH");
put("Yemen", "YE");
put("Zambia", "ZM");
put("Zimbabwe", "ZW");
}
};
public static Collection<String> getCountryCodes(){
return countriesnameToCountryCodeMap.values();
}
public static ArrayList<String> sortedCountriesName = new ArrayList<String>(CountriesStaticData.countriesnameToCountryCodeMap.keySet()) {
private static final long serialVersionUID = 1671688713929233996L;
{
Collections.sort(this);
}
};
/**
* @return the sortedCountriesName
*/
public static List<String> getSortedCountriesPopularity() {
return countryCodeSortedByPopularity;
}
public static int getNumberOfCountries(){
return sortedCountriesName.size();
}
public static String getCountryCodeFromCountryName(String countryname) {
return countriesnameToCountryCodeMap.get(countryname);
}
/**
* @param position the position in the sorted list (starts from 0)
* @return the country code for the given position, in the sorted @link {@value #sortedCountriesName}
* @throws IllegalArgumentException if position is negative
* @throws IndexOutOfBoundsException if position is too high
* * @see {@link #getNumberOfCountries()}
*/
public static String getCountryCodeFromPosition(int position) {
if (position<0){
throw new IllegalArgumentException("position should be positive or null");
}
return getCountryCodeFromCountryName(getCountryNameFromPosition(position));
}
/**
* @param position the position in the {@value #sortedCountriesName} (starts from 0)
* @return the country name for the given position, in the sorted @link {@value #sortedCountriesName}
* * @throws IllegalArgumentException if position is negative
* @throws IndexOutOfBoundsException if position is too high
* @see {@link #getNumberOfCountries()}
*/
public static String getCountryNameFromPosition(int position) {
if (position<0){
throw new IllegalArgumentException("position should be positive or null");
}
return sortedCountriesName.get(position);
}
/**
* @param countryCode the country code (iso 3166 alpha2)
* @return the country name
*/
public static String getCountryNameFromCountryCode(String countryCode) {
for (Entry<String, String> entry : countriesnameToCountryCodeMap.entrySet()) {
if (entry.getValue().equalsIgnoreCase(countryCode)) {
return entry.getKey();
}
}
return null;
}
/**
* @param countryCode the country code (iso 3166 alpha2)
* @return the position in the sortedCountryList. starts at 0
*/
public static int getPositionFromCountryCode(String countryCode) {
int position = 0;
String countryNameToSearch = getCountryNameFromCountryCode(countryCode);
for (String country : sortedCountriesName) {
if (country.equalsIgnoreCase(countryNameToSearch)) {
return position;
}
position++;
}
return 0;
}
}