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