blob: 107c3df0dbe96375184f19c9ad63402bf51f99c0 [file] [log] [blame]
/*
* 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.core.client.GWT;
import com.google.gwt.validation.client.impl.AbstractGwtValidator;
import com.google.gwt.validation.client.impl.GwtValidatorContext;
import javax.validation.ConstraintValidatorFactory;
import javax.validation.MessageInterpolator;
import javax.validation.TraversableResolver;
import javax.validation.Validator;
import javax.validation.ValidatorContext;
import javax.validation.ValidatorFactory;
import javax.validation.spi.ConfigurationState;
/**
* Abstract {@link ValidatorFactory} that delegates to a GWT generated
* {@link Validator}.
* <p>
* Extend this class create and implement createValidator
*
* <pre>
* public class MyValidatorFactory extends AbstractGwtValidatorFactory {
* @GwtValidation(value = {Pojo.class,Other.class})
* public static interface GwtValidator extends Validator {
* }
*
* public AbstractGwtValidator createValidator (){
* return GWT.create(GwtValidator.class));
* }
* }
* </pre>
* <p>
* Then add a line like this to your Gwt Module config (gwt.xml) file.
*
* <pre>
* &lt;replace-with class="com.example.MyValidatorFactory">
* &lt;when-type-is class="javax.validation.ValidatorFactory"/>
* &lt;/replace-with>
* </pre>
*/
public abstract class AbstractGwtValidatorFactory implements ValidatorFactory {
private ConstraintValidatorFactory constraintValidatorFactory;
private MessageInterpolator messageInterpolator;
private TraversableResolver traversableResolver;
/**
* Implement this method to return a {@link GWT#create}d {@link Validator}
* annotated with {@link GwtValidation}.
*
* @return newly created Validator
*/
public abstract AbstractGwtValidator createValidator();
/**
* GWT does not support {@link ConstraintValidatorFactory}, so the object returned by this method
* will not work.
*/
@Override
public final ConstraintValidatorFactory getConstraintValidatorFactory() {
return constraintValidatorFactory;
}
@Override
public final MessageInterpolator getMessageInterpolator() {
return messageInterpolator;
}
@Override
public final TraversableResolver getTraversableResolver() {
return traversableResolver;
}
@Override
public final Validator getValidator() {
AbstractGwtValidator validator = createValidator();
validator.init(getConstraintValidatorFactory(), getMessageInterpolator(),
getTraversableResolver());
return validator;
}
public final void init(ConfigurationState configState) {
ConstraintValidatorFactory configConstraintValidatorFactory =
configState.getConstraintValidatorFactory();
this.constraintValidatorFactory = configConstraintValidatorFactory != null ?
configConstraintValidatorFactory :
GWT.<ConstraintValidatorFactory>create(ConstraintValidatorFactory.class);
TraversableResolver configTraversableResolver = configState.getTraversableResolver();
this.traversableResolver = configTraversableResolver != null ?
configTraversableResolver : new DefaultTraversableResolver();
MessageInterpolator configMessageInterpolator = configState.getMessageInterpolator();
this.messageInterpolator = configMessageInterpolator != null ?
configMessageInterpolator : new GwtMessageInterpolator();
}
/**
* Unsupported. Always throws an {@link UnsupportedOperationException}.
*
* @throws UnsupportedOperationException
*/
@Override
public final <T> T unwrap(Class<T> type) {
throw new UnsupportedOperationException("GWT Validation does not support upwrap()");
}
@Override
public final ValidatorContext usingContext() {
return new GwtValidatorContext(this);
}
}