comparison src/org/eclipse/jetty/util/DateCache.java @ 802:3428c60d7cfc

replace jetty jars with source
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 07 Sep 2016 21:15:48 -0600
parents
children
comparison
equal deleted inserted replaced
801:6a21393191c1 802:3428c60d7cfc
1 //
2 // ========================================================================
3 // Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
4 // ------------------------------------------------------------------------
5 // All rights reserved. This program and the accompanying materials
6 // are made available under the terms of the Eclipse Public License v1.0
7 // and Apache License v2.0 which accompanies this distribution.
8 //
9 // The Eclipse Public License is available at
10 // http://www.eclipse.org/legal/epl-v10.html
11 //
12 // The Apache License v2.0 is available at
13 // http://www.opensource.org/licenses/apache2.0.php
14 //
15 // You may elect to redistribute this code under either of these licenses.
16 // ========================================================================
17 //
18
19 package org.eclipse.jetty.util;
20
21 import java.text.DateFormatSymbols;
22 import java.text.SimpleDateFormat;
23 import java.util.Date;
24 import java.util.Locale;
25 import java.util.TimeZone;
26
27 /* ------------------------------------------------------------ */
28 /** Date Format Cache.
29 * Computes String representations of Dates and caches
30 * the results so that subsequent requests within the same minute
31 * will be fast.
32 *
33 * Only format strings that contain either "ss" or "ss.SSS" are
34 * handled.
35 *
36 * The timezone of the date may be included as an ID with the "zzz"
37 * format string or as an offset with the "ZZZ" format string.
38 *
39 * If consecutive calls are frequently very different, then this
40 * may be a little slower than a normal DateFormat.
41 *
42 *
43 *
44 */
45
46 public class DateCache
47 {
48 public static String DEFAULT_FORMAT="EEE MMM dd HH:mm:ss zzz yyyy";
49 private static long __hitWindow=60*60;
50
51 private String _formatString;
52 private String _tzFormatString;
53 private SimpleDateFormat _tzFormat;
54
55 private String _minFormatString;
56 private SimpleDateFormat _minFormat;
57
58 private String _secFormatString;
59 private String _secFormatString0;
60 private String _secFormatString1;
61
62 private long _lastMinutes = -1;
63 private long _lastSeconds = -1;
64 private int _lastMs = -1;
65 private String _lastResult = null;
66
67 private Locale _locale = null;
68 private DateFormatSymbols _dfs = null;
69
70 /* ------------------------------------------------------------ */
71 /** Constructor.
72 * Make a DateCache that will use a default format. The default format
73 * generates the same results as Date.toString().
74 */
75 public DateCache()
76 {
77 this(DEFAULT_FORMAT);
78 getFormat().setTimeZone(TimeZone.getDefault());
79 }
80
81 /* ------------------------------------------------------------ */
82 /** Constructor.
83 * Make a DateCache that will use the given format
84 */
85 public DateCache(String format)
86 {
87 _formatString=format;
88 setTimeZone(TimeZone.getDefault());
89
90 }
91
92 /* ------------------------------------------------------------ */
93 public DateCache(String format,Locale l)
94 {
95 _formatString=format;
96 _locale = l;
97 setTimeZone(TimeZone.getDefault());
98 }
99
100 /* ------------------------------------------------------------ */
101 public DateCache(String format,DateFormatSymbols s)
102 {
103 _formatString=format;
104 _dfs = s;
105 setTimeZone(TimeZone.getDefault());
106 }
107
108 /* ------------------------------------------------------------ */
109 /** Set the timezone.
110 * @param tz TimeZone
111 */
112 public synchronized void setTimeZone(TimeZone tz)
113 {
114 setTzFormatString(tz);
115 if( _locale != null )
116 {
117 _tzFormat=new SimpleDateFormat(_tzFormatString,_locale);
118 _minFormat=new SimpleDateFormat(_minFormatString,_locale);
119 }
120 else if( _dfs != null )
121 {
122 _tzFormat=new SimpleDateFormat(_tzFormatString,_dfs);
123 _minFormat=new SimpleDateFormat(_minFormatString,_dfs);
124 }
125 else
126 {
127 _tzFormat=new SimpleDateFormat(_tzFormatString);
128 _minFormat=new SimpleDateFormat(_minFormatString);
129 }
130 _tzFormat.setTimeZone(tz);
131 _minFormat.setTimeZone(tz);
132 _lastSeconds=-1;
133 _lastMinutes=-1;
134 }
135
136 /* ------------------------------------------------------------ */
137 public TimeZone getTimeZone()
138 {
139 return _tzFormat.getTimeZone();
140 }
141
142 /* ------------------------------------------------------------ */
143 /** Set the timezone.
144 * @param timeZoneId TimeZoneId the ID of the zone as used by
145 * TimeZone.getTimeZone(id)
146 */
147 public void setTimeZoneID(String timeZoneId)
148 {
149 setTimeZone(TimeZone.getTimeZone(timeZoneId));
150 }
151
152 /* ------------------------------------------------------------ */
153 private synchronized void setTzFormatString(final TimeZone tz )
154 {
155 int zIndex = _formatString.indexOf( "ZZZ" );
156 if( zIndex >= 0 )
157 {
158 String ss1 = _formatString.substring( 0, zIndex );
159 String ss2 = _formatString.substring( zIndex+3 );
160 int tzOffset = tz.getRawOffset();
161
162 StringBuilder sb = new StringBuilder(_formatString.length()+10);
163 sb.append(ss1);
164 sb.append("'");
165 if( tzOffset >= 0 )
166 sb.append( '+' );
167 else
168 {
169 tzOffset = -tzOffset;
170 sb.append( '-' );
171 }
172
173 int raw = tzOffset / (1000*60); // Convert to seconds
174 int hr = raw / 60;
175 int min = raw % 60;
176
177 if( hr < 10 )
178 sb.append( '0' );
179 sb.append( hr );
180 if( min < 10 )
181 sb.append( '0' );
182 sb.append( min );
183 sb.append( '\'' );
184
185 sb.append(ss2);
186 _tzFormatString=sb.toString();
187 }
188 else
189 _tzFormatString=_formatString;
190 setMinFormatString();
191 }
192
193
194 /* ------------------------------------------------------------ */
195 private void setMinFormatString()
196 {
197 int i = _tzFormatString.indexOf("ss.SSS");
198 int l = 6;
199 if (i>=0)
200 throw new IllegalStateException("ms not supported");
201 i = _tzFormatString.indexOf("ss");
202 l=2;
203
204 // Build a formatter that formats a second format string
205 String ss1=_tzFormatString.substring(0,i);
206 String ss2=_tzFormatString.substring(i+l);
207 _minFormatString =ss1+"'ss'"+ss2;
208 }
209
210 /* ------------------------------------------------------------ */
211 /** Format a date according to our stored formatter.
212 * @param inDate
213 * @return Formatted date
214 */
215 public synchronized String format(Date inDate)
216 {
217 return format(inDate.getTime());
218 }
219
220 /* ------------------------------------------------------------ */
221 /** Format a date according to our stored formatter.
222 * @param inDate
223 * @return Formatted date
224 */
225 public synchronized String format(long inDate)
226 {
227 long seconds = inDate / 1000;
228
229 // Is it not suitable to cache?
230 if (seconds<_lastSeconds ||
231 _lastSeconds>0 && seconds>_lastSeconds+__hitWindow)
232 {
233 // It's a cache miss
234 Date d = new Date(inDate);
235 return _tzFormat.format(d);
236
237 }
238
239 // Check if we are in the same second
240 // and don't care about millis
241 if (_lastSeconds==seconds )
242 return _lastResult;
243
244 Date d = new Date(inDate);
245
246 // Check if we need a new format string
247 long minutes = seconds/60;
248 if (_lastMinutes != minutes)
249 {
250 _lastMinutes = minutes;
251 _secFormatString=_minFormat.format(d);
252
253 int i=_secFormatString.indexOf("ss");
254 int l=2;
255 _secFormatString0=_secFormatString.substring(0,i);
256 _secFormatString1=_secFormatString.substring(i+l);
257 }
258
259 // Always format if we get here
260 _lastSeconds = seconds;
261 StringBuilder sb=new StringBuilder(_secFormatString.length());
262 sb.append(_secFormatString0);
263 int s=(int)(seconds%60);
264 if (s<10)
265 sb.append('0');
266 sb.append(s);
267 sb.append(_secFormatString1);
268 _lastResult=sb.toString();
269
270
271 return _lastResult;
272 }
273
274 /* ------------------------------------------------------------ */
275 /** Format to string buffer.
276 * @param inDate Date the format
277 * @param buffer StringBuilder
278 */
279 public void format(long inDate, StringBuilder buffer)
280 {
281 buffer.append(format(inDate));
282 }
283
284 /* ------------------------------------------------------------ */
285 /** Get the format.
286 */
287 public SimpleDateFormat getFormat()
288 {
289 return _minFormat;
290 }
291
292 /* ------------------------------------------------------------ */
293 public String getFormatString()
294 {
295 return _formatString;
296 }
297
298 /* ------------------------------------------------------------ */
299 public String now()
300 {
301 long now=System.currentTimeMillis();
302 _lastMs=(int)(now%1000);
303 return format(now);
304 }
305
306 /* ------------------------------------------------------------ */
307 public int lastMs()
308 {
309 return _lastMs;
310 }
311 }