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

svn commit: r1065716 - in /struts/struts2/trunk/xwork-core: ./ src/main/java/com/opensymphony/xwork2/interceptor/annotations/ src/test/java/com/opensymphony/xwork2/interceptor/annotations/

Author: jafl
Date: Mon Jan 31 19:16:35 2011
New Revision: 1065716

URL: http://svn.apache.org/viewvc?rev=1065716&view=rev
Log:
WW-3500 If top of stack is not the action, assume it is the model and check for annotiations.

Added:
    struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/annotations/AllowingByDefaultModel.java   (with props)
    struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/annotations/BlockingByDefaultModel.java   (with props)
Modified:
    struts/struts2/trunk/xwork-core/   (props changed)
    struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationParameterFilterIntereptor.java
    struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationParameterFilterUnitTest.java

Propchange: struts/struts2/trunk/xwork-core/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Mon Jan 31 19:16:35 2011
@@ -5,6 +5,7 @@ cobertura.ser
 *.iml
 .project
 target
+test-output
 ivyrep.properties
 build
 .settings

Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationParameterFilterIntereptor.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationParameterFilterIntereptor.java?rev=1065716&r1=1065715&r2=1065716&view=diff
==============================================================================
--- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationParameterFilterIntereptor.java (original)
+++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationParameterFilterIntereptor.java Mon Jan 31 19:16:35 2011
@@ -37,12 +37,20 @@ public class AnnotationParameterFilterIn
         final Object action = invocation.getAction();
         Map<String, Object> parameters = invocation.getInvocationContext().getParameters();
 
