You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@turbine.apache.org by tv...@apache.org on 2007/04/08 16:51:22 UTC

svn commit: r526565 - in /jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src: dtd/ java/org/apache/turbine/services/intake/model/ java/org/apache/turbine/services/intake/transform/ java/org/apache/turbine/services/intake/validator/ java/org/apache/tu...

Author: tv
Date: Sun Apr  8 07:51:21 2007
New Revision: 526565

URL: http://svn.apache.org/viewvc?view=rev&rev=526565
Log:
Backported localization and custom fields from Fulcrum

Added:
    jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/AbstractNumberField.java
Modified:
    jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/dtd/intake.dtd
    jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/BigDecimalField.java
    jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/DoubleField.java
    jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/Field.java
    jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/FieldFactory.java
    jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/FloatField.java
    jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/NumberKeyField.java
    jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/transform/DTDResolver.java
    jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/BigDecimalValidator.java
    jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/DefaultValidator.java
    jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/DoubleValidator.java
    jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/FloatValidator.java
    jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/Validator.java
    jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/xmlmodel/XmlField.java

Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/dtd/intake.dtd
URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/dtd/intake.dtd?view=diff&rev=526565&r1=526564&r2=526565
==============================================================================
--- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/dtd/intake.dtd (original)
+++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/dtd/intake.dtd Sun Apr  8 07:51:21 2007
@@ -143,6 +143,15 @@
 
                 Default: default validator for the field type.
 
+fieldClass:     Name of the class used for handling the field. This is used to 
+                customize field types. The attribute is only interpreted if the 
+                type attribute is set to "custom".
+
+                The the name of the class is not fully qualified, it will
+                be prepended with org.apache.turbine.services.intake.model.
+                For example: a value of "CurrencyField" will be read as
+                "org.apache.turbine.services.intake.model.CurrencyField".
+
 mapToObject:    Class name of the mapped object.  This will override the
                 mapToObject attribute of the enclosing group element.
 
@@ -183,7 +192,7 @@
   displaySize CDATA #IMPLIED
   type ( boolean | BigDecimal | int  | float | FileItem
        | String | DateString  | StringKey | NumberKey
-       | ComboKey | double | short | long ) "String"
+       | ComboKey | double | short | long | custom ) "String"
   multiValued ( true | false ) "false"
   mapToObject CDATA #IMPLIED
   mapToProperty CDATA #IMPLIED

Added: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/AbstractNumberField.java
URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/AbstractNumberField.java?view=auto&rev=526565
==============================================================================
--- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/AbstractNumberField.java (added)
+++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/AbstractNumberField.java Sun Apr  8 07:51:21 2007
@@ -0,0 +1,70 @@
+package org.apache.turbine.services.intake.model;
+
+/*
+ * Copyright 2001-2004 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ */
+
+import java.text.DecimalFormatSymbols;
+import java.util.Locale;
+
+import org.apache.turbine.services.intake.IntakeException;
+import org.apache.turbine.services.intake.xmlmodel.XmlField;
+
+/**
+ * Provides helper methods for localizing floating point numbers
+ * 
+ * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
+ * @version $Id: BigDecimalField.java 223047 2004-07-01 11:30:52Z epugh $
+ */
+public abstract class AbstractNumberField
+        extends Field
+{
+    /**
+     * Constructor.
+     *
+     * @param field xml field definition object
+     * @param group xml group definition object
+     * @throws IntakeException thrown by superclass
+     */
+    public AbstractNumberField(XmlField field, Group group)
+            throws IntakeException
+    {
+        super(field, group);
+    }
+
+    /**
+     * Canonicalizes an user-inputted <code>BigDecimal</code> string
+     * to the system's internal format.
+     *
+     * @param number Text conforming to a <code>Number</code>
+     * description for a set of <code>DecimalFormatSymbols</code>.
+     * @return The canonicalized representation.
+     */
+    protected final String canonicalizeDecimalInput(String number)
+    {
+        if (getLocale() != null)
+        {
+            DecimalFormatSymbols internal = new DecimalFormatSymbols(Locale.US);
+            DecimalFormatSymbols user = new DecimalFormatSymbols(getLocale());
+
+            if (!internal.equals(user))
+            {
+                number = number.replace(user.getDecimalSeparator(),
+                        internal.getDecimalSeparator());
+            }
+        }
+        return number;
+    }
+}

Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/BigDecimalField.java
URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/BigDecimalField.java?view=diff&rev=526565&r1=526564&r2=526565
==============================================================================
--- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/BigDecimalField.java (original)
+++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/BigDecimalField.java Sun Apr  8 07:51:21 2007
@@ -18,9 +18,6 @@
 
 import java.math.BigDecimal;
 
