List of usage examples for org.apache.commons.lang3.reflect TypeUtils isAssignable
private static boolean isAssignable(final Type type, final Class<?> toClass)
Checks if the subject type may be implicitly cast to the target class following the Java generics rules.
From source file:QuickTest.java
@Test public void testTyped() { final Typed stringList = new TypeLiteral<List<String>>() { };/*from w w w . j a v a 2 s . com*/ final Typed stringArrayList = new TypeLiteral<ArrayList<String>>() { }; log.info(String.format("stringList : %s", stringList)); log.info(String.format("stringList.getType() : %s", stringList.getType())); assertThat(TypeUtils.isAssignable(stringArrayList.getType(), stringList.getType()), is(true)); assertThat(TypeUtils.isAssignable(stringList.getType(), stringArrayList.getType()), is(false)); assertThat(TypeUtils.isAssignable(stringList.getType(), stringArrayList.getType()), is(false)); }
From source file:io.servicecomb.swagger.invocation.converter.ConverterMgr.java
protected Converter findAssignable(Type src, Type target) { if (TypeUtils.isAssignable(src, target)) { return same; } return null; }
From source file:org.apache.bval.jsr.AnnotationConstraintBuilder.java
/** build attributes, payload, groups from 'annotation' */ @Privileged// w w w .j ava 2 s . com private void buildFromAnnotation() { if (constraintValidation.getAnnotation() == null) { return; } final Class<? extends Annotation> annotationType = constraintValidation.getAnnotation().annotationType(); boolean foundPayload = false; boolean foundGroups = false; Method validationAppliesTo = null; boolean foundMessage = false; for (final Method method : AnnotationProxyBuilder.findMethods(annotationType)) { // groups + payload must also appear in attributes (also // checked by TCK-Tests) if (method.getParameterTypes().length == 0) { try { final String name = method.getName(); if (ConstraintAnnotationAttributes.PAYLOAD.getAttributeName().equals(name)) { buildPayload(method); foundPayload = true; } else if (ConstraintAnnotationAttributes.GROUPS.getAttributeName().equals(name)) { buildGroups(method); foundGroups = true; } else if (ConstraintAnnotationAttributes.VALIDATION_APPLIES_TO.getAttributeName() .equals(name)) { buildValidationAppliesTo(method); validationAppliesTo = method; } else if (name.startsWith("valid")) { throw new ConstraintDefinitionException( "constraints parameters can't start with valid: " + name); } else { if (ConstraintAnnotationAttributes.MESSAGE.getAttributeName().equals(name)) { foundMessage = true; if (!TypeUtils.isAssignable(method.getReturnType(), ConstraintAnnotationAttributes.MESSAGE.getType())) { throw new ConstraintDefinitionException("Return type for message() must be of type " + ConstraintAnnotationAttributes.MESSAGE.getType()); } } constraintValidation.getAttributes().put(name, method.invoke(constraintValidation.getAnnotation())); } } catch (final ConstraintDefinitionException cde) { throw cde; } catch (final Exception e) { // do nothing log.log(Level.WARNING, String.format("Error processing annotation: %s ", constraintValidation.getAnnotation()), e); } } } if (!foundMessage) { throw new ConstraintDefinitionException( "Annotation " + annotationType.getName() + " has no message method"); } if (!foundPayload) { throw new ConstraintDefinitionException( "Annotation " + annotationType.getName() + " has no payload method"); } if (!foundGroups) { throw new ConstraintDefinitionException( "Annotation " + annotationType.getName() + " has no groups method"); } if (validationAppliesTo != null && !ConstraintTarget.IMPLICIT.equals(validationAppliesTo.getDefaultValue())) { throw new ConstraintDefinitionException("validationAppliesTo default value should be IMPLICIT"); } // valid validationAppliesTo final Constraint annotation = annotationType.getAnnotation(Constraint.class); if (annotation == null) { return; } final Pair validationTarget = computeValidationTarget(annotation.validatedBy()); for (final Annotation a : annotationType.getAnnotations()) { final Class<? extends Annotation> aClass = a.annotationType(); if (aClass.getName().startsWith("java.lang.annotation.")) { continue; } final Constraint inheritedConstraint = aClass.getAnnotation(Constraint.class); if (inheritedConstraint != null && !aClass.getName().startsWith("javax.validation.constraints.")) { final Pair validationTargetInherited = computeValidationTarget(inheritedConstraint.validatedBy()); if ((validationTarget.a > 0 && validationTargetInherited.b > 0 && validationTarget.b == 0) || (validationTarget.b > 0 && validationTargetInherited.a > 0 && validationTarget.a == 0)) { throw new ConstraintDefinitionException("Parent and child constraint have different targets"); } } } }
From source file:org.apache.bval.jsr.AnnotationConstraintBuilder.java
private void buildValidationAppliesTo(final Method method) throws InvocationTargetException, IllegalAccessException { if (!TypeUtils.isAssignable(method.getReturnType(), ConstraintAnnotationAttributes.VALIDATION_APPLIES_TO.getType())) { throw new ConstraintDefinitionException("Return type for validationAppliesTo() must be of type " + ConstraintAnnotationAttributes.VALIDATION_APPLIES_TO.getType()); }/* w w w . j a va 2s .c o m*/ final Object validationAppliesTo = method.invoke(constraintValidation.getAnnotation()); if (!ConstraintTarget.class.isInstance(validationAppliesTo)) { throw new ConstraintDefinitionException( "validationAppliesTo type is " + ConstraintTarget.class.getName()); } constraintValidation.setValidationAppliesTo(ConstraintTarget.class.cast(validationAppliesTo)); }
From source file:org.apache.bval.jsr.AnnotationConstraintBuilder.java
private void buildGroups(final Method method) throws IllegalAccessException, InvocationTargetException { if (!TypeUtils.isAssignable(method.getReturnType(), ConstraintAnnotationAttributes.GROUPS.getType())) { throw new ConstraintDefinitionException( "Return type for groups() must be of type " + ConstraintAnnotationAttributes.GROUPS.getType()); }/* w ww .ja v a2 s . co m*/ final Object raw = method.invoke(constraintValidation.getAnnotation()); Class<?>[] garr; if (raw instanceof Class<?>) { garr = new Class[] { (Class<?>) raw }; } else if (raw instanceof Class<?>[]) { garr = (Class<?>[]) raw; if (Object[].class.cast(method.getDefaultValue()).length > 0) { throw new ConstraintDefinitionException("Default value for groups() must be an empty array"); } } else { garr = null; } if (ArrayUtils.isEmpty(garr)) { garr = GroupsComputer.DEFAULT_GROUP; } constraintValidation.setGroups(garr); }
From source file:org.apache.bval.jsr.AnnotationConstraintBuilder.java
@SuppressWarnings("unchecked") private void buildPayload(final Method method) throws IllegalAccessException, InvocationTargetException { if (!TypeUtils.isAssignable(method.getReturnType(), ConstraintAnnotationAttributes.PAYLOAD.getType())) { throw new ConstraintDefinitionException("Return type for payload() must be of type " + ConstraintAnnotationAttributes.PAYLOAD.getType()); }/*from w w w . j av a 2 s . c o m*/ if (Object[].class.cast(method.getDefaultValue()).length > 0) { throw new ConstraintDefinitionException("Default value for payload() must be an empty array"); } final Class<? extends Payload>[] payload_raw = (Class<? extends Payload>[]) method .invoke(constraintValidation.getAnnotation()); final Set<Class<? extends Payload>> payloadSet; if (payload_raw == null) { payloadSet = Collections.<Class<? extends Payload>>emptySet(); } else { payloadSet = new HashSet<Class<? extends Payload>>(payload_raw.length); Collections.addAll(payloadSet, payload_raw); } constraintValidation.setPayload(payloadSet); }
From source file:org.apache.bval.jsr.ClassValidator.java
/** * Implement {@link #validateProperty(Object, String, boolean, Class[])} } and * {@link #validateValue(Class, String, Object, boolean, Class...)}. * //from w ww .jav a2 s . co m * @param <T> * @param beanType * @param object * @param propertyName * @param value * @param cascade * @param groups * @return {@link ConstraintViolation} {@link Set} */ private <T> Set<ConstraintViolation<T>> validateValueImpl(Class<T> beanType, T object, String propertyName, Object value, final boolean cascade, Class<?>... groups) { assert (object == null) ^ (value == VALIDATE_PROPERTY); checkPropertyName(propertyName); checkGroups(groups); try { final MetaBean initialMetaBean = new DynamicMetaBean(metaBeanFinder); initialMetaBean.setBeanClass(beanType); GroupValidationContext<T> context = createContext(initialMetaBean, object, beanType, groups); ValidationContextTraversal contextTraversal = createValidationContextTraversal(context); PathNavigation.navigate(propertyName, contextTraversal); MetaProperty prop = context.getMetaProperty(); boolean fixed = false; if (value != VALIDATE_PROPERTY) { assert !context.getPropertyPath().isRootPath(); if (prop == null && value != null) { context.setMetaBean(metaBeanFinder.findForClass(value.getClass())); } if (!cascade) { //TCK doesn't care what type a property is if there are no constraints to validate: FeaturesCapable meta = prop == null ? context.getMetaBean() : prop; if (ArrayUtils.isEmpty(meta.getValidations())) { return Collections.<ConstraintViolation<T>>emptySet(); } } if (!TypeUtils.isAssignable(value == null ? null : value.getClass(), contextTraversal.getType())) { throw new IncompatiblePropertyValueException( String.format("%3$s is not a valid value for property %2$s of type %1$s", beanType, propertyName, value)); } if (prop == null) { context.setBean(value); } else { context.setFixedValue(value); fixed = true; } } boolean doCascade = cascade && (prop == null || prop.getMetaBean() != null); Object bean = context.getBean(); ConstraintValidationListener<T> result = context.getListener(); Groups sequence = context.getGroups(); // 1. process groups for (Group current : sequence.getGroups()) { context.setCurrentGroup(current); if (!doCascade || prop != null) { validatePropertyInGroup(context); } if (doCascade) { contextTraversal.moveDownIfNecessary(); if (context.getMetaBean() instanceof DynamicMetaBean) { context.setMetaBean(context.getMetaBean().resolveMetaBean( ObjectUtils.defaultIfNull(context.getBean(), contextTraversal.getRawType()))); } validateBeanNet(context); if (prop != null) { context.moveUp(bean, prop.getParentMetaBean()); context.setMetaProperty(prop); if (fixed) { context.setFixedValue(value); } } } } // 2. process sequences int groupViolations = result.getConstraintViolations().size(); outer: for (List<Group> eachSeq : sequence.getSequences()) { for (Group current : eachSeq) { context.setCurrentGroup(current); if (!doCascade || prop != null) { validatePropertyInGroup(context); } if (doCascade) { contextTraversal.moveDownIfNecessary(); if (context.getMetaBean() instanceof DynamicMetaBean) { context.setMetaBean(context.getMetaBean().resolveMetaBean( ObjectUtils.defaultIfNull(context.getBean(), contextTraversal.getRawType()))); } validateBeanNet(context); if (prop != null) { context.moveUp(bean, prop.getParentMetaBean()); context.setMetaProperty(prop); if (fixed) { context.setFixedValue(value); } } } /** * if one of the group process in the sequence leads to one or more validation failure, the groups * following in the sequence must not be processed */ if (result.getConstraintViolations().size() > groupViolations) break outer; } } return result.getConstraintViolations(); } catch (RuntimeException ex) { throw unrecoverableValidationError(ex, ObjectUtils.defaultIfNull(object, value)); } }
From source file:org.apache.bval.jsr.ConstraintValidation.java
private static void fillAssignableTypes(Type type, Set<Type> validatorsTypes, List<Type> suitableTypes) { for (final Type validatorType : validatorsTypes) { if (TypeUtils.isAssignable(type, validatorType) && !suitableTypes.contains(validatorType)) { suitableTypes.add(validatorType); }/*from w ww . ja v a 2s.c o m*/ } }
From source file:org.apache.bval.jsr.ConstraintValidation.java
/** * Tries to reduce all assignable classes down to a single class. * * @param assignableTypes The set of all classes which are assignable to the class of * the value to be validated and which are handled by at least * one of the validators for the specified constraint. *///www . j a v a 2 s .co m private static void reduceAssignableTypes(List<Type> assignableTypes) { if (assignableTypes.size() <= 1) { return; // no need to reduce } boolean removed = false; do { final Type type = assignableTypes.get(0); for (int i = 1; i < assignableTypes.size(); i++) { final Type nextType = assignableTypes.get(i); if (TypeUtils.isAssignable(nextType, type)) { assignableTypes.remove(0); i--; removed = true; } else if (TypeUtils.isAssignable(type, nextType)) { assignableTypes.remove(i--); removed = true; } } } while (removed && assignableTypes.size() > 1); }
From source file:org.apache.bval.util.IndexedAccess.java
/** * Get the Java element type of a particular container type. * /*w ww . java2 s . com*/ * @param containerType * @return Type or <code>null</code> if <code>containerType</code> is not * some type of {@link Iterable} or array */ public static Type getJavaElementType(Type containerType) { if (TypeUtils.isArrayType(containerType)) { return TypeUtils.getArrayComponentType(containerType); } if (TypeUtils.isAssignable(containerType, Iterable.class)) { Map<TypeVariable<?>, Type> typeArguments = TypeUtils.getTypeArguments(containerType, Iterable.class); return ObjectUtils.defaultIfNull(TypeUtils.unrollVariables(typeArguments, ITERABLE_TYPE), Object.class); } return null; }