1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*
2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Conditions Of Use
3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* This software was developed by employees of the National Institute of
5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Standards and Technology (NIST), an agency of the Federal Government.
6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Pursuant to title 15 Untied States Code Section 105, works of NIST
7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* employees are not subject to copyright protection in the United States
8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* and are considered to be in the public domain.  As a result, a formal
9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* license is not needed to use the software.
10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* This software is provided by NIST as a service and is expressly
12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* AND DATA ACCURACY.  NIST does not warrant or make any representations
16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* regarding the use of the software or the results thereof, including but
17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* not limited to the correctness, accuracy, reliability or usefulness of
18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* the software.
19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Permission to use this software is contingent upon your acceptance
21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* of the terms of this agreement
22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* .
24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*/
26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*******************************************************************************
27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Product of NIST/ITL Advanced Networking Technologies Division (ANTD).        *
28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*******************************************************************************/
29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpackage gov.nist.javax.sip.header;
30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.*;
31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Calendar;
32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.TimeZone;
33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Locale;
34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.GregorianCalendar;
35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.io.Serializable;
36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.lang.IllegalArgumentException;
37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/**
39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Implements a parser class for tracking expiration time
40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* when specified as a Date value.
41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*<pre>
42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* From the HTTP 1.1 spec
43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*14.18 Date
44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   The Date general-header field represents the date and time at which
46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   the message was originated, having the same semantics as orig-date in
47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   RFC 822. The field value is an HTTP-date, as described in section
48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   3.3.1; it MUST be sent in RFC 1123 [8]-date format.
49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*       Date  = "Date" ":" HTTP-date
51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   An example is
53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*       Date: Tue, 15 Nov 1994 08:12:31 GMT
55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*</pre>
56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*@version 1.2 $Revision: 1.9 $ $Date: 2009/10/18 13:46:33 $
58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*@author M. Ranganathan   <br/>
60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*/
65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic class SIPDate implements Cloneable,Serializable {
67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Comment for <code>serialVersionUID</code>
69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private static final long serialVersionUID = 8544101899928346909L;
71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String GMT = "GMT";
72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String MON = "Mon";
73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String TUE = "Tue";
74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String WED = "Wed";
75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String THU = "Thu";
76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String FRI = "Fri";
77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String SAT = "Sat";
78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String SUN = "Sun";
79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String JAN = "Jan";
80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String FEB = "Feb";
81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String MAR = "Mar";
82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String APR = "Apr";
83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String MAY = "May";
84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String JUN = "Jun";
85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String JUL = "Jul";
86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String AUG = "Aug";
87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String SEP = "Sep";
88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String OCT = "Oct";
89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String NOV = "Nov";
90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String DEC = "Dec";
91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** sipWkDay member
93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected String sipWkDay;
95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** sipMonth member
97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    */
98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected String sipMonth;
99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** wkday member
101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    */
102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected int wkday;
103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** day member
105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    */
106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected int day;
107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** month member
109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    */
110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected int month;
111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** year member
113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    */
114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected int year;
115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** hour member
117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    */
118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected int hour;
119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** minute member
121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    */
122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected int minute;
123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** second member
125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    */
126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected int second;
127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** javaCal member
129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    */
130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private java.util.Calendar javaCal;
131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** equality check.
133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *@return true if the two date fields are equals
135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public boolean equals(Object that){
137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (that.getClass() != this.getClass())return false;
138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPDate other = (SIPDate)that;
139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return this.wkday == other.wkday &&
140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.day == other.day &&
141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.month == other.month &&
142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.year == other.year &&
143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.hour == other.hour &&
144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.minute == other.minute &&
145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.second == other.second;
146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Initializer, sets all the fields to invalid values.
150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public SIPDate() {
152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        wkday = -1;
153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        day = -1;
154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        month = -1;
155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        year = -1;
156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        hour = -1;
157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        minute = -1;
158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        second = -1;
159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        javaCal = null;
160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Construct a SIP date from the time offset given in miliseconds
164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param timeMillis long to set
165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public SIPDate(long timeMillis) {
167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        javaCal =
168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            new GregorianCalendar(
169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                TimeZone.getTimeZone("GMT:0"),
170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                Locale.getDefault());
171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        java.util.Date date = new java.util.Date(timeMillis);
172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        javaCal.setTime(date);
173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        wkday = javaCal.get(Calendar.DAY_OF_WEEK);
174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        switch (wkday) {
175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.MONDAY :
176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipWkDay = MON;
177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.TUESDAY :
179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipWkDay = TUE;
180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.WEDNESDAY :
182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipWkDay = WED;
183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.THURSDAY :
185600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipWkDay = THU;
186600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
187600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.FRIDAY :
188600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipWkDay = FRI;
189600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
190600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.SATURDAY :
191600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipWkDay = SAT;
192600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
193600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.SUNDAY :
194600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipWkDay = SUN;
195600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
196600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            default :
197600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                InternalErrorHandler.handleException(
198600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    "No date map for wkday " + wkday);
199600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
200600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
201600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        day = javaCal.get(Calendar.DAY_OF_MONTH);
202600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        month = javaCal.get(Calendar.MONTH);
203600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        switch (month) {
204600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.JANUARY :
205600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipMonth = JAN;
206600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
207600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.FEBRUARY :
208600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipMonth = FEB;
209600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
210600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.MARCH :
211600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipMonth = MAR;
212600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
213600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.APRIL :
214600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipMonth = APR;
215600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
216600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.MAY :
217600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipMonth = MAY;
218600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
219600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.JUNE :
220600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipMonth = JUN;
221600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
222600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.JULY :
223600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipMonth = JUL;
224600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
225600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.AUGUST :
226600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipMonth = AUG;
227600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
228600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.SEPTEMBER :
229600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipMonth = SEP;
230600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
231600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.OCTOBER :
232600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipMonth = OCT;
233600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
234600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.NOVEMBER :
235600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipMonth = NOV;
236600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
237600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            case Calendar.DECEMBER :
238600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sipMonth = DEC;
239600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
240600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            default :
241600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                InternalErrorHandler.handleException(
242600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    "No date map for month " + month);
243600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
244600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        year = javaCal.get(Calendar.YEAR);
245600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // Bug report by Bruno Konik
246600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        hour = javaCal.get(Calendar.HOUR_OF_DAY);
247600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        minute = javaCal.get(Calendar.MINUTE);
248600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        second = javaCal.get(Calendar.SECOND);
249600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
250600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
251600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
252600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Get canonical string representation.
253600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return String
254600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
255600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String encode() {
256600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
257600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        String dayString;
258600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (day < 10) {
259600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            dayString = "0" + day;
260600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else
261600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            dayString = "" + day;
262600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
263600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        String hourString;
264600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (hour < 10) {
265600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            hourString = "0" + hour;
266600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else
267600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            hourString = "" + hour;
268600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
269600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        String minuteString;
270600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (minute < 10) {
271600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            minuteString = "0" + minute;
272600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else
273600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            minuteString = "" + minute;
274600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
275600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        String secondString;
276600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (second < 10) {
277600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            secondString = "0" + second;
278600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else
279600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            secondString = "" + second;
280600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
281600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        String encoding = "";
282600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
283600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (sipWkDay != null)
284600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            encoding += sipWkDay + Separators.COMMA + Separators.SP;
285600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
286600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        encoding += dayString + Separators.SP;
287600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
288600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (sipMonth != null)
289600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            encoding += sipMonth + Separators.SP;
290600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
291600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        encoding += year
292600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            + Separators.SP
293600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            + hourString
294600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            + Separators.COLON
295600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            + minuteString
296600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            + Separators.COLON
297600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            + secondString
298600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            + Separators.SP
299600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            + GMT;
300600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
301600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return encoding;
302600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
303600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
304600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
305600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * The only accessor we allow is to the java calendar record.
306600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * All other fields are for this package only.
307600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return Calendar
308600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
309600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public java.util.Calendar getJavaCal() {
310600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (javaCal == null)
311600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            setJavaCal();
312600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return javaCal;
313600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
314600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
315600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** get the WkDay field
316600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return String
317600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
318600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String getWkday() {
319600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sipWkDay;
320600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
321600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
322600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** get the month
323600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return String
324600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
325600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String getMonth() {
326600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sipMonth;
327600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
328600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
329600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** get the hour
330600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return int
331600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
332600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public int getHour() {
333600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return hour;
334600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
335600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
336600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** get the minute
337600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return int
338600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
339600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public int getMinute() {
340600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return minute;
341600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
342600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
343600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** get the second
344600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *  @return int
345600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
346600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public int getSecond() {
347600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return second;
348600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
349600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
350600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
351600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * convert the SIP Date of this structure to a Java Date.
352600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * SIP Dates are forced to be GMT. Stores the converted time
353600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * as a java Calendar class.
354600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
355600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private void setJavaCal() {
356600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        javaCal =
357600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            new GregorianCalendar(
358600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                TimeZone.getTimeZone("GMT:0"),
359600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                Locale.getDefault());
360600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (year != -1)
361600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            javaCal.set(Calendar.YEAR, year);
362600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (day != -1)
363600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            javaCal.set(Calendar.DAY_OF_MONTH, day);
364600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (month != -1)
365600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            javaCal.set(Calendar.MONTH, month);
366600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (wkday != -1)
367600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            javaCal.set(Calendar.DAY_OF_WEEK, wkday);
368600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (hour != -1)
369600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            javaCal.set(Calendar.HOUR, hour);
370600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (minute != -1)
371600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            javaCal.set(Calendar.MINUTE, minute);
372600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (second != -1)
373600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            javaCal.set(Calendar.SECOND, second);
374600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
375600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
376600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
377600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the wkday member
378600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param w String to set
379600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws IllegalArgumentException if w is not a valid day.
380600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
381600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setWkday(String w) throws IllegalArgumentException {
382600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipWkDay = w;
383600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (sipWkDay.compareToIgnoreCase(MON) == 0) {
384600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            wkday = Calendar.MONDAY;
385600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else if (sipWkDay.compareToIgnoreCase(TUE) == 0) {
386600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            wkday = Calendar.TUESDAY;
387600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else if (sipWkDay.compareToIgnoreCase(WED) == 0) {
388600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            wkday = Calendar.WEDNESDAY;
389600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else if (sipWkDay.compareToIgnoreCase(THU) == 0) {
390600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            wkday = Calendar.THURSDAY;
391600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else if (sipWkDay.compareToIgnoreCase(FRI) == 0) {
392600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            wkday = Calendar.FRIDAY;
393600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else if (sipWkDay.compareToIgnoreCase(SAT) == 0) {
394600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            wkday = Calendar.SATURDAY;
395600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else if (sipWkDay.compareToIgnoreCase(SUN) == 0) {
396600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            wkday = Calendar.SUNDAY;
397600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else {
398600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new IllegalArgumentException("Illegal Week day :" + w);
399600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
400600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
401600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
402600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
403600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the day member
404600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param d int to set
405600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws IllegalArgumentException if d is not a valid day
406600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
407600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setDay(int d) throws IllegalArgumentException {
408600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (d < 1 || d > 31)
409600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new IllegalArgumentException(
410600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                "Illegal Day of the month " + Integer.toString(d));
411600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        day = d;
412600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
413600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
414600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
415600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the month member
416600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param m String to set.
417600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws IllegalArgumentException if m is not a valid month
418600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
419600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setMonth(String m) throws IllegalArgumentException {
420600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipMonth = m;
421600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (sipMonth.compareToIgnoreCase(JAN) == 0) {
422600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            month = Calendar.JANUARY;
423600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else if (sipMonth.compareToIgnoreCase(FEB) == 0) {
424600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            month = Calendar.FEBRUARY;
425600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else if (sipMonth.compareToIgnoreCase(MAR) == 0) {
426600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            month = Calendar.MARCH;
427600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else if (sipMonth.compareToIgnoreCase(APR) == 0) {
428600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            month = Calendar.APRIL;
429600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else if (sipMonth.compareToIgnoreCase(MAY) == 0) {
430600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            month = Calendar.MAY;
431600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else if (sipMonth.compareToIgnoreCase(JUN) == 0) {
432600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            month = Calendar.JUNE;
433600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else if (sipMonth.compareToIgnoreCase(JUL) == 0) {
434600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            month = Calendar.JULY;
435600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else if (sipMonth.compareToIgnoreCase(AUG) == 0) {
436600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            month = Calendar.AUGUST;
437600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else if (sipMonth.compareToIgnoreCase(SEP) == 0) {
438600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            month = Calendar.SEPTEMBER;
439600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else if (sipMonth.compareToIgnoreCase(OCT) == 0) {
440600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            month = Calendar.OCTOBER;
441600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else if (sipMonth.compareToIgnoreCase(NOV) == 0) {
442600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            month = Calendar.NOVEMBER;
443600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else if (sipMonth.compareToIgnoreCase(DEC) == 0) {
444600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            month = Calendar.DECEMBER;
445600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else {
446600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new IllegalArgumentException("Illegal Month :" + m);
447600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
448600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
449600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
450600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
451600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the year member
452600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param y int to set
453600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws IllegalArgumentException if y is not a valid year.
454600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
455600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setYear(int y) throws IllegalArgumentException {
456600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (y < 0)
457600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new IllegalArgumentException("Illegal year : " + y);
458600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        javaCal = null;
459600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        year = y;
460600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
461600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
462600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
463600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    * Get the year member.
464600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    */
465600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public int getYear() {
466600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return year;
467600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
468600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
469600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
470600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the hour member
471600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param h int to set
472600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws IllegalArgumentException if h is not a valid hour.
473600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
474600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setHour(int h) throws IllegalArgumentException {
475600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (h < 0 || h > 24)
476600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new IllegalArgumentException("Illegal hour : " + h);
477600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        javaCal = null;
478600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        hour = h;
479600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
480600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
481600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
482600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the minute member
483600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param m int to set
484600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws IllegalArgumentException if m is not a valid minute
485600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
486600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setMinute(int m) throws IllegalArgumentException {
487600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (m < 0 || m >= 60)
488600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new IllegalArgumentException(
489600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                "Illegal minute : " + (Integer.toString(m)));
490600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        javaCal = null;
491600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        minute = m;
492600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
493600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
494600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
495600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the second member
496600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param s int to set
497600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws IllegalArgumentException if s is not a valid second
498600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
499600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setSecond(int s) throws IllegalArgumentException {
500600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (s < 0 || s >= 60)
501600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new IllegalArgumentException(
502600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                "Illegal second : " + Integer.toString(s));
503600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        javaCal = null;
504600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        second = s;
505600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
506600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
507600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Get the time offset from the current time.
508600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
509600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *@return offset from the current time.
510600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
511600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public int getDeltaSeconds() {
512600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // long ctime = this.getJavaCal().getTimeInMillis();
513600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        long ctime = this.getJavaCal().getTime().getTime();
514600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return (int) (ctime - System.currentTimeMillis()) / 1000;
515600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
516600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
517600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Object clone() {
518600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPDate retval;
519600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        try {
520600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            retval = (SIPDate) super.clone();
521600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } catch (CloneNotSupportedException e) {
522600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new RuntimeException("Internal error");
523600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
524600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (javaCal != null)
525600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            retval.javaCal = (java.util.Calendar) javaCal.clone();
526600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return retval;
527600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
528600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang}
529600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*
530600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * $Log: SIPDate.java,v $
531600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.9  2009/10/18 13:46:33  deruelle_jean
532600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * FindBugs Fixes (Category Performance Warnings)
533600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
534600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Issue number:
535600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Obtained from:
536600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Submitted by: Jean Deruelle
537600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Reviewed by:
538600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
539600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.8  2009/07/17 18:57:37  emcho
540600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Converts indentation tabs to spaces so that we have a uniform indentation policy in the whole project.
541600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
542600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.7  2006/07/13 09:01:16  mranga
543600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Issue number:
544600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Obtained from:
545600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Submitted by:  jeroen van bemmel
546600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Reviewed by:   mranga
547600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Moved some changes from jain-sip-1.2 to java.net
548600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
549600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: ----------------------------------------------------------------------
550600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Issue number:
551600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this change addresses one or more issues,
552600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   then enter the issue number(s) here.
553600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Obtained from:
554600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this change has been taken from another system,
555600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   then name the system in this line, otherwise delete it.
556600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Submitted by:
557600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this code has been contributed to the project by someone else; i.e.,
558600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   they sent us a patch or a set of diffs, then include their name/email
559600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   address here. If this is your work then delete this line.
560600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Reviewed by:
561600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If we are doing pre-commit code reviews and someone else has
562600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   reviewed your changes, include their name(s) here.
563600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If you have not had it reviewed then delete this line.
564600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
565600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.3  2006/06/19 06:47:26  mranga
566600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * javadoc fixups
567600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
568600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.2  2006/06/16 15:26:28  mranga
569600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Added NIST disclaimer to all public domain files. Clean up some javadoc. Fixed a leak
570600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
571600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.1.1.1  2005/10/04 17:12:35  mranga
572600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
573600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Import
574600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
575600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
576600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.5  2005/04/16 20:35:10  dmuresan
577600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * SIPDate made cloneable.
578600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
579600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.4  2004/07/28 14:41:53  mranga
580600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Submitted by:  mranga
581600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
582600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * fixed equality check for SIPDate.
583600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
584600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.3  2004/04/05 21:46:08  mranga
585600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Submitted by:  Bruno Konik
586600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Reviewed by:   mranga
587600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
588600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.2  2004/01/22 13:26:29  sverker
589600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Issue number:
590600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Obtained from:
591600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Submitted by:  sverker
592600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Reviewed by:   mranga
593600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
594600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Major reformat of code to conform with style guide. Resolved compiler and javadoc warnings. Added CVS tags.
595600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
596600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: ----------------------------------------------------------------------
597600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Issue number:
598600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this change addresses one or more issues,
599600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   then enter the issue number(s) here.
600600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Obtained from:
601600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this change has been taken from another system,
602600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   then name the system in this line, otherwise delete it.
603600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Submitted by:
604600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this code has been contributed to the project by someone else; i.e.,
605600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   they sent us a patch or a set of diffs, then include their name/email
606600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   address here. If this is your work then delete this line.
607600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Reviewed by:
608600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If we are doing pre-commit code reviews and someone else has
609600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   reviewed your changes, include their name(s) here.
610600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If you have not had it reviewed then delete this line.
611600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
612600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */
613