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);
+ }
+}