Author: musachy
Date: Mon Mar 30 20:02:31 2009
New Revision: 760136
URL: http://svn.apache.org/viewvc?rev=760136&view=rev
Log:
Add more tests. Improve field name extraction from OVal message
Added:
struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/SimpleFieldsXMLChild.java
struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/ValidationInMethods.java
struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/aa.java
struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/org/apache/struts2/interceptor/SimpleFieldsXMLChild-validation.xml
Modified:
struts/sandbox/trunk/struts2-oval-plugin/src/main/java/org/apache/struts2/interceptor/DefaultOValValidationManager.java
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/resources/org/apache/struts2/interceptor/SimpleFieldI18n.properties
struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/org/apache/struts2/interceptor/SimpleFieldsXML-validation.xml
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/DefaultOValValidationManager.java
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-oval-plugin/src/main/java/org/apache/struts2/interceptor/DefaultOValValidationManager.java?rev=760136&r1=760135&r2=760136&view=diff
==============================================================================
---
struts/sandbox/trunk/struts2-oval-plugin/src/main/java/org/apache/struts2/interceptor/DefaultOValValidationManager.java
(original)
+++
struts/sandbox/trunk/struts2-oval-plugin/src/main/java/org/apache/struts2/interceptor/DefaultOValValidationManager.java
Mon Mar 30 20:02:31 2009
@@ -19,9 +19,9 @@
public class DefaultOValValidationManager implements OValValidationManager {
private static final Logger LOG =
LoggerFactory.getLogger(DefaultOValValidationManager.class);
- private static final String VALIDATION_CONFIG_SUFFIX = "-validation.xml";
- private final Map<String, List<Configurer>> validatorCache = new
HashMap<String, List<Configurer>>();
- private final Map<String, Configurer> validatorFileCache = new
HashMap<String, Configurer>();
+ protected static final String VALIDATION_CONFIG_SUFFIX = "-validation.xml";
+ protected final Map<String, List<Configurer>> validatorCache = new
HashMap<String, List<Configurer>>();
+ protected final Map<String, Configurer> validatorFileCache = new
HashMap<String, Configurer>();
public synchronized List<Configurer> getConfigurers(Class clazz, String
context) {
final String validatorKey = buildValidatorKey(clazz, context);
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=760136&r1=760135&r2=760136&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
Mon Mar 30 20:02:31 2009
@@ -42,6 +42,7 @@
import java.util.List;
import java.lang.reflect.Method;
+import java.lang.reflect.Field;
import org.apache.struts2.validation.Profiles;
import org.apache.commons.lang.xwork.StringUtils;
@@ -89,7 +90,7 @@
ActionProxy proxy = invocation.getProxy();
ValueStack valueStack = invocation.getStack();
String methodName = proxy.getMethod();
- String context = proxy.getActionName();
+ String context = proxy.getConfig().getName();
if (LOG.isDebugEnabled()) {
LOG.debug("Validating [#0/#1] with method [#2]",
invocation.getProxy().getNamespace(), invocation.getProxy().getActionName(),
methodName);
@@ -167,7 +168,7 @@
String key = violation.getMessage();
//push the validator into the stack
- valueStack.push(violation);
+ valueStack.push(violation.getContext());
String message = key;
try {
message = validatorContext.getText(key);
@@ -178,10 +179,8 @@
if (isActionError(violation))
validatorContext.addActionError(message);
else {
- String className = clazz.getName();
- //the default OVal message shows the field name as
ActionClass.fieldName
- message = StringUtils.removeStart(message, className +
".");
-
validatorContext.addFieldError(extractFieldName(violation), message);
+ ValidationError validationError =
buildValidationError(violation, message);
+
validatorContext.addFieldError(validationError.getFieldName(),
validationError.getMessage());
}
}
}
@@ -189,24 +188,41 @@
/**
- * Get field name, used to add the validation error to fieldErrors
+ * Get field name and message, used to add the validation error to
fieldErrors
*/
- protected String extractFieldName(ConstraintViolation violation) {
+ protected ValidationError buildValidationError(ConstraintViolation
violation, String message) {
OValContext context = violation.getContext();
if (context instanceof FieldContext) {
- return ((FieldContext) context).getField().getName();
+ Field field = ((FieldContext) context).getField();
+ String className = field.getDeclaringClass().getName();
+
+ //the default OVal message shows the field name as
ActionClass.fieldName
+ String finalMessage = StringUtils.removeStart(message, className +
".");
+
+ return new ValidationError(field.getName(), finalMessage);
} else if (context instanceof MethodReturnValueContext) {
- String methodName = ((MethodReturnValueContext)
context).getMethod().getName();
+ Method method = ((MethodReturnValueContext) context).getMethod();
+ String className = method.getDeclaringClass().getName();
+ String methodName = method.getName();
+
+ //the default OVal message shows the field name as
ActionClass.fieldName
+ String finalMessage = StringUtils.removeStart(message, className +
".");
+
+ String fieldName = null;
if (methodName.startsWith("get")) {
- return
StringUtils.uncapitalize(StringUtils.removeStart(methodName, "get"));
+ fieldName =
StringUtils.uncapitalize(StringUtils.removeStart(methodName, "get"));
} else if (methodName.startsWith("is")) {
- return
StringUtils.uncapitalize(StringUtils.removeStart(methodName, "is"));
+ fieldName =
StringUtils.uncapitalize(StringUtils.removeStart(methodName, "is"));
}
- return methodName;
+ //the result will have the full method name, like "getName()",
replace it by "name" (obnly if it is a field)
+ if (fieldName != null)
+ finalMessage = finalMessage.replaceAll(methodName +
"\\(.*?\\)", fieldName);
+
+ return new ValidationError(StringUtils.defaultString(fieldName,
methodName), finalMessage);
}
- return violation.getCheckName();
+ return new ValidationError(violation.getCheckName(), message);
}
/**
@@ -215,4 +231,22 @@
protected boolean isActionError(ConstraintViolation violation) {
return false;
}
+
+ class ValidationError {
+ private String fieldName;
+ private String message;
+
+ ValidationError(String fieldName, String message) {
+ this.fieldName = fieldName;
+ this.message = message;
+ }
+
+ public String getFieldName() {
+ return fieldName;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+ }
}
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=760136&r1=760135&r2=760136&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
Mon Mar 30 20:02:31 2009
@@ -43,16 +43,52 @@
assertValue(fieldErrors, "lastName", Arrays.asList("lastName cannot be
null"));
}
+ public void testValidationInMethods() throws Exception {
+ ActionProxy baseActionProxy =
actionProxyFactory.createActionProxy("oval", "validationInMethods", null, null);
+ baseActionProxy.execute();
+
+ Map<String, List<String>> fieldErrors = ((ValidationAware)
baseActionProxy.getAction()).getFieldErrors();
+ assertNotNull(fieldErrors);
+ assertEquals(4, fieldErrors.size());
+ assertValue(fieldErrors, "name", Arrays.asList("name cannot be null"));
+ assertValue(fieldErrors, "SisyphusHasTheAnswer",
Arrays.asList("SisyphusHasTheAnswer() cannot be null"));
+ assertValue(fieldErrors, "thereAnyMeaningInLife",
Arrays.asList("thereAnyMeaningInLife cannot be null"));
+ assertValue(fieldErrors, "theManingOfLife",
Arrays.asList("theManingOfLife cannot be null"));
+ }
+
+ public void testSimpleFieldsInheritedXML() throws Exception {
+ ActionProxy baseActionProxy =
actionProxyFactory.createActionProxy("oval", "simpleFieldsXMLChild", null,
null);
+ baseActionProxy.execute();
+
+ Map<String, List<String>> fieldErrors = ((ValidationAware)
baseActionProxy.getAction()).getFieldErrors();
+ assertNotNull(fieldErrors);
+ assertEquals(3, fieldErrors.size());
+ assertValue(fieldErrors, "firstName", Arrays.asList("firstName cannot
be null"));
+ assertValue(fieldErrors, "lastName", Arrays.asList("lastName cannot be
null"));
+ assertValue(fieldErrors, "middleName", Arrays.asList("middleName
cannot be null"));
+ }
+
+ public void testSlashesInNameWithWildcardsHitsCache() throws Exception {
+ ActionProxy baseActionProxy =
actionProxyFactory.createActionProxy("oval", "simpleFieldsXML/test", null,
null);
+ baseActionProxy.execute();
+
+ ActionProxy baseActionProxy2 =
actionProxyFactory.createActionProxy("oval", "simpleFieldsXML/test2", null,
null);
+ baseActionProxy2.execute();
+
+ DummyDefaultOValValidationManager manager =
(DummyDefaultOValValidationManager)
container.getInstance(OValValidationManager.class);
+ assertEquals(1, manager.getCache().size());
+ }
+
public void testXMLLoadCaching() {
OValValidationManager manager =
container.getInstance(OValValidationManager.class);
- List<Configurer> configurers =
manager.getConfigurers(SimpleFieldsXML.class, "simpleFieldsXML");
+ List<Configurer> configurers =
manager.getConfigurers(SimpleFieldsXML.class, "simpleFieldsXMLCaching");
assertNotNull(configurers);
- assertEquals(1, configurers.size());
+ assertEquals(2, configurers.size());
//load again and check it is the same instance
- List<Configurer> configurers2 =
manager.getConfigurers(SimpleFieldsXML.class, "simpleFieldsXML");
+ List<Configurer> configurers2 =
manager.getConfigurers(SimpleFieldsXML.class, "simpleFieldsXMLCaching");
assertNotNull(configurers2);
- assertEquals(1, configurers2.size());
+ assertEquals(2, configurers2.size());
assertSame(configurers.get(0), configurers2.get(0));
}
@@ -210,7 +246,6 @@
assertEquals(expectedValues, values);
}
-
@Override
protected void setUp() throws Exception {
super.setUp();
Added:
struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/SimpleFieldsXMLChild.java
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/SimpleFieldsXMLChild.java?rev=760136&view=auto
==============================================================================
---
struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/SimpleFieldsXMLChild.java
(added)
+++
struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/SimpleFieldsXMLChild.java
Mon Mar 30 20:02:31 2009
@@ -0,0 +1,33 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.struts2.interceptor;
+
+public class SimpleFieldsXMLChild extends SimpleFieldsXML {
+ private String middleName;
+
+ public String getMiddleName() {
+ return middleName;
+ }
+
+ public void setMiddleName(String middleName) {
+ this.middleName = middleName;
+ }
+}
Added:
struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/ValidationInMethods.java
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/ValidationInMethods.java?rev=760136&view=auto
==============================================================================
---
struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/ValidationInMethods.java
(added)
+++
struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/ValidationInMethods.java
Mon Mar 30 20:02:31 2009
@@ -0,0 +1,52 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.struts2.interceptor;
+
+import com.opensymphony.xwork2.ActionSupport;
+import net.sf.oval.constraint.NotNull;
+import net.sf.oval.configuration.annotation.IsInvariant;
+
+public class ValidationInMethods extends ActionSupport {
+ @IsInvariant
+ @NotNull
+ public String getName() {
+ return null;
+ }
+
+ @IsInvariant
+ @NotNull
+ public Boolean isThereAnyMeaningInLife() {
+ return null;
+ }
+
+ @IsInvariant
+ @NotNull
+ public String getTheManingOfLife() {
+ return null;
+ }
+
+ @IsInvariant
+ @NotNull
+ public String SisyphusHasTheAnswer() {
+ //some method annotated, whose name is not a field
+ return null;
+ }
+}
\ No newline at end of file
Added:
struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/aa.java
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/aa.java?rev=760136&view=auto
==============================================================================
---
struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/aa.java
(added)
+++
struts/sandbox/trunk/struts2-oval-plugin/src/test/java/org/apache/struts2/interceptor/aa.java
Mon Mar 30 20:02:31 2009
@@ -0,0 +1,33 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.struts2.interceptor;
+
+import net.sf.oval.configuration.Configurer;
+
+import java.util.List;
+import java.util.Map;
+
+//just to expose the cache
+class DummyDefaultOValValidationManager extends DefaultOValValidationManager {
+ public Map<String, List<Configurer>> getCache() {
+ return validatorCache;
+ }
+}
Modified:
struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/org/apache/struts2/interceptor/SimpleFieldI18n.properties
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/org/apache/struts2/interceptor/SimpleFieldI18n.properties?rev=760136&r1=760135&r2=760136&view=diff
==============================================================================
---
struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/org/apache/struts2/interceptor/SimpleFieldI18n.properties
(original)
+++
struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/org/apache/struts2/interceptor/SimpleFieldI18n.properties
Mon Mar 30 20:02:31 2009
@@ -1 +1 @@
-notnull.field=${context.field.name} cannot be null
\ No newline at end of file
+notnull.field=${field.name} cannot be null
\ No newline at end of file
Modified:
struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/org/apache/struts2/interceptor/SimpleFieldsXML-validation.xml
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/org/apache/struts2/interceptor/SimpleFieldsXML-validation.xml?rev=760136&r1=760135&r2=760136&view=diff
==============================================================================
---
struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/org/apache/struts2/interceptor/SimpleFieldsXML-validation.xml
(original)
+++
struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/org/apache/struts2/interceptor/SimpleFieldsXML-validation.xml
Mon Mar 30 20:02:31 2009
@@ -1,9 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!--
-<!DOCTYPE oval PUBLIC
- "-//OVal/OVal Configuration DTD 1.3//EN"
- "http://oval.sourceforge.net/oval-configuration-1.3.dtd">
--->
<oval xmlns="http://oval.sf.net/oval-configuration"
xmlns:xsi="http://http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://oval.sf.net/oval-configuration
http://oval.sourceforge.net/oval-configuration-1.3.xsd">
<class type="org.apache.struts2.interceptor.SimpleFieldsXML"
overwrite="false"
Added:
struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/org/apache/struts2/interceptor/SimpleFieldsXMLChild-validation.xml
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/org/apache/struts2/interceptor/SimpleFieldsXMLChild-validation.xml?rev=760136&view=auto
==============================================================================
---
struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/org/apache/struts2/interceptor/SimpleFieldsXMLChild-validation.xml
(added)
+++
struts/sandbox/trunk/struts2-oval-plugin/src/test/resources/org/apache/struts2/interceptor/SimpleFieldsXMLChild-validation.xml
Mon Mar 30 20:02:31 2009
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<oval xmlns="http://oval.sf.net/oval-configuration"
xmlns:xsi="http://http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://oval.sf.net/oval-configuration
http://oval.sourceforge.net/oval-configuration-1.3.xsd">
+ <class type="org.apache.struts2.interceptor.SimpleFieldsXMLChild"
overwrite="false"
+ applyFieldConstraintsToSetters="true">
+ <field name="middleName">
+ <notNull/>
+ </field>
+ </class>
+</oval>
\ No newline at end of file
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=760136&r1=760135&r2=760136&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
Mon Mar 30 20:02:31 2009
@@ -4,7 +4,8 @@
>
<xwork>
- <bean type="org.apache.struts2.interceptor.OValValidationManager"
class="org.apache.struts2.interceptor.DefaultOValValidationManager" />
+ <bean type="org.apache.struts2.interceptor.OValValidationManager"
class="org.apache.struts2.interceptor.DummyDefaultOValValidationManager"/>
+ <constant name="struts.enable.SlashesInActionNames" value="true"/>
<package namespace="oval" name="oval-test">
<result-types>
<result-type name="void"
class="org.apache.struts2.interceptor.VoidResult"/>
@@ -13,10 +14,26 @@
<interceptor name="ovalValidation"
class="org.apache.struts2.interceptor.OValValidationInterceptor"/>
</interceptors>
+ <action name="simpleFieldsXMLChild"
class="org.apache.struts2.interceptor.SimpleFieldsXMLChild">
+ <interceptor-ref name="ovalValidation"/>
+ <result type="void"></result>
+ </action>
+ <action name="validationInMethods"
class="org.apache.struts2.interceptor.ValidationInMethods">
+ <interceptor-ref name="ovalValidation"/>
+ <result type="void"></result>
+ </action>
+ <action name="simpleFieldsXML/*"
class="org.apache.struts2.interceptor.SimpleFieldsXML">
+ <interceptor-ref name="ovalValidation"/>
+ <result type="void"></result>
+ </action>
<action name="simpleFieldsXML"
class="org.apache.struts2.interceptor.SimpleFieldsXML">
<interceptor-ref name="ovalValidation"/>
<result type="void"></result>
</action>
+ <action name="simpleFieldsXMLCaching"
class="org.apache.struts2.interceptor.SimpleFieldsXML">
+ <interceptor-ref name="ovalValidation"/>
+ <result type="void"></result>
+ </action>
<action name="simpleField"
class="org.apache.struts2.interceptor.SimpleField">
<interceptor-ref name="ovalValidation"/>
<result type="void"></result>