001: /*
002: * @(#)RuleRec.java 1.6 06/10/10
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package sun.tools.javazic;
028:
029: import java.util.ArrayList;
030: import java.util.StringTokenizer;
031:
032: /**
033: * RuleRec class represents one record of the Rule set.
034: *
035: * @since 1.4
036: */
037: class RuleRec {
038: private int fromYear;
039: private int toYear;
040: private String type;
041: private int inMonth;
042: private RuleDay onDay;
043: private Time atTime;
044: private int save;
045: private String letters;
046: private String line;
047: private boolean isLastRule;
048:
049: int getFromYear() {
050: return fromYear;
051: }
052:
053: int getToYear() {
054: return toYear;
055: }
056:
057: int getMonthNum() {
058: return inMonth;
059: }
060:
061: RuleDay getDay() {
062: return onDay;
063: }
064:
065: Time getTime() {
066: return atTime;
067: }
068:
069: int getSave() {
070: return save;
071: }
072:
073: String getLine() {
074: return line;
075: }
076:
077: /**
078: * Sets the line from the text file.
079: * @param line the text of the line
080: */
081: void setLine(String line) {
082: this .line = line;
083: }
084:
085: /**
086: * @return true if the rule type is "odd".
087: */
088: boolean isOdd() {
089: return "odd".equals(type);
090: }
091:
092: /**
093: * @return true if the rule type is "even".
094: */
095: boolean isEven() {
096: return "even".equals(type);
097: }
098:
099: /**
100: * Determines if this rule record is the last DST schedule rule.
101: *
102: * @return true if this rule record has "max" as TO (year).
103: */
104: boolean isLastRule() {
105: return isLastRule;
106: }
107:
108: /**
109: * Determines if the unadjusted until time of the specified ZoneRec
110: * is the same as the transition time of this rule in the same
111: * year as the ZoneRec until year.
112: *
113: * @param zrec ZoneRec to compare to
114: * @param save the amount of daylight saving in milliseconds
115: * @param gmtOffset the GMT offset value in milliseconds
116: * @return true if the unadjusted until time is the same as rule's
117: * transition time.
118: */
119: boolean isSameTransition(ZoneRec zrec, int save, int gmtOffset) {
120: long until, transition;
121:
122: if (zrec.getUntilTime().getType() != atTime.getType()) {
123: until = zrec.getLocalUntilTime(save, gmtOffset);
124: transition = Time.getLocalTime(zrec.getUntilYear(),
125: getMonthNum(), getDay(), save, gmtOffset, atTime);
126: } else {
127: until = zrec.getLocalUntilTime();
128: transition = Time.getLocalTime(zrec.getUntilYear(),
129: getMonthNum(), getDay(), atTime.getTime());
130: }
131:
132: return until == transition;
133: }
134:
135: /**
136: * Parses a Rule line and returns a RuleRec object.
137: *
138: * @param tokens a StringTokenizer object that should contain a
139: * token for the "FROM" field and the rest.
140: * @return a RuleRec object.
141: */
142: static RuleRec parse(StringTokenizer tokens) {
143: RuleRec rec = new RuleRec();
144: try {
145: // FROM
146: String token = tokens.nextToken();
147: try {
148: rec.fromYear = Integer.parseInt(token);
149: } catch (NumberFormatException e) {
150: // it's not integer
151: if ("min".equals(token) || "minimum".equals(token)) {
152: rec.fromYear = Zoneinfo.getMinYear();
153: } else if ("max".equals(token)
154: || "maximum".equals(token)) {
155: rec.fromYear = Zoneinfo.getMaxYear();
156: } else {
157: Main.panic("invalid year value: " + token);
158: }
159: }
160:
161: // TO
162: token = tokens.nextToken();
163: rec.isLastRule = false;
164: try {
165: rec.toYear = Integer.parseInt(token);
166: } catch (NumberFormatException e) {
167: // it's not integer
168: if ("min".equals(token) || "minimum".equals(token)) {
169: rec.fromYear = Zoneinfo.getMinYear();
170: } else if ("max".equals(token)
171: || "maximum".equals(token)) {
172: rec.toYear = Integer.MAX_VALUE;
173: rec.isLastRule = true;
174: } else if ("only".equals(token)) {
175: rec.toYear = rec.fromYear;
176: } else {
177: Main.panic("invalid year value: " + token);
178: }
179: }
180:
181: // TYPE
182: rec.type = tokens.nextToken();
183:
184: // IN
185: rec.inMonth = Month.parse(tokens.nextToken());
186:
187: // ON
188: rec.onDay = RuleDay.parse(tokens.nextToken());
189:
190: // AT
191: rec.atTime = Time.parse(tokens.nextToken());
192:
193: // SAVE
194: rec.save = (int) Time.parse(tokens.nextToken()).getTime();
195:
196: // LETTER/S
197: rec.letters = tokens.nextToken();
198: } catch (Exception e) {
199: e.printStackTrace();
200: }
201: return rec;
202: }
203:
204: /**
205: * Calculates the transition time of the given year under this rule.
206: * @param year the year value
207: * @param gmtOffset the GMT offset value in milliseconds
208: * @param save the amount of daylight save time
209: * @return the transition time in milliseconds of the given year in UTC.
210: */
211: long getTransitionTime(int year, int gmtOffset, int save) {
212: long time = Time.getLocalTime(year, getMonthNum(), getDay(),
213: atTime.getTime());
214: if (atTime.isSTD()) {
215: time -= gmtOffset;
216: } else if (atTime.isWall()) {
217: time -= gmtOffset + save;
218: }
219: return time;
220: }
221:
222: private static int getInt(StringTokenizer tokens) {
223: String token = tokens.nextToken();
224: return Integer.parseInt(token);
225: }
226: }
|