jdk/test/sun/util/calendar/zi/ZoneRec.java
changeset 15658 55b829ca2334
child 23010 6dadb192ad81
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/util/calendar/zi/ZoneRec.java	Tue Feb 12 09:25:43 2013 -0800
@@ -0,0 +1,250 @@
+/*
+ * Copyright (c) 2000, 2004, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+/**
+ * ZoneRec hold information of time zone corresponding to each text
+ * line of the "Zone" part.
+ *
+ * @since 1.4
+ */
+class ZoneRec {
+    private int gmtOffset;
+    private String ruleName;
+    private int directSave;
+    private Rule ruleRef;
+    private String format;
+    private boolean hasUntil;
+    private int untilYear;
+    private Month untilMonth;
+    private RuleDay untilDay;
+    private Time untilTime;
+    private long untilInMillis;
+    private String line;
+
+    /**
+     * @return the "UNTIL" value in milliseconds
+     */
+    Time getUntilTime() {
+        return untilTime;
+    }
+
+    /**
+     * @return the GMT offset value in milliseconds
+     */
+    int getGmtOffset() {
+        return gmtOffset;
+    }
+
+    /**
+     * @return the rule name to which this zone record refers
+     */
+    String getRuleName() {
+        return ruleName;
+    }
+
+    /**
+     * @return the amount of saving time directly defined in the
+     * "RULES/SAVE" field.
+     */
+    int getDirectSave() {
+        return directSave;
+    }
+
+    /**
+     * @return true if this zone record has a reference to a rule
+     */
+    boolean hasRuleReference() {
+        return ruleRef != null;
+    }
+
+    /**
+     * Returns the "FORMAT" field string of this zone record. This
+     * @return the "FORMAT" field
+     */
+    String getFormat() {
+        return format;
+    }
+
+    /**
+     * @return the year in the "UNTIL" field
+     */
+    int getUntilYear() {
+        return untilYear;
+    }
+
+    /**
+     * Returns the "UNTIL" field value in milliseconds from Janurary
+     * 1, 1970 0:00 GMT.
+     * @param currentSave the amount of daylight saving in
+     * milliseconds that is used to adjust wall-clock time.
+     * @return the milliseconds value of the "UNTIL" field
+     */
+    long getUntilTime(int currentSave) {
+        if (untilTime.isWall()) {
+            return untilInMillis - currentSave;
+        }
+        return untilInMillis;
+    }
+
+    /**
+     * Returns the "UNTIL" time in milliseconds without adjusting GMT
+     * offsets or daylight saving.
+     * @return local "UNTIL" time in milliseconds
+     */
+    long getLocalUntilTime() {
+        return Time.getLocalTime(untilYear,
+                                 untilMonth,
+                                 untilDay,
+                                 untilTime.getTime());
+    }
+
+    /**
+     * Returns the "UNTIL" time in milliseconds with adjusting GMT offsets and daylight saving.
+     * @return the "UNTIL" time after the adjustment
+     */
+    long getLocalUntilTime(int save, int gmtOffset) {
+        return Time.getLocalTime(untilYear,
+                                 untilMonth,
+                                 untilDay,
+                                 save,
+                                 gmtOffset,
+                                 untilTime);
+    }
+
+    /**
+     * @return the text line of this zone record
+     */
+    String getLine() {
+        return line;
+    }
+
+    /**
+     * Sets the specified text line to this zone record
+     */
+    void setLine(String line) {
+        this.line = line;
+    }
+
+    /**
+     * @return true if this zone record has the "UNTIL" field
+     */
+    boolean hasUntil() {
+        return this.hasUntil;
+    }
+
+    /**
+     * Adjusts the "UNTIL" time to GMT offset if this zone record has
+     * it.  <code>untilTime</code> is not adjusted to daylight saving
+     * in this method.
+     */
+    void adjustTime() {
+        if (!hasUntil()) {
+            return;
+        }
+        if (untilTime.isSTD() || untilTime.isWall()) {
+            // adjust to gmt offset only here.  adjust to real
+            // wall-clock time when tracking rules
+            untilInMillis -= gmtOffset;
+        }
+    }
+
+    /**
+     * @return the reference to the Rule object
+     */
+    Rule getRuleRef() {
+        return ruleRef;
+    }
+
+    /**
+     * Resolves the reference to a Rule and adjusts its "UNTIL" time
+     * to GMT offset.
+     */
+    void resolve(Zoneinfo zi) {
+        if (ruleName != null && (!"-".equals(ruleName))) {
+                ruleRef = zi.getRule(ruleName);
+        }
+        adjustTime();
+    }
+
+    /**
+     * Parses a Zone text line that is described by a StringTokenizer.
+     * @param tokens represents tokens of a Zone text line
+     * @return the zone record produced by parsing the text
+     */
+    static ZoneRec parse(StringTokenizer tokens) {
+        ZoneRec rec = new ZoneRec();
+        try {
+            rec.gmtOffset = (int) Time.parse(tokens.nextToken()).getTime();
+            String token = tokens.nextToken();
+            char c = token.charAt(0);
+            if (c >= '0' && c <= '9') {
+                rec.directSave = (int) Time.parse(token).getTime();
+            } else {
+                rec.ruleName = token;
+            }
+            rec.format = tokens.nextToken();
+            if (tokens.hasMoreTokens()) {
+                rec.hasUntil = true;
+                rec.untilYear = Integer.parseInt(tokens.nextToken());
+                if (tokens.hasMoreTokens()) {
+                    rec.untilMonth = Month.parse(tokens.nextToken());
+                } else {
+                    rec.untilMonth = Month.JANUARY;
+                }
+                if (tokens.hasMoreTokens()) {
+                    rec.untilDay = RuleDay.parse(tokens.nextToken());
+                } else {
+                    rec.untilDay = new RuleDay(1);
+                }
+                if (tokens.hasMoreTokens()) {
+                    rec.untilTime = Time.parse(tokens.nextToken());
+                } else {
+                    rec.untilTime = Time.parse("0:00");
+                }
+                rec.untilInMillis = rec.getLocalUntilTime();
+            }
+        } catch (Exception e) {
+            // TODO: error reporting
+            e.printStackTrace();
+        }
+        return rec;
+    }
+
+    private static void panic(String msg) {
+        Main.panic(msg);
+    }
+}