/*
* Conditions Of Use
*
* This software was developed by employees of the National Institute of
* Standards and Technology (NIST), an agency of the Federal Government.
* Pursuant to title 15 Untied States Code Section 105, works of NIST
* employees are not subject to copyright protection in the United States
* and are considered to be in the public domain. As a result, a formal
* license is not needed to use the software.
*
* This software is provided by NIST as a service and is expressly
* provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
* AND DATA ACCURACY. NIST does not warrant or make any representations
* regarding the use of the software or the results thereof, including but
* not limited to the correctness, accuracy, reliability or usefulness of
* the software.
*
* Permission to use this software is contingent upon your acceptance
* of the terms of this agreement
*
* .
*
*/
/*******************************************************************************
* Product of NIST/ITL Advanced Networking Technologies Division (ANTD). *
*******************************************************************************/
package gov.nist.javax.sip.header;
import gov.nist.core.*;
import java.util.Calendar;
import java.util.TimeZone;
import java.util.Locale;
import java.util.GregorianCalendar;
import java.io.Serializable;
import java.lang.IllegalArgumentException;
/**
* Implements a parser class for tracking expiration time
* when specified as a Date value.
*<pre>
* From the HTTP 1.1 spec
*14.18 Date
*
* The Date general-header field represents the date and time at which
* the message was originated, having the same semantics as orig-date in
* RFC 822. The field value is an HTTP-date, as described in section
* 3.3.1; it MUST be sent in RFC 1123 [8]-date format.
* Date = "Date" ":" HTTP-date
*
* An example is
*
* Date: Tue, 15 Nov 1994 08:12:31 GMT
*</pre>
*
*@version 1.2 $Revision: 1.9 $ $Date: 2009/10/18 13:46:33 $
*
*@author M. Ranganathan <br/>
*
*
*
*
*/
public class SIPDate implements Cloneable,Serializable {
/**
* Comment for <code>serialVersionUID</code>
*/
private static final long serialVersionUID = 8544101899928346909L;
public static final String GMT = "GMT";
public static final String MON = "Mon";
public static final String TUE = "Tue";
public static final String WED = "Wed";
public static final String THU = "Thu";
public static final String FRI = "Fri";
public static final String SAT = "Sat";
public static final String SUN = "Sun";
public static final String JAN = "Jan";
public static final String FEB = "Feb";
public static final String MAR = "Mar";
public static final String APR = "Apr";
public static final String MAY = "May";
public static final String JUN = "Jun";
public static final String JUL = "Jul";
public static final String AUG = "Aug";
public static final String SEP = "Sep";
public static final String OCT = "Oct";
public static final String NOV = "Nov";
public static final String DEC = "Dec";
/** sipWkDay member
*/
protected String sipWkDay;
/** sipMonth member
*/
protected String sipMonth;
/** wkday member
*/
protected int wkday;
/** day member
*/
protected int day;
/** month member
*/
protected int month;
/** year member
*/
protected int year;
/** hour member
*/
protected int hour;
/** minute member
*/
protected int minute;
/** second member
*/
protected int second;
/** javaCal member
*/
private java.util.Calendar javaCal;
/** equality check.
*
*@return true if the two date fields are equals
*/
public boolean equals(Object that){
if (that.getClass() != this.getClass())return false;
SIPDate other = (SIPDate)that;
return this.wkday == other.wkday &&
this.day == other.day &&
this.month == other.month &&
this.year == other.year &&
this.hour == other.hour &&
this.minute == other.minute &&
this.second == other.second;
}
/**
* Initializer, sets all the fields to invalid values.
*/
public SIPDate() {
wkday = -1;
day = -1;
month = -1;
year = -1;
hour = -1;
minute = -1;
second = -1;
javaCal = null;
}
/**
* Construct a SIP date from the time offset given in miliseconds
* @param timeMillis long to set
*/
public SIPDate(long timeMillis) {
javaCal =
new GregorianCalendar(
TimeZone.getTimeZone("GMT:0"),
Locale.getDefault());
java.util.Date date = new java.util.Date(timeMillis);
javaCal.setTime(date);
wkday = javaCal.get(Calendar.DAY_OF_WEEK);
switch (wkday) {
case Calendar.MONDAY :
sipWkDay = MON;
break;
case Calendar.TUESDAY :
sipWkDay = TUE;
break;
case Calendar.WEDNESDAY :
sipWkDay = WED;
break;
case Calendar.THURSDAY :
sipWkDay = THU;
break;
case Calendar.FRIDAY :
sipWkDay = FRI;
break;
case Calendar.SATURDAY :
sipWkDay = SAT;
break;
case Calendar.SUNDAY :
sipWkDay = SUN;
break;
default :
InternalErrorHandler.handleException(
"No date map for wkday " + wkday);
}
day = javaCal.get(Calendar.DAY_OF_MONTH);
month = javaCal.get(Calendar.MONTH);
switch (month) {
case Calendar.JANUARY :
sipMonth = JAN;
break;
case Calendar.FEBRUARY :
sipMonth = FEB;
break;
case Calendar.MARCH :
sipMonth = MAR;
break;
case Calendar.APRIL :
sipMonth = APR;
break;
case Calendar.MAY :
sipMonth = MAY;
break;
case Calendar.JUNE :
sipMonth = JUN;
break;
case Calendar.JULY :
sipMonth = JUL;
break;
case Calendar.AUGUST :
sipMonth = AUG;
break;
case Calendar.SEPTEMBER :
sipMonth = SEP;
break;
case Calendar.OCTOBER :
sipMonth = OCT;
break;
case Calendar.NOVEMBER :
sipMonth = NOV;
break;
case Calendar.DECEMBER :
sipMonth = DEC;
break;
default :
InternalErrorHandler.handleException(
"No date map for month " + month);
}
year = javaCal.get(Calendar.YEAR);
// Bug report by Bruno Konik
hour = javaCal.get(Calendar.HOUR_OF_DAY);
minute = javaCal.get(Calendar.MINUTE);
second = javaCal.get(Calendar.SECOND);
}
/**
* Get canonical string representation.
* @return String
*/
public String encode() {
String dayString;
if (day < 10) {
dayString = "0" + day;
} else
dayString = "" + day;
String hourString;
if (hour < 10) {
hourString = "0" + hour;
} else
hourString = "" + hour;
String minuteString;
if (minute < 10) {
minuteString = "0" + minute;
} else
minuteString = "" + minute;
String secondString;
if (second < 10) {
secondString = "0" + second;
} else
secondString = "" + second;
String encoding = "";
if (sipWkDay != null)
encoding += sipWkDay + Separators.COMMA + Separators.SP;
encoding += dayString + Separators.SP;
if (sipMonth != null)
encoding += sipMonth + Separators.SP;
encoding += year
+ Separators.SP
+ hourString
+ Separators.COLON
+ minuteString
+ Separators.COLON
+ secondString
+ Separators.SP
+ GMT;
return encoding;
}
/**
* The only accessor we allow is to the java calendar record.
* All other fields are for this package only.
* @return Calendar
*/
public java.util.Calendar getJavaCal() {
if (javaCal == null)
setJavaCal();
return javaCal;
}
/** get the WkDay field
* @return String
*/
public String getWkday() {
return sipWkDay;
}
/** get the month
* @return String
*/
public String getMonth() {
return sipMonth;
}
/** get the hour
* @return int
*/
public int getHour() {
return hour;
}
/** get the minute
* @return int
*/
public int getMinute() {
return minute;
}
/** get the second
* @return int
*/
public int getSecond() {
return second;
}
/**
* convert the SIP Date of this structure to a Java Date.
* SIP Dates are forced to be GMT. Stores the converted time
* as a java Calendar class.
*/
private void setJavaCal() {
javaCal =
new GregorianCalendar(
TimeZone.getTimeZone("GMT:0"),
Locale.getDefault());
if (year != -1)
javaCal.set(Calendar.YEAR, year);
if (day != -1)
javaCal.set(Calendar.DAY_OF_MONTH, day);
if (month != -1)
javaCal.set(Calendar.MONTH, month);
if (wkday != -1)
javaCal.set(Calendar.DAY_OF_WEEK, wkday);
if (hour != -1)
javaCal.set(Calendar.HOUR, hour);
if (minute != -1)
javaCal.set(Calendar.MINUTE, minute);
if (second != -1)
javaCal.set(Calendar.SECOND, second);
}
/**
* Set the wkday member
* @param w String to set
* @throws IllegalArgumentException if w is not a valid day.
*/
public void setWkday(String w) throws IllegalArgumentException {
sipWkDay = w;
if (sipWkDay.compareToIgnoreCase(MON) == 0) {
wkday = Calendar.MONDAY;
} else if (sipWkDay.compareToIgnoreCase(TUE) == 0) {
wkday = Calendar.TUESDAY;
} else if (sipWkDay.compareToIgnoreCase(WED) == 0) {
wkday = Calendar.WEDNESDAY;
} else if (sipWkDay.compareToIgnoreCase(THU) == 0) {
wkday = Calendar.THURSDAY;
} else if (sipWkDay.compareToIgnoreCase(FRI) == 0) {
wkday = Calendar.FRIDAY;
} else if (sipWkDay.compareToIgnoreCase(SAT) == 0) {
wkday = Calendar.SATURDAY;
} else if (sipWkDay.compareToIgnoreCase(SUN) == 0) {
wkday = Calendar.SUNDAY;
} else {
throw new IllegalArgumentException("Illegal Week day :" + w);
}
}
/**
* Set the day member
* @param d int to set
* @throws IllegalArgumentException if d is not a valid day
*/
public void setDay(int d) throws IllegalArgumentException {
if (d < 1 || d > 31)
throw new IllegalArgumentException(
"Illegal Day of the month " + Integer.toString(d));
day = d;
}
/**
* Set the month member
* @param m String to set.
* @throws IllegalArgumentException if m is not a valid month
*/
public void setMonth(String m) throws IllegalArgumentException {
sipMonth = m;
if (sipMonth.compareToIgnoreCase(JAN) == 0) {
month = Calendar.JANUARY;
} else if (sipMonth.compareToIgnoreCase(FEB) == 0) {
month = Calendar.FEBRUARY;
} else if (sipMonth.compareToIgnoreCase(MAR) == 0) {
month = Calendar.MARCH;
} else if (sipMonth.compareToIgnoreCase(APR) == 0) {
month = Calendar.APRIL;
} else if (sipMonth.compareToIgnoreCase(MAY) == 0) {
month = Calendar.MAY;
} else if (sipMonth.compareToIgnoreCase(JUN) == 0) {
month = Calendar.JUNE;
} else if (sipMonth.compareToIgnoreCase(JUL) == 0) {
month = Calendar.JULY;
} else if (sipMonth.compareToIgnoreCase(AUG) == 0) {
month = Calendar.AUGUST;
} else if (sipMonth.compareToIgnoreCase(SEP) == 0) {
month = Calendar.SEPTEMBER;
} else if (sipMonth.compareToIgnoreCase(OCT) == 0) {
month = Calendar.OCTOBER;
} else if (sipMonth.compareToIgnoreCase(NOV) == 0) {
month = Calendar.NOVEMBER;
} else if (sipMonth.compareToIgnoreCase(DEC) == 0) {
month = Calendar.DECEMBER;
} else {
throw new IllegalArgumentException("Illegal Month :" + m);
}
}
/**
* Set the year member
* @param y int to set
* @throws IllegalArgumentException if y is not a valid year.
*/
public void setYear(int y) throws IllegalArgumentException {
if (y < 0)
throw new IllegalArgumentException("Illegal year : " + y);
javaCal = null;
year = y;
}
/**
* Get the year member.
*/
public int getYear() {
return year;
}
/**
* Set the hour member
* @param h int to set
* @throws IllegalArgumentException if h is not a valid hour.
*/
public void setHour(int h) throws IllegalArgumentException {
if (h < 0 || h > 24)
throw new IllegalArgumentException("Illegal hour : " + h);
javaCal = null;
hour = h;
}
/**
* Set the minute member
* @param m int to set
* @throws IllegalArgumentException if m is not a valid minute
*/
public void setMinute(int m) throws IllegalArgumentException {
if (m < 0 || m >= 60)
throw new IllegalArgumentException(
"Illegal minute : " + (Integer.toString(m)));
javaCal = null;
minute = m;
}
/**
* Set the second member
* @param s int to set
* @throws IllegalArgumentException if s is not a valid second
*/
public void setSecond(int s) throws IllegalArgumentException {
if (s < 0 || s >= 60)
throw new IllegalArgumentException(
"Illegal second : " + Integer.toString(s));
javaCal = null;
second = s;
}
/** Get the time offset from the current time.
*
*@return offset from the current time.
*/
public int getDeltaSeconds() {
// long ctime = this.getJavaCal().getTimeInMillis();
long ctime = this.getJavaCal().getTime().getTime();
return (int) (ctime - System.currentTimeMillis()) / 1000;
}
public Object clone() {
SIPDate retval;
try {
retval = (SIPDate) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException("Internal error");
}
if (javaCal != null)
retval.javaCal = (java.util.Calendar) javaCal.clone();
return retval;
}
}
/*
* $Log: SIPDate.java,v $
* Revision 1.9 2009/10/18 13:46:33 deruelle_jean
* FindBugs Fixes (Category Performance Warnings)
*
* Issue number:
* Obtained from:
* Submitted by: Jean Deruelle
* Reviewed by:
*
* Revision 1.8 2009/07/17 18:57:37 emcho
* Converts indentation tabs to spaces so that we have a uniform indentation policy in the whole project.
*
* Revision 1.7 2006/07/13 09:01:16 mranga
* Issue number:
* Obtained from:
* Submitted by: jeroen van bemmel
* Reviewed by: mranga
* Moved some changes from jain-sip-1.2 to java.net
*
* CVS: ----------------------------------------------------------------------
* CVS: Issue number:
* CVS: If this change addresses one or more issues,
* CVS: then enter the issue number(s) here.
* CVS: Obtained from:
* CVS: If this change has been taken from another system,
* CVS: then name the system in this line, otherwise delete it.
* CVS: Submitted by:
* CVS: If this code has been contributed to the project by someone else; i.e.,
* CVS: they sent us a patch or a set of diffs, then include their name/email
* CVS: address here. If this is your work then delete this line.
* CVS: Reviewed by:
* CVS: If we are doing pre-commit code reviews and someone else has
* CVS: reviewed your changes, include their name(s) here.
* CVS: If you have not had it reviewed then delete this line.
*
* Revision 1.3 2006/06/19 06:47:26 mranga
* javadoc fixups
*
* Revision 1.2 2006/06/16 15:26:28 mranga
* Added NIST disclaimer to all public domain files. Clean up some javadoc. Fixed a leak
*
* Revision 1.1.1.1 2005/10/04 17:12:35 mranga
*
* Import
*
*
* Revision 1.5 2005/04/16 20:35:10 dmuresan
* SIPDate made cloneable.
*
* Revision 1.4 2004/07/28 14:41:53 mranga
* Submitted by: mranga
*
* fixed equality check for SIPDate.
*
* Revision 1.3 2004/04/05 21:46:08 mranga
* Submitted by: Bruno Konik
* Reviewed by: mranga
*
* Revision 1.2 2004/01/22 13:26:29 sverker
* Issue number:
* Obtained from:
* Submitted by: sverker
* Reviewed by: mranga
*
* Major reformat of code to conform with style guide. Resolved compiler and javadoc warnings. Added CVS tags.
*
* CVS: ----------------------------------------------------------------------
* CVS: Issue number:
* CVS: If this change addresses one or more issues,
* CVS: then enter the issue number(s) here.
* CVS: Obtained from:
* CVS: If this change has been taken from another system,
* CVS: then name the system in this line, otherwise delete it.
* CVS: Submitted by:
* CVS: If this code has been contributed to the project by someone else; i.e.,
* CVS: they sent us a patch or a set of diffs, then include their name/email
* CVS: address here. If this is your work then delete this line.
* CVS: Reviewed by:
* CVS: If we are doing pre-commit code reviews and someone else has
* CVS: reviewed your changes, include their name(s) here.
* CVS: If you have not had it reviewed then delete this line.
*
*/