turner 2003/01/19 22:15:06 Modified: validator/src/share/org/apache/commons/validator ValidatorResources.java ValidatorResourcesInitializer.java validator/src/test/org/apache/commons/validator ValidatorTestSuite.java Added: validator/conf/share validator_1_0_1.dtd validator/src/test/org/apache/commons/validator LocaleTest.java validator-locale.xml Log: Fixes bug 16073. Makes variant work for formsets, and adds it back into the DTD. Moves a few info statements to debug statements to clear up log clutter Revision Changes Path 1.1 jakarta-commons/validator/conf/share/validator_1_0_1.dtd Index: validator_1_0_1.dtd =================================================================== <!-- DTD for the Validator Rules Configuration File, Version 1.0 To allow for XML validation of your rules configuration file, include the following DOCTYPE element at the beginning (after the "xml" declaration): <!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0.1//EN" "http://jakarta.apache.org/commons/dtds/validator_1_0_1.dtd"> $Id: validator_1_0_1.dtd,v 1.1 2003/01/20 06:15:06 turner Exp $ --> <!-- =================================================== Top Level Elements --> <!-- The "form-validation" element is the root of the configuration file hierarchy, and contains nested elements for all of the other configuration settings. --> <!ELEMENT form-validation (global*, formset*)> <!-- The elements defined here are all global and must be nested within a "global" element. --> <!ELEMENT global (validator*, constant*)> <!-- The "validator" element defines what validators objects can be used with the fields referenced by the formset elements. The validator element can accept 4 properties: name, classname, method, methodparams, msg, depends, and jsFunctionName. --> <!ELEMENT validator (javascript?)> <!ATTLIST validator name CDATA #REQUIRED classname CDATA #REQUIRED method CDATA #REQUIRED methodParams CDATA #REQUIRED msg CDATA #REQUIRED depends CDATA #IMPLIED jsFunctionName CDATA #IMPLIED > <!-- The "javascript" element defines a JavaScript that can be used to perform client-side validators. --> <!ELEMENT javascript (#PCDATA)> <!-- The "constant" element defines a static value that can be used as replacement parameters within "field" elements. The "constant-name" and "constant-value" elements define the constant's reference id and replacement value. --> <!ELEMENT constant (constant-name, constant-value)> <!ELEMENT constant-name (#PCDATA)> <!ELEMENT constant-value (#PCDATA)> <!-- The "formset" element defines a set of forms for a locale. Formsets for specific locales can override only those fields that change. The localization is properly scoped, so that a formset can override just the language, or just the country, or both. --> <!ELEMENT formset (constant*, form+)> <!ATTLIST formset language CDATA #IMPLIED country CDATA #IMPLIED variant CDATA #IMPLIED > <!-- The "form" element defines a set of fields to be validated. The name corresponds to the identifer the application assigns to the form. --> <!ELEMENT form (field+ )> <!ATTLIST form name CDATA #REQUIRED> <!-- The "field" element defines the properties to be validated. In a web application, a field would also correspond to a control on a HTML form. To validate the properties, the validator works through a JavaBean representation. The field element can accept up to 4 attributes: property The property on the JavaBean corresponding to this field element. depends The comma-delimited list of validators to apply against this field. For the field to succeed, all the validators must succeed. page The JavaBean corresponding to this form may include a page property. Only fields with a "page" attribute value that is equal to or less than the page property on the form JavaBean are processed. This is useful when using a "wizard" approach to completing a large form, to ensure that a page is not skipped. [0] indexedListProperty The "indexedListProperty" is the method name that will return an array or a Collection used to retrieve the list and then loop through the list performing the validations for this field. --> <!ELEMENT field (msg|arg0|arg1|arg2|arg3|var)*> <!ATTLIST field property CDATA #REQUIRED depends CDATA #IMPLIED page CDATA #IMPLIED indexedListProperty CDATA #IMPLIED > <!-- The "msg" element defines a custom message key to use when one of the validators for this field fails. Each validator has a default message property that is used when a corresonding field msg is not specified. Each validator applied to a field may have its own msg element. The msg element accepts up to three attributes. name The name of the validator corresponding to this msg. key The key that will return the message template from a resource bundle. resource If set to "false", the key is taken to be a literal value rather than a bundle key. [true] --> <!ELEMENT msg EMPTY> <!ATTLIST msg name CDATA #IMPLIED key CDATA #IMPLIED resource CDATA #IMPLIED > <!-- The "arg0" element defines the first replacement value to use with the message template for this validator or this field. The arg0 element accepts up to three attributes. name The name of the validator corresponding to this msg. key The key that will return the message template from a resource bundle. resource If set to "false", the key is taken to be a literal value rather than a bundle key. [true] --> <!ELEMENT arg0 EMPTY> <!ATTLIST arg0 name CDATA #IMPLIED key CDATA #IMPLIED resource CDATA #IMPLIED > <!-- The "arg1" element defines the second replacement value to use with the message template for this validator or this field. The arg1 element accepts up to three attributes. name The name of the validator corresponding to this msg. key The key that will return the message template from a resource bundle. resource If set to "false", the key is taken to be a literal value rather than a bundle key. [true] --> <!ELEMENT arg1 EMPTY> <!ATTLIST arg1 name CDATA #IMPLIED key CDATA #IMPLIED resource CDATA #IMPLIED > <!-- The "arg2" element defines the third replacement value to use with the message template for this validator or this field. The arg2 element accepts up to three attributes. name The name of the validator corresponding to this msg. key The key that will return the message template from a resource bundle. resource If set to "false", the key is taken to be a literal value rather than a bundle key. [true] --> <!ELEMENT arg2 EMPTY> <!ATTLIST arg2 name CDATA #IMPLIED key CDATA #IMPLIED resource CDATA #IMPLIED > <!-- The "arg3" element defines the fourth replacement value to use with the message template for this validator or this field. The arg0 element accepts up to three attributes. name The name of the validator corresponding to this msg. key The key that will return the message template from a resource bundle. resource If set to "false", the key is taken to be a literal value rather than a bundle key. [true] --> <!ELEMENT arg3 EMPTY> <!ATTLIST arg3 name CDATA #IMPLIED key CDATA #IMPLIED resource CDATA #IMPLIED > <!-- The "var" element can set parameters that a field may need to pass to one of its validators, such as the minimum and maximum values in a range validation. These parameters may also be referenced by one of the arg? elements using a shell syntax: ${var:var-name}. --> <!ELEMENT var (var-name, var-value)> <!-- The name of the var parameter to provide to a field's validators. --> <!ELEMENT var-name (#PCDATA)> <!-- The value of the var parameter to provide to a field's validators. --> <!ELEMENT var-value (#PCDATA)> <!-- eof --> 1.10 +23 -13 jakarta-commons/validator/src/share/org/apache/commons/validator/ValidatorResources.java Index: ValidatorResources.java =================================================================== RCS file: /home/cvs/jakarta-commons/validator/src/share/org/apache/commons/validator/ValidatorResources.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- ValidatorResources.java 15 Dec 2002 21:46:41 -0000 1.9 +++ ValidatorResources.java 20 Jan 2003 06:15:06 -0000 1.10 @@ -131,8 +131,8 @@ formsets.add(fs); } - if (log.isInfoEnabled()) { - log.info("Adding FormSet '" + fs.toString() + "'."); + if (log.isDebugEnabled()) { + log.debug("Adding FormSet '" + fs.toString() + "'."); } } } @@ -147,8 +147,8 @@ hConstants.put(c.getName(), c.getValue()); } - if (log.isInfoEnabled()) { - log.info("Add Global Constant: " + c.getName() + "," + c.getValue()); + if (log.isDebugEnabled()) { + log.debug("Add Global Constant: " + c.getName() + "," + c.getValue()); } } @@ -161,8 +161,8 @@ hConstants.put(name, value); } - if (log.isInfoEnabled()) { - log.info("Add Global Constant: " + name + "," + value); + if (log.isDebugEnabled()) { + log.debug("Add Global Constant: " + name + "," + value); } } @@ -181,8 +181,8 @@ hActions.put(va.getName(), va); - if (log.isInfoEnabled()) { - log.info("Add ValidatorAction: " + va.getName() + "," + va.getClassname()); + if (log.isDebugEnabled()) { + log.debug("Add ValidatorAction: " + va.getName() + "," + va.getClassname()); } } } @@ -378,7 +378,7 @@ if (!GenericValidator.isBlankOrNull(language) && !GenericValidator.isBlankOrNull(country) && !GenericValidator.isBlankOrNull(variant)) { - Form form = get(language, country, null, formKey); + Form form = get(language, country, variant, formKey); if (form.getFieldMap().containsKey(fieldKey)) { field = (Field)form.getFieldMap().get(fieldKey); @@ -388,6 +388,16 @@ if (field == null) { if (!GenericValidator.isBlankOrNull(language) && !GenericValidator.isBlankOrNull(country)) { + Form form = get(language, country, null, formKey); + + if (form.getFieldMap().containsKey(fieldKey)) { + field = (Field)form.getFieldMap().get(fieldKey); + } + } + } + + if (field == null) { + if (!GenericValidator.isBlankOrNull(language)) { Form form = get(language, null, null, formKey); if (form.getFieldMap().containsKey(fieldKey)) { 1.11 +6 -6 jakarta-commons/validator/src/share/org/apache/commons/validator/ValidatorResourcesInitializer.java Index: ValidatorResourcesInitializer.java =================================================================== RCS file: /home/cvs/jakarta-commons/validator/src/share/org/apache/commons/validator/ValidatorResourcesInitializer.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- ValidatorResourcesInitializer.java 15 Dec 2002 21:46:41 -0000 1.10 +++ ValidatorResourcesInitializer.java 20 Jan 2003 06:15:06 -0000 1.11 @@ -94,8 +94,8 @@ * <strong>MUST</strong> be an even number of Strings in this list! */ protected static String registrations[] = { - "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN", - "/org/apache/commons/validator/resources/validator_1_0.dtd" + "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0.1//EN", + "/org/apache/commons/validator/resources/validator_1_0_1.dtd" }; 1.6 +5 -4 jakarta-commons/validator/src/test/org/apache/commons/validator/ValidatorTestSuite.java Index: ValidatorTestSuite.java =================================================================== RCS file: /home/cvs/jakarta-commons/validator/src/test/org/apache/commons/validator/ValidatorTestSuite.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- ValidatorTestSuite.java 24 Sep 2002 20:23:35 -0000 1.5 +++ ValidatorTestSuite.java 20 Jan 2003 06:15:06 -0000 1.6 @@ -96,6 +96,7 @@ suite.addTest(TypeTest.suite()); suite.addTest(EmailTest.suite()); suite.addTest(ValidatorTest.suite()); + suite.addTest(LocaleTest.suite()); return suite; } 1.1 jakarta-commons/validator/src/test/org/apache/commons/validator/LocaleTest.java Index: LocaleTest.java =================================================================== /* * $Header: /home/cvs/jakarta-commons/validator/src/test/org/apache/commons/validator/LocaleTest.java,v 1.1 2003/01/20 06:15:06 turner Exp $ * $Revision: 1.1 $ * $Date: 2003/01/20 06:15:06 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Commons", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.commons.validator; import java.io.IOException; import java.io.InputStream; import java.util.Map; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import junit.framework.AssertionFailedError; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.util.Locale; /** * <p>Performs Validation Test for <code>long</code> validations.</p> * * @author David Winterfeldt * @version $Revision: 1.1 $ $Date: 2003/01/20 06:15:06 $ */ public class LocaleTest extends TestCase { /** * The key used to retrieve the set of validation * rules from the xml file. */ protected static String FORM_KEY = "nameForm"; /** * The key used to retrieve the validator action. */ protected static String ACTION = "required"; /** * Commons Logging instance. */ private Log log = LogFactory.getLog(this.getClass()); /** * Resources used for validation tests. */ private ValidatorResources resources = null; public LocaleTest(String name) { super(name); } /** * Start the tests. * * @param theArgs the arguments. Not used */ public static void main(String[] theArgs) { junit.awtui.TestRunner.main(new String[] {LocaleTest.class.getName()}); } /** * @return a test suite (<code>TestSuite</code>) that includes all methods * starting with "test" */ public static Test suite() { // All methods starting with "test" will be executed in the test suite. return new TestSuite(LocaleTest.class); } /** * Load <code>ValidatorResources</code> from * validator-name-required.xml. */ protected void setUp() throws IOException { // Load resources InputStream in = null; resources = new ValidatorResources(); try { in = this.getClass().getResourceAsStream("validator-locale.xml"); ValidatorResourcesInitializer.initialize(resources, in); } catch (IOException e) { log.error(e.getMessage(), e); throw e; } finally { if (in != null) { try { in.close(); } catch (Exception e) {} } } } protected void tearDown() { } /** * See what happens when we try to validate with a Locale, Country and variant */ public void testLocale1() throws ValidatorException { // Create bean to run test on. NameBean name = new NameBean(); name.setFirstName(""); name.setLastName(""); valueTest(name, new Locale("en", "US", "TEST1"), false, false); } /** * See what happens when we try to validate with a Locale, Country and variant */ public void testLocale2() throws ValidatorException { // Create bean to run test on. NameBean name = new NameBean(); name.setFirstName(""); name.setLastName(""); valueTest(name, new Locale("en", "US", "TEST2"), true, false); } /** * See what happens when we try to validate with a Locale, Country and variant */ public void testLocale3() throws ValidatorException { // Create bean to run test on. NameBean name = new NameBean(); name.setFirstName(""); name.setLastName(""); valueTest(name, new Locale("en", "UK"), false, true); } /** * Utlity class to run a test on a value. * * @param info Value to run test on. * @param passed Whether or not the test is expected to pass. */ private void valueTest(Object name, Locale loc, boolean firstGood, boolean lastGood) throws ValidatorException { // Construct validator based on the loaded resources // and the form key Validator validator = new Validator(resources, FORM_KEY); // add the name bean to the validator as a resource // for the validations to be performed on. validator.addResource(Validator.BEAN_KEY, name); validator.addResource(Validator.LOCALE_KEY, loc); // Get results of the validation. ValidatorResults results = null; // throws ValidatorException, // but we aren't catching for testing // since no validation methods we use // throw this results = validator.validate(); assertNotNull("Results are null.", results); ValidatorResult resultlast = results.getValidatorResult("lastName"); ValidatorResult resultfirst = results.getValidatorResult("firstName"); if (firstGood) { assertNull(ACTION + " firstName ValidatorResult should be null.", resultfirst); } else { assertNotNull(ACTION + " firstName ValidatorResult should not be null.", resultfirst); } if (lastGood) { assertNull(ACTION + " lastName ValidatorResult should be null.", resultlast); } else { assertNotNull(ACTION + " lastName ValidatorResult should not be null.", resultlast); } } } 1.1 jakarta-commons/validator/src/test/org/apache/commons/validator/validator-locale.xml Index: validator-locale.xml =================================================================== <form-validation> <global> <validator name="required" classname="org.apache.commons.validator.TestValidator" method="validateRequired" methodParams="java.lang.Object,org.apache.commons.validator.Field"/> </global> <formset> <form name="nameForm" > <field property="firstName" depends="required"> <arg0 key="nameForm.firstname.displayname"/> </field> <field property="lastName" depends="required"> <arg0 key="nameForm.lastname.displayname"/> </field> </form> </formset> <formset language="en" country="US" variant="TEST1"> <form name="nameForm" > <field property="firstName" depends="required"> <arg0 key="nameForm.firstname.displayname"/> </field> <field property="lastName" depends="required"> <arg0 key="nameForm.lastname.displayname"/> </field> </form> </formset> <formset language="en" country="US" variant="TEST2"> <form name="nameForm" > <field property="firstName" depends=""> <arg0 key="nameForm.firstname.displayname"/> </field> <field property="lastName" depends="required"> <arg0 key="nameForm.lastname.displayname"/> </field> </form> </formset> <formset language="en" country="UK"> <form name="nameForm" > <field property="firstName" depends="required"> <arg0 key="nameForm.firstname.displayname"/> </field> <field property="lastName" depends=""> <arg0 key="nameForm.lastname.displayname"/> </field> </form> </formset> </form-validation>
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>