Revision: 9865
Author:   gwt.mirror...@gmail.com
Date:     Fri Mar 18 07:52:29 2011
Log:      Add Support for @ReportAsSingleViolation.

[JSR 303 TCK Result] 119 of 257 (46.30%) Pass with 12 Failures and 8 Errors.

Review at http://gwt-code-reviews.appspot.com/1388801

Review by: rchan...@google.com
http://code.google.com/p/google-web-toolkit/source/detail?r=9865

Modified:
/trunk/user/src/com/google/gwt/validation/client/impl/AbstractGwtSpecificValidator.java /trunk/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java /trunk/user/test/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/ConstraintCompositionGwtTest.java /trunk/user/test/org/hibernate/jsr303/tck/tests/validation/ValidateGwtTest.java

=======================================
--- /trunk/user/src/com/google/gwt/validation/client/impl/AbstractGwtSpecificValidator.java Mon Dec 20 11:43:41 2010 +++ /trunk/user/src/com/google/gwt/validation/client/impl/AbstractGwtSpecificValidator.java Fri Mar 18 07:52:29 2011
@@ -65,7 +65,24 @@
     return new AttributeBuilder();
   }

-  protected <A extends Annotation, T, V> void validate(
+  protected <V, T, A extends Annotation> void addSingleViolation(
+ GwtValidationContext<T> context, Set<ConstraintViolation<T>> violations, + G object, V value, ConstraintDescriptorImpl<A> constraintDescriptor) {
+    ConstraintValidatorContextImpl<A, V> constraintValidatorContext =
+      context.createConstraintValidatorContext(constraintDescriptor);
+    addViolations(context, violations, object, value, constraintDescriptor,
+        constraintValidatorContext);
+  }
+
+  /**
+   * Perform the actual validation of a single {@link ConstraintValidator}.
+   * <p>
+   * As a side effect {@link ConstraintViolation}s may be added to
+   * {@code violations}.
+   *
+   * @return true if there was any constraint violations
+   */
+  protected <A extends Annotation, T, V> boolean validate(
GwtValidationContext<T> context, Set<ConstraintViolation<T>> violations,
       G object, V value, ConstraintValidator<A, ? super V> validator,
ConstraintDescriptorImpl<A> constraintDescriptor, Class<?>[] groups) {
@@ -85,7 +102,7 @@

     // check group
     if (!containsAny(groups, constraintGroup)) {
-      return;
+      return false;
     }

     if (!validator.isValid(value, constraintValidatorContext)) {
@@ -96,7 +113,9 @@
           value, //
           constraintDescriptor, //
           constraintValidatorContext);
-    }
+      return true;
+    }
+    return false;
   }

   private <V, T, A extends Annotation> void addViolations(
=======================================
--- /trunk/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java Thu Mar 10 05:54:28 2011 +++ /trunk/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java Fri Mar 18 07:52:29 2011
@@ -80,15 +80,16 @@
  * This class is not thread safe.
  */
 public class GwtSpecificValidatorCreator extends AbstractCreator {
-
   private static enum Stage {
     OBJECT, PROPERTY, VALUE
   }
-
-  private static final Annotation[] NO_ANNOTATIONS = new Annotation[]{};

   static final JType[] NO_ARGS = new JType[]{};

+  private static final String DEFAULT_VIOLATION_VAR = "violations";
+
+  private static final Annotation[] NO_ANNOTATIONS = new Annotation[]{};
+
   private static Function<java.beans.PropertyDescriptor, String>
       PROPERTY_DESCRIPTOR_TO_NAME =
           new Function<java.beans.PropertyDescriptor, String>() {
@@ -845,12 +846,18 @@
   }

   private void writeNewViolations(SourceWriter sw) {
+    writeNewViolations(sw, DEFAULT_VIOLATION_VAR);
+  }
+
+  private void writeNewViolations(SourceWriter sw, String violationName) {
     // Set<ConstraintViolation<T>> violations =
-    // new HashSet<ConstraintViolation<T>>();
-    sw.println("Set<ConstraintViolation<T>> violations = ");
+    sw.print("Set<ConstraintViolation<T>> ");
+    sw.print(violationName);
+    sw.println(" = ");
     sw.indent();
     sw.indent();

+    // new HashSet<ConstraintViolation<T>>();
     sw.println("new HashSet<ConstraintViolation<T>>();");
     sw.outdent();
     sw.outdent();
@@ -999,8 +1006,52 @@
private void writeValidateConstraint(SourceWriter sw, PropertyDescriptor p,
       Class<?> elementClass, ConstraintDescriptor<?> constraint,
       String constraintDescriptorVar) throws UnableToCompleteException {
-    if (!constraint.getConstraintValidatorClasses().isEmpty()) {
-
+    writeValidateConstraint(sw, p, elementClass, constraint,
+        constraintDescriptorVar, DEFAULT_VIOLATION_VAR);
+  }
+
+  /**
+ * Writes the call to actually validate a constraint, including its composite
+   * constraints.
+   * <p>
+   * If the constraint is annotated as
+ * {@link javax.validation.ReportAsSingleViolation ReportAsSingleViolation},
+   * then is called recursively and the {@code violationsVar} is changed to
+   * match the the {@code constraintDescriptorVar}.
+   *
+   * @param sw the Source Writer
+   * @param p the property
+   * @param elementClass The class of the Element
+   * @param constraint the constraint to validate.
+   * @param constraintDescriptorVar the name of the constraintDescriptor
+   *          variable.
+   * @param violationsVar the name of the variable to hold violations
+   * @throws UnableToCompleteException
+   */
+ private void writeValidateConstraint(SourceWriter sw, PropertyDescriptor p,
+      Class<?> elementClass, ConstraintDescriptor<?> constraint,
+      String constraintDescriptorVar, String violationsVar)
+      throws UnableToCompleteException {
+    boolean isComposite = !constraint.getComposingConstraints().isEmpty();
+    boolean firstReportAsSingleViolation =
+        constraint.isReportAsSingleViolation()
+        && violationsVar.equals(DEFAULT_VIOLATION_VAR) && isComposite;
+    boolean reportAsSingleViolation = firstReportAsSingleViolation
+        || !violationsVar.equals(DEFAULT_VIOLATION_VAR);
+    boolean hasValidator = !constraint.getConstraintValidatorClasses()
+        .isEmpty();
+ String compositeViolationsVar = constraintDescriptorVar + "_violations";
+
+    // Only do this the first time in a constraint composition.
+    if (firstReportAsSingleViolation) {
+      // Report myConstraint as Single Violation
+      sw.print("// Report ");
+ sw.print(constraint.getAnnotation().annotationType().getCanonicalName());
+      sw.println(" as Single Violation");
+      writeNewViolations(sw, compositeViolationsVar);
+    }
+
+    if (hasValidator) {
Class<? extends ConstraintValidator<? extends Annotation, ?>> validatorClass;
       try {
         validatorClass = getValidatorForType(constraint, elementClass);
@@ -1008,25 +1059,87 @@
         throw error(logger, e);
       }

-      // validate(myContext, violations, object, value, new MyValidator(),
-      // constraintDescriptor, groups);
-      sw.print("validate(myContext, violations, object, value, ");
+      if (firstReportAsSingleViolation) {
+        // if (!
+        sw.println("if (!");
+        sw.indent();
+        sw.indent();
+      }
+
+      // validate(myContext, violations object, value, new MyValidator(),
+      // constraintDescriptor, groups));
+      sw.print("validate(myContext, ");
+      sw.print(violationsVar);
+      sw.print(", object, value, ");
       sw.print("new "); // TODO(nchalko) use ConstraintValidatorFactory
       sw.print(validatorClass.getCanonicalName());
       sw.print("(), ");
       sw.print(constraintDescriptorVar);
-      sw.println(", groups);");
-    } else if (constraint.getComposingConstraints().isEmpty()) {
-        // TODO(nchalko) What does the spec say to do here.
-        logger.log(Type.WARN, "No ConstraintValidator of " + constraint
-            + " for " + p.getPropertyName() + " of type " + elementClass);
-    }
-    // TODO(nchalko) handle constraint.isReportAsSingleViolation()
+      sw.print(", groups)");
+      if (firstReportAsSingleViolation) {
+        // ) {
+        sw.println(") {");
+        sw.outdent();
+
+      } else if (!reportAsSingleViolation) {
+        // ;
+        sw.println(";");
+      } else if (isComposite) {
+        // ||
+        sw.println(" ||");
+      }
+    } else if (!isComposite) {
+      // TODO(nchalko) What does the spec say to do here.
+ logger.log(Type.WARN, "No ConstraintValidator of " + constraint + " for "
+          + p.getPropertyName() + " of type " + elementClass);
+    }
+
+    if (firstReportAsSingleViolation) {
+      // if (
+      sw.print("if (");
+      sw.indent();
+      sw.indent();
+    }
     int count = 0;
- for (ConstraintDescriptor<?> compositeConstraint : constraint.getComposingConstraints()) {
+
+    for (ConstraintDescriptor<?> compositeConstraint : constraint
+        .getComposingConstraints()) {
       String compositeVar = constraintDescriptorVar + "_" + count++;
       writeValidateConstraint(sw, p, elementClass, compositeConstraint,
-          compositeVar);
+ compositeVar, firstReportAsSingleViolation ? compositeViolationsVar
+              : violationsVar);
+      if (!reportAsSingleViolation) {
+        // ;
+        sw.println(";");
+      } else {
+        // ||
+        sw.println(" ||");
+      }
+    }
+    if (isComposite && reportAsSingleViolation) {
+      // false
+      sw.print("false");
+    }
+    if (firstReportAsSingleViolation) {
+      // ) {
+      sw.println(" ) {");
+      sw.outdent();
+
+      // addSingleViolation(myContext, violations, object, value,
+      // constraintDescriptor);
+ sw.print("addSingleViolation(myContext, violations, object, value, ");
+      sw.print(constraintDescriptorVar);
+      sw.println(");");
+
+      // }
+      sw.outdent();
+      sw.println("}");
+
+      if (hasValidator) {
+        // }
+        sw.outdent();
+        sw.println("}");
+      }
     }
   }

=======================================
--- /trunk/user/test/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/ConstraintCompositionGwtTest.java Tue Mar 15 04:56:41 2011 +++ /trunk/user/test/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/ConstraintCompositionGwtTest.java Fri Mar 18 07:52:29 2011
@@ -17,8 +17,6 @@

 import com.google.gwt.junit.client.GWTTestCase;

-import org.hibernate.jsr303.tck.util.client.Failing;
-
 /**
  * Wraps {@link ConstraintCompositionTest}.
  */
@@ -51,7 +49,6 @@
     delegate.testGroupsDefinedOnMainAnnotationAreInherited();
   }

-  @Failing(issue = 5799)
   public void testOnlySingleConstraintViolation() {
     delegate.testOnlySingleConstraintViolation();
   }
=======================================
--- /trunk/user/test/org/hibernate/jsr303/tck/tests/validation/ValidateGwtTest.java Thu Mar 10 05:54:28 2011 +++ /trunk/user/test/org/hibernate/jsr303/tck/tests/validation/ValidateGwtTest.java Fri Mar 18 07:52:29 2011
@@ -44,7 +44,6 @@
     delegate.testGraphValidationWithList();
   }

-  @Failing(issue = 5930)
   public void testMultipleConstraintViolationOfDifferentTypes() {
     delegate.testMultipleConstraintViolationOfDifferentTypes();
   }

--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to