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/05/12 22:56:17 UTC

svn commit: r537515 - in /jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake: model/Field.java model/Group.java validator/DateRangeValidator.java

Author: tv
Date: Sat May 12 13:56:17 2007
New Revision: 537515

URL: http://svn.apache.org/viewvc?view=rev&rev=537515
Log:
Added two examples for inter-field dependency validators to Intake

Added:
    jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/DateRangeValidator.java
Modified:
    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/Group.java

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=537515&r1=537514&r2=537515
==============================================================================
--- 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 Sat May 12 13:56:17 2007
@@ -131,6 +131,9 @@
     /** Has the field passed the validation test? */
     protected boolean validFlag;
 
+    /** Has the field been validated? */
+    protected boolean validated;
+
     /** Does the field require a value? */
     protected boolean required;
 
@@ -324,6 +327,7 @@
     {
         this.parser = pp;
         validFlag = true;
+        validated = false;
 
         // If the parser is for a HTTP request, use the request it's
         // associated with to grok the locale.
@@ -351,14 +355,14 @@
             {
                 setFlag = true;
             }
-            validate();
+            // validate();
         }
         else if (pp.containsKey(getValueIfAbsent()) &&
                 pp.getString(getValueIfAbsent()) != null)
         {
             pp.add(getKey(), pp.getString(getValueIfAbsent()));
             setFlag = true;
-            validate();
+            // validate();
         }
 
         initialized = true;
@@ -379,6 +383,7 @@
         if (!initialized)
         {
             validFlag = true;
+            validated = false;
         }
         retrievable = obj;
         return this;
@@ -494,6 +499,7 @@
         initialized = false;
         setFlag = false;
         validFlag = false;
+        validated = false;
         required = false;
         message = null;
         retrievable = null;
@@ -539,6 +545,16 @@
     }
 
     /**
+     * Flag to determine whether the field has been validated.
+     *
+     * @return value of validated.
+     */
+    public boolean isValidated()
+    {
+        return validated;
+    }
+
+    /**
      * Flag set to true, if the test value has been set to
      * anything other than an empty value.
      *
@@ -602,7 +618,7 @@
     /**
      * Compares request data with constraints and sets the valid flag.
      */
-    protected boolean validate()
+    public boolean validate()
     {
         log.debug(name + ": validate()");
 
@@ -615,7 +631,7 @@
                 log.debug(name + ": Multi-Valued");
                 for (int i = 0; i < stringValues.length; i++)
                 {
-                    log.debug(name + ": " + i + ". Wert: " + stringValues[i]);
+                    log.debug(name + ": " + i + ". Value: " + stringValues[i]);
                 }
             }
 
@@ -672,6 +688,8 @@
                 doSetValue();
             }
         }
+        
+        validated = true;
 
         return validFlag;
     }

Modified: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/Group.java
URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/Group.java?view=diff&rev=537515&r1=537514&r2=537515
==============================================================================
--- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/Group.java (original)
+++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/model/Group.java Sat May 12 13:56:17 2007
@@ -185,6 +185,13 @@
         {
             fieldsArray[i].init(pp);
         }
+        for (int i = fieldsArray.length - 1; i >= 0; i--)
+        {
+            if (fieldsArray[i].isSet() && !fieldsArray[i].isValidated())
+            {
+                fieldsArray[i].validate();
+            }
+        }
         return this;
     }
 

