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();