Author: musachy Date: Sun Mar 29 20:37:40 2009 New Revision: 759781 URL: http://svn.apache.org/viewvc?rev=759781&view=rev Log: Add alwaysInvokevalidate and programmatic attributes
Modified: struts/sandbox/trunk/struts2-oval-plugin/src/main/java/org/apache/struts2/interceptor/OValValidationInterceptor.java struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/OValValidationInterceptorTest.java struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/SimpleField.java struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/oval-test.xml Modified: struts/sandbox/trunk/struts2-oval-plugin/src/main/java/org/apache/struts2/interceptor/OValValidationInterceptor.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-oval-plugin/src/main/java/org/apache/struts2/interceptor/OValValidationInterceptor.java?rev=759781&r1=759780&r2=759781&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-oval-plugin/src/main/java/org/apache/struts2/interceptor/OValValidationInterceptor.java (original) +++ struts/sandbox/trunk/struts2-oval-plugin/src/main/java/org/apache/struts2/interceptor/OValValidationInterceptor.java Sun Mar 29 20:37:40 2009 @@ -21,8 +21,10 @@ package org.apache.struts2.interceptor; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; +import com.opensymphony.xwork2.interceptor.PrefixMethodInvocationUtil; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionProxy; +import com.opensymphony.xwork2.Validateable; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.validator.ValidatorContext; import com.opensymphony.xwork2.validator.DelegatingValidatorContext; @@ -48,6 +50,32 @@ public class OValValidationInterceptor extends MethodFilterInterceptor { private static final Logger LOG = LoggerFactory.getLogger(OValValidationInterceptor.class); + private final static String VALIDATE_PREFIX = "validate"; + private final static String ALT_VALIDATE_PREFIX = "validateDo"; + + private boolean alwaysInvokeValidate = true; + private boolean programmatic = true; + + /** + * Determines if {...@link com.opensymphony.xwork2.Validateable}'s <code>validate()</code> should be called, + * as well as methods whose name that start with "validate". Defaults to "true". + * + * @param programmatic <tt>true</tt> then <code>validate()</code> is invoked. + */ + public void setProgrammatic(boolean programmatic) { + this.programmatic = programmatic; + } + + /** + * Determines if {...@link com.opensymphony.xwork2.Validateable}'s <code>validate()</code> should always + * be invoked. Default to "true". + * + * @param alwaysInvokeValidate <tt>true</tt> then <code>validate()</code> is always invoked. + */ + public void setAlwaysInvokeValidate(String alwaysInvokeValidate) { + this.alwaysInvokeValidate = Boolean.parseBoolean(alwaysInvokeValidate); + } + protected String doIntercept(ActionInvocation invocation) throws Exception { Object action = invocation.getAction(); ActionProxy proxy = invocation.getProxy(); @@ -58,6 +86,50 @@ LOG.debug("Validating [#0/#1] with method [#2]", invocation.getProxy().getNamespace(), invocation.getProxy().getActionName(), methodName); } + //OVal vallidatio (no XML yet) + performOValValidation(action, valueStack, methodName); + + //Validatable.valiedate() and validateX() + performProgrammaticValidation(invocation, action); + + return invocation.invoke(); + } + + private void performProgrammaticValidation(ActionInvocation invocation, Object action) throws Exception { + if (action instanceof Validateable && programmatic) { + // keep exception that might occured in validateXXX or validateDoXXX + Exception exception = null; + + Validateable validateable = (Validateable) action; + if (LOG.isDebugEnabled()) { + LOG.debug("Invoking validate() on action [#0]", validateable.toString()); + } + + try { + PrefixMethodInvocationUtil.invokePrefixMethod( + invocation, + new String[]{VALIDATE_PREFIX, ALT_VALIDATE_PREFIX}); + } + catch (Exception e) { + // If any exception occurred while doing reflection, we want + // validate() to be executed + LOG.warn("An exception occured while executing the prefix method", e); + exception = e; + } + + + if (alwaysInvokeValidate) { + validateable.validate(); + } + + if (exception != null) { + // rethrow if something is wrong while doing validateXXX / validateDoXXX + throw exception; + } + } + } + + protected void performOValValidation(Object action, ValueStack valueStack, String methodName) throws NoSuchMethodException { Validator validator = new Validator(); //if the method is annotated with a @Profiles annotation, use those profiles Method method = action.getClass().getMethod(methodName, new Class[0]); @@ -102,8 +174,6 @@ } } } - - return invocation.invoke(); } /** Modified: struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/OValValidationInterceptorTest.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/OValValidationInterceptorTest.java?rev=759781&r1=759780&r2=759781&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/OValValidationInterceptorTest.java (original) +++ struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/OValValidationInterceptorTest.java Sun Mar 29 20:37:40 2009 @@ -86,7 +86,7 @@ assertNotNull(fieldErrors.get("name")); } - public void testFieldsWithMultipleProfiles() throws Exception { + public void testFieldsWithMultipleProfiles() throws Exception { ActionProxy baseActionProxy = actionProxyFactory.createActionProxy("oval", "fieldsWidthProfiles13", null, null); FieldsWithProfiles action = (FieldsWithProfiles) baseActionProxy.getAction(); baseActionProxy.execute(); @@ -121,7 +121,7 @@ assertValue(fieldErrors, "name", Arrays.asList("name cannot be null")); } - public void testSimpleFieldI18nDefaultKey() throws Exception { + public void testSimpleFieldI18nDefaultKey() throws Exception { ActionProxy baseActionProxy = actionProxyFactory.createActionProxy("oval", "simpleFieldI18nDefaultKey", null, null); SimpleFieldI18nDefaultKey action = (SimpleFieldI18nDefaultKey) baseActionProxy.getAction(); baseActionProxy.execute(); @@ -133,6 +133,47 @@ assertValue(fieldErrors, "name", Arrays.asList("notnull.field")); } + + public void testProgrammaticValidation() throws Exception { + ActionProxy baseActionProxy = actionProxyFactory.createActionProxy("oval", "simpleField", null, null); + SimpleField action = (SimpleField) baseActionProxy.getAction(); + baseActionProxy.execute(); + + Map<String, List<String>> fieldErrors = ((ValidationAware) baseActionProxy.getAction()).getFieldErrors(); + assertNotNull(fieldErrors); + assertEquals(1, fieldErrors.size()); + assertValue(fieldErrors, "name", Arrays.asList("name cannot be null")); + assertTrue(action.isValidateCalled()); + assertTrue(action.isValidateExecuteCalled()); + } + + public void testProgrammaticValidationDontInvokeValidate() throws Exception { + ActionProxy baseActionProxy = actionProxyFactory.createActionProxy("oval", "simpleFieldNoValidate", null, null); + SimpleField action = (SimpleField) baseActionProxy.getAction(); + baseActionProxy.execute(); + + Map<String, List<String>> fieldErrors = ((ValidationAware) baseActionProxy.getAction()).getFieldErrors(); + assertNotNull(fieldErrors); + assertEquals(1, fieldErrors.size()); + assertValue(fieldErrors, "name", Arrays.asList("name cannot be null")); + assertFalse(action.isValidateCalled()); + assertTrue(action.isValidateExecuteCalled()); + } + + public void testProgrammaticValidationDontInvokeProgrammatic() throws Exception { + ActionProxy baseActionProxy = actionProxyFactory.createActionProxy("oval", "simpleFieldNoProgrammatic", null, null); + SimpleField action = (SimpleField) baseActionProxy.getAction(); + baseActionProxy.execute(); + + Map<String, List<String>> fieldErrors = ((ValidationAware) baseActionProxy.getAction()).getFieldErrors(); + assertNotNull(fieldErrors); + assertEquals(1, fieldErrors.size()); + assertValue(fieldErrors, "name", Arrays.asList("name cannot be null")); + assertFalse(action.isValidateCalled()); + assertFalse(action.isValidateExecuteCalled()); + } + + private void assertValue(Map<String, List<String>> map, String key, List<String> expectedValues) { assertNotNull(map); assertNotNull(key); Modified: struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/SimpleField.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/SimpleField.java?rev=759781&r1=759780&r2=759781&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/SimpleField.java (original) +++ struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/SimpleField.java Sun Mar 29 20:37:40 2009 @@ -30,6 +30,8 @@ @NotEmpty @Length(max = 3) private String name; + private boolean validateCalled; + private boolean validateExecuteCalled; public String getName() { return name; @@ -38,4 +40,20 @@ public void setName(String name) { this.name = name; } + + public void validate() { + this.validateCalled = true; + } + + public void validateExecute() { + this.validateExecuteCalled = true; + } + + public boolean isValidateCalled() { + return validateCalled; + } + + public boolean isValidateExecuteCalled() { + return validateExecuteCalled; + } } Modified: struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/oval-test.xml URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/oval-test.xml?rev=759781&r1=759780&r2=759781&view=diff ============================================================================== --- struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/oval-test.xml (original) +++ struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/oval-test.xml Sun Mar 29 20:37:40 2009 @@ -1,7 +1,7 @@ <!DOCTYPE xwork PUBLIC - "-//OpenSymphony Group//XWork 2.0//EN" - "http://www.opensymphony.com/xwork/xwork-2.0.dtd" - > + "-//OpenSymphony Group//XWork 2.0//EN" + "http://www.opensymphony.com/xwork/xwork-2.0.dtd" + > <xwork> <package namespace="oval" name="oval-test"> @@ -13,31 +13,43 @@ </interceptors> <action name="simpleField" class="org.apache.struts2.interceptor.SimpleField"> - <interceptor-ref name="ovalValidation" /> + <interceptor-ref name="ovalValidation"/> <result type="void"></result> </action> <action name="simpleMethod" class="org.apache.struts2.interceptor.SimpleMethod"> - <interceptor-ref name="ovalValidation" /> + <interceptor-ref name="ovalValidation"/> <result type="void"></result> </action> <action name="simpleFieldOGNL" class="org.apache.struts2.interceptor.SimpleFieldOGNLExpression"> - <interceptor-ref name="ovalValidation" /> + <interceptor-ref name="ovalValidation"/> <result type="void"></result> </action> <action name="simpleFieldI18n" class="org.apache.struts2.interceptor.SimpleFieldI18n"> - <interceptor-ref name="ovalValidation" /> + <interceptor-ref name="ovalValidation"/> <result type="void"></result> </action> <action name="simpleFieldI18nDefaultKey" class="org.apache.struts2.interceptor.SimpleFieldI18nDefaultKey"> - <interceptor-ref name="ovalValidation" /> + <interceptor-ref name="ovalValidation"/> <result type="void"></result> </action> <action name="fieldsWidthProfiles13" class="org.apache.struts2.interceptor.FieldsWithProfiles" method="run1"> - <interceptor-ref name="ovalValidation" /> + <interceptor-ref name="ovalValidation"/> <result type="void"></result> </action> <action name="fieldsWidthProfiles2" class="org.apache.struts2.interceptor.FieldsWithProfiles" method="run2"> - <interceptor-ref name="ovalValidation" /> + <interceptor-ref name="ovalValidation"/> + <result type="void"></result> + </action> + <action name="simpleFieldNoValidate" class="org.apache.struts2.interceptor.SimpleField"> + <interceptor-ref name="ovalValidation"> + <param name="alwaysInvokeValidate">false</param> + </interceptor-ref> + <result type="void"></result> + </action> + <action name="simpleFieldNoProgrammatic" class="org.apache.struts2.interceptor.SimpleField"> + <interceptor-ref name="ovalValidation"> + <param name="programmatic">false</param> + </interceptor-ref> <result type="void"></result> </action> </package>