classpath-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cp-patches] FYI: URLConnection date parsing


From: Bryce McKinlay
Subject: [cp-patches] FYI: URLConnection date parsing
Date: Wed, 21 Jul 2004 21:32:38 -0400
User-agent: Mozilla Thunderbird 0.5 (X11/20040626)

This patch makes a small efficiency improvement to parsing dates in URL headers. We reuse a ParsePosition for each URLConnection rather than creating multiple ones for each date header call. I'm checking it in.

Regards

Bryce

2004-07-21  Bryce McKinlay  <address@hidden>

        * java/net/URLConnection.java (position): New field.
        (dateFormat1, dateFormat2, dateFormat3): Removed.
        (dateFormats): New field.
        (getHeaderFieldDate): Use new dateFormats array. Re-use parsePosition
        each time instead of re-allocating.
        (initializeDateFormats): Initialize 'dateFormats'.

Index: URLConnection.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/net/URLConnection.java,v
retrieving revision 1.31
diff -u -r1.31 URLConnection.java
--- URLConnection.java  23 Apr 2004 07:21:46 -0000      1.31
+++ URLConnection.java  22 Jul 2004 01:21:38 -0000
@@ -165,11 +165,12 @@
   protected URL url;
 
   private static Hashtable handlers = new Hashtable();
-  private static SimpleDateFormat dateFormat1;
-  private static SimpleDateFormat dateFormat2;
-  private static SimpleDateFormat dateFormat3;
+  private static SimpleDateFormat[] dateFormats;
   private static boolean dateformats_initialized;
 
+  /* Cached ParsePosition, used when parsing dates. */
+  private ParsePosition position;
+
   /**
    * Creates a URL connection to a given URL. A real connection is not made.
    * Use #connect to do this.
@@ -366,19 +367,24 @@
   {
     if (! dateformats_initialized)
       initializeDateFormats();
+    
+    if (position == null)
+      position = new ParsePosition(0);
 
     long result = defaultValue;
     String str = getHeaderField(name);
 
     if (str != null)
       {
-       Date date;
-       if ((date = dateFormat1.parse(str, new ParsePosition(0))) != null)
-         result = date.getTime();
-       else if ((date = dateFormat2.parse(str, new ParsePosition(0))) != null)
-         result = date.getTime();
-       else if ((date = dateFormat3.parse(str, new ParsePosition(0))) != null)
-         result = date.getTime();
+       for (int i = 0; i < dateFormats.length; i++)
+         {
+           SimpleDateFormat df = dateFormats[i];
+           position.setIndex(0);
+           position.setErrorIndex(0);
+           Date date = df.parse(str, position);
+           if (date != null)
+             return date.getTime();
+         }
       }
 
     return result;
@@ -1040,17 +1046,18 @@
   // We don't put these in a static initializer, because it creates problems
   // with initializer co-dependency: SimpleDateFormat's constructors 
eventually 
   // depend on URLConnection (via the java.text.*Symbols classes).
-  private synchronized void initializeDateFormats()
+  private static synchronized void initializeDateFormats()
   {
     if (dateformats_initialized)
       return;
 
     Locale locale = new Locale("En", "Us", "Unix");
-    dateFormat1 =
+    dateFormats = new SimpleDateFormat[3];
+    dateFormats[0] =
       new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss 'GMT'", locale);
-    dateFormat2 =
+    dateFormats[1] =
       new SimpleDateFormat("EEEE, dd-MMM-yy hh:mm:ss 'GMT'", locale);
-    dateFormat3 = new SimpleDateFormat("EEE MMM d hh:mm:ss yyyy", locale);
+    dateFormats[2] = new SimpleDateFormat("EEE MMM d hh:mm:ss yyyy", locale);
     dateformats_initialized = true;
   }
 }

reply via email to

[Prev in Thread] Current Thread [Next in Thread]