Author: lukaszlenart
Date: Mon Nov 28 20:34:18 2011
New Revision: 1207576
URL: http://svn.apache.org/viewvc?rev=1207576&view=rev
Log:
WW-3713 allows to return content not only for GET method
Modified:
struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionInvocation.java
struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionInvocationTest.java
Modified:
struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionInvocation.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionInvocation.java?rev=1207576&r1=1207575&r2=1207576&view=diff
==============================================================================
---
struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionInvocation.java
(original)
+++
struts/struts2/trunk/plugins/rest/src/main/java/org/apache/struts2/rest/RestActionInvocation.java
Mon Nov 28 20:34:18 2011
@@ -21,34 +21,30 @@
package org.apache.struts2.rest;
+import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.DefaultActionInvocation;
-import com.opensymphony.xwork2.Result;
-import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;
+import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.ValidationAware;
import com.opensymphony.xwork2.config.ConfigurationException;
-import com.opensymphony.xwork2.config.entities.ResultConfig;
import com.opensymphony.xwork2.config.entities.ActionConfig;
+import com.opensymphony.xwork2.config.entities.ResultConfig;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;
import com.opensymphony.xwork2.util.profiling.UtilTimerStack;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Map;
-import java.util.HashMap;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.HttpHeaderResult;
import org.apache.struts2.rest.handler.ContentTypeHandler;
import org.apache.struts2.rest.handler.HtmlHandler;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
/**
* Extends the usual {@link ActionInvocation} to add support for processing
the object returned
@@ -64,6 +60,7 @@ public class RestActionInvocation extend
private ContentTypeHandlerManager handlerSelector;
private boolean logger;
private String defaultErrorResultName;
+ private boolean restrictToGet = true;
protected HttpHeaders httpHeaders;
protected Object target;
@@ -84,6 +81,17 @@ public class RestActionInvocation extend
defaultErrorResultName = value;
}
+ /**
+ * If set to true (be default) blocks returning content from any other
methods than GET,
+ * if set to false, the content can be returned for any kind of method
+ *
+ * @param value true or false
+ */
+ @Inject(value = "struts.rest.content.restrictToGET", required = false)
+ public void setRestrictToGet(String value) {
+ restrictToGet = "true".equalsIgnoreCase(value);
+ }
+
@Inject
public void setMimeTypeHandlerSelector(ContentTypeHandlerManager sel) {
this.handlerSelector = sel;
@@ -345,12 +353,19 @@ public class RestActionInvocation extend
target = action;
}
- // don't return any content for PUT, DELETE, and POST where there are
no errors
- if (!hasErrors &&
!"get".equalsIgnoreCase(ServletActionContext.getRequest().getMethod())) {
+ if (shouldRestrictToGET()) {
target = null;
}
}
+ // don't return any content for PUT, DELETE, and POST where there are no
errors
+ // or backward compatible restrictToGET flag is set to true
+ private boolean shouldRestrictToGET() {
+ return !hasErrors
+ &&
!"get".equalsIgnoreCase(ServletActionContext.getRequest().getMethod())
+ && restrictToGet;
+ }
+
private void disableCatching(HttpServletResponse response) {
// No cache
response.setHeader("Cache-Control", "no-cache");
Modified:
struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionInvocationTest.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionInvocationTest.java?rev=1207576&r1=1207575&r2=1207576&view=diff
==============================================================================
---
struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionInvocationTest.java
(original)
+++
struts/struts2/trunk/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionInvocationTest.java
Mon Nov 28 20:34:18 2011
@@ -1,21 +1,5 @@
package org.apache.struts2.rest;
-import static javax.servlet.http.HttpServletResponse.SC_NOT_MODIFIED;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletResponse;
-
-import junit.framework.TestCase;
-
-import org.apache.struts2.ServletActionContext;
-import org.apache.struts2.dispatcher.HttpHeaderResult;
-import org.springframework.mock.web.MockHttpServletRequest;
-import org.springframework.mock.web.MockHttpServletResponse;
-
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.DefaultUnknownHandlerManager;
import com.opensymphony.xwork2.ModelDriven;
@@ -27,6 +11,19 @@ import com.opensymphony.xwork2.config.en
import com.opensymphony.xwork2.mock.MockActionProxy;
import com.opensymphony.xwork2.mock.MockInterceptor;
import com.opensymphony.xwork2.util.XWorkTestCaseHelper;
+import junit.framework.TestCase;
+import org.apache.struts2.ServletActionContext;
+import org.apache.struts2.dispatcher.HttpHeaderResult;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static javax.servlet.http.HttpServletResponse.SC_NOT_MODIFIED;
public class RestActionInvocationTest extends TestCase {
@@ -121,8 +118,18 @@ public class RestActionInvocationTest ex
request.setMethod("DELETE");
restActionInvocation.selectTarget();
assertEquals(null, restActionInvocation.target);
-
- }
+
+ // disable content restriction to GET only
+ model = new ArrayList<String>();
+ model.add("Item1");
+ restAction.model = model;
+
+ request.setMethod("POST");
+ restActionInvocation.setRestrictToGet("false");
+ restActionInvocation.selectTarget();
+ assertEquals(model, restActionInvocation.target);
+ assertEquals(model.get(0), "Item1");
+ }
/**
* Test the not modified status code.
@@ -187,7 +194,7 @@ public class RestActionInvocationTest ex
restAction.model = model;
request.setMethod("GET");
restActionInvocation.setResultCode("index");
-
+
try {
restActionInvocation.processResult();