Added: jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/DateRangeValidator.java
URL: http://svn.apache.org/viewvc/jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/DateRangeValidator.java?view=auto&rev=537515
==============================================================================
--- jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/DateRangeValidator.java (added)
+++ jakarta/turbine/core/branches/TURBINE_2_3_BRANCH/src/java/org/apache/turbine/services/intake/validator/DateRangeValidator.java Sat May 12 13:56:17 2007
@@ -0,0 +1,243 @@
+package org.apache.turbine.services.intake.validator;
+
+/*
+ * 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.
+ */
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.turbine.services.intake.IntakeException;
+import org.apache.turbine.services.intake.model.Field;
+import org.apache.turbine.services.intake.model.Group;
+
+/**
+ * Validates a DateString field in dependency on another DateString field.
+ *
+ * <table>
+ * <tr>
+ *   <th>Name</th><th>Valid Values</th><th>Default Value</th>
+ * </tr>
+ * <tr>
+ *   <td>less-than</td>
+ *   <td>&lt;name of other field&gt;</td>
+ *   <td>&nbsp;</td>
+ * </tr>
+ * <tr>
+ *   <td>greater-than</td>
+ *   <td>&lt;name of other field&gt;</td>
+ *   <td>&nbsp;</td>
+ * </tr>
+ * <tr>
+ *   <td>less-than-or-equal</td>
+ *   <td>&lt;name of other field&gt;</td>
+ *   <td>&nbsp;</td>
+ * </tr>
+ * <tr>
+ *   <td>greater-than-or-equal</td>
+ *   <td>&lt;name of other field&gt;</td>
+ *   <td>&nbsp;</td>
+ * </tr>
+ * </table>
+ *
+ * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
+ * @version $Id: DateStringValidator.java 534527 2007-05-02 16:10:59Z tv $
+ */
+public class DateRangeValidator
+        extends DateStringValidator
+{
+    /** List of FieldReferences for multiple comparisons */
+    List fieldReferences; 
+
+    /** Callback for the actual compare operation */
+    CompareCallback compareCallback; 
+
+    public DateRangeValidator(final Map paramMap)
+            throws IntakeException
+    {
+        init(paramMap);
+    }
+
+    /**
+     *  Default constructor
+     */
+    public DateRangeValidator()
+    {
+        super();
+    }
+
+    /**
+     * Constructor to use when initialising Object
+     *
+     * @param paramMap
+     * @throws InvalidMaskException
+     */
+    public void init(final Map paramMap)
+            throws InvalidMaskException
+    {
+        super.init(paramMap);
+        
+        compareCallback = new CompareCallback()
+            {
+                /**
+                 * Compare the given values using the compare operation provided
+                 * 
+                 * @param compare type of compare operation
+                 * @param thisValue value of this field
+                 * @param refValue value of the reference field
+                 * 
+                 * @return the result of the comparison
+                 */
+                public boolean compareValues(int compare, Object thisValue, Object refValue)
+                    throws ClassCastException
+                {
+                    boolean result = true;
+                    
+                    Date thisDate = (Date)thisValue;
+                    Date otherDate = (Date)refValue;
+                    
+                    switch (compare)
+                    {
+                        case FieldReference.COMPARE_LT:
+                            result = thisDate.before(otherDate);
+                            break;
+                            
+                        case FieldReference.COMPARE_LTE:
+                            result = !thisDate.after(otherDate);
+                            break;
+                            
+                        case FieldReference.COMPARE_GT:
+                            result = thisDate.after(otherDate);
+                            break;
+                            
+                        case FieldReference.COMPARE_GTE:
+                            result = !thisDate.before(otherDate);
+                            break;
+                    }
+                    
+                    return result;
+                }
+            };
+        
+        fieldReferences = new ArrayList(10);
+
+        for (Iterator i = paramMap.entrySet().iterator(); i.hasNext();)
+        {
+            Map.Entry entry = (Map.Entry)i.next();
+            String key = (String)entry.getKey();
+            Constraint constraint = (Constraint)entry.getValue();
+
+            int compare = FieldReference.getCompareType(key);
+            
+            if (compare != 0)
+            {
+                // found matching constraint
+                FieldReference fieldref = new FieldReference();
+                fieldref.setCompare(compare);
+                fieldref.setFieldName(constraint.getValue());
+                fieldref.setMessage(constraint.getMessage());
+                
+                fieldReferences.add(fieldref);
+            }
+        }
+        
+        if (fieldReferences.isEmpty())
+        {
+            log.warn("No reference field rules have been found.");
+        }
+    }
+    
+    /**
+     * Determine whether a testValue meets the criteria specified
+     * in the constraints defined for this validator
+     *
+     * @param testField 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(final Field testField)
+        throws ValidationException
+    {
+        super.assertValidity(testField);
+        
+        Group thisGroup = testField.getGroup();
+
+        if (testField.isMultiValued())
+        {
+            String[] stringValues = (String[])testField.getTestValue();
+
+            for (int i = 0; i < stringValues.length; i++)
+            {
+                assertValidity(stringValues[i], thisGroup);
+            }
+        }
+        else
+        {
+            String testValue = (String)testField.getTestValue();
+        
+            assertValidity(testValue, thisGroup);
+        }
+    }
+
+    /**
+     * 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 group the group this field belongs to
+     * 
+     * @exception ValidationException containing an error message if the
+     * testValue did not pass the validation tests.
+     */
+    public void assertValidity(final String testValue, final Group group)
+        throws ValidationException
+    {
+        if (required || StringUtils.isNotEmpty(testValue))
+        {
+            Date testDate = null;
+            
+            try
+            {
+                testDate = parse(testValue);
+            }
+            catch (ParseException e)
+            {
+                // This should not happen because we succeded with this before, 
+                // but we need to catch the exception anyway
+                errorMessage = getDateFormatMessage();
+                throw new ValidationException(errorMessage);
+            }
+            
+            try
+            {
+                FieldReference.checkReferences(fieldReferences, compareCallback, 
+                        testDate, group);
+            }
+            catch (ValidationException e)
+            {
+                errorMessage = e.getMessage();
+                throw e;
+            }
+        }
+    }
+}



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