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