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