blob: 23b6ff2cd0a1b35f9e8377062333886046e23135 [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.rebind;
import com.google.gwt.core.ext.typeinfo.JArrayType;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JField;
import com.google.gwt.core.ext.typeinfo.JParameterizedType;
import com.google.gwt.core.ext.typeinfo.JRawType;
import com.google.gwt.core.ext.typeinfo.JType;
import com.google.gwt.core.ext.typeinfo.NotFoundException;
import com.google.gwt.thirdparty.guava.common.base.Function;
import javax.validation.metadata.BeanDescriptor;
import javax.validation.metadata.PropertyDescriptor;
/**
* A simple struct for the various values associated with a Bean that can be
* validated.
*/
public final class BeanHelper {
public static final Function<BeanHelper, Class<?>> TO_CLAZZ =
new Function<BeanHelper, Class<?>>() {
@Override
public Class<?> apply(BeanHelper helper) {
return helper.getClazz();
}
};
private final BeanDescriptor beanDescriptor;
private final JClassType jClass;
private final Class<?> clazz;
/**
* Shouldn't be created directly; instead use BeanHelperCache.
*/
BeanHelper(JClassType jClass, Class<?> clazz, BeanDescriptor beanDescriptor) {
this.beanDescriptor = beanDescriptor;
this.jClass = jClass;
this.clazz = clazz;
}
public JClassType getAssociationType(PropertyDescriptor p, boolean useField) {
JType type = this.getElementType(p, useField);
JArrayType jArray = type.isArray();
if (jArray != null) {
return jArray.getComponentType().isClassOrInterface();
}
JParameterizedType pType = type.isParameterized();
JClassType[] typeArgs;
if (pType == null) {
JRawType rType = type.isRawType();
typeArgs = rType.getGenericType().getTypeParameters();
} else {
typeArgs = pType.getTypeArgs();
}
// it is either a Iterable or a Map use the last type arg.
return typeArgs[typeArgs.length - 1].isClassOrInterface();
}
public BeanDescriptor getBeanDescriptor() {
return beanDescriptor;
}
/*
* The server-side validator needs an actual class.
*/
public Class<?> getClazz() {
return clazz;
}
public String getFullyQualifiedValidatorName() {
return getPackage() + "." + getValidatorName();
}
public JClassType getJClass() {
return jClass;
}
public String getPackage() {
return jClass.getPackage().getName();
}
public String getTypeCanonicalName() {
return jClass.getQualifiedSourceName();
}
public String getValidatorInstanceName() {
return getFullyQualifiedValidatorName() + ".INSTANCE";
}
public String getValidatorName() {
return makeJavaSafe("_" + jClass.getName() + "Validator");
}
@Override
public String toString() {
return getTypeCanonicalName();
}
JType getElementType(PropertyDescriptor p, boolean useField) {
if (useField) {
return jClass.findField(p.getPropertyName()).getType();
} else {
return jClass.findMethod(GwtSpecificValidatorCreator.asGetter(p),
GwtSpecificValidatorCreator.NO_ARGS).getReturnType();
}
}
boolean hasField(PropertyDescriptor p) {
JField field = jClass.findField(p.getPropertyName());
return field != null;
}
boolean hasGetter(PropertyDescriptor p) {
JType[] paramTypes = new JType[]{};
try {
jClass.getMethod(GwtSpecificValidatorCreator.asGetter(p), paramTypes);
return true;
} catch (NotFoundException e) {
return false;
}
}
private String makeJavaSafe(String in) {
return in.replaceAll("\\.", "_");
}
}