You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by mu...@apache.org on 2010/01/15 20:16:09 UTC

svn commit: r899763 - in /struts/struts2/trunk: core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerManager.java plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/FreemarkerDecoratorServlet.java

Author: musachy
Date: Fri Jan 15 19:16:09 2010
New Revision: 899763

URL: http://svn.apache.org/viewvc?rev=899763&view=rev
Log:
WW-3329 ${Parameters.xxx} in freemarker view is broken

Modified:
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerManager.java
    struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/FreemarkerDecoratorServlet.java

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=899763&r1=899762&r2=899763&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 Fri Jan 15 19:16:09 2010
@@ -99,11 +99,11 @@
 public class FreemarkerManager {
 
     // coppied from freemarker servlet - so that there is no dependency on it
-    private static final String INITPARAM_TEMPLATE_PATH = "TemplatePath";
-     private static final String INITPARAM_NOCACHE = "NoCache";
-     private static final String INITPARAM_CONTENT_TYPE = "ContentType";
-     private static final String DEFAULT_CONTENT_TYPE = "text/html";
-     private static final String INITPARAM_DEBUG = "Debug";
+     public static final String INITPARAM_TEMPLATE_PATH = "TemplatePath";
+     public static final String INITPARAM_NOCACHE = "NoCache";
+     public static final String INITPARAM_CONTENT_TYPE = "ContentType";
+     public static final String DEFAULT_CONTENT_TYPE = "text/html";
+     public static final String INITPARAM_DEBUG = "Debug";
 
      public static final String KEY_REQUEST = "Request";
      public static final String KEY_INCLUDE = "include_page";
@@ -115,16 +115,21 @@
      public static final String KEY_JSP_TAGLIBS = "JspTaglibs";
 
      // Note these names start with dot, so they're essentially invisible from  a freemarker script.
-     public static final String ATTR_TEMPLATE_MODEL = ".freemarker.TemplateModel";  // template model stored in request for siteMesh
      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";
 
+    // for sitemesh
+    public static final String ATTR_TEMPLATE_MODEL = ".freemarker.TemplateModel";  // template model stored in request for siteMesh
+
+    // for Struts
+    public static final String KEY_REQUEST_PARAMETERS_STRUTS = "Parameters";
+
     public static final String KEY_HASHMODEL_PRIVATE = "__FreeMarkerManager.Request__";
 
-    private static final String EXPIRATION_DATE;
+    public static final String EXPIRATION_DATE;
 
     /**
      * Adds individual settings.
@@ -305,32 +310,36 @@
     protected ScopesHashModel buildScopesHashModel(ServletContext servletContext, HttpServletRequest request, HttpServletResponse response, ObjectWrapper wrapper, ValueStack stack) {
         ScopesHashModel model = new ScopesHashModel(wrapper, servletContext, request, stack);
 
-        // Create hash model wrapper for servlet context (the application)
-        // only need one thread to do this once, per servlet context
+        // Create hash model wrapper for servlet context (the application). We need one thread, once per servlet context
         synchronized (servletContext) {
             ServletContextHashModel servletContextModel = (ServletContextHashModel) servletContext.getAttribute(ATTR_APPLICATION_MODEL);
-
             if (servletContextModel == null) {
-
+                // first try a JSP support servlet.  If it fails, default to the servlet.
                 GenericServlet servlet = JspSupportServlet.jspSupportServlet;
-                // TODO if the jsp support  servlet isn't load-on-startup then it won't exist
-                // if it hasn't been accessed, and a JSP page is accessed
                 if (servlet != null) {
                     servletContextModel = new ServletContextHashModel(servlet, wrapper);
                     servletContext.setAttribute(ATTR_APPLICATION_MODEL, servletContextModel);
-                    TaglibFactory taglibs = new TaglibFactory(servletContext);
-                    servletContext.setAttribute(ATTR_JSP_TAGLIBS_MODEL, taglibs);
+                } else {
+                    servletContextModel = new ServletContextHashModel(servletContext, wrapper);
+                    servletContext.setAttribute(ATTR_APPLICATION_MODEL, servletContextModel);
                 }
-
+                TaglibFactory taglibs = new TaglibFactory(servletContext);
+                servletContext.setAttribute(ATTR_JSP_TAGLIBS_MODEL, taglibs);
             }
-
             model.put(KEY_APPLICATION, servletContextModel);
-            model.put(KEY_JSP_TAGLIBS, (TemplateModel) servletContext.getAttribute(ATTR_JSP_TAGLIBS_MODEL));
+            model.putUnlistedModel(KEY_APPLICATION_PRIVATE, servletContextModel);
         }
+        model.put(KEY_JSP_TAGLIBS, (TemplateModel) servletContext.getAttribute(ATTR_JSP_TAGLIBS_MODEL));
 
         // 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 ???
@@ -355,6 +364,7 @@
             request.setAttribute(ATTR_REQUEST_PARAMETERS_MODEL, reqParametersModel);
         }
         model.put(ATTR_REQUEST_PARAMETERS_MODEL, reqParametersModel);
+        model.put(KEY_REQUEST_PARAMETERS_STRUTS,reqParametersModel);
 
         return model;
     }

Modified: struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/FreemarkerDecoratorServlet.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/FreemarkerDecoratorServlet.java?rev=899763&r1=899762&r2=899763&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/FreemarkerDecoratorServlet.java (original)
+++ struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/FreemarkerDecoratorServlet.java Fri Jan 15 19:16:09 2010
@@ -66,26 +66,8 @@
 
     public static final long serialVersionUID = -2440216393145762479L;
 
-    private static final String INITPARAM_TEMPLATE_PATH = "TemplatePath";
-
-    public static final String KEY_REQUEST = "Request";
-    public static final String KEY_INCLUDE = "include_page";
-    public static final String KEY_REQUEST_PRIVATE = "__FreeMarkerServlet.Request__";
-    public static final String KEY_REQUEST_PARAMETERS = "RequestParameters";
-    public static final String KEY_SESSION = "Session";
-    public static final String KEY_APPLICATION = "Application";
-    public static final String KEY_APPLICATION_PRIVATE = "__FreeMarkerServlet.Application__";
-    public static final String KEY_JSP_TAGLIBS = "JspTaglibs";
-
-    private static final String ATTR_REQUEST_PARAMETERS_MODEL = "Parameters";
-
-    // 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_SESSION_MODEL = ".freemarker.Session";
-    private static final String ATTR_APPLICATION_MODEL = ".freemarker.Application";
-    private static final String ATTR_JSP_TAGLIBS_MODEL = ".freemarker.JspTaglibs";
 
+/*
     private static final String EXPIRATION_DATE;
 
     static {
@@ -95,7 +77,7 @@
         SimpleDateFormat httpDate = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", java.util.Locale.US);
         EXPIRATION_DATE = httpDate.format(expiration.getTime());
     }
-
+*/
     protected String templatePath;
     protected boolean nocache;
     protected boolean debug;
@@ -132,7 +114,7 @@
                 }
 
                 // template path is already handled!
