Ci sono 246 paesi in ISO 3166, si potrebbe ottenere un grande enum relè su questo. Preferisco utilizzare il file XML con l'elenco dei Paesi, puoi scaricarne uno da http://www.iso.org/ e caricarlo (ad es. Quando l'app è in fase di avvio). Quindi, poiché sono necessari in GWT, caricarli di nuovo come richiami RPC, ma ricordarsi di memorizzarli nella cache (una sorta di caricamento lento) in modo che non si finisca di caricarli ogni volta. Penso che sarebbe comunque meglio che tenerli in codice, dato che finirai con il caricamento dell'elenco completo ogni volta che si accede al modulo, anche se l'utente non avrà bisogno di usare questo elenco.
Quindi avete bisogno di qualcosa che terrà Paese:
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();
}
}
Per GWT questa classe avrebbe bisogno di implementare IsSerializable. E si può caricare chi, sul lato server utilizzando:
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);
}
}
Naturalmente, se avete bisogno di trovare paese Codice ISO del 2 lettera si potrebbe abituato a cambiare List per Mappa probabilmente. Se, come hai detto, hai bisogno di paesi separati per continente, potresti estendere XML da ISO 3166 e aggiungere i tuoi elementi. Basta controllare la loro licenza (sito Web ISO).
Alcuni paesi appartengono a due continenti (in Europa, Turchia, Russia e Kazakistan), un rapporto M: N – mjn
è il loro problema :). nessuno vorrà comunque utilizzare quei 3 paesi, e se lo fanno possono cercarli in ordine alfabetico anziché per regione –
in modo da sapere quali paesi non saranno "usati"? devi essere un vero esperto ... – mjn