Example usage for org.apache.commons.lang3.reflect TypeUtils isAssignable

List of usage examples for org.apache.commons.lang3.reflect TypeUtils isAssignable

Introduction

In this page you can find the example usage for org.apache.commons.lang3.reflect TypeUtils isAssignable.

Prototype

private static boolean isAssignable(final Type type, final Class<?> toClass) 

Source Link

Document

Checks if the subject type may be implicitly cast to the target class following the Java generics rules.

Usage

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;
}