You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bval.apache.org by mb...@apache.org on 2014/12/16 01:19:10 UTC

svn commit: r1645798 - /bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java

Author: mbenson
Date: Tue Dec 16 00:19:09 2014
New Revision: 1645798

URL: http://svn.apache.org/r1645798
Log:
restore extensible means for code that manages CDI containers to force BVal to ignore certain types for executable validation

Modified:
    bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java

Modified: bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java
URL: http://svn.apache.org/viewvc/bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java?rev=1645798&r1=1645797&r2=1645798&view=diff
==============================================================================
--- bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java (original)
+++ bval/branches/bval-11/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java Tue Dec 16 00:19:09 2014
@@ -42,12 +42,13 @@ import javax.validation.executable.Valid
 import javax.validation.metadata.BeanDescriptor;
 import javax.validation.metadata.MethodType;
 
+import org.apache.commons.lang3.Validate;
+
 import java.lang.reflect.Modifier;
 import java.lang.reflect.Type;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
-import java.util.HashSet;
 import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -58,17 +59,21 @@ import java.util.logging.Logger;
 public class BValExtension implements Extension {
     private static final Logger LOGGER = Logger.getLogger(BValExtension.class.getName());
 
-    // extension point, we can add a SPI if needed, today mainly a fallback "API" for TomEE if we encounter an issue
-    public static final Set<String> SKIPPED_PREFIXES;
-    static {
-        final Set<String> s = new HashSet<String>();
-        s.add("java.");
-        s.add("javax.");
-        s.add("org.apache.bval.");
-        s.add("org.apache.openejb.");
-        s.add("org.apache.deltaspike."); // should be checked when upgrading
-        s.add("org.apache.myfaces."); // should be checked when upgrading
-        SKIPPED_PREFIXES = Collections.unmodifiableSet(s);
+    private static final AnnotatedTypeFilter DEFAULT_ANNOTATED_TYPE_FILTER = new AnnotatedTypeFilter() {
+        
+        @Override
+        public boolean accept(AnnotatedType<?> annotatedType) {
+            if (annotatedType.getJavaClass().getName().startsWith("org.apache.bval.")) {
+                return false;
+            }
+            return true;
+        }
+    };
+
+    private static AnnotatedTypeFilter annotatedTypeFilter = DEFAULT_ANNOTATED_TYPE_FILTER;
+
+    public static void setAnnotatedTypeFilter(AnnotatedTypeFilter annotatedTypeFilter) {
+        BValExtension.annotatedTypeFilter = Validate.notNull(annotatedTypeFilter);
     }
 
     private boolean validatorFound = Boolean.getBoolean("bval.in-container");
@@ -149,28 +154,19 @@ public class BValExtension implements Ex
         beforeBeanDiscovery.addAnnotatedType(beanManager.createAnnotatedType(BValInterceptor.class));
     }
 
-    protected boolean skip(final String name) {
-        for (final String p : SKIPPED_PREFIXES) {
-            if (name.startsWith(p)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     public <A> void processAnnotatedType(final @Observes ProcessAnnotatedType<A> pat) {
         if (!isExecutableValidationEnabled) {
             return;
         }
 
         final AnnotatedType<A> annotatedType = pat.getAnnotatedType();
-        final Class<A> javaClass = annotatedType.getJavaClass();
-        final int modifiers = javaClass.getModifiers();
-        final String name = javaClass.getName();
-        if (skip(name)) {
+
+        if (!annotatedTypeFilter.accept(annotatedType)) {
             return;
         }
 
+        final Class<A> javaClass = annotatedType.getJavaClass();
+        final int modifiers = javaClass.getModifiers();
         if (!javaClass.isInterface() && !Modifier.isFinal(modifiers) && !Modifier.isAbstract(modifiers)) {
             try {
                 ensureFactoryValidator();
@@ -327,4 +323,14 @@ public class BValExtension implements Ex
             return instance;
         }
     }
+
+    /**
+     * Defines an item that can determine whether a given {@link AnnotatedType} will be processed
+     * by the {@link BValExtension} for executable validation. May be statically applied before
+     * container startup.
+     * @see BValExtension#setAnnotatedTypeFilter(AnnotatedTypeFilter)
+     */
+    public interface AnnotatedTypeFilter {
+        boolean accept(AnnotatedType<?> annotatedType);
+    }
 }