-import java.text.DecimalFormatSymbols;
-import java.util.Locale;
-
 import org.apache.commons.lang.StringUtils;
 
 import org.apache.turbine.services.intake.IntakeException;
@@ -32,10 +29,11 @@
  * @author <a href="mailto:dlr@finemaltcoding.com">Daniel Rall</a>
  * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
  * @author <a href="mailto:quintonm@bellsouth.net">Quinton McCombs</a>
+ * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
  * @version $Id$
  */
 public class BigDecimalField
-        extends Field
+        extends AbstractNumberField
 {
     /**
      * Constructor.
@@ -109,38 +107,14 @@
             for (int i = 0; i < inputs.length; i++)
             {
                 values[i] = StringUtils.isNotEmpty(inputs[i])
-                        ? canonicalizeDecimalInput(inputs[i]) : (BigDecimal) getEmptyValue();
+                        ? new BigDecimal(canonicalizeDecimalInput(inputs[i])) : (BigDecimal) getEmptyValue();
             }
             setTestValue(values);
         }
         else
         {
             String val = parser.getString(getKey());
-            setTestValue(StringUtils.isNotEmpty(val) ? canonicalizeDecimalInput(val) : (BigDecimal) getEmptyValue());
-        }
-    }
-
-    /**
-     * Canonicalizes an user-inputted <code>BigDecimal</code> string
-     * to the system's internal format.
-     *
-     * @param bigDecimal Text conforming to a <code>BigDecimal</code>
-     * description for a set of <code>DecimalFormatSymbols</code>.
-     * @return The canonicalized representation.
-     */
-    protected final BigDecimal canonicalizeDecimalInput(String bigDecimal)
-    {
-        if (getLocale() != null)
-        {
-            DecimalFormatSymbols internal = new DecimalFormatSymbols(Locale.US);
-            DecimalFormatSymbols user = new DecimalFormatSymbols(getLocale());
-
-            if (!internal.equals(user))
-            {
-                bigDecimal = bigDecimal.replace(user.getDecimalSeparator(),
-                        internal.getDecimalSeparator());
-            }
+            setTestValue(StringUtils.isNotEmpty(val) ? new BigDecimal(canonicalizeDecimalInput(val)) : (BigDecimal) getEmptyValue());
         }
-        return new BigDecimal(bigDecimal);
     }
 }

Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/DoubleField.java
URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/DoubleField.java?view=diff&rev=526565&r1=526564&r2=526565
==============================================================================
--- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/DoubleField.java (original)
+++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/DoubleField.java Sun Apr  8 07:51:21 2007
@@ -29,7 +29,7 @@
  * @version $Id$
  */
 public class DoubleField
