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();
 


Reply via email to