You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2003/01/03 20:31:00 UTC
cvs commit: jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/http FastHttpDateFormat.java
remm 2003/01/03 11:31:00
Modified: util/java/org/apache/tomcat/util/http
FastHttpDateFormat.java
Log:
- Major update to the cache (also handles parsing now).
Revision Changes Path
1.2 +117 -9 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/http/FastHttpDateFormat.java
Index: FastHttpDateFormat.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/http/FastHttpDateFormat.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- FastHttpDateFormat.java 9 Jan 2002 23:23:24 -0000 1.1
+++ FastHttpDateFormat.java 3 Jan 2003 19:31:00 -0000 1.2
@@ -63,6 +63,8 @@
import java.util.HashMap;
import java.util.Locale;
import java.util.TimeZone;
+import java.text.DateFormat;
+import java.text.ParseException;
import java.text.SimpleDateFormat;
/**
@@ -79,10 +81,20 @@
/**
* HTTP date format.
*/
- protected static SimpleDateFormat format =
+ protected static final SimpleDateFormat format =
new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
+ /**
+ * The set of SimpleDateFormat formats to use in getDateHeader().
+ */
+ protected static final SimpleDateFormat formats[] = {
+ new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US),
+ new SimpleDateFormat("EEEEEE, dd-MMM-yy HH:mm:ss zzz", Locale.US),
+ new SimpleDateFormat("EEE MMMM d HH:mm:ss yyyy", Locale.US)
+ };
+
+
protected final static TimeZone gmtZone = TimeZone.getTimeZone("GMT");
@@ -90,7 +102,13 @@
* GMT timezone - all HTTP dates are on GMT
*/
static {
+
format.setTimeZone(gmtZone);
+
+ formats[0].setTimeZone(gmtZone);
+ formats[1].setTimeZone(gmtZone);
+ formats[2].setTimeZone(gmtZone);
+
}
@@ -107,9 +125,15 @@
/**
- * Date cache.
+ * Formatter cache.
+ */
+ protected static final HashMap formatCache = new HashMap();
+
+
+ /**
+ * Parser cache.
*/
- protected static HashMap dateCache = new HashMap();
+ protected static final HashMap parseCache = new HashMap();
// --------------------------------------------------------- Public Methods
@@ -118,7 +142,7 @@
/**
* Get the current date in HTTP format.
*/
- public static String getCurrentDate() {
+ public static final String getCurrentDate() {
long now = System.currentTimeMillis();
if ((now - currentDateGenerated) > 1000) {
@@ -137,19 +161,103 @@
/**
* Get the HTTP format of the specified date.
*/
- public static String getDate(Date date) {
+ public static final String formatDate
+ (long value, DateFormat threadLocalformat) {
- String cachedDate = (String) dateCache.get(date);
+ String cachedDate = null;
+ Long longValue = new Long(value);
+ try {
+ cachedDate = (String) formatCache.get(longValue);
+ } catch (Exception e) {
+ }
if (cachedDate != null)
return cachedDate;
String newDate = null;
- synchronized (format) {
- newDate = format.format(date);
- dateCache.put(date, newDate);
+ Date dateValue = new Date(value);
+ if (threadLocalformat != null) {
+ newDate = threadLocalformat.format(dateValue);
+ synchronized (formatCache) {
+ updateCache(formatCache, longValue, newDate);
+ }
+ } else {
+ synchronized (formatCache) {
+ newDate = format.format(dateValue);
+ updateCache(formatCache, longValue, newDate);
+ }
}
return newDate;
+ }
+
+
+ /**
+ * Try to parse the given date as a HTTP date.
+ */
+ public static final long parseDate(String value,
+ DateFormat[] threadLocalformats) {
+
+ Long cachedDate = null;
+ try {
+ cachedDate = (Long) formatCache.get(value);
+ } catch (Exception e) {
+ }
+ if (cachedDate != null)
+ return cachedDate.longValue();
+
+ Long date = null;
+ if (threadLocalformats != null) {
+ date = internalParseDate(value, threadLocalformats);
+ synchronized (parseCache) {
+ updateCache(parseCache, value, date);
+ }
+ } else {
+ synchronized (parseCache) {
+ date = internalParseDate(value, formats);
+ updateCache(parseCache, value, date);
+ }
+ }
+ if (date == null) {
+ return (-1L);
+ } else {
+ return date.longValue();
+ }
+
+ }
+
+
+ /**
+ * Parse date with given formatters.
+ */
+ private static final Long internalParseDate
+ (String value, DateFormat[] formats) {
+ Date date = null;
+ for (int i = 0; (date == null) && (i < formats.length); i++) {
+ try {
+ date = formats[i].parse(value);
+ } catch (ParseException e) {
+ ;
+ }
+ }
+ if (date == null) {
+ return null;
+ }
+ return new Long(date.getTime());
+ }
+
+
+ /**
+ * Update cache.
+ */
+ private static final void updateCache(HashMap cache, Object key,
+ Object value) {
+ if (value == null) {
+ return;
+ }
+ if (cache.size() > 1000) {
+ cache.clear();
+ }
+ cache.put(key, value);
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>