-        extends Field
+        extends AbstractNumberField
 {
     /**
      * Constructor.
@@ -82,7 +82,7 @@
     }
 
     /**
-     * Provides access to emptyValue such that the value returned will be
+     * Provides access to emptyValue such that the value returned will be 
      * acceptable as an argument parameter to Method.invoke.  Subclasses
      * that deal with primitive types should ensure that they return an
      * appropriate value wrapped in the object wrapper class for the
@@ -126,7 +126,7 @@
             for (int i = 0; i < inputs.length; i++)
             {
                 values[i] = StringUtils.isNotEmpty(inputs[i])
-                        ? new Double(inputs[i]).doubleValue()
+                        ? new Double(canonicalizeDecimalInput(inputs[i])).doubleValue()
                         : ((Double) getEmptyValue()).doubleValue();
             }
             setTestValue(values);
@@ -134,8 +134,9 @@
         else
         {
             String val = parser.getString(getKey());
-            setTestValue(StringUtils.isNotEmpty(val)
-                    ? new Double(val) : (Double) getEmptyValue());
+            setTestValue(StringUtils.isNotEmpty(val) 
+                    ? new Double(canonicalizeDecimalInput(val))
+                    : (Double) getEmptyValue());
         }
     }
 

Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/Field.java
URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/Field.java?view=diff&rev=526565&r1=526564&r2=526565
==============================================================================
--- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/Field.java (original)
+++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/Field.java Sun Apr  8 07:51:21 2007
@@ -50,6 +50,7 @@
  * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
  * @author <a href="mailto:quintonm@bellsouth.net">Quinton McCombs</a>
  * @author <a href="mailto:jh@byteaction.de">J&uuml;rgen Hoffmann</a>
+ * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
  * @version $Id$
  */
 public abstract class Field
@@ -60,8 +61,11 @@
     /** CGI Key for "value if absent" */
     private static final String VALUE_IF_ABSENT_KEY = "_vifa_";
 
-    /** Default Package */
-    public static final String defaultFieldPackage = "org.apache.turbine.services.intake.validator.";
+    /** Default Validator Package */
+    public static final String defaultValidatorPackage = "org.apache.turbine.services.intake.validator.";
+
+    /** Default Field Package */
+    public static final String defaultFieldPackage = "org.apache.turbine.services.intake.model.";
 
     // the following are set from the xml file and are permanent (final)
 
@@ -206,7 +210,7 @@
         else if (validatorClassName != null
                 && validatorClassName.indexOf('.') == -1)
         {
-            validatorClassName = defaultFieldPackage + validatorClassName;
+            validatorClassName = defaultValidatorPackage + validatorClassName;
         }
 
         if (validatorClassName != null)
@@ -378,12 +382,23 @@
     }
 
     /**
+     * Returns the <code>Group</code> this field belongs to 
+     * or <code>null</code> if unknown.
+     *
+     * @return The group this field belongs to.
+     */
+    public Group getGroup()
+    {
+        return group;
+    }
+
+    /**
      * Returns the <code>Locale</code> used when localizing data for
      * this field, or <code>null</code> if unknown.
      *
      * @return Where to localize for.
      */
-    protected Locale getLocale()
+    public Locale getLocale()
     {
         return locale;
     }
@@ -408,6 +423,16 @@
     }
 
     /**
+     * Flag to determine whether the field has been declared as multi-valued.
+     *
+     * @return value of isMultiValued.
+     */
+    public boolean isMultiValued()
+    {
+        return isMultiValued;
+    }
+
+    /**
      * Flag to determine whether the field has been declared as required.
      *
      * @return value of required.
@@ -591,22 +616,19 @@
                 }
             }
 
-
             if (validator != null)
             {
                 // set the test value as a String[] which might be replaced by
                 // the correct type if the input is valid.
                 setTestValue(parser.getStrings(getKey()));
-                for (int i = 0; i < stringValues.length; i++)
+                
+                try
+                {
+                    validator.assertValidity(this);
+                }
+                catch (ValidationException ve)
                 {
-                    try
-                    {
-                        validator.assertValidity(stringValues[i]);
-                    }
-                    catch (ValidationException ve)
-                    {
-                        setMessage(ve.getMessage());
-                    }
+                    setMessage(ve.getMessage());
                 }
             }
 
@@ -632,7 +654,7 @@
 
                 try
                 {
-                    validator.assertValidity(stringValue);
+                    validator.assertValidity(this);
                     log.debug(name + ": Value is ok");
                     doSetValue();
                 }

Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/FieldFactory.java
URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/FieldFactory.java?view=diff&rev=526565&r1=526564&r2=526565
==============================================================================
--- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/FieldFactory.java (original)
+++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/FieldFactory.java Sun Apr  8 07:51:21 2007
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 
+import java.lang.reflect.Constructor;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -28,6 +29,7 @@
  * @author <a href="mailto:jmcnally@collab.net">John McNally</a>
  * @author <a href="mailto:quintonm@bellsouth.net">Quinton McCombs</a>
  * @author <a href="mailto:Colin.Chalmers@maxware.nl">Colin Chalmers</a>
+ * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
  * @version $Id$
  */
 public abstract class FieldFactory
