Author: bayard
Date: Mon Oct 15 22:40:16 2007
New Revision: 585044

URL: http://svn.apache.org/viewvc?rev=585044&view=rev
Log:
Applying the fix and the tests from #32311 - LRUMap used as a caching system to 
improve on performance

Added:
    
jakarta/taglibs/proper/standard/trunk/test/org/apache/taglibs/standard/tag/el/fmt/
    
jakarta/taglibs/proper/standard/trunk/test/org/apache/taglibs/standard/tag/el/fmt/TestDateTag.java
   (with props)
    
jakarta/taglibs/proper/standard/trunk/test/web/org/apache/taglibs/standard/tag/el/fmt/
    
jakarta/taglibs/proper/standard/trunk/test/web/org/apache/taglibs/standard/tag/el/fmt/TestDateTag.jsp
   (with props)
Modified:
    
jakarta/taglibs/proper/standard/trunk/src/org/apache/taglibs/standard/tag/common/fmt/FormatDateSupport.java

Modified: 
jakarta/taglibs/proper/standard/trunk/src/org/apache/taglibs/standard/tag/common/fmt/FormatDateSupport.java
URL: 
http://svn.apache.org/viewvc/jakarta/taglibs/proper/standard/trunk/src/org/apache/taglibs/standard/tag/common/fmt/FormatDateSupport.java?rev=585044&r1=585043&r2=585044&view=diff
==============================================================================
--- 
jakarta/taglibs/proper/standard/trunk/src/org/apache/taglibs/standard/tag/common/fmt/FormatDateSupport.java
 (original)
+++ 
jakarta/taglibs/proper/standard/trunk/src/org/apache/taglibs/standard/tag/common/fmt/FormatDateSupport.java
 Mon Oct 15 22:40:16 2007
@@ -22,6 +22,8 @@
 import java.util.Date;
 import java.util.Locale;
 import java.util.TimeZone;
+import java.util.Collections;
+import java.util.Map;
 
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.JspTagException;
@@ -31,6 +33,8 @@
 import org.apache.taglibs.standard.resources.Resources;
 import org.apache.taglibs.standard.tag.common.core.Util;
 
+import org.apache.taglibs.standard.extra.commons.collections.map.LRUMap;
+
 /**
  * Support for tag handlers for <formatDate>, the date and time
  * formatting tag in JSTL 1.0.
@@ -43,10 +47,24 @@
     //*********************************************************************
     // Private constants
 
+       /**
+        * Name of configuration setting for maximum number of entries in the
+        * cached dateformat map
+        */
+       private static final String DATE_CACHE_PARAM = 
+               
"org.apache.taglibs.standard.tag.common.fmt.dateFormatCacheSize";
+
     private static final String DATE = "date";
     private static final String TIME = "time";
     private static final String DATETIME = "both";
 
+    private static Map dateFormatCache = null;
+
+       /**
+        * Default maximum  cache size
+        */
+       private static final int MAX_SIZE = 100;
+
 
     //*********************************************************************
     // Protected state
