src/share/classes/sun/util/calendar/ZoneInfo.java

Print this page

        

*** 28,41 **** --- 28,43 ---- import java.io.IOException; import java.io.ObjectInputStream; import java.lang.ref.SoftReference; import java.security.AccessController; import java.util.ArrayList; + import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Map; + import java.util.Set; import java.util.SimpleTimeZone; import java.util.TimeZone; /** * <code>ZoneInfo</code> is an implementation subclass of {@link
*** 76,98 **** private static final int DST_NSHIFT = 4; // this bit field is reserved for abbreviation support private static final long ABBR_MASK = 0xf00L; private static final int TRANSITION_NSHIFT = 12; - // Flag for supporting JDK backward compatible IDs, such as "EST". - static final boolean USE_OLDMAPPING; - static { - String oldmapping = AccessController.doPrivileged( - new sun.security.action.GetPropertyAction("sun.timezone.ids.oldmapping", "false")).toLowerCase(Locale.ROOT); - USE_OLDMAPPING = (oldmapping.equals("yes") || oldmapping.equals("true")); - } - - // IDs having conflicting data between Olson and JDK 1.1 - static final String[] conflictingIDs = { - "EST", "MST", "HST" - }; - private static final CalendarSystem gcal = CalendarSystem.getGregorianCalendar(); /** * The raw GMT offset in milliseconds between this zone and GMT. * Negative offsets are to the west of Greenwich. To obtain local --- 78,87 ----
*** 570,590 **** * Gets all available IDs supported in the Java run-time. * * @return an array of time zone IDs. */ public static String[] getAvailableIDs() { ! List<String> idList = ZoneInfoFile.getZoneIDs(); ! List<String> excluded = ZoneInfoFile.getExcludedZones(); ! if (excluded != null) { ! // List all zones from the idList and excluded lists ! List<String> list = new ArrayList<>(idList.size() + excluded.size()); ! list.addAll(idList); ! list.addAll(excluded); ! idList = list; ! } ! String[] ids = new String[idList.size()]; ! return idList.toArray(ids); } /** * Gets all available IDs that have the same value as the * specified raw GMT offset. --- 559,570 ---- * Gets all available IDs supported in the Java run-time. * * @return an array of time zone IDs. */ public static String[] getAvailableIDs() { ! Set<String> idSet = ZoneInfoFile.getZoneIds(); ! return idSet.toArray(new String[idSet.size()]); } /** * Gets all available IDs that have the same value as the * specified raw GMT offset.
*** 593,641 **** * value should not include any daylight saving time. * * @return an array of time zone IDs. */ public static String[] getAvailableIDs(int rawOffset) { ! String[] result; ! List<String> matched = new ArrayList<>(); ! List<String> IDs = ZoneInfoFile.getZoneIDs(); ! int[] rawOffsets = ZoneInfoFile.getRawOffsets(); ! ! loop: ! for (int index = 0; index < rawOffsets.length; index++) { ! if (rawOffsets[index] == rawOffset) { ! byte[] indices = ZoneInfoFile.getRawOffsetIndices(); ! for (int i = 0; i < indices.length; i++) { ! if (indices[i] == index) { ! matched.add(IDs.get(i++)); ! while (i < indices.length && indices[i] == index) { ! matched.add(IDs.get(i++)); ! } ! break loop; ! } ! } ! } ! } ! ! // We need to add any zones from the excluded zone list that ! // currently have the same GMT offset as the specified ! // rawOffset. The zones returned by this method may not be ! // correct as of return to the caller if any GMT offset ! // transition is happening during this GMT offset checking... ! List<String> excluded = ZoneInfoFile.getExcludedZones(); ! if (excluded != null) { ! for (String id : excluded) { ! TimeZone zi = getTimeZone(id); ! if (zi != null && zi.getRawOffset() == rawOffset) { ! matched.add(id); ! } ! } ! } ! ! result = new String[matched.size()]; ! matched.toArray(result); ! return result; } /** * Gets the ZoneInfo for the given ID. * --- 573,583 ---- * value should not include any daylight saving time. * * @return an array of time zone IDs. */ public static String[] getAvailableIDs(int rawOffset) { ! return ZoneInfoFile.getZoneIds(rawOffset); } /** * Gets the ZoneInfo for the given ID. *
*** 643,690 **** * * @return the specified ZoneInfo object, or null if there is no * time zone of the ID. */ public static TimeZone getTimeZone(String ID) { ! String givenID = null; ! ! /* ! * If old JDK compatibility is specified, get the old alias ! * name. ! */ ! if (USE_OLDMAPPING) { ! String compatibleID = TzIDOldMapping.MAP.get(ID); ! if (compatibleID != null) { ! givenID = ID; ! ID = compatibleID; ! } ! } ! ! ZoneInfo zi = ZoneInfoFile.getZoneInfo(ID); ! if (zi == null) { ! // if we can't create an object for the ID, try aliases. ! try { ! Map<String, String> map = getAliasTable(); ! String alias = ID; ! while ((alias = map.get(alias)) != null) { ! zi = ZoneInfoFile.getZoneInfo(alias); ! if (zi != null) { ! zi.setID(ID); ! zi = ZoneInfoFile.addToCache(ID, zi); ! zi = (ZoneInfo) zi.clone(); ! break; ! } ! } ! } catch (Exception e) { ! // ignore exceptions ! } ! } ! ! if (givenID != null && zi != null) { ! zi.setID(givenID); ! } ! return zi; } private transient SimpleTimeZone lastRule; /** --- 585,595 ---- * * @return the specified ZoneInfo object, or null if there is no * time zone of the ID. */ public static TimeZone getTimeZone(String ID) { ! return ZoneInfoFile.getZoneInfo(ID); } private transient SimpleTimeZone lastRule; /**
*** 809,853 **** return false; } return (checksum == ((ZoneInfo)other).checksum); } - private static SoftReference<Map<String, String>> aliasTable; - - static Map<String, String> getCachedAliasTable() { - Map<String, String> aliases = null; - - SoftReference<Map<String, String>> cache = aliasTable; - if (cache != null) { - aliases = cache.get(); - } - return aliases; - } - /** * Returns a Map from alias time zone IDs to their standard * time zone IDs. * * @return the Map that holds the mappings from alias time zone IDs * to their standard time zone IDs, or null if * <code>ZoneInfoMappings</code> file is not available. */ ! public synchronized static Map<String, String> getAliasTable() { ! Map<String, String> aliases = getCachedAliasTable(); ! if (aliases == null) { ! aliases = ZoneInfoFile.getZoneAliases(); ! if (aliases != null) { ! if (!USE_OLDMAPPING) { ! // Remove the conflicting IDs from the alias table. ! for (String key : conflictingIDs) { ! aliases.remove(key); ! } ! } ! aliasTable = new SoftReference<Map<String, String>>(aliases); ! } ! } ! return aliases; } private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); --- 714,733 ---- return false; } return (checksum == ((ZoneInfo)other).checksum); } /** * Returns a Map from alias time zone IDs to their standard * time zone IDs. * * @return the Map that holds the mappings from alias time zone IDs * to their standard time zone IDs, or null if * <code>ZoneInfoMappings</code> file is not available. */ ! public static Map<String, String> getAliasTable() { ! return ZoneInfoFile.getAliasMap(); } private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject();