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:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to