В ISO 3166 есть 246 стран, вы можете получить большое количество перечислений. Я предпочитаю использовать XML-файл со списком стран, вы можете загрузить его из http://www.iso.org/ и загрузить его (например, при запуске приложения).
Затем, когда они вам понадобятся в GWT, загрузите их обратно как вызов RPC, но не забывайте кэшировать их (какая-то ленивая загрузка), чтобы не заканчивать их загрузку каждый раз.
Я думаю, что это было бы в любом случае лучше, чем держать их в коде, так как вы закончите с загрузкой полного списка при каждом доступе к модулю, даже если пользователю не нужно будет использовать этот список.
Итак, вам нужно что-то, что будет содержать страну:
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();
}
}
Для GWT этот класс должен реализовывать IsSerializable.
И вы можете загрузить их на стороне сервера, используя:
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);
}
}
Конечно, если вам нужно найти страну по буквенному коду ISO 2, вы, возможно, захотите изменить Список на Карту, вероятно.
Если, как вы упомянули, вам нужны отдельные страны по континентам, вы можете расширить XML с ISO 3166 и добавить свои собственные элементы. Просто проверьте их (ISO сайт) лицензию.