001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 *
019 */
020 package org.apache.directory.server.kerberos.shared.messages.value;
021
022
023 import java.text.ParseException;
024 import java.text.SimpleDateFormat;
025 import java.util.Date;
026 import java.util.TimeZone;
027
028
029 /**
030 * Implementation of the time object for Kerberos.
031 *
032 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
033 * @version $Rev: 557427 $, $Date: 2007-07-19 02:47:31 +0300 (Thu, 19 Jul 2007) $
034 */
035 public class KerberosTime implements Comparable<KerberosTime>
036 {
037 /** The number of milliseconds in a minute. */
038 public static final int MINUTE = 60000;
039
040 /** The number of milliseconds in a day. */
041 public static final int DAY = MINUTE * 1440;
042
043 /** The number of milliseconds in a week. */
044 public static final int WEEK = MINUTE * 10080;
045
046 /** Constant for the {@link KerberosTime} "infinity." */
047 public static final KerberosTime INFINITY = new KerberosTime( Long.MAX_VALUE );
048
049 private static final TimeZone UTC_TIME_ZONE = TimeZone.getTimeZone( "UTC" );
050 private static final SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyyMMddHHmmss'Z'" );
051
052 static
053 {
054 dateFormat.setTimeZone( UTC_TIME_ZONE );
055 }
056
057 private long kerberosTime;
058
059
060 /**
061 * Creates a new instance of KerberosTime.
062 */
063 public KerberosTime()
064 {
065 kerberosTime = System.currentTimeMillis();
066 }
067
068
069 /**
070 * Creates a new instance of KerberosTime.
071 *
072 * @param time
073 */
074 public KerberosTime( long time )
075 {
076 kerberosTime = time;
077 }
078
079
080 /**
081 * Creates a new instance of KerberosTime.
082 *
083 * @param time
084 */
085 public KerberosTime( Date time )
086 {
087 kerberosTime = time.getTime();
088 }
089
090
091 /**
092 * Returns the {@link KerberosTime} for a given zulu time.
093 *
094 * @param zuluTime
095 * @return The {@link KerberosTime}.
096 * @throws ParseException
097 */
098 public static KerberosTime getTime( String zuluTime ) throws ParseException
099 {
100 Date date = null;
101 synchronized ( dateFormat )
102 {
103 date = dateFormat.parse( zuluTime );
104 }
105 return new KerberosTime( date );
106 }
107
108
109 public int compareTo( KerberosTime that )
110 {
111 final int BEFORE = -1;
112 final int EQUAL = 0;
113 final int AFTER = 1;
114
115 // this optimization is usually worthwhile, and can always be added
116 if ( this == that )
117 {
118 return EQUAL;
119 }
120
121 // primitive numbers follow this form
122 if ( this.kerberosTime < that.kerberosTime )
123 {
124 return BEFORE;
125 }
126
127 if ( this.kerberosTime > that.kerberosTime )
128 {
129 return AFTER;
130 }
131
132 return EQUAL;
133 }
134
135
136 /**
137 * Returns the {@link KerberosTime} as a long.
138 *
139 * @return The {@link KerberosTime} as a long.
140 */
141 public long getTime()
142 {
143 return kerberosTime;
144 }
145
146
147 /**
148 * Returns the {@link KerberosTime} as a {@link Date}.
149 *
150 * @return The {@link KerberosTime} as a {@link Date}.
151 */
152 public Date toDate()
153 {
154 return new Date( kerberosTime );
155 }
156
157
158 /**
159 * Returns whether this {@link KerberosTime} is within the given clockskew.
160 *
161 * @param clockSkew
162 * @return true if this {@link KerberosTime} is within the given clockskew.
163 */
164 public boolean isInClockSkew( long clockSkew )
165 {
166 return Math.abs( kerberosTime - System.currentTimeMillis() ) < clockSkew;
167 }
168
169
170 /**
171 * Returns whether this {@link KerberosTime} is greater than a given {@link KerberosTime}.
172 *
173 * @param time
174 * @return true if this {@link KerberosTime} is greater than a given {@link KerberosTime}.
175 */
176 public boolean greaterThan( KerberosTime time )
177 {
178 return kerberosTime > time.kerberosTime;
179 }
180
181
182 /**
183 * Returns whether this {@link KerberosTime} is less than a given {@link KerberosTime}.
184 *
185 * @param time
186 * @return true if this {@link KerberosTime} is less than a given {@link KerberosTime}.
187 */
188 public boolean lessThan( KerberosTime time )
189 {
190 return kerberosTime < time.kerberosTime;
191 }
192
193
194 /**
195 * Returns whether this {@link KerberosTime} is equal to another {@link KerberosTime}.
196 *
197 * @param time
198 * @return true if the two {@link KerberosTime}s are equal.
199 */
200 public boolean equals( KerberosTime time )
201 {
202 return kerberosTime == time.kerberosTime;
203 }
204
205
206 /**
207 * Returns whether this {@link KerberosTime} is zero.
208 *
209 * @return true if this {@link KerberosTime} is zero.
210 */
211 public boolean isZero()
212 {
213 return kerberosTime == 0;
214 }
215
216
217 public String toString()
218 {
219 Date kerberosDate = new Date( kerberosTime );
220
221 synchronized ( dateFormat )
222 {
223 return dateFormat.format( kerberosDate );
224 }
225 }
226 }