jdk/src/share/classes/sun/util/calendar/ZoneInfoFile.java
author sherman
Wed, 13 Feb 2013 11:49:34 -0800
changeset 15665 2223468cd706
parent 15658 55b829ca2334
child 16852 60207b2b4b42
permissions -rw-r--r--
8008161: Regression: j.u.TimeZone.getAvailableIDs(rawOffset) returns non-sorted list Summary: to return a sorted list Reviewed-by: lancea, naoto
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
     2
 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4194
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4194
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4194
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4194
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4194
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
package sun.util.calendar;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    28
import java.io.ByteArrayInputStream;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    29
import java.io.DataInput;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    30
import java.io.DataInputStream;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    31
import java.io.File;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    32
import java.io.IOException;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    33
import java.io.StreamCorruptedException;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    34
import java.security.AccessController;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    35
import java.security.PrivilegedAction;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    36
import java.time.DayOfWeek;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    37
import java.time.LocalDateTime;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    38
import java.time.LocalTime;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    39
import java.time.Month;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    40
import java.time.OffsetDateTime;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    41
import java.time.ZoneOffset;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    42
import java.time.zone.ZoneRules;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    43
import java.time.zone.ZoneOffsetTransition;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    44
import java.time.zone.ZoneOffsetTransitionRule;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    45
import java.time.zone.ZoneOffsetTransitionRule.TimeDefinition;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    46
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    47
import java.util.ArrayList;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    48
import java.util.Arrays;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    49
import java.util.Calendar;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    50
import java.util.Collections;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    51
import java.util.HashMap;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    52
import java.util.List;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    53
import java.util.Locale;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    54
import java.util.Map;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    55
import java.util.Map.Entry;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    56
import java.util.Objects;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    57
import java.util.Set;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    58
import java.util.SimpleTimeZone;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    59
import java.util.concurrent.ConcurrentHashMap;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    60
import java.util.zip.CRC32;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    61
import java.util.zip.ZipFile;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    62
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
/**
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    64
 * Loads TZDB time-zone rules for j.u.TimeZone
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    65
 * <p>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    66
 * @since 1.8
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    67
 */
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    68
public final class ZoneInfoFile {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    69
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    70
    /**
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    71
     * Gets all available IDs supported in the Java run-time.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    72
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    73
     * @return a set of time zone IDs.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    74
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    75
    public static Set<String> getZoneIds() {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    76
        return zones.keySet();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    77
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
    /**
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    80
     * Gets all available IDs that have the same value as the
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    81
     * specified raw GMT offset.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    82
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    83
     * @param rawOffset  the GMT offset in milliseconds. This
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    84
     *                   value should not include any daylight saving time.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    85
     * @return an array of time zone IDs.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    86
     */
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    87
    public static String[] getZoneIds(int rawOffset) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    88
        List<String> ids = new ArrayList<>();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    89
        for (String id : zones.keySet()) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    90
            ZoneInfo zi = getZoneInfo0(id);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    91
            if (zi.getRawOffset() == rawOffset) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    92
                ids.add(id);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    93
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    94
        }
15665
2223468cd706 8008161: Regression: j.u.TimeZone.getAvailableIDs(rawOffset) returns non-sorted list
sherman
parents: 15658
diff changeset
    95
        // It appears the "zi" implementation returns the
2223468cd706 8008161: Regression: j.u.TimeZone.getAvailableIDs(rawOffset) returns non-sorted list
sherman
parents: 15658
diff changeset
    96
        // sorted list, though the specification does not
2223468cd706 8008161: Regression: j.u.TimeZone.getAvailableIDs(rawOffset) returns non-sorted list
sherman
parents: 15658
diff changeset
    97
        // specify it. Keep the same behavior for better
2223468cd706 8008161: Regression: j.u.TimeZone.getAvailableIDs(rawOffset) returns non-sorted list
sherman
parents: 15658
diff changeset
    98
        // compatibility.
2223468cd706 8008161: Regression: j.u.TimeZone.getAvailableIDs(rawOffset) returns non-sorted list
sherman
parents: 15658
diff changeset
    99
        String[] list = ids.toArray(new String[ids.size()]);
2223468cd706 8008161: Regression: j.u.TimeZone.getAvailableIDs(rawOffset) returns non-sorted list
sherman
parents: 15658
diff changeset
   100
        Arrays.sort(list);
