001: /*
002: * ====================================================================
003: *
004: * The Apache Software License, Version 1.1
005: *
006: * Copyright (c) 1999 The Apache Software Foundation. All rights
007: * reserved.
008: *
009: * Redistribution and use in source and binary forms, with or without
010: * modification, are permitted provided that the following conditions
011: * are met:
012: *
013: * 1. Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * 2. Redistributions in binary form must reproduce the above copyright
017: * notice, this list of conditions and the following disclaimer in
018: * the documentation and/or other materials provided with the
019: * distribution.
020: *
021: * 3. The end-user documentation included with the redistribution, if
022: * any, must include the following acknowlegement:
023: * "This product includes software developed by the
024: * Apache Software Foundation (http://www.apache.org/)."
025: * Alternately, this acknowlegement may appear in the software itself,
026: * if and wherever such third-party acknowlegements normally appear.
027: *
028: * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
029: * Foundation" must not be used to endorse or promote products derived
030: * from this software without prior written permission. For written
031: * permission, please contact apache@apache.org.
032: *
033: * 5. Products derived from this software may not be called "Apache"
034: * nor may "Apache" appear in their names without prior written
035: * permission of the Apache Group.
036: *
037: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
038: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
039: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
040: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
041: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
042: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
043: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
044: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
045: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
046: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
047: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
048: * SUCH DAMAGE.
049: * ====================================================================
050: *
051: * This software consists of voluntary contributions made by many
052: * individuals on behalf of the Apache Software Foundation. For more
053: * information on the Apache Software Foundation, please see
054: * <http://www.apache.org/>.
055: *
056: * [Additional notices, if required by prior licensing conditions]
057: *
058: */
059:
060: package org.apache.catalina.util;
061:
062: import java.util.Date;
063: import java.util.HashMap;
064: import java.util.Locale;
065: import java.util.TimeZone;
066: import java.text.SimpleDateFormat;
067:
068: /**
069: * Utility class to generate HTTP dates.
070: *
071: * @author Remy Maucherat
072: */
073: public final class FastHttpDateFormat {
074:
075: // -------------------------------------------------------------- Variables
076:
077: /**
078: * HTTP date format.
079: */
080: protected static SimpleDateFormat format = new SimpleDateFormat(
081: "EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
082:
083: protected final static TimeZone gmtZone = TimeZone
084: .getTimeZone("GMT");
085:
086: /**
087: * GMT timezone - all HTTP dates are on GMT
088: */
089: static {
090: format.setTimeZone(gmtZone);
091: }
092:
093: /**
094: * Instant on which the currentDate object was generated.
095: */
096: protected static long currentDateGenerated = 0L;
097:
098: /**
099: * Current formatted date.
100: */
101: protected static String currentDate = null;
102:
103: /**
104: * Date cache.
105: */
106: protected static HashMap dateCache = new HashMap();
107:
108: // --------------------------------------------------------- Public Methods
109:
110: /**
111: * Get the current date in HTTP format.
112: */
113: public static String getCurrentDate() {
114:
115: long now = System.currentTimeMillis();
116: if ((now - currentDateGenerated) > 1000) {
117: synchronized (format) {
118: if ((now - currentDateGenerated) > 1000) {
119: currentDateGenerated = now;
120: currentDate = format.format(new Date(now));
121: }
122: }
123: }
124: return currentDate;
125:
126: }
127:
128: /**
129: * Get the HTTP format of the specified date.
130: */
131: public static String getDate(Date date) {
132:
133: String cachedDate = (String) dateCache.get(date);
134: if (cachedDate != null)
135: return cachedDate;
136:
137: String newDate = null;
138: synchronized (format) {
139: newDate = format.format(date);
140: dateCache.put(date, newDate);
141: }
142: return newDate;
143:
144: }
145:
146: }
|