| /* |
| * 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. |
| * |
| */ |