package org.jboss.seam.international; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.TimeZone; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.annotations.Unwrap; import org.jboss.seam.annotations.Create; /** * <p>Seam component that provides a list of time zones, limited to time zones * with IDs in the form Continent/Place, excluding deprecated three-letter time * zone IDs. The time zones returned have a fixed offset from UTC, which takes * daylight savings time into account. For example, Europe/Amsterdam is UTC+1; * in winter this is GMT+1 and in summer GMT+2.</p> * * <p>The time zone objects returned are wrapped in an implementation of * TimeZone that provides a more friendly interface for accessing the time zone * information. In particular, this type provides a more bean-friend property * for the time zone id (id than ID) and provides a convenience property named * label that formats the time zone for display in the UI. This wrapper can be * disabled by setting the component property wrap to false.</p> * * @author Peter Hilton, Lunatech Research * @author Dan Allen */ @Scope(ScopeType.APPLICATION) @Name("org.jboss.seam.international.timeZones") public class TimeZones { private static final String TIMEZONE_ID_PREFIXES = "^(Africa|America|Asia|Atlantic|Australia|Europe|Indian|Pacific)/.*"; private boolean wrap = true; private List<TimeZone> timeZones = null; @Create public void init() { timeZones = new ArrayList<TimeZone>(); final String[] timeZoneIds = TimeZone.getAvailableIDs(); for (final String id : timeZoneIds) { if (id.matches(TIMEZONE_ID_PREFIXES)) { timeZones.add(wrap ? new TimeZoneWrapper(TimeZone.getTimeZone(id)) : TimeZone.getTimeZone(id)); } } Collections.sort(timeZones, new Comparator<TimeZone>() { public int compare(final TimeZone a, final TimeZone b) { return a.getID().compareTo(b.getID()); } }); } @Unwrap public List<TimeZone> getTimeZones() { return timeZones; } public boolean isWrap() { return wrap; } public void setWrap(boolean wrap) { this.wrap = wrap; } }