@@ -152,6 +154,52 @@
                     throws IntakeException
             {
                 return new LongField(f, g);
+            }
+        }
+        );
+        fieldCtors.put("custom", new FieldFactory.FieldCtor()
+        {
+            public Field getInstance(XmlField f, Group g)
+                    throws IntakeException
+            {
+                String fieldClass = f.getFieldClass();
+                
+                if (fieldClass != null
+                        && fieldClass.indexOf('.') == -1)
+                {
+                    fieldClass = Field.defaultFieldPackage + fieldClass;
+                }
+
+                if (fieldClass != null)
+                {
+                    Class field;
+                    
+                    try
+                    {
+                        field = Class.forName(fieldClass);
+                        Constructor constructor = 
+                            field.getConstructor(new Class[] { XmlField.class, Group.class });
+                        
+                        return (Field)constructor.newInstance(new Object[] { f, g });
+                    }
+                    catch (ClassNotFoundException e)
+                    {
+                        throw new IntakeException(
+                                "Could not load Field class("
+                                + fieldClass + ")", e);
+                    }
+                    catch (Exception e)
+                    {
+                        throw new IntakeException(
+                                "Could not create new instance of Field("
+                                + fieldClass + ")", e);
+                    }
+                }
+                else
+                {
+                    throw new IntakeException(
+                            "Custom field types must define a fieldClass");
+                }
             }
         }
         );

Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/FloatField.java
URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/FloatField.java?view=diff&rev=526565&r1=526564&r2=526565
==============================================================================
--- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/FloatField.java (original)
+++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/FloatField.java Sun Apr  8 07:51:21 2007
@@ -32,9 +32,8 @@
  * @version $Id$
  */
 public class FloatField
-        extends Field
+        extends AbstractNumberField
 {
-
     /**
      * Constructor.
      *
@@ -130,7 +129,7 @@
             for (int i = 0; i < inputs.length; i++)
             {
                 values[i] = StringUtils.isNotEmpty(inputs[i])
-                        ? new Float(inputs[i]).floatValue()
+                        ? new Float(canonicalizeDecimalInput(inputs[i])).floatValue()
                         : ((Float) getEmptyValue()).floatValue();
             }
             setTestValue(values);
@@ -138,8 +137,9 @@
         else
         {
             String val = parser.getString(getKey());
-            setTestValue(StringUtils.isNotEmpty(val)
-                    ? new Float(val) : getEmptyValue());
+            setTestValue(StringUtils.isNotEmpty(val) 
+                    ? new Float(canonicalizeDecimalInput(val))
+                    : getEmptyValue());
         }
     }
 

Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/NumberKeyField.java
URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/NumberKeyField.java?view=diff&rev=526565&r1=526564&r2=526565
==============================================================================
--- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/NumberKeyField.java (original)
+++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/NumberKeyField.java Sun Apr  8 07:51:21 2007
@@ -103,7 +103,7 @@
             String val = parser.getString(getKey());
             if (StringUtils.isNotEmpty(val))
             {
-                BigDecimal bd = canonicalizeDecimalInput(val);
+                BigDecimal bd = new BigDecimal(canonicalizeDecimalInput(val));
                 setTestValue(new NumberKey(bd));
             }
             else

Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/transform/DTDResolver.java
URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/transform/DTDResolver.java?view=diff&rev=526565&r1=526564&r2=526565
==============================================================================
--- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/transform/DTDResolver.java (original)
+++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/transform/DTDResolver.java Sun Apr  8 07:51:21 2007
@@ -40,7 +40,7 @@
 public class DTDResolver implements EntityResolver
 {
     private static final String WEB_SITE_DTD =
-            "http://jakarta.apache.org/turbine/dtd/intake_2_3.dtd";
+            "http://jakarta.apache.org/turbine/dtd/intake_2_3_3.dtd";
 
     /** InputSource for <code>intake.dtd</code>. */
     private InputSource intakeDTD = null;

Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/BigDecimalValidator.java
URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/BigDecimalValidator.java?view=diff&rev=526565&r1=526564&r2=526565
==============================================================================
--- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/BigDecimalValidator.java (original)
+++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/BigDecimalValidator.java Sun Apr  8 07:51:21 2007
@@ -17,10 +17,13 @@
  */
 
 import java.math.BigDecimal;
-
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.util.Locale;
 import java.util.Map;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.turbine.services.intake.model.Field;
 
 /**
  * Validates BigDecimals with the following constraints in addition to those
@@ -38,6 +41,8 @@
  *
  * @author <a href="mailto:jmcnally@collab.net">John McNally</a>
  * @author <a href="mailto:Colin.Chalmers@maxware.nl">Colin Chalmers</a>
+ * @author <a href="mailto:jh@byteaction.de">J&uuml;rgen Hoffmann</a>
+ * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
  * @version $Id$
  */
 public class BigDecimalValidator
@@ -95,14 +100,43 @@
     }
 
     /**
+     * Determine whether a field meets the criteria specified
+     * in the constraints defined for this validator
+     *
+     * @param field a <code>Field</code> to be tested
+     * @exception ValidationException containing an error message if the
+     * testValue did not pass the validation tests.
+     */
+    public void assertValidity(Field field)
+            throws ValidationException
+    {
+        Locale locale = field.getLocale();
+        
+        if (field.isMultiValued())
+        {
+            String[] stringValues = (String[])field.getTestValue();
+            
+            for (int i = 0; i < stringValues.length; i++)
+            {
+                assertValidity(stringValues[i], locale);
+            }
+        }
+        else
+        {
+            assertValidity((String)field.getTestValue(), locale);
+        }
+    }
+    
+    /**
      * Determine whether a testValue meets the criteria specified
      * in the constraints defined for this validator
      *
      * @param testValue a <code>String</code> to be tested
+     * @param locale the Locale of the associated field
      * @exception ValidationException containing an error message if the
      * testValue did not pass the validation tests.
      */
