package org.appfuse.webapp.action;
import org.appfuse.model.LabelValue;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
public class CountryModel {
private Map<String, String> availableCountries;
/**
* Build a List of LabelValues for all the available countries. Uses
* the two letter uppercase ISO name of the country as the value and the
* localized country name as the label.
*
* @param locale The Locale used to localize the country names.
*
* @return List of LabelValues for all available countries.
*/
@SuppressWarnings("unchecked")
public Map<String, String> getCountries(Locale locale) {
if (availableCountries == null) {
final String EMPTY = "";
final Locale[] available = Locale.getAvailableLocales();
List<LabelValue> countries = new ArrayList<LabelValue>();
countries.add(new LabelValue("",""));
for (Locale anAvailable : available) {
final String iso = anAvailable.getCountry();
final String name = anAvailable.getDisplayCountry(locale);
if (!EMPTY.equals(iso) && !EMPTY.equals(name)) {
LabelValue country = new LabelValue(name, iso);
if (!countries.contains(country)) {
countries.add(new LabelValue(name, iso));
}
}
}
Collections.sort(countries, new LabelValueComparator(locale));
Map<String, String> options = new LinkedHashMap<String, String>();
// loop through and convert list to a JSF-Friendly Map for a <select>
for (Object country : countries) {
LabelValue option = (LabelValue) country;
if (!options.containsValue(option.getValue())) {
options.put(option.getLabel(), option.getValue());
}
}
this.availableCountries = options;
}
return availableCountries;
}
/**
* Class to compare LabelValues using their labels with
* locale-sensitive behaviour.
*/
public class LabelValueComparator implements Comparator {
private Comparator<Object> c;
/**
* Creates a new LabelValueComparator object.
*
* @param locale The Locale used for localized String comparison.
*/
public LabelValueComparator(Locale locale) {
c = Collator.getInstance(locale);
}
/**
* Compares the localized labels of two LabelValues.
*
* @param o1 The first LabelValue to compare.
* @param o2 The second LabelValue to compare.
*
* @return The value returned by comparing the localized labels.
*/
public final int compare(Object o1, Object o2) {
LabelValue lhs = (LabelValue) o1;
LabelValue rhs = (LabelValue) o2;
return c.compare(lhs.getLabel(), rhs.getLabel());
}
}
}