+        Object model = invocation.getStack().peek();
+        if (model == action) {
+            model = null;
+        }
+
         boolean blockByDefault = action.getClass().isAnnotationPresent(BlockByDefault.class);
         List<Field> annotatedFields = new ArrayList<Field>();
         HashSet<String> paramsToRemove = new HashSet<String>();
 
         if (blockByDefault) {
             AnnotationUtils.addAllFields(Allowed.class, action.getClass(), annotatedFields);
+            if (model != null) {
+                AnnotationUtils.addAllFields(Allowed.class, model.getClass(), annotatedFields);
+            }
 
             for (String paramName : parameters.keySet()) {
                 boolean allowed = false;
@@ -61,6 +69,9 @@ public class AnnotationParameterFilterIn
             }
         } else {
             AnnotationUtils.addAllFields(Blocked.class, action.getClass(), annotatedFields);
+            if (model != null) {
+                AnnotationUtils.addAllFields(Blocked.class, model.getClass(), annotatedFields);
+            }
 
             for (String paramName : parameters.keySet()) {
 

Added: struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/annotations/AllowingByDefaultModel.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/annotations/AllowingByDefaultModel.java?rev=1065716&view=auto
==============================================================================
--- struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/annotations/AllowingByDefaultModel.java (added)
+++ struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/annotations/AllowingByDefaultModel.java Mon Jan 31 19:16:35 2011
@@ -0,0 +1,23 @@
+package com.opensymphony.xwork2.interceptor.annotations;
+
+import com.opensymphony.xwork2.ActionSupport;
+
+/**
+ * @author jafl
+ *
+ */
+public class AllowingByDefaultModel {
+	
+	@Blocked
+	private String m1;
+	private String m2;
+	
+	public void setM1(String s) {
+		m1 = s;
+	}
+	
+	public void setM2(String s) {
+		m2 = s;
+	}
+
+}

Propchange: struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/annotations/AllowingByDefaultModel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationParameterFilterUnitTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationParameterFilterUnitTest.java?rev=1065716&r1=1065715&r2=1065716&view=diff
==============================================================================
--- struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationParameterFilterUnitTest.java (original)
+++ struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationParameterFilterUnitTest.java Mon Jan 31 19:16:35 2011
@@ -4,6 +4,8 @@ import com.mockobjects.dynamic.Mock;
 import com.opensymphony.xwork2.Action;
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.StubValueStack;
+import com.opensymphony.xwork2.util.ValueStack;
 import junit.framework.TestCase;
 
 import java.util.HashMap;
@@ -11,10 +13,19 @@ import java.util.Map;
 
 /**
  * @author martin.gilday
+ * @author jafl
  *
  */
 public class AnnotationParameterFilterUnitTest extends TestCase {
 
+	ValueStack stack;
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		stack = new StubValueStack();
+	}
+
 	/**
 	 * Only "name" should remain in the parameter map.  All others
 	 * should be removed
@@ -30,11 +41,15 @@ public class AnnotationParameterFilterUn
 		
 		contextMap.put(ActionContext.PARAMETERS, parameterMap);
 		
+		Action action = new BlockingByDefaultAction();
+		stack.push(action);
+		
 		Mock mockInvocation = new Mock(ActionInvocation.class);
 		mockInvocation.expectAndReturn("getInvocationContext", new ActionContext(contextMap));
-        mockInvocation.matchAndReturn("getAction", new BlockingByDefaultAction());
-        mockInvocation.expectAndReturn("invoke", Action.SUCCESS);
-        
+		mockInvocation.matchAndReturn("getAction", action);
+		mockInvocation.matchAndReturn("getStack", stack);
+		mockInvocation.expectAndReturn("invoke", Action.SUCCESS);
+		
 		ActionInvocation invocation = (ActionInvocation) mockInvocation.proxy();
 		
 		AnnotationParameterFilterIntereptor intereptor = new AnnotationParameterFilterIntereptor();
@@ -61,11 +76,15 @@ public class AnnotationParameterFilterUn
 		
 		contextMap.put(ActionContext.PARAMETERS, parameterMap);
 		
+		Action action = new AllowingByDefaultAction();
+		stack.push(action);
+		
 		Mock mockInvocation = new Mock(ActionInvocation.class);
 		mockInvocation.expectAndReturn("getInvocationContext", new ActionContext(contextMap));
-        mockInvocation.matchAndReturn("getAction", new AllowingByDefaultAction());
-        mockInvocation.expectAndReturn("invoke", Action.SUCCESS);
-        
+		mockInvocation.matchAndReturn("getAction", action);
+		mockInvocation.matchAndReturn("getStack", stack);
+		mockInvocation.expectAndReturn("invoke", Action.SUCCESS);
+		
 		ActionInvocation invocation = (ActionInvocation) mockInvocation.proxy();
 		
 		AnnotationParameterFilterIntereptor intereptor = new AnnotationParameterFilterIntereptor();
@@ -76,5 +95,79 @@ public class AnnotationParameterFilterUn
 		assertNull(parameterMap.get("name"));
 		
 	}
+
+	/**
+	 * Only "name" should remain in the parameter map.  All others
+	 * should be removed
+	 * @throws Exception
+	 */
+	public void testBlockingByDefaultWithModel() throws Exception {
+		
+		Map contextMap = new HashMap();
+		Map parameterMap = new HashMap();
+		
+		parameterMap.put("job", "Baker");
+		parameterMap.put("name", "Martin");
+		parameterMap.put("m1", "s1");
+		parameterMap.put("m2", "s2");
+		
+		contextMap.put(ActionContext.PARAMETERS, parameterMap);
+		stack.push(new BlockingByDefaultModel());
+		
+		Mock mockInvocation = new Mock(ActionInvocation.class);
+		mockInvocation.expectAndReturn("getInvocationContext", new ActionContext(contextMap));
+		mockInvocation.matchAndReturn("getAction", new BlockingByDefaultAction());
+		mockInvocation.matchAndReturn("getStack", stack);
+		mockInvocation.expectAndReturn("invoke", Action.SUCCESS);
+		
+		ActionInvocation invocation = (ActionInvocation) mockInvocation.proxy();
+		
+		AnnotationParameterFilterIntereptor intereptor = new AnnotationParameterFilterIntereptor();
+		intereptor.intercept(invocation);
+		
+		assertEquals("Paramter map should contain two entries", 2, parameterMap.size());
+		assertNull(parameterMap.get("job"));
+		assertNotNull(parameterMap.get("name"));
+		assertNotNull(parameterMap.get("m1"));
+		assertNull(parameterMap.get("m2"));
+		
+	}
+
+	/**
+	 * "name" should be removed from the map, as it is blocked.
+	 * All other parameters should remain
+	 * @throws Exception
+	 */
+	public void testAllowingByDefaultWithModel() throws Exception {
+		
+		Map contextMap = new HashMap();
+		Map parameterMap = new HashMap();
+		
+		parameterMap.put("job", "Baker");
+		parameterMap.put("name", "Martin");
+		parameterMap.put("m1", "s1");
+		parameterMap.put("m2", "s2");
+		
+		contextMap.put(ActionContext.PARAMETERS, parameterMap);
+		stack.push(new AllowingByDefaultModel());
+		
+		Mock mockInvocation = new Mock(ActionInvocation.class);
+		mockInvocation.expectAndReturn("getInvocationContext", new ActionContext(contextMap));
+		mockInvocation.matchAndReturn("getAction", new AllowingByDefaultAction());
+		mockInvocation.matchAndReturn("getStack", stack);
+		mockInvocation.expectAndReturn("invoke", Action.SUCCESS);
+		
+		ActionInvocation invocation = (ActionInvocation) mockInvocation.proxy();
+		
+		AnnotationParameterFilterIntereptor intereptor = new AnnotationParameterFilterIntereptor();
+		intereptor.intercept(invocation);
+		
+		assertEquals("Paramter map should contain two entries", 2, parameterMap.size());
+		assertNotNull(parameterMap.get("job"));
+		assertNull(parameterMap.get("name"));
+		assertNull(parameterMap.get("m1"));
+		assertNotNull(parameterMap.get("m2"));
+		
+	}
 	
 }

Added: struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/annotations/BlockingByDefaultModel.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/annotations/BlockingByDefaultModel.java?rev=1065716&view=auto
==============================================================================
--- struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/annotations/BlockingByDefaultModel.java (added)
+++ struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/annotations/BlockingByDefaultModel.java Mon Jan 31 19:16:35 2011
@@ -0,0 +1,22 @@
+package com.opensymphony.xwork2.interceptor.annotations;
+
+/**
+ * @author jafl
+ *
+ */
+@BlockByDefault
+public class BlockingByDefaultModel {
+	
+	@Allowed
+	private String m1;
+	private String m2;
+	
+	public void setM1(String s) {
+		m1 = s;
+	}
+	
+	public void setM2(String s) {
+		m2 = s;
+	}
+
+}

Propchange: struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/annotations/BlockingByDefaultModel.java
------------------------------------------------------------------------------
    svn:eol-style = native