Author: jkuhnert
Date: Sun Feb 11 15:40:50 2007
New Revision: 506177

URL: http://svn.apache.org/viewvc?view=rev&rev=506177
Log:
Fixes TAPESTRY-1229. DateFormat objects aren't thread safe so used commons-pool 
to pool the instances.

Will probably replace the org.apache.tapestry.services.ObjectPool 
implementation with something like this. (as well as 
whatever is pooling pages, which may be the same service )

Added:
    
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/asset/PoolableDateFormatFactory.java
Modified:
    tapestry/tapestry4/trunk/src/main/assembly/dep.xml
    
tapestry/tapestry4/trunk/tapestry-examples/TimeTracker/src/context/WEB-INF/log4j.properties
    
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/asset/AssetService.java
    
tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/asset/TestAssetService.java
    
tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/translator/TestTranslatorBinding.java

Modified: tapestry/tapestry4/trunk/src/main/assembly/dep.xml
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/src/main/assembly/dep.xml?view=diff&rev=506177&r1=506176&r2=506177
==============================================================================
--- tapestry/tapestry4/trunk/src/main/assembly/dep.xml (original)
+++ tapestry/tapestry4/trunk/src/main/assembly/dep.xml Sun Feb 11 15:40:50 2007
@@ -33,7 +33,7 @@
             </includes>
             <binaries>
                 <outputDirectory>modules/${artifactId}</outputDirectory>
-                <includeDependencies>true</includeDependencies>
+                <includeDependencies>false</includeDependencies>
                 <unpack>false</unpack>
             </binaries>
         </moduleSet>

Modified: 
tapestry/tapestry4/trunk/tapestry-examples/TimeTracker/src/context/WEB-INF/log4j.properties
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-examples/TimeTracker/src/context/WEB-INF/log4j.properties?view=diff&rev=506177&r1=506176&r2=506177
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-examples/TimeTracker/src/context/WEB-INF/log4j.properties
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-examples/TimeTracker/src/context/WEB-INF/log4j.properties
 Sun Feb 11 15:40:50 2007
@@ -32,5 +32,6 @@
 log4j.logger.org.apache.tapestry.form=DEBUG
 log4j.logger.org.apache.tapestry.form.FormSupportImpl=DEBUG
 
+log4j.logger.tapestry.services.Asset=DEBUG
 #log4j.logger.tapestry.globals.ResponseBuilder=DEBUG
 #log4j.logger.org.apache.tapestry.services.impl.DojoAjaxResponseBuilder=DEBUG

Modified: 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/asset/AssetService.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/asset/AssetService.java?view=diff&rev=506177&r1=506176&r2=506177
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/asset/AssetService.java
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/asset/AssetService.java
 Sun Feb 11 15:40:50 2007
@@ -21,8 +21,6 @@
 import java.net.URL;
 import java.net.URLConnection;
 import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
@@ -34,6 +32,8 @@
 import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
+import org.apache.commons.pool.ObjectPool;
+import org.apache.commons.pool.impl.StackObjectPool;
 import org.apache.hivemind.ClassResolver;
 import org.apache.hivemind.util.Defense;
 import org.apache.tapestry.IRequestCycle;
@@ -82,7 +82,10 @@
 
     public static final String DIGEST = "digest";
     
