Author: lukaszlenart
Date: Fri Mar  4 06:51:59 2011
New Revision: 1077833

URL: http://svn.apache.org/viewvc?rev=1077833&view=rev
Log:
Solves WW-3330 - <@s.action> broken in sitemesh freemarker decorator page

Added:
    
struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/StrutsSiteMeshFactory.java
Modified:
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerResult.java
    
struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/FreemarkerPageFilter.java

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerResult.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerResult.java?rev=1077833&r1=1077832&r2=1077833&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerResult.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerResult.java
 Fri Mar  4 06:51:59 2011
@@ -21,25 +21,11 @@
 
 package org.apache.struts2.views.freemarker;
 
-import java.io.CharArrayWriter;
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Locale;
-
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.struts2.ServletActionContext;
-import org.apache.struts2.dispatcher.StrutsResultSupport;
-import org.apache.struts2.views.util.ResourceUtil;
-
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.LocaleProvider;
 import com.opensymphony.xwork2.inject.Inject;
 import com.opensymphony.xwork2.util.ValueStack;
-
 import freemarker.template.Configuration;
 import freemarker.template.ObjectWrapper;
 import freemarker.template.Template;
@@ -47,6 +33,19 @@ import freemarker.template.TemplateExcep
 import freemarker.template.TemplateExceptionHandler;
 import freemarker.template.TemplateModel;
 import freemarker.template.TemplateModelException;
+import org.apache.commons.lang.ObjectUtils;
+import org.apache.struts2.ServletActionContext;
+import org.apache.struts2.StrutsStatics;
+import org.apache.struts2.dispatcher.StrutsResultSupport;
+import org.apache.struts2.views.util.ResourceUtil;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Locale;
 
 
 /**
@@ -330,11 +329,19 @@ public class FreemarkerResult extends St
 
                 response.setContentType(contentType);
             }
+        } else if(isInsideActionTag()){
+             //trigger 
com.opensymphony.module.sitemesh.filter.PageResponseWrapper.deactivateSiteMesh()
+            response.setContentType(response.getContentType());
         }
 
         return true;
     }
 
+    private boolean isInsideActionTag() {
+        Object attribute = 
ServletActionContext.getRequest().getAttribute(StrutsStatics.STRUTS_ACTION_TAG_INVOCATION);
+        return (Boolean) ObjectUtils.defaultIfNull(attribute, Boolean.FALSE);
+    }
+
     /**
      * @return true write to the stream only when template processing 
completed successfully (false by default)
      */

Modified: 
struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/FreemarkerPageFilter.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/FreemarkerPageFilter.java?rev=1077833&r1=1077832&r2=1077833&view=diff
==============================================================================
--- 
struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/FreemarkerPageFilter.java
 (original)
+++ 
struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/FreemarkerPageFilter.java
 Fri Mar  4 06:51:59 2011
@@ -21,34 +21,44 @@
 
 package org.apache.struts2.sitemesh;
 
-import com.opensymphony.sitemesh.webapp.SiteMeshWebAppContext;
-import com.opensymphony.sitemesh.webapp.SiteMeshFilter;
-import com.opensymphony.sitemesh.DecoratorSelector;
-import com.opensymphony.module.sitemesh.Factory;
 import com.opensymphony.module.sitemesh.Config;
+import com.opensymphony.module.sitemesh.Factory;
+import com.opensymphony.sitemesh.DecoratorSelector;
+import com.opensymphony.sitemesh.webapp.SiteMeshFilter;
+import com.opensymphony.sitemesh.webapp.SiteMeshWebAppContext;
 import com.opensymphony.xwork2.inject.Inject;
-
-import javax.servlet.*;
-
 import org.apache.struts2.views.freemarker.FreemarkerManager;
 
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletContext;
+
 /**
  * Core Filter for integrating SiteMesh + Freemarker into
  * a Java web application.
  */
 public class FreemarkerPageFilter extends SiteMeshFilter {
 
-    @Inject(required=false)
+    /*
+      * @see com.opensymphony.module.sitemesh.Factory.SITEMESH_FACTORY
+      */
+    private static final String SITEMESH_FACTORY = "sitemesh.factory";
+
+    @Inject(required = false)
     public static void setFreemarkerManager(FreemarkerManager mgr) {
         OldDecorator2NewStrutsFreemarkerDecorator.setFreemarkerManager(mgr);
     }
 
     private FilterConfig filterConfig;
 
-     public void init(FilterConfig filterConfig) {
-         this.filterConfig = filterConfig;
+    public void init(FilterConfig filterConfig) {
+        this.filterConfig = filterConfig;
         super.init(filterConfig);
-     }
+        ServletContext sc = filterConfig.getServletContext();
+        Factory instance = (Factory) sc.getAttribute(SITEMESH_FACTORY);
+        if (instance == null) {
+            sc.setAttribute(SITEMESH_FACTORY, new StrutsSiteMeshFactory(new 
Config(filterConfig)));
+        }
+    }
 
     protected DecoratorSelector initDecoratorSelector(SiteMeshWebAppContext 
webAppContext) {
         Factory factory = Factory.getInstance(new Config(filterConfig));

Added: 
struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/StrutsSiteMeshFactory.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/StrutsSiteMeshFactory.java?rev=1077833&view=auto
==============================================================================
--- 
struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/StrutsSiteMeshFactory.java
 (added)
+++ 
struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/StrutsSiteMeshFactory.java
 Fri Mar  4 06:51:59 2011
@@ -0,0 +1,28 @@
+package org.apache.struts2.sitemesh;
+
+import com.opensymphony.module.sitemesh.Config;
+import com.opensymphony.module.sitemesh.factory.DefaultFactory;
+import org.apache.commons.lang.ObjectUtils;
+import org.apache.struts2.ServletActionContext;
+import org.apache.struts2.StrutsStatics;
+
+
+public class StrutsSiteMeshFactory extends DefaultFactory {
+
+    public StrutsSiteMeshFactory(Config config) {
+        super(config);
+    }
+
+    /**
+     * Determine whether a Page of given content-type should be parsed or not, 
avoiding inner action parsing.
+     */
+    @Override
+    public boolean shouldParsePage(String contentType) {
+        return !isInsideActionTag() && super.shouldParsePage(contentType);
+    }
+
+    private boolean isInsideActionTag() {
+        Object attribute = 
ServletActionContext.getRequest().getAttribute(StrutsStatics.STRUTS_ACTION_TAG_INVOCATION);
+        return (Boolean) ObjectUtils.defaultIfNull(attribute, Boolean.FALSE);
+    }
+}


Reply via email to