svn commit: r585044 - in /jakarta/taglibs/proper/standard/trunk: src/org/apache/taglibs/standard/tag/common/fmt/ test/org/apache/taglibs/standard/tag/el/fmt/ test/web/org/apache/taglibs/standard/tag/el/fmt/

[email protected]
Newsgroups gmane.comp.jakarta.taglibs.devel
Message-ID <[email protected]>
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 &lt;formatDate&gt;, 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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.