-    static final DateFormat CACHED_FORMAT = new SimpleDateFormat("EEE, d MMM 
yyyy HH:mm:ss Z", Locale.ENGLISH);
+    /**
+     * Pool of date format objects. (pooled because DateFormat isn't thread 
safe )
+     */
+    static final ObjectPool CACHED_FORMAT_POOL = new StackObjectPool(new 
PoolableDateFormatFactory("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH));
     
     /**
      * Defaults MIME types, by extension, used when the servlet container 
doesn't provide MIME
@@ -304,10 +307,26 @@
         String header = _request.getHeader("If-Modified-Since");
         long modify = -1;
         
+        if (_log.isDebugEnabled())
+            _log.debug("cachedResource(" + resourceURL.getURL() + ") 
modified-since header is: " + header);
+        
+        DateFormat format = null;
+        
         try {
-            if (header != null)
-                modify = CACHED_FORMAT.parse(header).getTime();
-        } catch (ParseException e) { e.printStackTrace(); }
+            
+            if (header != null) {
+                
+                format = (DateFormat) CACHED_FORMAT_POOL.borrowObject();
+                
+                modify = format.parse(header).getTime();
+            }
+            
+        } catch (Exception e) { e.printStackTrace(); }
+        finally {
+            
+            if (format != null) 
+                try { CACHED_FORMAT_POOL.returnObject(format); } catch 
(Throwable t) { t.printStackTrace(); }
+        }
         
         if (resourceURL.getLastModified() > modify)
             return false;

Added: 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/asset/PoolableDateFormatFactory.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/asset/PoolableDateFormatFactory.java?view=auto&rev=506177
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/asset/PoolableDateFormatFactory.java
 (added)
+++ 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/asset/PoolableDateFormatFactory.java
 Sun Feb 11 15:40:50 2007
@@ -0,0 +1,55 @@
+// Copyright 2004, 2005 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package org.apache.tapestry.asset;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
+
+import org.apache.commons.pool.BasePoolableObjectFactory;
+
+
+/**
+ * Implementation of [EMAIL PROTECTED] BasePoolableObjectFactory} used to 
cache [EMAIL PROTECTED] DateFormat} objects.
+ */
+public class PoolableDateFormatFactory extends BasePoolableObjectFactory
+{
+
+    private String _format;
+    
+    private Locale _locale;
+    
+    /**
+     * Creates a new pool factory that will create [EMAIL PROTECTED] 
DateFormat} objects by passing
+     * in the format/locale arguments to that objects constructor.
+     * 
+     * @param format The date format type.
+     * @param locale The locale of the format.
+     */
+    public PoolableDateFormatFactory(String format, Locale locale)
+    {
+        _format = format;
+        _locale = locale;
+    }
+    
+    /**
+     * [EMAIL PROTECTED]
+     */
+    public Object makeObject()
+        throws Exception
+    {
+        return new SimpleDateFormat(_format, _locale);
+    }
+
+}

Modified: 
tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/asset/TestAssetService.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/asset/TestAssetService.java?view=diff&rev=506177&r1=506176&r2=506177
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/asset/TestAssetService.java
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/asset/TestAssetService.java
 Sun Feb 11 15:40:50 2007
@@ -16,7 +16,9 @@
 import static org.easymock.EasyMock.*;
 
 import java.net.URLConnection;
+import java.text.DateFormat;
 
+import org.apache.commons.logging.LogFactory;
 import org.apache.tapestry.web.WebRequest;
 import org.apache.tapestry.web.WebResponse;
 import org.testng.annotations.Test;
@@ -42,6 +44,7 @@
         
         AssetService service = new AssetService();
         service.setRequest(request);
+        service.setLog(LogFactory.getLog("test"));
         
         URLConnection url = 
org.easymock.classextension.EasyMock.createMock(URLConnection.class);
         
@@ -64,6 +67,7 @@
         
         AssetService service = new AssetService();
         service.setRequest(request);
+        service.setLog(LogFactory.getLog("test"));
         
         URLConnection url = 
org.easymock.classextension.EasyMock.createMock(URLConnection.class);
         
@@ -86,6 +90,7 @@
         
         AssetService service = new AssetService();
         service.setRequest(request);
+        service.setLog(LogFactory.getLog("test"));
         
         URLConnection url = 
org.easymock.classextension.EasyMock.createMock(URLConnection.class);
         
@@ -111,11 +116,24 @@
         AssetService service = new AssetService();
         service.setRequest(request);
         service.setResponse(response);
+        service.setLog(LogFactory.getLog("test"));
         
         URLConnection url = 
org.easymock.classextension.EasyMock.createMock(URLConnection.class);
         
-        expect(request.getHeader("If-Modified-Since")).andReturn("Sat, 29 Oct 
1994 19:43:31 GMT");
-        
expect(url.getLastModified()).andReturn(AssetService.CACHED_FORMAT.parse("Sat, 
1 Dec 1991 19:43:31 GMT").getTime());
+        DateFormat format = null;
+        
+        try {
+            
+            format = (DateFormat) 
AssetService.CACHED_FORMAT_POOL.borrowObject();
+            
+            expect(request.getHeader("If-Modified-Since")).andReturn("Sat, 29 
Oct 1994 19:43:31 GMT");
+            expect(url.getLastModified()).andReturn(format.parse("Sat, 1 Dec 
1991 19:43:31 GMT").getTime());
+            
+        } finally {
+            if (format != null) {
+                try { AssetService.CACHED_FORMAT_POOL.returnObject(format); } 
catch (Throwable t) {}
+            }
+        }
         
         response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
         

Modified: 
tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/translator/TestTranslatorBinding.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/translator/TestTranslatorBinding.java?view=diff&rev=506177&r1=506176&r2=506177
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/translator/TestTranslatorBinding.java
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/translator/TestTranslatorBinding.java
 Sun Feb 11 15:40:50 2007
@@ -32,10 +32,10 @@
  * @author Howard Lewis Ship
  * @since 4.0
  */
[EMAIL PROTECTED]
[EMAIL PROTECTED](sequential = true)
 public class TestTranslatorBinding extends BindingTestCase
 {
-    public void testCreate()
+    public void test_Create()
     {
         Location l = newLocation();
         ValueConverter vc = newValueConverter();
@@ -63,7 +63,7 @@
         verify();
     }
 
-    public void testFailure()
+    public void test_Failure()
     {
         Location l = newLocation();
         IComponent component = newComponent();


Reply via email to