@@ -120,16 +138,7 @@
            DateFormat.getAvailableLocales());
 
        if (locale != null) {
-           DateFormat formatter = createFormatter(locale);
-
-           // Apply pattern, if present
-           if (pattern != null) {
-               try {
-                   ((SimpleDateFormat) formatter).applyPattern(pattern);
-               } catch (ClassCastException cce) {
-                   formatter = new SimpleDateFormat(pattern, locale);
-               }
-           }
+           DateFormat formatter = createFormatter(locale, pattern);
 
            // Set time zone
            TimeZone tz = null;
@@ -180,22 +189,75 @@
     //*********************************************************************
     // Private utility methods
 
-    private DateFormat createFormatter(Locale loc) throws JspException {
+    private DateFormat createFormatter(Locale loc, String pattern) throws 
JspException {
        DateFormat formatter = null;
 
+       // lazy initialization of cache
+       if (dateFormatCache == null) {
+               String value = 
pageContext.getServletContext().getInitParameter(DATE_CACHE_PARAM);
+               if (value != null) {
+                       dateFormatCache = Collections.synchronizedMap(new 
LRUMap(Integer.parseInt(value)));
+               } else {
+                       dateFormatCache = Collections.synchronizedMap(new 
LRUMap(MAX_SIZE));
+               }
+       }
+
+       // Apply pattern, if present
+       if (pattern != null) {
+               if ((type == null) || DATE.equalsIgnoreCase(type)) {
+                   String key = DATE + pattern + loc;
+            formatter = (DateFormat) dateFormatCache.get(key);
+            if(formatter == null) {
+                formatter = new SimpleDateFormat(pattern, loc);
+                dateFormatCache.put(key, formatter);
+            }
+               } else if (TIME.equalsIgnoreCase(type)) {
+                   String key = TIME + pattern + loc;
+            formatter = (DateFormat) dateFormatCache.get(key);
+            if(formatter == null) {
+                formatter = new SimpleDateFormat(pattern, loc);
+                dateFormatCache.put(key, formatter);
+            }
+               } else if (DATETIME.equalsIgnoreCase(type)) {
+                   String key = DATETIME + pattern + loc;
+            formatter = (DateFormat) dateFormatCache.get(key);
+            if(formatter == null) {
+                formatter = new SimpleDateFormat(pattern, loc);
+                dateFormatCache.put(key, formatter);
+            }
+               } else {
+                   throw new JspException(
+                         Resources.getMessage("FORMAT_DATE_INVALID_TYPE", 
+                                                type));
+               }
+        return formatter;
+       }
+
        if ((type == null) || DATE.equalsIgnoreCase(type)) {
-           formatter = DateFormat.getDateInstance(
-               Util.getStyle(dateStyle, "FORMAT_DATE_INVALID_DATE_STYLE"),
-               loc);
+               int style = Util.getStyle(dateStyle, 
"FORMAT_DATE_INVALID_DATE_STYLE");
+               String key = DATE + style + loc;
+               formatter = (DateFormat) dateFormatCache.get(key);
+               if(formatter == null) {
+                       formatter = DateFormat.getDateInstance(style, loc);
+                       dateFormatCache.put(key, formatter);
+               }
        } else if (TIME.equalsIgnoreCase(type)) {
-           formatter = DateFormat.getTimeInstance(
-               Util.getStyle(timeStyle, "FORMAT_DATE_INVALID_TIME_STYLE"),
-               loc);
+               int style = Util.getStyle(timeStyle, 
"FORMAT_DATE_INVALID_TIME_STYLE");
+               String key = TIME + style + loc;
+               formatter = (DateFormat) dateFormatCache.get(key);
+               if(formatter == null) {
+                       formatter = DateFormat.getTimeInstance(style, loc);
+                       dateFormatCache.put(key, formatter);
+               }
        } else if (DATETIME.equalsIgnoreCase(type)) {
-           formatter = DateFormat.getDateTimeInstance(
-               Util.getStyle(dateStyle, "FORMAT_DATE_INVALID_DATE_STYLE"),
-               Util.getStyle(timeStyle, "FORMAT_DATE_INVALID_TIME_STYLE"),
-               loc);
+               int style1 = Util.getStyle(dateStyle, 
"FORMAT_DATE_INVALID_DATE_STYLE");
+               int style2 = Util.getStyle(timeStyle, 
"FORMAT_DATE_INVALID_TIME_STYLE");
+               String key = DATETIME + style1 + loc + style2;
+               formatter = (DateFormat) dateFormatCache.get(key);
+               if(formatter == null) {
+                       formatter = DateFormat.getDateTimeInstance(style1, 
style2, loc);
+                       dateFormatCache.put(key, formatter);
+               }
        } else {
            throw new JspException(
                     Resources.getMessage("FORMAT_DATE_INVALID_TYPE", 

Added: 
jakarta/taglibs/proper/standard/trunk/test/org/apache/taglibs/standard/tag/el/fmt/TestDateTag.java
URL: 
http://svn.apache.org/viewvc/jakarta/taglibs/proper/standard/trunk/test/org/apache/taglibs/standard/tag/el/fmt/TestDateTag.java?rev=585044&view=auto
==============================================================================
--- 
jakarta/taglibs/proper/standard/trunk/test/org/apache/taglibs/standard/tag/el/fmt/TestDateTag.java
 (added)
+++ 
jakarta/taglibs/proper/standard/trunk/test/org/apache/taglibs/standard/tag/el/fmt/TestDateTag.java
 Mon Oct 15 22:40:16 2007
@@ -0,0 +1,49 @@
+/*
+ * Copyright 1999,2004 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.taglibs.standard.tag.el.fmt;
+
+import javax.servlet.jsp.*;
+import org.apache.cactus.*;
+import org.apache.taglibs.standard.testutil.TestUtil;
+
+public class TestDateTag extends JspTestCase {
+
+    public TestDateTag(String name) {
+        super(name);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    public void testDateTag() throws Exception {
+        String var = "varDate";
+        String toInclude = TestUtil.getTestJsp(this);
+        pageContext.include(toInclude);
+        String actual = (String) pageContext.getAttribute(var, 
PageContext.APPLICATION_SCOPE);
+
+        // This isn't desired; Cactus doesn't set things up right
+        assertEquals(new java.util.Date().toString().length(), 
actual.length());
+        
+        // Ideally we would run this, or something like it
+//        assertEquals("yyyy-MM-dd".length(), actual.length());
+    }
+}

Propchange: 
jakarta/taglibs/proper/standard/trunk/test/org/apache/taglibs/standard/tag/el/fmt/TestDateTag.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
jakarta/taglibs/proper/standard/trunk/test/web/org/apache/taglibs/standard/tag/el/fmt/TestDateTag.jsp
URL: 
http://svn.apache.org/viewvc/jakarta/taglibs/proper/standard/trunk/test/web/org/apache/taglibs/standard/tag/el/fmt/TestDateTag.jsp?rev=585044&view=auto
==============================================================================
--- 
jakarta/taglibs/proper/standard/trunk/test/web/org/apache/taglibs/standard/tag/el/fmt/TestDateTag.jsp
 (added)
+++ 
jakarta/taglibs/proper/standard/trunk/test/web/org/apache/taglibs/standard/tag/el/fmt/TestDateTag.jsp
 Mon Oct 15 22:40:16 2007
@@ -0,0 +1,18 @@
+<!-- Use this via the web browser to show that things are fine             -->
+<!-- Unfortunately with Cactus the server isn't getting the correct locale -->
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"; %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"; %>
+
+<jsp:useBean id="date" class="java.util.Date" />
+
+<fmt:formatDate value="${date}" var="varDate" scope="application" 
pattern="yyyy-MM-dd"/>
+<c:out value="${varDate}"/>
+
+<fmt:formatDate value="${date}" var="varTime" scope="application" 
pattern="HH:mm:ss" type="time"/>
+<c:out value="${varTime}"/>
+
+<fmt:formatDate value="${date}" dateStyle="short" var="varDate2" 
scope="application"/>
+<c:out value="${varDate2}"/>
+
+<fmt:formatDate value="${date}" timeStyle="short" var="varTime2" 
scope="application" type="time"/>
+<c:out value="${varTime2}"/>

Propchange: 
jakarta/taglibs/proper/standard/trunk/test/web/org/apache/taglibs/standard/tag/el/fmt/TestDateTag.jsp
------------------------------------------------------------------------------
    svn:eol-style = native



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to