You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2010/07/17 12:10:46 UTC

svn commit: r965050 - in /struts/struts2/trunk/core/src/main/java/org/apache/struts2: StrutsConstants.java components/template/FreemarkerTemplateEngine.java config/BeanSelectionProvider.java views/freemarker/FreemarkerManager.java

Author: lukaszlenart
Date: Sat Jul 17 10:10:46 2010
New Revision: 965050

URL: http://svn.apache.org/viewvc?rev=965050&view=rev
Log:
Resolved WW-3467 - Improve performance for page rendering by refactoring freemarker cache

Modified:
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/template/FreemarkerTemplateEngine.java
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerManager.java

Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java?rev=965050&r1=965049&r2=965050&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java (original)
+++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java Sat Jul 17 10:10:46 2010
@@ -82,9 +82,13 @@ public final class StrutsConstants {
     /** The org.apache.struts2.views.freemarker.FreemarkerManager implementation class */
     public static final String STRUTS_FREEMARKER_MANAGER_CLASSNAME = "struts.freemarker.manager.classname";
     
-    /** Cache Freemarker templates */
+    @Deprecated
+    /** Cache Freemarker templates, this cache is managed by struts2,instead of native freemarker cache,set STRUTS_FREEMARKER_MRU_MAX_STRONG_SIZE >0&&STRUTS_FREEMARKER_TEMPLATES_CACHE_UPDATE_DELAY>0*/
     public static final String STRUTS_FREEMARKER_TEMPLATES_CACHE = "struts.freemarker.templatesCache";
     
+    /** Update freemarker templates cache in seconds*/
+    public static final String STRUTS_FREEMARKER_TEMPLATES_CACHE_UPDATE_DELAY = "struts.freemarker.templatesCache.updateDelay";
+    
     /** Cache model instances at BeanWrapper level */
     public static final String STRUTS_FREEMARKER_BEANWRAPPER_CACHE = "struts.freemarker.beanwrapperCache";
     

Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/template/FreemarkerTemplateEngine.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/template/FreemarkerTemplateEngine.java?rev=965050&r1=965049&r2=965050&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/template/FreemarkerTemplateEngine.java (original)
+++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/template/FreemarkerTemplateEngine.java Sat Jul 17 10:10:46 2010
@@ -23,16 +23,14 @@ package org.apache.struts2.components.te
 
 import java.io.IOException;
 import java.io.Writer;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.Map;
+import java.util.List;
 
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.struts2.ServletActionContext;
-import org.apache.struts2.StrutsConstants;
 import org.apache.struts2.views.freemarker.FreemarkerManager;
 
 import com.opensymphony.xwork2.ActionContext;
@@ -54,10 +52,6 @@ public class FreemarkerTemplateEngine ex
     static Class bodyContent = null;
     protected FreemarkerManager freemarkerManager;
 
-    protected final Map<String, freemarker.template.Template> templates = new ConcurrentHashMap<String, freemarker.template.Template>();
-    protected final Set<String> missingTemplates = new CopyOnWriteArraySet<String>();
-    protected boolean freemarkerCaching = false;
-
     static {
         try {
             bodyContent = ClassLoaderUtil.loadClass("javax.servlet.jsp.tagext.BodyContent",
@@ -97,24 +91,6 @@ public class FreemarkerTemplateEngine ex
         Exception exception = null;
         for (Template t : templates) {
             templateName = getFinalTemplateName(t);
-            if (freemarkerCaching) {
-                if (!isTemplateMissing(templateName)) {
-                    try {
-                        template = findInCache(templateName);  // look in cache first
-                        if (template == null) {
-                            // try to load, and if it works, stop at the first one
-                            template = config.getTemplate(templateName);
-                            addToCache(templateName, template);
-                        }
-                        break;
-                    } catch (IOException e) {
-                        addToMissingTemplateCache(templateName);
-                        if (exception == null) {
-                            exception = e;
-                        }
-                    }
-                }
-            } else {
                 try {
                     // try to load, and if it works, stop at the first one
                     template = config.getTemplate(templateName);
@@ -129,7 +105,6 @@ public class FreemarkerTemplateEngine ex
                         exception = e;
                     }
                 }
-            }
         }
 
         if (template == null) {
@@ -189,39 +164,5 @@ public class FreemarkerTemplateEngine ex
         return "ftl";
     }
 
-    protected void addToMissingTemplateCache(String templateName) {
-        missingTemplates.add(templateName);
-    }
-    
-    protected boolean isTemplateMissing(String templateName) {
-        return missingTemplates.contains(templateName);
-    }
 
-    protected void addToCache(String templateName,
-        freemarker.template.Template template) {
-        templates.put(templateName, template);
-    }
-    
-    protected freemarker.template.Template findInCache(String templateName) {
-        return templates.get(templateName);
-    }
-    
-    /**
-     * Enables or disables Struts caching of Freemarker templates. By default disabled.
-     * Set struts.freemarker.templatesCache=true to enable cache
-     * @param cacheTemplates "true" if the template engine should cache freemarker template
-     * internally
-     */
-    @Inject(StrutsConstants.STRUTS_FREEMARKER_TEMPLATES_CACHE)
-    public void setCacheTemplates(String cacheTemplates) {
-        freemarkerCaching = "true".equals(cacheTemplates);
-    }
-
-    /**
-     * Clear the templates and missing templates cache
-     */
-    public void clearTemplatesCache() {
-        templates.clear();
-        missingTemplates.clear();
-    }
 }

Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java?rev=965050&r1=965049&r2=965050&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java (original)
+++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java Sat Jul 17 10:10:46 2010
@@ -26,7 +26,6 @@ import java.util.StringTokenizer;
 
 import org.apache.struts2.StrutsConstants;
 import org.apache.struts2.components.UrlRenderer;
-import org.apache.struts2.dispatcher.DefaultStaticContentLoader;
 import org.apache.struts2.dispatcher.StaticContentLoader;
 import org.apache.struts2.dispatcher.mapper.ActionMapper;
 import org.apache.struts2.dispatcher.multipart.MultiPartRequest;
@@ -222,6 +221,7 @@ public class BeanSelectionProvider imple
             props.setProperty(StrutsConstants.STRUTS_I18N_RELOAD, "true");
             props.setProperty(StrutsConstants.STRUTS_CONFIGURATION_XML_RELOAD, "true");
             props.setProperty(StrutsConstants.STRUTS_FREEMARKER_TEMPLATES_CACHE, "false");
+            props.setProperty(StrutsConstants.STRUTS_FREEMARKER_TEMPLATES_CACHE_UPDATE_DELAY, "0");
             // Convert struts properties into ones that xwork expects
             props.setProperty("devMode", "true");
         } else {

Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerManager.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerManager.java?rev=965050&r1=965049&r2=965050&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerManager.java (original)
+++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerManager.java Sat Jul 17 10:10:46 2010
@@ -50,14 +50,12 @@ import freemarker.cache.FileTemplateLoad
 import freemarker.cache.MultiTemplateLoader;
 import freemarker.cache.TemplateLoader;
 import freemarker.cache.WebappTemplateLoader;
-import freemarker.ext.beans.BeansWrapper;
 import freemarker.ext.jsp.TaglibFactory;
 import freemarker.ext.servlet.HttpRequestHashModel;
 import freemarker.ext.servlet.HttpRequestParametersHashModel;
 import freemarker.ext.servlet.HttpSessionHashModel;
 import freemarker.ext.servlet.ServletContextHashModel;
 import freemarker.template.*;
-import freemarker.core.Configurable;
 import freemarker.template.utility.StringUtil;
 
 
@@ -117,7 +115,6 @@ public class FreemarkerManager {
      // Note these names start with dot, so they're essentially invisible from  a freemarker script.
      private static final String ATTR_REQUEST_MODEL = ".freemarker.Request";
      private static final String ATTR_REQUEST_PARAMETERS_MODEL = ".freemarker.RequestParameters";
-     private static final String ATTR_SESSION_MODEL = ".freemarker.Session";
      private static final String ATTR_APPLICATION_MODEL = ".freemarker.Application";
      private static final String ATTR_JSP_TAGLIBS_MODEL = ".freemarker.JspTaglibs";
 
@@ -169,6 +166,7 @@ public class FreemarkerManager {
     protected boolean altMapWrapper;
     protected boolean cacheBeanWrapper;
     protected int mruMaxStrongSize;
+    protected String templateUpdateDelay;
     protected Map<String,TagLibrary> tagLibraries;
 
     @Inject(StrutsConstants.STRUTS_I18N_ENCODING)
@@ -191,6 +189,11 @@ public class FreemarkerManager {
         mruMaxStrongSize = Integer.parseInt(size);
     }
     
+    @Inject(value = StrutsConstants.STRUTS_FREEMARKER_TEMPLATES_CACHE_UPDATE_DELAY, required = false)
+    public void setTemplateUpdateDelay(String delay) {
+    	templateUpdateDelay = delay;
+    }
+    
     @Inject
     public void setContainer(Container container) {
         Map<String,TagLibrary> map = new HashMap<String,TagLibrary>();
@@ -229,7 +232,7 @@ public class FreemarkerManager {
         return contentType;
     }
 
-    public synchronized freemarker.template.Configuration getConfiguration(ServletContext servletContext) {
+    public synchronized Configuration getConfiguration(ServletContext servletContext) {
         if (config == null) {
             try {
                 init(servletContext);
@@ -287,15 +290,17 @@ public class FreemarkerManager {
      *
      * @param servletContext
      */
-    protected freemarker.template.Configuration createConfiguration(ServletContext servletContext) throws TemplateException {
-        freemarker.template.Configuration configuration = new freemarker.template.Configuration();
+    protected Configuration createConfiguration(ServletContext servletContext) throws TemplateException {
+        Configuration configuration = new Configuration();
 
         configuration.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);
 
         if (mruMaxStrongSize > 0) {
-            configuration.setSetting(freemarker.template.Configuration.CACHE_STORAGE_KEY, "strong:" + mruMaxStrongSize);
+            configuration.setSetting(Configuration.CACHE_STORAGE_KEY, "strong:" + mruMaxStrongSize);
+        }
+        if (templateUpdateDelay != null) {
+            configuration.setSetting(Configuration.TEMPLATE_UPDATE_DELAY_KEY, templateUpdateDelay);
         }
-
         if (encoding != null) {
             configuration.setDefaultEncoding(encoding);
         }
@@ -333,17 +338,8 @@ public class FreemarkerManager {
 
         // Create hash model wrapper for session
         HttpSession session = request.getSession(false);
-        HttpSessionHashModel sessionModel;
         if (session != null) {
-            sessionModel = (HttpSessionHashModel) session.getAttribute(ATTR_SESSION_MODEL);
-            if (sessionModel == null) {
-                sessionModel = new HttpSessionHashModel(session, wrapper);
-                session.setAttribute(ATTR_SESSION_MODEL, sessionModel);
-            }
             model.put(KEY_SESSION, new HttpSessionHashModel(session, wrapper));
-        } else {
-            // no session means no attributes ???
-            //            model.put(KEY_SESSION_MODEL, new SimpleHash());
         }
 
         // Create hash model wrapper for the request attributes
@@ -525,19 +521,4 @@ public class FreemarkerManager {
         }
     }
 
-      /**
-     * If the parameter "nocache" was set to true, generate a set of headers
-     * that will advise the HTTP client not to cache the returned page.
-     */
-      private void setBrowserCachingPolicy(HttpServletResponse res) {
-          if (nocache) {
-              // HTTP/1.1 + IE extensions
-              res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, "
-                      + "post-check=0, pre-check=0");
-              // HTTP/1.0
-              res.setHeader("Pragma", "no-cache");
-              // Last resort for those that ignore all of the above
-              res.setHeader("Expires", EXPIRATION_DATE);
-          }
-      }
 }