2223468cd706 8008161: Regression: j.u.TimeZone.getAvailableIDs(rawOffset) returns non-sorted list
sherman
parents: 15658
diff changeset
   101
        return list;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   102
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   104
    public static ZoneInfo getZoneInfo(String zoneId) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   105
        if (!zones.containsKey(zoneId)) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   106
            return null;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   107
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   108
        // ZoneInfo is mutable, return the copy
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   110
        ZoneInfo zi = getZoneInfo0(zoneId);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   111
        zi = (ZoneInfo)zi.clone();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   112
        zi.setID(zoneId);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   113
        return zi;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   114
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
    /**
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   117
     * Returns a Map from alias time zone IDs to their standard
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   118
     * time zone IDs.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   119
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   120
     * @return an unmodified alias mapping
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
     */
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   122
    public static Map<String, String> getAliasMap() {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   123
        return aliases;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   124
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   125
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
    /**
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   127
     * Gets the version of this tz data.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   128
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   129
     * @return the tzdb version
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
     */
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   131
    public static String getVersion() {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   132
        return versionId;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   134
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   136
     * Gets a ZoneInfo with the given GMT offset. The object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   137
     * has its ID in the format of GMT{+|-}hh:mm.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   138
     *
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   139
     * @param originalId  the given custom id (before normalized such as "GMT+9")
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   140
     * @param gmtOffset   GMT offset <em>in milliseconds</em>
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   141
     * @return a ZoneInfo constructed with the given GMT offset
90ce3da70b43 Initial load
duke
parents:
diff changeset
   142
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   143
    public static ZoneInfo getCustomTimeZone(String originalId, int gmtOffset) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   144
        String id = toCustomID(gmtOffset);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   145
        return new ZoneInfo(id, gmtOffset);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   146
/*
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   147
        ZoneInfo zi = getFromCache(id);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   148
        if (zi == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   149
            zi = new ZoneInfo(id, gmtOffset);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   150
            zi = addToCache(id, zi);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   151
            if (!id.equals(originalId)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
                zi = addToCache(originalId, zi);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   153
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   154
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   155
        return (ZoneInfo) zi.clone();
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   156
*/
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
    public static String toCustomID(int gmtOffset) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   160
        char sign;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
        int offset = gmtOffset / 60000;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   162
90ce3da70b43 Initial load
duke
parents:
diff changeset
   163
        if (offset >= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   164
            sign = '+';
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   166
            sign = '-';
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
            offset = -offset;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   168
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   169
        int hh = offset / 60;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   170
        int mm = offset % 60;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   171
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
        char[] buf = new char[] { 'G', 'M', 'T', sign, '0', '0', ':', '0', '0' };
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
        if (hh >= 10) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
            buf[4] += hh / 10;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
        buf[5] += hh % 10;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
        if (mm != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
            buf[7] += mm / 10;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
            buf[8] += mm % 10;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
        return new String(buf);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   185
    ///////////////////////////////////////////////////////////
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   187
    private static ZoneInfo getZoneInfo0(String zoneId) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   190
            Object obj = zones.get(zoneId);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   191
            if (obj instanceof byte[]) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   192
                byte[] bytes = (byte[]) obj;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   193
                DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes));
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   194
                obj = getZoneInfo(dis, zoneId);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   195
                zones.put(zoneId, obj);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   196
            }
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   197
            return (ZoneInfo)obj;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   198
        } catch (Exception ex) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   199
            throw new RuntimeException("Invalid binary time-zone data: TZDB:" +
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   200
                zoneId + ", version: " + versionId, ex);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   202
    }
11130
c7093e306a34 7117487: Warnings Cleanup: some i18n classes in java.util and sun.util
okutsu
parents: 9025
diff changeset
   203