-                if (!INITPARAM_TEMPLATE_PATH.equals(name)) freemarkerManager.addSetting(name, value);
+                if (!FreemarkerManager.INITPARAM_TEMPLATE_PATH.equals(name)) freemarkerManager.addSetting(name, value);
             }
             nocache = freemarkerManager.getNocache();
             debug = freemarkerManager.getDebug();
@@ -195,8 +177,6 @@
                 model = freemarkerManager.buildTemplateModel(ctx.getValueStack(), ctx.getActionInvocation().getAction(), servletContext, request, response, wrapper);
             }
 
-            populateModel(model, wrapper, servletContext, request, response);
-
             // Give subclasses a chance to hook into preprocessing
             if (preTemplateProcess(request, response, template, model)) {
                 try {
@@ -352,58 +332,7 @@
             // HTTP/1.0
             res.setHeader("Pragma", "no-cache");
             // Last resort for those that ignore all of the above
-            res.setHeader("Expires", EXPIRATION_DATE);
-        }
-    }
-
-    protected ScopesHashModel populateModel(ScopesHashModel params, ObjectWrapper wrapper, ServletContext servletContext, final HttpServletRequest request, final HttpServletResponse response) throws TemplateModelException {
-        try {
-            // Create hash model wrapper for servlet context (the application)
-            ServletContextHashModel servletContextModel = (ServletContextHashModel) servletContext.getAttribute(ATTR_APPLICATION_MODEL);
-            if (servletContextModel == null) {
-                servletContextModel = new ServletContextHashModel(this, wrapper);
-                servletContext.setAttribute(ATTR_APPLICATION_MODEL, servletContextModel);
-                TaglibFactory taglibs = new TaglibFactory(servletContext);
-                servletContext.setAttribute(ATTR_JSP_TAGLIBS_MODEL, taglibs);
-                initializeServletContext(request, response);
-            }
-            params.putUnlistedModel(KEY_APPLICATION, servletContextModel);
-            params.putUnlistedModel(KEY_APPLICATION_PRIVATE, servletContextModel);
-            params.putUnlistedModel(KEY_JSP_TAGLIBS, (TemplateModel) servletContext.getAttribute(ATTR_JSP_TAGLIBS_MODEL));
-            // Create hash model wrapper for session
-            HttpSessionHashModel sessionModel;
-            HttpSession session = request.getSession(false);
-            if (session != null) {
-                sessionModel = (HttpSessionHashModel) session.getAttribute(ATTR_SESSION_MODEL);
-                if (sessionModel == null) {
-                    sessionModel = new HttpSessionHashModel(session, wrapper);
-                    session.setAttribute(ATTR_SESSION_MODEL, sessionModel);
-                    initializeSession(request, response);
-                }
-            } else {
-                sessionModel = new HttpSessionHashModel(this, request, response, wrapper);
-            }
-            params.putUnlistedModel(KEY_SESSION, sessionModel);
-
-            // Create hash model wrapper for request
-            HttpRequestHashModel requestModel = (HttpRequestHashModel) request.getAttribute(ATTR_REQUEST_MODEL);
-            if (requestModel == null || requestModel.getRequest() != request) {
-                requestModel = new HttpRequestHashModel(request, response, wrapper);
-                request.setAttribute(ATTR_REQUEST_MODEL, requestModel);
-                request.setAttribute(ATTR_REQUEST_PARAMETERS_MODEL, createRequestParametersHashModel(request));
-            }
-            params.putUnlistedModel(KEY_REQUEST, requestModel);
-            params.putUnlistedModel(KEY_INCLUDE, new IncludePage(request, response));
-            params.putUnlistedModel(KEY_REQUEST_PRIVATE, requestModel);
-
-            // Create hash model wrapper for request parameters
-            HttpRequestParametersHashModel requestParametersModel = (HttpRequestParametersHashModel) request.getAttribute(ATTR_REQUEST_PARAMETERS_MODEL);
-            params.putUnlistedModel(KEY_REQUEST_PARAMETERS, requestParametersModel);
-            return params;
-        } catch (ServletException e) {
-            throw new TemplateModelException(e);
-        } catch (IOException e) {
-            throw new TemplateModelException(e);
+            res.setHeader("Expires", freemarkerManager.EXPIRATION_DATE);
         }
     }
 }