Save the factory and options in the ValidatorContext
Add test for GwtValidatorContext.
Review at http://gwt-code-reviews.appspot.com/1523806

Review by: rchandia@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10578 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/validation/Validation.gwt.xml b/user/src/com/google/gwt/validation/Validation.gwt.xml
index 063a83e..82ad94d 100644
--- a/user/src/com/google/gwt/validation/Validation.gwt.xml
+++ b/user/src/com/google/gwt/validation/Validation.gwt.xml
@@ -40,9 +40,6 @@
     class="com.google.gwt.validation.client.GwtValidationProviderResolver">
     <when-type-is class="javax.validation.ValidationProviderResolver" />
   </replace-with>
-  <replace-with class="com.google.gwt.validation.client.GwtValidatorContext">
-    <when-type-is class="javax.validation.ValidatorContext" />
-  </replace-with>
   <replace-with class="com.google.gwt.validation.client.NullUserValidationMessageResolver">
     <!-- User can override this to have Custom messages -->
     <when-type-is class="com.google.gwt.validation.client.UserValidationMessagesResolver" />
diff --git a/user/src/com/google/gwt/validation/client/AbstractGwtValidatorFactory.java b/user/src/com/google/gwt/validation/client/AbstractGwtValidatorFactory.java
index 49907ec..acbc50d 100644
--- a/user/src/com/google/gwt/validation/client/AbstractGwtValidatorFactory.java
+++ b/user/src/com/google/gwt/validation/client/AbstractGwtValidatorFactory.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- *
+ * 
  * 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
@@ -56,24 +56,30 @@
  */
 public abstract class AbstractGwtValidatorFactory implements ValidatorFactory {
 
+  private final ConstraintValidatorFactory constraintValidatorFactory = GWT
+      .create(ConstraintValidatorFactory.class);
+  private final GwtMessageInterpolator messageInterpolator = new GwtMessageInterpolator();
+  private final TraversableResolver traversableResolver = GWT
+      .create(TraversableResolver.class);;
+
   /**
    * Implement this method to returns a {@link GWT#create}ed {@link Validator}
    * annotated with {@link GwtValidation}.
-   *
+   * 
    * @return newly created Validator
    */
   public abstract AbstractGwtValidator createValidator();
 
   public final ConstraintValidatorFactory getConstraintValidatorFactory() {
-    return GWT.create(ConstraintValidatorFactory.class);
+    return constraintValidatorFactory;
   }
 
   public final MessageInterpolator getMessageInterpolator() {
-    return new GwtMessageInterpolator();
+    return messageInterpolator;
   }
 
   public final TraversableResolver getTraversableResolver() {
-    return GWT.create(TraversableResolver.class);
+    return traversableResolver;
   }
 
   public final Validator getValidator() {
@@ -89,6 +95,6 @@
   }
 
   public final ValidatorContext usingContext() {
-    return GWT.create(ValidatorContext.class);
+    return new GwtValidatorContext(this);
   }
 }
diff --git a/user/src/com/google/gwt/validation/client/GwtValidatorContext.java b/user/src/com/google/gwt/validation/client/GwtValidatorContext.java
index 4f98419..993f89b 100644
--- a/user/src/com/google/gwt/validation/client/GwtValidatorContext.java
+++ b/user/src/com/google/gwt/validation/client/GwtValidatorContext.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- *
+ * 
  * 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
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.validation.client;
 
-import com.google.gwt.core.client.GWT;
 import com.google.gwt.validation.client.impl.AbstractGwtValidator;
 
 import javax.validation.ConstraintValidatorFactory;
@@ -23,7 +22,6 @@
 import javax.validation.TraversableResolver;
 import javax.validation.Validator;
 import javax.validation.ValidatorContext;
-import javax.validation.ValidatorFactory;
 
 /**
  * <strong>EXPERIMENTAL</strong> and subject to change. Do not use this in
@@ -31,20 +29,39 @@
  * <p>
  * GWT {@link ValidatorContext}.
  */