-    public void assertValidity(String testValue)
+    public void assertValidity(String testValue, Locale locale)
             throws ValidationException
     {
         super.assertValidity(testValue);
@@ -110,11 +144,13 @@
         if (required || StringUtils.isNotEmpty(testValue))
         {
             BigDecimal bd = null;
+            NumberFormat nf = NumberFormat.getInstance(locale);
             try
             {
-                bd = new BigDecimal(testValue);
+                Number number = nf.parse(testValue);
+                bd = new BigDecimal(number.doubleValue());
             }
-            catch (RuntimeException e)
+            catch (ParseException e)
             {
                 errorMessage = invalidNumberMessage;
                 throw new ValidationException(invalidNumberMessage);

Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/DefaultValidator.java
URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/DefaultValidator.java?view=diff&rev=526565&r1=526564&r2=526565
==============================================================================
--- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/DefaultValidator.java (original)
+++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/DefaultValidator.java Sun Apr  8 07:51:21 2007
@@ -21,6 +21,7 @@
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.turbine.services.intake.model.Field;
 
 /**
  * DefaultValidator that will compare a testValue against the following
@@ -39,6 +40,7 @@
  * @author <a href="mailto:jmcnally@collab.net">John McNally</a>
  * @author <a href="mailto:quintonm@bellsouth.net">Quinton McCombs</a>
  * @author <a href="mailto:Colin.Chalmers@maxware.nl">Colin Chalmers</a>
+ * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
  * @version $Id$
  */
 abstract public class DefaultValidator
@@ -126,11 +128,61 @@
     }
 
     /**
+     * Determine whether a field meets the criteria specified
+     * in the constraints defined for this validator
+     *
+     * @param field a <code>Field</code> to be tested
+     * @return true if valid, false otherwise
+     */
+    public boolean isValid(Field field)
+    {
+        boolean valid = false;
+        try
+        {
+            assertValidity(field);
+            valid = true;
+        }
+        catch (ValidationException ve)
+        {
+            valid = false;
+        }
+        return valid;
+    }
+
+    /**
+     * Determine whether a field meets the criteria specified
+     * in the constraints defined for this validator
+     *
+     * @param field a <code>Field</code> to be tested
+     * @exception ValidationException containing an error message if the
+     * testValue did not pass the validation tests.
+     */
+    public void assertValidity(Field field)
+            throws ValidationException
+    {
+    	if (field.isMultiValued())
+    	{
+    		String[] stringValues = (String[])field.getTestValue();
+    		
+    		for (int i = 0; i < stringValues.length; i++)
+    		{
+    			assertValidity(stringValues[i]);
+    		}
+    	}
+    	else
+    	{
+    		assertValidity((String)field.getTestValue());
+    	}
+    }
+
+    /**
      * Determine whether a testValue meets the criteria specified
      * in the constraints defined for this validator
      *
      * @param testValue a <code>String</code> to be tested
      * @return true if valid, false otherwise
+     * 
+     * @deprecated use isValid(Field) instead
      */
     public boolean isValid(String testValue)
     {

Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/DoubleValidator.java
URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/DoubleValidator.java?view=diff&rev=526565&r1=526564&r2=526565
==============================================================================
--- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/DoubleValidator.java (original)
+++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/DoubleValidator.java Sun Apr  8 07:51:21 2007
@@ -16,9 +16,13 @@
  * limitations under the License.
  */
 
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.util.Locale;
 import java.util.Map;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.turbine.services.intake.model.Field;
 
 /**
  * Validates Doubles with the following constraints in addition to those
@@ -36,6 +40,8 @@
  *
  * @author <a href="mailto:jmcnally@collab.net">John McNally</a>
  * @author <a href="mailto:Colin.Chalmers@maxware.nl">Colin Chalmers</a>
+ * @author <a href="mailto:jh@byteaction.de">J&uuml;rgen Hoffmann</a>
+ * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
  * @version $Id$
  */
 public class DoubleValidator
@@ -96,14 +102,43 @@
     }
 
     /**
+     * Determine whether a field meets the criteria specified
+     * in the constraints defined for this validator
+     *
+     * @param field a <code>Field</code> to be tested
+     * @exception ValidationException containing an error message if the
+     * testValue did not pass the validation tests.
+     */
+    public void assertValidity(Field field)
+            throws ValidationException
+    {
+        Locale locale = field.getLocale();
+        
+        if (field.isMultiValued())
+        {
+            String[] stringValues = (String[])field.getTestValue();
+            
+            for (int i = 0; i < stringValues.length; i++)
+            {
+                assertValidity(stringValues[i], locale);
+            }
+        }
+        else
+        {
+            assertValidity((String)field.getTestValue(), locale);
+        }
+    }
+    
+    /**
      * Determine whether a testValue meets the criteria specified
      * in the constraints defined for this validator
      *
      * @param testValue a <code>String</code> to be tested
+     * @param locale the Locale of the associated field
      * @exception ValidationException containing an error message if the
      * testValue did not pass the validation tests.
      */
-    public void assertValidity(String testValue)
+    public void assertValidity(String testValue, Locale locale)
             throws ValidationException
     {
         super.assertValidity(testValue);
@@ -112,11 +147,13 @@
 
         if (required || StringUtils.isNotEmpty(testValue))
         {
+            NumberFormat nf = NumberFormat.getInstance(locale);
+
             try
             {
-                d = Double.parseDouble(testValue);
+                d = nf.parse(testValue).doubleValue();
             }
-            catch (RuntimeException e)
+            catch (ParseException e)
             {
                 errorMessage = invalidNumberMessage;
                 throw new ValidationException(invalidNumberMessage);
@@ -127,6 +164,7 @@
                 errorMessage = minValueMessage;
                 throw new ValidationException(minValueMessage);
             }
+            
             if (d > maxValue)
             {
                 errorMessage = maxValueMessage;
@@ -179,4 +217,4 @@
     {
         this.maxValue = value;
     }
-}
+}
\ No newline at end of file

Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/FloatValidator.java
URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/FloatValidator.java?view=diff&rev=526565&r1=526564&r2=526565
==============================================================================
--- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/FloatValidator.java (original)
+++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/FloatValidator.java Sun Apr  8 07:51:21 2007
@@ -16,9 +16,13 @@
  * limitations under the License.
  */
 
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.util.Locale;
 import java.util.Map;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.turbine.services.intake.model.Field;
 
 /**
  * Validates Floats with the following constraints in addition to those
@@ -36,6 +40,8 @@
  *
  * @author <a href="mailto:jmcnally@collab.net">John McNally</a>
  * @author <a href="mailto:Colin.Chalmers@maxware.nl">Colin Chalmers</a>
+ * @author <a href="mailto:jh@byteaction.de">J&uuml;rgen Hoffmann</a>
+ * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
  * @version $Id$
  */
 public class FloatValidator
@@ -96,14 +102,43 @@
     }
 
     /**
+     * Determine whether a field meets the criteria specified
+     * in the constraints defined for this validator
+     *
+     * @param field a <code>Field</code> to be tested
+     * @exception ValidationException containing an error message if the
+     * testValue did not pass the validation tests.
+     */
+    public void assertValidity(Field field)
+            throws ValidationException
+    {
+        Locale locale = field.getLocale();
+        
+        if (field.isMultiValued())
+        {
+            String[] stringValues = (String[])field.getTestValue();
+            
+            for (int i = 0; i < stringValues.length; i++)
+            {
+                assertValidity(stringValues[i], locale);
+            }
+        }
+        else
+        {
+            assertValidity((String)field.getTestValue(), locale);
+        }
+    }
+    
+    /**
      * Determine whether a testValue meets the criteria specified
      * in the constraints defined for this validator
      *
      * @param testValue a <code>String</code> to be tested
+     * @param locale the Locale of the associated field
      * @exception ValidationException containing an error message if the
      * testValue did not pass the validation tests.
      */
-    public void assertValidity(String testValue)
+    public void assertValidity(String testValue, Locale locale)
             throws ValidationException
     {
         super.assertValidity(testValue);
@@ -111,11 +146,13 @@
         if (required || StringUtils.isNotEmpty(testValue))
         {
             float f = 0.0f;
+            NumberFormat nf = NumberFormat.getInstance(locale);
+
             try
             {
-                f = Float.parseFloat(testValue);
+                f = nf.parse(testValue).floatValue();
             }
-            catch (RuntimeException e)
+            catch (ParseException e)
             {
                 errorMessage = invalidNumberMessage;
                 throw new ValidationException(invalidNumberMessage);

Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/Validator.java
URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/Validator.java?view=diff&rev=526565&r1=526564&r2=526565
==============================================================================
--- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/Validator.java (original)
+++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/Validator.java Sun Apr  8 07:51:21 2007
@@ -1,5 +1,7 @@
 package org.apache.turbine.services.intake.validator;
 
+import org.apache.turbine.services.intake.model.Field;
+
 /*
  * Copyright 2001-2005 The Apache Software Foundation.
  *
@@ -20,6 +22,7 @@
  * Validator api.
  *
  * @author <a href="mailto:jmcnally@collab.net">John McNally</a>
+ * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
  * @version $Id$
  */
 public interface Validator
@@ -52,11 +55,33 @@
     String REQUIRED_RULE_NAME = "required";
 
     /**
+     * Determine whether a field meets the criteria specified
+     * in the constraints defined for this validator
+     *
+     * @param field a <code>Field</code> to be tested
+     * @return true if valid, false otherwise
+     */
+    boolean isValid(Field field);
+
+    /**
+     * Determine whether a field meets the criteria specified
+     * in the constraints defined for this validator
+     *
+     * @param field a <code>Field</code> to be tested
+     * @exception ValidationException containing an error message if the
+     * testValue did not pass the validation tests.
+     */
+    void assertValidity(Field field)
+            throws ValidationException;
+
+    /**
      * Determine whether a testValue meets the criteria specified
      * in the constraints defined for this validator
      *
      * @param testValue a <code>String</code> to be tested
      * @return true if valid, false otherwise
+     * 
+     * @deprecated use isValid(Field) instead
      */
     boolean isValid(String testValue);
 

Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/xmlmodel/XmlField.java
URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/xmlmodel/XmlField.java?view=diff&rev=526565&r1=526564&r2=526565
==============================================================================
--- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/xmlmodel/XmlField.java (original)
+++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/xmlmodel/XmlField.java Sun Apr  8 07:51:21 2007
@@ -37,6 +37,7 @@
  * @author <a href="mailto:jmcnally@collab.net">John McNally</a>
  * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
  * @author <a href="mailto:quintonm@bellsouth.net">Quinton McCombs</a>
+ * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
  * @version $Id$
  */
 public class XmlField
@@ -60,6 +61,7 @@
     private String defaultValue;
     private String emptyValue;
     private String displaySize;
+    private String fieldClass;
 
     /**
      * Default Constructor
@@ -99,6 +101,7 @@
         }
 
         setMapToProperty(attrib.getValue("mapToProperty"));
+        setFieldClass(attrib.getValue("fieldClass"));
         setValidator(attrib.getValue("validator"));
         setDefaultValue(attrib.getValue("defaultValue"));
         setEmptyValue(attrib.getValue("emptyValue"));
@@ -362,6 +365,26 @@
     public void setIfRequiredMessage(String v)
     {
         this.ifRequiredMessage = v;
+    }
+
+    /**
+     * Get the value of fieldClass.
+     *
+     * @return value of fieldClass.
+     */
+    public String getFieldClass()
+    {
+        return fieldClass;
+    }
+
+    /**
+     * Set the value of fieldClass.
+     *
+     * @param v  Value to assign to fieldClass.
+     */
+    public void setFieldClass(String v)
+    {
+        this.fieldClass = v;
     }
 
     /**



---------------------------------------------------------------------
To unsubscribe, e-mail: turbine-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: turbine-dev-help@jakarta.apache.org