c7093e306a34 7117487: Warnings Cleanup: some i18n classes in java.util and sun.util
okutsu
parents: 9025
diff changeset
   204
    private ZoneInfoFile() {
c7093e306a34 7117487: Warnings Cleanup: some i18n classes in java.util and sun.util
okutsu
parents: 9025
diff changeset
   205
    }
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   206
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   207
    private static String versionId;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   208
    private final static Map<String, Object> zones = new ConcurrentHashMap<>();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   209
    private static Map<String, String> aliases = new HashMap<>();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   210
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   211
    // Flag for supporting JDK backward compatible IDs, such as "EST".
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   212
    private static final boolean USE_OLDMAPPING;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   213
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   214
    static {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   215
        String oldmapping = AccessController.doPrivileged(
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   216
            new sun.security.action.GetPropertyAction("sun.timezone.ids.oldmapping", "false")).toLowerCase(Locale.ROOT);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   217
        USE_OLDMAPPING = (oldmapping.equals("yes") || oldmapping.equals("true"));
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   218
        AccessController.doPrivileged(new PrivilegedAction<Object>() {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   219
            public Object run() {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   220
                try {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   221
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   222
                    String libDir = System.getProperty("java.home") + File.separator + "lib";
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   223
                    File tzdbJar = new File(libDir, "tzdb.jar");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   224
                    try (ZipFile zf = new ZipFile(tzdbJar);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   225
                        DataInputStream dis = new DataInputStream(
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   226
                            zf.getInputStream(zf.getEntry("TZDB.dat")))) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   227
                        load(dis);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   228
                    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   229
                } catch (Exception x) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   230
                    throw new Error(x);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   231
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   232
                return null;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   233
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   234
        });
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   235
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   236
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   237
    // Must be invoked after loading in all data
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   238
    private static void addOldMapping() {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   239
        String[][] oldMappings = new String[][] {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   240
            { "ACT", "Australia/Darwin" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   241
            { "AET", "Australia/Sydney" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   242
            { "AGT", "America/Argentina/Buenos_Aires" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   243
            { "ART", "Africa/Cairo" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   244
            { "AST", "America/Anchorage" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   245
            { "BET", "America/Sao_Paulo" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   246
            { "BST", "Asia/Dhaka" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   247
            { "CAT", "Africa/Harare" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   248
            { "CNT", "America/St_Johns" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   249
            { "CST", "America/Chicago" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   250
            { "CTT", "Asia/Shanghai" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   251
            { "EAT", "Africa/Addis_Ababa" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   252
            { "ECT", "Europe/Paris" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   253
            { "IET", "America/Indiana/Indianapolis" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   254
            { "IST", "Asia/Kolkata" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   255
            { "JST", "Asia/Tokyo" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   256
            { "MIT", "Pacific/Apia" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   257
            { "NET", "Asia/Yerevan" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   258
            { "NST", "Pacific/Auckland" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   259
            { "PLT", "Asia/Karachi" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   260
            { "PNT", "America/Phoenix" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   261
            { "PRT", "America/Puerto_Rico" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   262
            { "PST", "America/Los_Angeles" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   263
            { "SST", "Pacific/Guadalcanal" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   264
            { "VST", "Asia/Ho_Chi_Minh" },
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   265
        };
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   266
        for (String[] alias : oldMappings) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   267
            String k = alias[0];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   268
            String v = alias[1];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   269
            if (zones.containsKey(v)) {  // make sure we do have the data
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   270
                aliases.put(k, v);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   271
                zones.put(k, zones.get(v));
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   272
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   273
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   274
        if (USE_OLDMAPPING) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   275
            if (zones.containsKey("America/New_York")) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   276
                aliases.put("EST", "America/New_York");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   277
                zones.put("EST", zones.get("America/New_York"));
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   278
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   279
            if (zones.containsKey("America/Denver")) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   280
                aliases.put("MST", "America/Denver");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   281
                zones.put("MST", zones.get("America/Denver"));
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   282
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   283
            if (zones.containsKey("Pacific/Honolulu")) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   284
                aliases.put("HST", "Pacific/Honolulu");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   285
                zones.put("HST", zones.get("Pacific/Honolulu"));
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   286
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   287
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   288
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   289
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   290
    /**
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   291
     * Loads the rules from a DateInputStream
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   292
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   293
     * @param dis  the DateInputStream to load, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   294
     * @throws Exception if an error occurs
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   295
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   296
    private static void load(DataInputStream dis) throws ClassNotFoundException, IOException {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   297
        if (dis.readByte() != 1) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   298
            throw new StreamCorruptedException("File format not recognised");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   299
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   300
        // group
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   301
        String groupId = dis.readUTF();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   302
        if ("TZDB".equals(groupId) == false) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   303
            throw new StreamCorruptedException("File format not recognised");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   304
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   305
        // versions, only keep the last one
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   306
        int versionCount = dis.readShort();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   307
        for (int i = 0; i < versionCount; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   308
            versionId = dis.readUTF();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   309
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   310
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   311
        // regions
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   312
        int regionCount = dis.readShort();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   313
        String[] regionArray = new String[regionCount];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   314
        for (int i = 0; i < regionCount; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   315
            regionArray[i] = dis.readUTF();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   316
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   317
        // rules
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   318
        int ruleCount = dis.readShort();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   319
        Object[] ruleArray = new Object[ruleCount];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   320
        for (int i = 0; i < ruleCount; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   321
            byte[] bytes = new byte[dis.readShort()];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   322
            dis.readFully(bytes);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   323
            ruleArray[i] = bytes;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   324
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   325
        // link version-region-rules, only keep the last version, if more than one
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   326
        for (int i = 0; i < versionCount; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   327
            regionCount = dis.readShort();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   328
            zones.clear();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   329
            for (int j = 0; j < regionCount; j++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   330
                String region = regionArray[dis.readShort()];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   331
                Object rule = ruleArray[dis.readShort() & 0xffff];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   332
                zones.put(region, rule);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   333
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   334
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   335
        // remove the following ids from the map, they
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   336
        // are exclued from the "old" ZoneInfo
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   337
        zones.remove("ROC");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   338
        for (int i = 0; i < versionCount; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   339
            int aliasCount = dis.readShort();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   340
            aliases.clear();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   341
            for (int j = 0; j < aliasCount; j++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   342
                String alias = regionArray[dis.readShort()];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   343
                String region = regionArray[dis.readShort()];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   344
                aliases.put(alias, region);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   345
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   346
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   347
        // old us time-zone names
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   348
        addOldMapping();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   349
        aliases = Collections.unmodifiableMap(aliases);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   350
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   351
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   352
    /////////////////////////Ser/////////////////////////////////
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   353
    public static ZoneInfo getZoneInfo(DataInput in, String zoneId) throws Exception {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   354
        byte type = in.readByte();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   355
        // TBD: assert ZRULES:
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   356
        int stdSize = in.readInt();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   357
        long[] stdTrans = new long[stdSize];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   358
        for (int i = 0; i < stdSize; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   359
            stdTrans[i] = readEpochSec(in);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   360
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   361
        int [] stdOffsets = new int[stdSize + 1];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   362
        for (int i = 0; i < stdOffsets.length; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   363
            stdOffsets[i] = readOffset(in);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   364
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   365
        int savSize = in.readInt();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   366
        long[] savTrans = new long[savSize];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   367
        for (int i = 0; i < savSize; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   368
            savTrans[i] = readEpochSec(in);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   369
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   370
        int[] savOffsets = new int[savSize + 1];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   371
        for (int i = 0; i < savOffsets.length; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   372
            savOffsets[i] = readOffset(in);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   373
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   374
        int ruleSize = in.readByte();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   375
        ZoneOffsetTransitionRule[] rules = new ZoneOffsetTransitionRule[ruleSize];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   376
        for (int i = 0; i < ruleSize; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   377
            rules[i] = readZOTRule(in);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   378
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   379
        return getZoneInfo(zoneId, stdTrans, stdOffsets, savTrans, savOffsets, rules);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   380
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   381
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   382
    public static int readOffset(DataInput in) throws IOException {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   383
        int offsetByte = in.readByte();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   384
        return offsetByte == 127 ? in.readInt() : offsetByte * 900;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   385
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   386
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   387
    static long readEpochSec(DataInput in) throws IOException {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   388
        int hiByte = in.readByte() & 255;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   389
        if (hiByte == 255) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   390
            return in.readLong();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   391
        } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   392
            int midByte = in.readByte() & 255;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   393
            int loByte = in.readByte() & 255;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   394
            long tot = ((hiByte << 16) + (midByte << 8) + loByte);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   395
            return (tot * 900) - 4575744000L;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   396
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   397
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   398
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   399
    static ZoneOffsetTransitionRule readZOTRule(DataInput in) throws IOException {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   400
        int data = in.readInt();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   401
        Month month = Month.of(data >>> 28);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   402
        int dom = ((data & (63 << 22)) >>> 22) - 32;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   403
        int dowByte = (data & (7 << 19)) >>> 19;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   404
        DayOfWeek dow = dowByte == 0 ? null : DayOfWeek.of(dowByte);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   405
        int timeByte = (data & (31 << 14)) >>> 14;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   406
        TimeDefinition defn = TimeDefinition.values()[(data & (3 << 12)) >>> 12];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   407
        int stdByte = (data & (255 << 4)) >>> 4;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   408
        int beforeByte = (data & (3 << 2)) >>> 2;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   409
        int afterByte = (data & 3);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   410
        LocalTime time = (timeByte == 31 ? LocalTime.ofSecondOfDay(in.readInt()) : LocalTime.of(timeByte % 24, 0));
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   411
        ZoneOffset std = (stdByte == 255 ? ZoneOffset.ofTotalSeconds(in.readInt()) : ZoneOffset.ofTotalSeconds((stdByte - 128) * 900));
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   412
        ZoneOffset before = (beforeByte == 3 ? ZoneOffset.ofTotalSeconds(in.readInt()) : ZoneOffset.ofTotalSeconds(std.getTotalSeconds() + beforeByte * 1800));
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   413
        ZoneOffset after = (afterByte == 3 ? ZoneOffset.ofTotalSeconds(in.readInt()) : ZoneOffset.ofTotalSeconds(std.getTotalSeconds() + afterByte * 1800));
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   414
        return ZoneOffsetTransitionRule.of(month, dom, dow, time, timeByte == 24, defn, std, before, after);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   415
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   416
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   417
    /////////////////////////ZoneRules --> ZoneInfo/////////////////////////////////
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   418
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   419
    // ZoneInfo starts with UTC1900
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   420
    private static final long UTC1900 = -2208988800L;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   421
    // ZoneInfo ends with   UTC2037
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   422
    private static final long UTC2037 =
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   423
        LocalDateTime.of(2038, 1, 1, 0, 0, 0).toEpochSecond(ZoneOffset.UTC) - 1;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   424
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   425
    /* Get a ZoneInfo instance.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   426
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   427
     * @param standardTransitions  the standard transitions, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   428
     * @param standardOffsets  the standard offsets, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   429
     * @param savingsInstantTransitions  the standard transitions, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   430
     * @param wallOffsets  the wall offsets, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   431
     * @param lastRules  the recurring last rules, size 15 or less, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   432
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   433
    private static ZoneInfo getZoneInfo(String zoneId,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   434
                                        long[] standardTransitions,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   435
                                        int[] standardOffsets,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   436
                                        long[] savingsInstantTransitions,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   437
                                        int[] wallOffsets,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   438
                                        ZoneOffsetTransitionRule[] lastRules) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   439
        int rawOffset = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   440
        int dstSavings = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   441
        int checksum = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   442
        int[] params = null;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   443
        boolean willGMTOffsetChange = false;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   444
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   445
        // rawOffset, pick the last one
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   446
        if (standardTransitions.length > 0)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   447
            rawOffset = standardOffsets[standardOffsets.length - 1] * 1000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   448
        else
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   449
            rawOffset = standardOffsets[0] * 1000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   450
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   451
        // transitions, offsets;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   452
        long[] transitions = null;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   453
        int[]  offsets = null;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   454
        int    nOffsets = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   455
        int    nTrans = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   456
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   457
        if (savingsInstantTransitions.length != 0) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   458
            transitions = new long[250];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   459
            offsets = new int[100];    // TBD: ZoneInfo actually can't handle
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   460
                                       // offsets.length > 16 (4-bit index limit)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   461
            // last year in trans table
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   462
            // It should not matter to use before or after offset for year
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   463
            int lastyear = LocalDateTime.ofEpochSecond(
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   464
                savingsInstantTransitions[savingsInstantTransitions.length - 1], 0,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   465
                ZoneOffset.ofTotalSeconds(wallOffsets[savingsInstantTransitions.length - 1])).getYear();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   466
            // int lastyear = savingsLocalTransitions[savingsLocalTransitions.length - 1].getYear();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   467
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   468
            int i = 0, k = 1;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   469
            while (i < savingsInstantTransitions.length &&
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   470
                   savingsInstantTransitions[i] < UTC1900) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   471
                 i++;     // skip any date before UTC1900
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   472
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   473
            if (i < savingsInstantTransitions.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   474
                // javazic writes the last GMT offset into index 0!
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   475
                if (i < savingsInstantTransitions.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   476
                    offsets[0] = standardOffsets[standardOffsets.length - 1] * 1000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   477
                    nOffsets = 1;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   478
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   479
                // ZoneInfo has a beginning entry for 1900.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   480
                // Only add it if this is not the only one in table
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   481
                nOffsets = addTrans(transitions, nTrans++, offsets, nOffsets,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   482
                                    UTC1900,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   483
                                    wallOffsets[i],
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   484
                                    getStandardOffset(standardTransitions, standardOffsets, UTC1900));
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   485
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   486
            for (; i < savingsInstantTransitions.length; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   487
                //if (savingsLocalTransitions[i * 2].getYear() > LASTYEAR) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   488
                if (savingsInstantTransitions[i] > UTC2037) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   489
                    // no trans beyond LASTYEAR
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   490
                    lastyear = LASTYEAR;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   491
                    break;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   492
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   493
                long trans = savingsInstantTransitions[i];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   494
                while (k < standardTransitions.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   495
                    // some standard offset transitions don't exist in
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   496
                    // savingInstantTrans, if the offset "change" doesn't
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   497
                    // really change the "effectiveWallOffset". For example
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   498
                    // the 1999/2000 pair in Zone Arg/Buenos_Aires, in which
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   499
                    // the daylightsaving "happened" but it actually does
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   500
                    //  not result in the timezone switch. ZoneInfo however
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   501
                    // needs them in its transitions table
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   502
                    long trans_s = standardTransitions[k];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   503
                    if (trans_s >= UTC1900) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   504
                        if (trans_s > trans)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   505
                            break;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   506
                        if (trans_s < trans) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   507
                            if (nOffsets + 2 >= offsets.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   508
                                offsets = Arrays.copyOf(offsets, offsets.length + 100);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   509
                            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   510
                            if (nTrans + 1 >= transitions.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   511
                                transitions = Arrays.copyOf(transitions, transitions.length + 100);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   512
                            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   513
                            nOffsets = addTrans(transitions, nTrans++, offsets, nOffsets,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   514
                                                trans_s,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   515
                                                wallOffsets[i],
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   516
                                                standardOffsets[k+1]);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   517
                        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   518
                    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   519
                    k++;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   520
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   521
                if (nOffsets + 2 >= offsets.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   522
                    offsets = Arrays.copyOf(offsets, offsets.length + 100);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   523
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   524
                if (nTrans + 1 >= transitions.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   525
                    transitions = Arrays.copyOf(transitions, transitions.length + 100);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   526
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   527
                nOffsets = addTrans(transitions, nTrans++, offsets, nOffsets,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   528
                                    trans,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   529
                                    wallOffsets[i + 1],
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   530
                                    getStandardOffset(standardTransitions, standardOffsets, trans));
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   531
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   532
            // append any leftover standard trans
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   533
            while (k < standardTransitions.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   534
                long trans = standardTransitions[k];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   535
                if (trans >= UTC1900) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   536
                    int offset = wallOffsets[i];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   537
                    int offsetIndex = indexOf(offsets, 0, nOffsets, offset);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   538
                    if (offsetIndex == nOffsets)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   539
                        nOffsets++;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   540
                    transitions[nTrans++] = ((trans * 1000) << TRANSITION_NSHIFT) |
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   541
                                            (offsetIndex & OFFSET_MASK);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   542
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   543
                k++;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   544
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   545
            if (lastRules.length > 1) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   546
                // fill the gap between the last trans until LASTYEAR
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   547
                while (lastyear++ < LASTYEAR) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   548
                    for (ZoneOffsetTransitionRule zotr : lastRules) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   549
                        ZoneOffsetTransition zot = zotr.createTransition(lastyear);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   550
                        //long trans = zot.getDateTimeBefore().toEpochSecond();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   551
                        long trans = zot.toEpochSecond();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   552
                        if (nOffsets + 2 >= offsets.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   553
                            offsets = Arrays.copyOf(offsets, offsets.length + 100);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   554
                        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   555
                        if (nTrans + 1 >= transitions.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   556
                            transitions = Arrays.copyOf(transitions, transitions.length + 100);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   557
                        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   558
                        nOffsets = addTrans(transitions, nTrans++, offsets, nOffsets,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   559
                                            trans,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   560
                                            zot.getOffsetAfter().getTotalSeconds(),
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   561
                                            getStandardOffset(standardTransitions, standardOffsets, trans));
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   562
                    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   563
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   564
                ZoneOffsetTransitionRule startRule =  lastRules[lastRules.length - 2];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   565
                ZoneOffsetTransitionRule endRule =  lastRules[lastRules.length - 1];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   566
                params = new int[10];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   567
                if (startRule.getOffsetBefore().compareTo(startRule.getOffsetAfter()) < 0 &&
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   568
                    endRule.getOffsetBefore().compareTo(endRule.getOffsetAfter()) > 0) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   569
                    ZoneOffsetTransitionRule tmp;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   570
                    tmp = startRule;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   571
                    startRule = endRule;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   572
                    endRule = tmp;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   573
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   574
                params[0] = startRule.getMonth().getValue() - 1;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   575
                // params[1] = startRule.getDayOfMonthIndicator();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   576
                // params[2] = toCalendarDOW[startRule.getDayOfWeek().getValue()];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   577
                int       dom = startRule.getDayOfMonthIndicator();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   578
                DayOfWeek dow = startRule.getDayOfWeek();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   579
                if (dow == null) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   580
                    params[1] = startRule.getDayOfMonthIndicator();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   581
                    params[2] = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   582
                } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   583
                    // ZoneRulesBuilder adjusts < 0 case (-1, for last, don't have
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   584
                    // "<=" case yet) to positive value if not February (it appears
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   585
                    // we don't have February cutoff in tzdata table yet)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   586
                    // Ideally, if JSR310 can just pass in the nagative and
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   587
                    // we can then pass in the dom = -1, dow > 0 into ZoneInfo
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   588
                    //
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   589
                    // hacking, assume the >=24 is the result of ZRB optimization for
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   590
                    // "last", it works for now.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   591
                    if (dom < 0 || dom >= 24) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   592
                        params[1] = -1;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   593
                        params[2] = toCalendarDOW[dow.getValue()];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   594
                    } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   595
                        params[1] = dom;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   596
                        // To specify a day of week on or after an exact day of month,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   597
                        // set the month to an exact month value, day-of-month to the
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   598
                        // day on or after which the rule is applied, and day-of-week
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   599
                        // to a negative Calendar.DAY_OF_WEEK DAY_OF_WEEK field value.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   600
                        params[2] = -toCalendarDOW[dow.getValue()];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   601
                    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   602
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   603
                params[3] = startRule.getLocalTime().toSecondOfDay() * 1000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   604
                params[4] = toSTZTime[startRule.getTimeDefinition().ordinal()];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   605
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   606
                params[5] = endRule.getMonth().getValue() - 1;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   607
                // params[6] = endRule.getDayOfMonthIndicator();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   608
                // params[7] = toCalendarDOW[endRule.getDayOfWeek().getValue()];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   609
                dom = endRule.getDayOfMonthIndicator();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   610
                dow = endRule.getDayOfWeek();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   611
                if (dow == null) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   612
                    params[6] = dom;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   613
                    params[7] = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   614
                } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   615
                    // hacking: see comment above
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   616
                    if (dom < 0 || dom >= 24) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   617
                        params[6] = -1;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   618
                        params[7] = toCalendarDOW[dow.getValue()];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   619
                    } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   620
                        params[6] = dom;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   621
                        params[7] = -toCalendarDOW[dow.getValue()];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   622
                    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   623
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   624
                params[8] = endRule.getLocalTime().toSecondOfDay() * 1000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   625
                params[9] = toSTZTime[endRule.getTimeDefinition().ordinal()];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   626
                dstSavings = (startRule.getOffsetAfter().getTotalSeconds()
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   627
                             - startRule.getOffsetBefore().getTotalSeconds()) * 1000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   628
                // Note: known mismatching -> Asia/Amman
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   629
                // ZoneInfo :      startDayOfWeek=5     <= Thursday
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   630
                //                 startTime=86400000   <= 24 hours
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   631
                // This:           startDayOfWeek=6
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   632
                //                 startTime=0
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   633
                // Below is the workaround, it probably slows down everyone a little
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   634
                if (params[2] == 6 && params[3] == 0 && zoneId.equals("Asia/Amman")) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   635
                    params[2] = 5;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   636
                    params[3] = 86400000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   637
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   638
            } else if (nTrans > 0) {  // only do this if there is something in table already
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   639
                if (lastyear < LASTYEAR) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   640
                    // ZoneInfo has an ending entry for 2037
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   641
                    long trans = OffsetDateTime.of(LASTYEAR, Month.JANUARY.getValue(), 1, 0, 0, 0, 0,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   642
                                                   ZoneOffset.ofTotalSeconds(rawOffset/1000))
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   643
                                               .toEpochSecond();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   644
                    int offsetIndex = indexOf(offsets, 0, nOffsets, rawOffset/1000);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   645
                    if (offsetIndex == nOffsets)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   646
                        nOffsets++;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   647
                    transitions[nTrans++] = (trans * 1000) << TRANSITION_NSHIFT |
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   648
                                       (offsetIndex & OFFSET_MASK);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   649
                } else if (savingsInstantTransitions.length > 2) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   650
                    // Workaround: create the params based on the last pair for
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   651
                    // zones like Israel and Iran which have trans defined
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   652
                    // up until 2037, but no "transition rule" defined
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   653
                    //
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   654
                    // Note: Known mismatching for Israel, Asia/Jerusalem/Tel Aviv
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   655
                    // ZoneInfo:        startMode=3
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   656
                    //                  startMonth=2
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   657
                    //                  startDay=26
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   658
                    //                  startDayOfWeek=6
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   659
                    //
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   660
                    // This:            startMode=1
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   661
                    //                  startMonth=2
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   662
                    //                  startDay=27
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   663
                    //                  startDayOfWeek=0
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   664
                    // these two are actually the same for 2037, the SimpleTimeZone
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   665
                    // for the last "known" year
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   666
                    int m = savingsInstantTransitions.length;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   667
                    long startTrans = savingsInstantTransitions[m - 2];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   668
                    int startOffset = wallOffsets[m - 2 + 1];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   669
                    int startStd = getStandardOffset(standardTransitions, standardOffsets, startTrans);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   670
                    long endTrans =  savingsInstantTransitions[m - 1];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   671
                    int endOffset = wallOffsets[m - 1 + 1];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   672
                    int endStd = getStandardOffset(standardTransitions, standardOffsets, endTrans);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   673
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   674
                    if (startOffset > startStd && endOffset == endStd) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   675
                        /*
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   676
                        m = savingsLocalTransitions.length;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   677
                        LocalDateTime startLDT = savingsLocalTransitions[m -4];  //gap
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   678
                        LocalDateTime endLDT = savingsLocalTransitions[m - 1];   //over
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   679
                         */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   680
                        // last - 1 trans
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   681
                        m = savingsInstantTransitions.length - 2;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   682
                        ZoneOffset before = ZoneOffset.ofTotalSeconds(wallOffsets[m]);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   683
                        ZoneOffset after = ZoneOffset.ofTotalSeconds(wallOffsets[m + 1]);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   684
                        ZoneOffsetTransition trans = ZoneOffsetTransition.of(
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   685
                            LocalDateTime.ofEpochSecond(savingsInstantTransitions[m], 0, before),
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   686
                            before,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   687
                            after);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   688
                        LocalDateTime startLDT;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   689
                        if (trans.isGap()) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   690
                            startLDT = trans.getDateTimeBefore();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   691
                        } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   692
                            startLDT = trans.getDateTimeAfter();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   693
                        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   694
                        // last trans
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   695
                        m = savingsInstantTransitions.length - 1;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   696
                        before = ZoneOffset.ofTotalSeconds(wallOffsets[m]);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   697
                        after = ZoneOffset.ofTotalSeconds(wallOffsets[m + 1]);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   698
                        trans = ZoneOffsetTransition.of(
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   699
                            LocalDateTime.ofEpochSecond(savingsInstantTransitions[m], 0, before),
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   700
                            before,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   701
                            after);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   702
                        LocalDateTime endLDT;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   703
                        if (trans.isGap()) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   704
                            endLDT = trans.getDateTimeAfter();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   705
                        } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   706
                            endLDT = trans.getDateTimeBefore();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   707
                        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   708
                        params = new int[10];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   709
                        params[0] = startLDT.getMonthValue() - 1;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   710
                        params[1] = startLDT.getDayOfMonth();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   711
                        params[2] = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   712
                        params[3] = startLDT.toLocalTime().toSecondOfDay() * 1000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   713
                        params[4] = SimpleTimeZone.WALL_TIME;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   714
                        params[5] = endLDT.getMonthValue() - 1;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   715
                        params[6] = endLDT.getDayOfMonth();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   716
                        params[7] = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   717
                        params[8] = endLDT.toLocalTime().toSecondOfDay() * 1000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   718
                        params[9] = SimpleTimeZone.WALL_TIME;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   719
                        dstSavings = (startOffset - startStd) * 1000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   720
                    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   721
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   722
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   723
            if (transitions != null && transitions.length != nTrans) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   724
                if (nTrans == 0) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   725
                   transitions = null;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   726
                } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   727
                    transitions = Arrays.copyOf(transitions, nTrans);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   728
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   729
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   730
            if (offsets != null && offsets.length != nOffsets) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   731
                if (nOffsets == 0) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   732
                   offsets = null;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   733
                } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   734
                    offsets = Arrays.copyOf(offsets, nOffsets);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   735
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   736
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   737
            if (transitions != null) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   738
                Checksum sum = new Checksum();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   739
                for (i = 0; i < transitions.length; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   740
                    long val = transitions[i];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   741
                    int dst = (int)((val >>> DST_NSHIFT) & 0xfL);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   742
                    int saving = (dst == 0) ? 0 : offsets[dst];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   743
                    int index = (int)(val & OFFSET_MASK);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   744
                    int offset = offsets[index];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   745
                    long second = (val >> TRANSITION_NSHIFT);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   746
                    // javazic uses "index of the offset in offsets",
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   747
                    // instead of the real offset value itself to
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   748
                    // calculate the checksum. Have to keep doing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   749
                    // the same thing, checksum is part of the
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   750
                    // ZoneInfo serialization form.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   751
                    sum.update(second + index);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   752
                    sum.update(index);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   753
                    sum.update(dst == 0 ? -1 : dst);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   754
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   755
                checksum = (int)sum.getValue();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   756
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   757
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   758
        return new ZoneInfo(zoneId, rawOffset, dstSavings, checksum, transitions,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   759
                            offsets, params, willGMTOffsetChange);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   760
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   761
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   762
    private static int getStandardOffset(long[] standardTransitions,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   763
                                         int[] standardOffsets,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   764
                                         long epochSec) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   765
        int index  = Arrays.binarySearch(standardTransitions, epochSec);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   766
        if (index < 0) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   767
            // switch negative insert position to start of matched range
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   768
            index = -index - 2;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   769
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   770
        return standardOffsets[index + 1];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   771
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   772
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   773
    private static int toCalendarDOW[] = new int[] {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   774
        -1,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   775
        Calendar.MONDAY,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   776
        Calendar.TUESDAY,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   777
        Calendar.WEDNESDAY,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   778
        Calendar.THURSDAY,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   779
        Calendar.FRIDAY,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   780
        Calendar.SATURDAY,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   781
        Calendar.SUNDAY
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   782
    };
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   783
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   784
    private static int toSTZTime[] = new int[] {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   785
        SimpleTimeZone.UTC_TIME,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   786
        SimpleTimeZone.WALL_TIME,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   787
        SimpleTimeZone.STANDARD_TIME,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   788
    };
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   789
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   790
    private static final long OFFSET_MASK = 0x0fL;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   791
    private static final long DST_MASK = 0xf0L;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   792
    private static final int  DST_NSHIFT = 4;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   793
    private static final int  TRANSITION_NSHIFT = 12;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   794
    private static final int  LASTYEAR = 2037;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   795
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   796
    // from: 0 for offset lookup, 1 for dstsvings lookup
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   797
    private static int indexOf(int[] offsets, int from, int nOffsets, int offset) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   798
        offset *= 1000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   799
        for (; from < nOffsets; from++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   800
            if (offsets[from] == offset)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   801
                return from;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   802
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   803
        offsets[from] = offset;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   804
        return from;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   805
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   806
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   807
    // return updated nOffsets
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   808
    private static int addTrans(long transitions[], int nTrans,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   809
                                int offsets[], int nOffsets,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   810
                                long trans, int offset, int stdOffset) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   811
        int offsetIndex = indexOf(offsets, 0, nOffsets, offset);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   812
        if (offsetIndex == nOffsets)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   813
            nOffsets++;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   814
        int dstIndex = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   815
        if (offset != stdOffset) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   816
            dstIndex = indexOf(offsets, 1, nOffsets, offset - stdOffset);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   817
            if (dstIndex == nOffsets)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   818
                nOffsets++;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   819
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   820
        transitions[nTrans] = ((trans * 1000) << TRANSITION_NSHIFT) |
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   821
                              ((dstIndex << DST_NSHIFT) & DST_MASK) |
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   822
                              (offsetIndex & OFFSET_MASK);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   823
        return nOffsets;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   824
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   825
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   826
    /////////////////////////////////////////////////////////////
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   827
    // ZoneInfo checksum, copy/pasted from javazic
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   828
    private static class Checksum extends CRC32 {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   829
        public void update(int val) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   830
            byte[] b = new byte[4];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   831
            b[0] = (byte)((val >>> 24) & 0xff);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   832
            b[1] = (byte)((val >>> 16) & 0xff);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   833
            b[2] = (byte)((val >>> 8) & 0xff);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   834
            b[3] = (byte)(val & 0xff);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   835
            update(b);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   836
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   837
        void update(long val) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   838
            byte[] b = new byte[8];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   839
            b[0] = (byte)((val >>> 56) & 0xff);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   840
            b[1] = (byte)((val >>> 48) & 0xff);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   841
            b[2] = (byte)((val >>> 40) & 0xff);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   842
            b[3] = (byte)((val >>> 32) & 0xff);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   843
            b[4] = (byte)((val >>> 24) & 0xff);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   844
            b[5] = (byte)((val >>> 16) & 0xff);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   845
            b[6] = (byte)((val >>> 8) & 0xff);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   846
            b[7] = (byte)(val & 0xff);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   847
            update(b);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   848
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   849
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   850
}