You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2014/09/15 05:34:47 UTC
[6/8] git commit: Drop unnecessary type param and improve type safety.
Drop unnecessary type param and improve type safety.
- Performs some reflection on generics to verify the ConstraintValidator defined for a constraint annotation is appropriate for said annotation.
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/cf43135d
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/cf43135d
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/cf43135d
Branch: refs/heads/master
Commit: cf43135deef25c6a6329cf6ceba14ee343c64169
Parents: dee7e9a
Author: Matt Sicker <ma...@apache.org>
Authored: Sun Sep 14 22:30:30 2014 -0500
Committer: Matt Sicker <ma...@apache.org>
Committed: Sun Sep 14 22:30:30 2014 -0500
----------------------------------------------------------------------
.../validation/ConstraintValidators.java | 51 ++++++++++++--------
1 file changed, 30 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/cf43135d/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
index 028f708..2429634 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
@@ -17,11 +17,12 @@
package org.apache.logging.log4j.core.config.plugins.validation;
import java.lang.annotation.Annotation;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.core.util.ReflectionUtil;
/**
* Utility class to locate an appropriate {@link ConstraintValidator} implementation for an annotation.
@@ -30,8 +31,6 @@ import org.apache.logging.log4j.status.StatusLogger;
*/
public final class ConstraintValidators {
- private static final Logger LOGGER = StatusLogger.getLogger();
-
private ConstraintValidators() {
}
@@ -42,14 +41,13 @@ public final class ConstraintValidators {
* @param annotations the annotations to find constraint validators for
* @return a collection of ConstraintValidators for the given annotations
*/
- public static Collection<ConstraintValidator<Annotation, Object>> findValidators(
- final Annotation... annotations) {
- final Collection<ConstraintValidator<Annotation, Object>> validators =
- new ArrayList<ConstraintValidator<Annotation, Object>>();
+ public static Collection<ConstraintValidator<?>> findValidators(final Annotation... annotations) {
+ final Collection<ConstraintValidator<?>> validators =
+ new ArrayList<ConstraintValidator<?>>();
for (final Annotation annotation : annotations) {
- final Constraint constraint = annotation.annotationType().getAnnotation(Constraint.class);
- if (constraint != null) {
- final ConstraintValidator<Annotation, Object> validator = getValidatorFor(annotation, constraint);
+ final Class<? extends Annotation> type = annotation.annotationType();
+ if (type.isAnnotationPresent(Constraint.class)) {
+ final ConstraintValidator<?> validator = getValidator(annotation, type);
if (validator != null) {
validators.add(validator);
}
@@ -58,18 +56,29 @@ public final class ConstraintValidators {
return validators;
}
- private static ConstraintValidator<Annotation, Object> getValidatorFor(final Annotation annotation,
- final Constraint constraint) {
- try {
- // TODO: may want to cache these validator instances
- @SuppressWarnings("unchecked")
- final ConstraintValidator<Annotation, Object> validator =
- (ConstraintValidator<Annotation, Object>) constraint.value().newInstance();
+ private static <A extends Annotation> ConstraintValidator<A> getValidator(final A annotation,
+ final Class<? extends A> type) {
+ final Constraint constraint = type.getAnnotation(Constraint.class);
+ final Class<? extends ConstraintValidator<?>> validatorClass = constraint.value();
+ if (type.equals(getConstraintValidatorAnnotationType(validatorClass))) {
+ @SuppressWarnings("unchecked") // I don't think we could be any more thorough in validation here
+ final ConstraintValidator<A> validator = (ConstraintValidator<A>)
+ ReflectionUtil.instantiate(validatorClass);
validator.initialize(annotation);
return validator;
- } catch (final Exception e) {
- LOGGER.error("Error loading ConstraintValidator [{}].", constraint.value(), e);
- return null;
}
+ return null;
+ }
+
+ private static Type getConstraintValidatorAnnotationType(final Class<? extends ConstraintValidator<?>> type) {
+ for (final Type parentType : type.getGenericInterfaces()) {
+ if (parentType instanceof ParameterizedType) {
+ final ParameterizedType parameterizedType = (ParameterizedType) parentType;
+ if (ConstraintValidator.class.equals(parameterizedType.getRawType())) {
+ return parameterizedType.getActualTypeArguments()[0];
+ }
+ }
+ }
+ return Void.TYPE;
}
}