-public class GwtValidatorContext implements ValidatorContext {
+class GwtValidatorContext implements ValidatorContext {
 
-  private final AbstractGwtValidatorFactory validatorFactory = GWT.create(ValidatorFactory.class);
+  private final AbstractGwtValidatorFactory validatorFactory;
 
-  private ConstraintValidatorFactory constraintValidatorfactory = validatorFactory.getConstraintValidatorFactory();
-  private MessageInterpolator messageInterpolator = validatorFactory.getMessageInterpolator();
-  private TraversableResolver traversableResolver = validatorFactory.getTraversableResolver();
+  private final ConstraintValidatorFactory factoryConstraintValidatorfactory;
+  private final MessageInterpolator factoryMessageInterpolator;
+  private final TraversableResolver factoryTraversableResolver;
+
+  private ConstraintValidatorFactory constraintValidatorfactory = null;
+  private MessageInterpolator messageInterpolator = null;
+  private TraversableResolver traversableResolver = null;
+
+  GwtValidatorContext(AbstractGwtValidatorFactory validatorFactory) {
+    this.validatorFactory = validatorFactory;
+
+    factoryConstraintValidatorfactory = validatorFactory
+        .getConstraintValidatorFactory();
+    constraintValidatorfactory = validatorFactory
+        .getConstraintValidatorFactory();
+
+    factoryMessageInterpolator = validatorFactory.getMessageInterpolator();
+    messageInterpolator = validatorFactory.getMessageInterpolator();
+
+    factoryTraversableResolver = validatorFactory.getTraversableResolver();
+    traversableResolver = validatorFactory.getTraversableResolver();
+  }
 
   public ValidatorContext constraintValidatorFactory(
-      ConstraintValidatorFactory factory) {
-    if (factory == null) {
-      this.constraintValidatorfactory = GWT.create(ConstraintValidatorFactory.class);
+      ConstraintValidatorFactory constraintValidatorfactory) {
+    if (constraintValidatorfactory == null) {
+      this.constraintValidatorfactory = factoryConstraintValidatorfactory;
     } else {
-      this.constraintValidatorfactory = factory;
+      this.constraintValidatorfactory = constraintValidatorfactory;
     }
     return this;
   }
@@ -59,7 +76,7 @@
   public ValidatorContext messageInterpolator(
       MessageInterpolator messageInterpolator) {
     if (messageInterpolator == null) {
-      this.messageInterpolator = GWT.create(MessageInterpolator.class);
+      this.messageInterpolator = factoryMessageInterpolator;
     } else {
       this.messageInterpolator = messageInterpolator;
     }
@@ -69,11 +86,10 @@
   public ValidatorContext traversableResolver(
       TraversableResolver traversableResolver) {
     if (traversableResolver == null) {
-      this.traversableResolver = GWT.create(TraversableResolver.class);
+      this.traversableResolver = factoryTraversableResolver;
     } else {
       this.traversableResolver = traversableResolver;
     }
     return this;
   }
-
 }
diff --git a/user/src/com/google/gwt/validation/client/impl/AbstractGwtValidator.java b/user/src/com/google/gwt/validation/client/impl/AbstractGwtValidator.java
index bd35bfb..c49f8aa 100644
--- a/user/src/com/google/gwt/validation/client/impl/AbstractGwtValidator.java
+++ b/user/src/com/google/gwt/validation/client/impl/AbstractGwtValidator.java
@@ -37,7 +37,7 @@
 public abstract class AbstractGwtValidator implements Validator {
 
   private final Set<Class<?>> validGroups;
-  private ConstraintValidatorFactory factory;
+  private ConstraintValidatorFactory contraintValidatorFactory;
   private MessageInterpolator messageInterpolator;
   private TraversableResolver traversableResolver;
 
@@ -53,7 +53,7 @@
   public void init(ConstraintValidatorFactory factory,
       MessageInterpolator messageInterpolator,
       TraversableResolver traversableResolver) {
-    this.factory = factory;
+    this.contraintValidatorFactory = factory;
     this.messageInterpolator = messageInterpolator;
     this.traversableResolver = traversableResolver;
   }
@@ -82,8 +82,8 @@
     }
   }
 
-  protected ConstraintValidatorFactory getFactory() {
-    return factory;
+  protected ConstraintValidatorFactory getConstraintValidatorFactory() {
+    return contraintValidatorFactory;
   }
 
   protected MessageInterpolator getMessageInterpolator() {
diff --git a/user/test/com/google/gwt/validation/ValidationClientGwtSuite.java b/user/test/com/google/gwt/validation/ValidationClientGwtSuite.java
index a40bd79..4e6794f 100644
--- a/user/test/com/google/gwt/validation/ValidationClientGwtSuite.java
+++ b/user/test/com/google/gwt/validation/ValidationClientGwtSuite.java
@@ -17,6 +17,7 @@
 
 import com.google.gwt.junit.tools.GWTTestSuite;
 import com.google.gwt.validation.client.BaseMessageInterpolatorTest;
+import com.google.gwt.validation.client.GwtValidatorContextTest;
 import com.google.gwt.validation.client.SimpleSampleTest;
 
 import junit.framework.Test;
@@ -30,6 +31,7 @@
     GWTTestSuite suite = new GWTTestSuite(
         "Test suite for all validation code.");
     suite.addTestSuite(BaseMessageInterpolatorTest.class);
+    suite.addTestSuite(GwtValidatorContextTest.class);
     suite.addTestSuite(SimpleSampleTest.class);
     return suite;
   }
diff --git a/user/test/com/google/gwt/validation/client/GwtValidatorContextTest.java b/user/test/com/google/gwt/validation/client/GwtValidatorContextTest.java
new file mode 100644
index 0000000..25e1cae
--- /dev/null
+++ b/user/test/com/google/gwt/validation/client/GwtValidatorContextTest.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * 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.
+ */
+package com.google.gwt.validation.client;
+
+import com.google.gwt.validation.client.impl.AbstractGwtValidator;
+import com.google.gwt.validation.client.impl.GwtValidationContext;
+
+import java.util.Set;
+
+import javax.validation.ConstraintValidatorFactory;
+import javax.validation.ConstraintViolation;
+import javax.validation.MessageInterpolator;
+import javax.validation.TraversableResolver;
+import javax.validation.ValidationException;
+import javax.validation.ValidatorContext;
+import javax.validation.ValidatorFactory;
+import javax.validation.metadata.BeanDescriptor;
+
+/**
+ * Tests for {@link GwtValidatorContext}.
+ */
+public class GwtValidatorContextTest extends ValidationClientGwtTestCase {
+
+  private final class DummyGwtValidatorFactory extends
+      AbstractGwtValidatorFactory {
+    @Override
+    public AbstractGwtValidator createValidator() {
+      return new DummyValidator();
+    }
+  }
+
+  private static class DummyValidator extends AbstractGwtValidator {
+    @Override
+    public BeanDescriptor getConstraintsForClass(Class<?> clazz) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public <T> Set<ConstraintViolation<T>> validate(
+        GwtValidationContext<T> context, Object object, Class<?>... groups)
+        throws ValidationException {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public <T> Set<ConstraintViolation<T>> validate(T object,
+        Class<?>... groups) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public <T> Set<ConstraintViolation<T>> validateProperty(T object,
+        String propertyName, Class<?>... groups) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType,
+        String propertyName, Object value, Class<?>... groups) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected ConstraintValidatorFactory getConstraintValidatorFactory() {
+      return super.getConstraintValidatorFactory();
+    }
+
+    @Override
+    protected MessageInterpolator getMessageInterpolator() {
+      return super.getMessageInterpolator();
+    }
+
+    @Override
+    protected TraversableResolver getTraversableResolver() {
+      return super.getTraversableResolver();
+    }
+  }
+
+  private ValidatorFactory validatorFactory;
+  private ValidatorContext validatorContext;
+
+  public void testCustom() throws Exception {
+    final TraversableResolver traversableResolver = new GwtTraversableResolver();
+    final ConstraintValidatorFactory constraintValidatorFactory = new GwtConstraintValidatorFactory();
+    final MessageInterpolator messageInterpolator = new GwtMessageInterpolator();
+
+    validatorContext.constraintValidatorFactory(constraintValidatorFactory)
+        .messageInterpolator(messageInterpolator)
+        .traversableResolver(traversableResolver);
+
+    assertContext(traversableResolver, constraintValidatorFactory,
+        messageInterpolator);
+  }
+
+  public void testDefault() throws Exception {
+    assertContext(validatorFactory.getTraversableResolver(), //
+        validatorFactory.getConstraintValidatorFactory(), //
+        validatorFactory.getMessageInterpolator());
+  }
+
+  public void testNull() throws Exception {
+    validatorContext.constraintValidatorFactory(null) //
+        .messageInterpolator(null) //
+        .traversableResolver(null);
+
+    assertContext(validatorFactory.getTraversableResolver(), //
+        validatorFactory.getConstraintValidatorFactory(), //
+        validatorFactory.getMessageInterpolator());
+  }
+
+  public void testReset() throws Exception {
+    final TraversableResolver traversableResolver = new GwtTraversableResolver();
+    final ConstraintValidatorFactory constraintValidatorFactory = new GwtConstraintValidatorFactory();
+    final MessageInterpolator messageInterpolator = new GwtMessageInterpolator();
+
+    validatorContext.constraintValidatorFactory(constraintValidatorFactory)
+        .messageInterpolator(messageInterpolator)
+        .traversableResolver(traversableResolver);
+
+    validatorContext.constraintValidatorFactory(null) //
+        .messageInterpolator(null) //
+        .traversableResolver(null);
+
+    assertContext(validatorFactory.getTraversableResolver(), //
+        validatorFactory.getConstraintValidatorFactory(), //
+        validatorFactory.getMessageInterpolator());
+  }
+
+  @Override
+  protected void gwtSetUp() throws Exception {
+    super.gwtSetUp();
+    validatorFactory = new DummyGwtValidatorFactory();
+    validatorContext = validatorFactory.usingContext();
+  }
+
+  private void assertContext(final TraversableResolver traversableResolver,
+      final ConstraintValidatorFactory constraintValidatorFactory,
+      final MessageInterpolator messageInterpolator) {
+    final DummyValidator validator = getDummyValidatorFromContext();
+    assertSame(messageInterpolator, validator.getMessageInterpolator());
+    assertSame(constraintValidatorFactory,
+        validator.getConstraintValidatorFactory());
+    assertSame(traversableResolver, validator.getTraversableResolver());
+  }
+
+  private DummyValidator getDummyValidatorFromContext() {
+    return ((DummyValidator) validatorContext.getValidator());
+  }
+
+}