There are 246 countries in ISO 3166, you can receive a large amount of relay in response to this. I prefer to use an XML file with a list of countries, you can download it from http://www.iso.org/ and download them (for example, when the application starts). Then, since you need them in GWT, load them back as an RPC call, but don't forget to cache them (some kind of lazy load) so that you don't finish loading them every time. I think that this will be better in any case than containing them in the code, since you will finish loading the full list every time you access the module, even if the user does not need to use this list.
So, you need something that will hold the country:
public class Country { private final String name; private final String code; public Country(String name, String code) { this.name = name; this.code = code; } public String getName() { return name; } public String getCode() { return code; } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } Country country = (Country) obj; return code.equals(country.code); } public int hashCode() { return code.hashCode(); } }
For GWT, this class will need to implement IsSerializable. And you can download them server side using:
import java.util.ArrayList; import java.util.List; import java.io.InputStream; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class CountriesService { private static final String EL_COUNTRY = "ISO_3166-1_Entry"; private static final String EL_COUNTRY_NAME = "ISO_3166-1_Country_name"; private static final String EL_COUNTRY_CODE = "ISO_3166-1_Alpha-2_Code_element"; private List<Country> countries = new ArrayList<Country>(); public CountriesService(InputStream countriesList) { parseCountriesList(countriesList); } public List<Country> getCountries() { return countries; } private void parseCountriesList(InputStream countriesList) { countries.clear(); try { Document document = parse(countriesList); Element root = document.getRootElement(); //noinspection unchecked Iterator<Element> i = root.elementIterator(EL_COUNTRY); while (i.hasNext()) { Element countryElement = i.next(); Element countryName = countryElement.element(EL_COUNTRY_NAME); Element countryCode = countryElement.element(EL_COUNTRY_CODE); String countryname = countryName.getText(); countries.add(new Country(countryname, countryCode.getText())); } } catch (DocumentException e) { log.error(e, "Cannot read countries list"); } catch (IOException e) { log.error(e, "Cannot read countries list"); } } public static Document parse(InputStream inputStream) throws DocumentException { SAXReader reader = new SAXReader(); return reader.read(inputStream); } }
Of course, if you need to find a country using the ISO 2 letter code, you probably want to change the list to a map. If, as you mentioned, you need individual countries by continent, you can extend the XML from ISO 3166 and add your own elements. Just check them out (ISO site).
Konrad
source share