/* * 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("\\.", "_"); } }