[weld-commits] Weld SVN: r4027 - in core/trunk/impl/src/main/java/org/jboss/weld: bean and 5 other directories.

weld-commits at lists.jboss.org weld-commits at lists.jboss.org
Wed Oct 14 03:26:33 EDT 2009


Author: marius.bogoevici
Date: 2009-10-14 03:26:33 -0400 (Wed, 14 Oct 2009)
New Revision: 4027

Modified:
   core/trunk/impl/src/main/java/org/jboss/weld/BeanManagerImpl.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractClassBean.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/InterceptorImpl.java
   core/trunk/impl/src/main/java/org/jboss/weld/bean/interceptor/ClassInterceptionHandlerFactory.java
   core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/AbstractBeanDeployer.java
   core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/BeanDeployer.java
   core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/InterceptorBindingModel.java
   core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java
   core/trunk/impl/src/main/java/org/jboss/weld/xml/BeansXmlParser.java
Log:
Fixing some interceptor functionality - structural validation, deployment error reporting.

Modified: core/trunk/impl/src/main/java/org/jboss/weld/BeanManagerImpl.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/BeanManagerImpl.java	2009-10-14 07:19:49 UTC (rev 4026)
+++ core/trunk/impl/src/main/java/org/jboss/weld/BeanManagerImpl.java	2009-10-14 07:26:33 UTC (rev 4027)
@@ -1055,6 +1055,17 @@
     */
    public List<Interceptor<?>> resolveInterceptors(InterceptionType type, Annotation... interceptorBindings)
    {
+      if (interceptorBindings.length == 0)
+         throw new IllegalArgumentException("Interceptor bindings list cannot be empty");
+      Set<Class<?>> uniqueInterceptorBindings = new HashSet<Class<?>>();
+      for (Annotation interceptorBinding: interceptorBindings)
+      {
+         if (uniqueInterceptorBindings.contains(interceptorBinding.annotationType()))
+            throw new IllegalArgumentException("Duplicate interceptor binding type: " + interceptorBinding.annotationType());
+         if (!isInterceptorBindingType(interceptorBinding.annotationType()))
+            throw new IllegalArgumentException("Trying to resolve interceptors with non-binding type: " + interceptorBinding.annotationType());
+         uniqueInterceptorBindings.add(interceptorBinding.annotationType());
+      }
       return new ArrayList<Interceptor<?>>(interceptorResolver.resolve(ResolvableFactory.of(type,interceptorBindings)));
    }
 
@@ -1280,7 +1291,7 @@
    {
       if (getServices().get(MetaAnnotationStore.class).getInterceptorBindingModel(bindingType).isValid())
       {
-         return getServices().get(MetaAnnotationStore.class).getInterceptorBindingModel(bindingType).getInheritedInterceptionBindingTypes();
+         return getServices().get(MetaAnnotationStore.class).getInterceptorBindingModel(bindingType).getMetaAnnotations();
       }
       else
       {

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractClassBean.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractClassBean.java	2009-10-14 07:19:49 UTC (rev 4026)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/AbstractClassBean.java	2009-10-14 07:26:33 UTC (rev 4027)
@@ -42,6 +42,7 @@
 import org.jboss.interceptor.model.InterceptionModelBuilder;
 import org.jboss.weld.BeanManagerImpl;
 import org.jboss.weld.DefinitionException;
+import org.jboss.weld.DeploymentException;
 import org.jboss.weld.bean.proxy.DecoratorProxyMethodHandler;
 import org.jboss.weld.bootstrap.BeanDeployerEnvironment;
 import org.jboss.weld.context.SerializableContextualInstance;
@@ -405,31 +406,40 @@
       return foundInterceptionBindingTypes;
    }
 
+
+
    protected void initInterceptors()
    {
       if (manager.getBoundInterceptorsRegistry().getInterceptionModel(getType()) == null)
       {
          InterceptionModelBuilder<Class<?>, SerializableContextual<Interceptor<?>, ?>> builder = InterceptionModelBuilder.newBuilderFor(getType(), (Class) SerializableContextual.class);
-
          Set<Annotation> classBindingAnnotations = flattenInterceptorBindings(manager, getAnnotatedItem().getAnnotations());
          for (Class<? extends Annotation> annotation : getStereotypes())
          {
             classBindingAnnotations.addAll(flattenInterceptorBindings(manager, manager.getStereotypeDefinition(annotation)));
          }
-
-         Annotation[] classBindingAnnotationsArray = classBindingAnnotations.toArray(new Annotation[0]);
-         builder.interceptPostConstruct().with(toSerializableContextualArray(manager.resolveInterceptors(InterceptionType.POST_CONSTRUCT, classBindingAnnotationsArray)));
-         builder.interceptPreDestroy().with(toSerializableContextualArray(manager.resolveInterceptors(InterceptionType.PRE_DESTROY, classBindingAnnotationsArray)));
-         builder.interceptPrePassivate().with(toSerializableContextualArray(manager.resolveInterceptors(InterceptionType.PRE_PASSIVATE, classBindingAnnotationsArray)));
-         builder.interceptPostActivate().with(toSerializableContextualArray(manager.resolveInterceptors(InterceptionType.POST_ACTIVATE, classBindingAnnotationsArray)));
-
+         if (classBindingAnnotations.size() > 0)
+         {
+            if (Beans.findInterceptorBindingConflicts(manager, classBindingAnnotations))
+               throw new DeploymentException("Conflicting interceptor bindings found on " + getType());
+            Annotation[] classBindingAnnotationsArray = classBindingAnnotations.toArray(new Annotation[0]);
+            builder.interceptPostConstruct().with(toSerializableContextualArray(manager.resolveInterceptors(InterceptionType.POST_CONSTRUCT, classBindingAnnotationsArray)));
+            builder.interceptPreDestroy().with(toSerializableContextualArray(manager.resolveInterceptors(InterceptionType.PRE_DESTROY, classBindingAnnotationsArray)));
+            builder.interceptPrePassivate().with(toSerializableContextualArray(manager.resolveInterceptors(InterceptionType.PRE_PASSIVATE, classBindingAnnotationsArray)));
+            builder.interceptPostActivate().with(toSerializableContextualArray(manager.resolveInterceptors(InterceptionType.POST_ACTIVATE, classBindingAnnotationsArray)));
+         }
          List<WeldMethod<?, ?>> businessMethods = Beans.getInterceptableBusinessMethods(getAnnotatedItem());
          for (WeldMethod<?, ?> method : businessMethods)
          {
-            List<Annotation> methodBindingAnnotations = new ArrayList<Annotation>(classBindingAnnotations);
+            Set<Annotation> methodBindingAnnotations = new HashSet<Annotation>(classBindingAnnotations);
             methodBindingAnnotations.addAll(flattenInterceptorBindings(manager, method.getAnnotations()));
-            List<Interceptor<?>> methodBoundInterceptors = manager.resolveInterceptors(InterceptionType.AROUND_INVOKE, methodBindingAnnotations.toArray(new Annotation[]{}));
-            builder.interceptAroundInvoke(((AnnotatedMethod) method).getJavaMember()).with(toSerializableContextualArray(methodBoundInterceptors));
+            if (methodBindingAnnotations.size() > 0)
+            {
+               if (Beans.findInterceptorBindingConflicts(manager, classBindingAnnotations))
+                  throw new DeploymentException("Conflicting interceptor bindings found on " + getType() + "." + method.getName() + "()");
+               List<Interceptor<?>> methodBoundInterceptors = manager.resolveInterceptors(InterceptionType.AROUND_INVOKE, methodBindingAnnotations.toArray(new Annotation[]{}));
+               builder.interceptAroundInvoke(((AnnotatedMethod) method).getJavaMember()).with(toSerializableContextualArray(methodBoundInterceptors));
+            }
          }
          manager.getBoundInterceptorsRegistry().registerInterceptionModel(getType(), builder.build());
       }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/InterceptorImpl.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/InterceptorImpl.java	2009-10-14 07:19:49 UTC (rev 4026)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/InterceptorImpl.java	2009-10-14 07:26:33 UTC (rev 4027)
@@ -19,6 +19,7 @@
 
 import java.lang.annotation.Annotation;
 import java.util.Set;
+import java.util.HashSet;
 
 import javax.enterprise.inject.spi.InterceptionType;
 import javax.enterprise.inject.spi.Interceptor;
@@ -28,6 +29,8 @@
 import org.jboss.interceptor.proxy.DirectClassInterceptionHandler;
 import org.jboss.interceptor.registry.InterceptorClassMetadataRegistry;
 import org.jboss.weld.BeanManagerImpl;
+import org.jboss.weld.DeploymentException;
+import org.jboss.weld.util.Beans;
 import org.jboss.weld.introspector.WeldClass;
 
 /**
@@ -43,7 +46,20 @@
    {
       super(type, new StringBuilder().append(Interceptor.class.getSimpleName()).append(BEAN_ID_SEPARATOR).append(type.getName()).toString(), manager);
       this.interceptorClassMetadata = InterceptorClassMetadataRegistry.getRegistry().getInterceptorClassMetadata(type.getJavaClass());
-      this.interceptorBindingTypes = flattenInterceptorBindings(manager, getAnnotatedItem().getAnnotations());
+      this.interceptorBindingTypes = new HashSet<Annotation>();
+      interceptorBindingTypes.addAll(flattenInterceptorBindings(manager, getAnnotatedItem().getAnnotations()));
+      for (Class<? extends Annotation> annotation : getStereotypes())
+      {
+         interceptorBindingTypes.addAll(flattenInterceptorBindings(manager, manager.getStereotypeDefinition(annotation)));
+      }
+      if (this.interceptorBindingTypes.size() == 0)
+      {
+         throw new DeploymentException("An interceptor must have at least one binding, but " + type.getName() + " has none");
+      }
+      if (Beans.findInterceptorBindingConflicts(manager, interceptorBindingTypes))
+      {
+         throw new DeploymentException("Conflicting interceptor bindings found on " + getType());
+      }
    }
 
    public static <T> InterceptorImpl<T> of(WeldClass<T> type, BeanManagerImpl manager)

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bean/interceptor/ClassInterceptionHandlerFactory.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bean/interceptor/ClassInterceptionHandlerFactory.java	2009-10-14 07:19:49 UTC (rev 4026)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bean/interceptor/ClassInterceptionHandlerFactory.java	2009-10-14 07:26:33 UTC (rev 4027)
@@ -17,6 +17,8 @@
 
 package org.jboss.weld.bean.interceptor;
 
+import java.lang.reflect.Constructor;
+
 import javax.enterprise.context.spi.CreationalContext;
 
 import org.jboss.interceptor.proxy.InterceptionHandlerFactory;
@@ -24,6 +26,7 @@
 import org.jboss.interceptor.proxy.DirectClassInterceptionHandler;
 import org.jboss.weld.BeanManagerImpl;
 import org.jboss.weld.DeploymentException;
+import org.jboss.weld.util.Reflections;
 
 /**
  * @author Marius Bogoevici
@@ -44,7 +47,9 @@
       try
       {
          // this is not a managed instance - assume no-argument constructor exists
-         Object interceptorInstance = clazz.newInstance();
+         Constructor constructor = clazz.getDeclaredConstructor();
+         Reflections.ensureAccessible(constructor);
+         Object interceptorInstance = constructor.newInstance();
          // inject
          manager.createInjectionTarget(manager.createAnnotatedType(clazz)).inject(interceptorInstance, creationalContext);
          return new DirectClassInterceptionHandler(interceptorInstance, clazz);

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/AbstractBeanDeployer.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/AbstractBeanDeployer.java	2009-10-14 07:19:49 UTC (rev 4026)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/AbstractBeanDeployer.java	2009-10-14 07:26:33 UTC (rev 4027)
@@ -23,6 +23,7 @@
 import javax.enterprise.inject.Disposes;
 import javax.enterprise.inject.Produces;
 import javax.inject.Inject;
+import javax.interceptor.Interceptor;
 
 import org.jboss.weld.BeanManagerImpl;
 import org.jboss.weld.bean.AbstractClassBean;

Modified: core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/BeanDeployer.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/BeanDeployer.java	2009-10-14 07:19:49 UTC (rev 4026)
+++ core/trunk/impl/src/main/java/org/jboss/weld/bootstrap/BeanDeployer.java	2009-10-14 07:26:33 UTC (rev 4027)
@@ -25,6 +25,7 @@
 
 import org.jboss.weld.BeanManagerImpl;
 import org.jboss.weld.Container;
+import org.jboss.weld.DeploymentException;
 import org.jboss.weld.bootstrap.events.ProcessAnnotatedTypeImpl;
 import org.jboss.weld.ejb.EjbDescriptors;
 import org.jboss.weld.ejb.InternalEjbDescriptor;
@@ -98,10 +99,12 @@
          boolean managedBeanOrDecorator = !getEnvironment().getEjbDescriptors().contains(clazz.getJavaClass()) && isTypeManagedBeanOrDecorator(clazz);
          if (managedBeanOrDecorator && clazz.isAnnotationPresent(Decorator.class))
          {
+            validateDecorator(clazz);
             createDecorator(clazz);
          }
          else if (managedBeanOrDecorator && clazz.isAnnotationPresent(Interceptor.class))
          {
+            validateInterceptor(clazz);
             createInterceptor(clazz);
          }
          else if (managedBeanOrDecorator && !clazz.isAbstract())
@@ -116,4 +119,20 @@
       return this;
    }
 
+   private void validateInterceptor(WeldClass<?> clazz)
+   {
+      if (clazz.isAnnotationPresent(Decorator.class))
+      {
+         throw new DeploymentException("Class " + clazz.getName() + " has both @Interceptor and @Decorator annotations");
+      }
+   }
+
+   private void validateDecorator(WeldClass<?> clazz)
+   {
+      if (clazz.isAnnotationPresent(Interceptor.class))
+      {
+         throw new DeploymentException("Class " + clazz.getName() + " has both @Interceptor and @Decorator annotations");
+      }
+   }
+
 }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/InterceptorBindingModel.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/InterceptorBindingModel.java	2009-10-14 07:19:49 UTC (rev 4026)
+++ core/trunk/impl/src/main/java/org/jboss/weld/metadata/cache/InterceptorBindingModel.java	2009-10-14 07:26:33 UTC (rev 4027)
@@ -75,11 +75,16 @@
 
    public boolean isEqual(Annotation instance, Annotation other)
    {
+       return isEqual(instance, other, false);
+   }
+
+   public boolean isEqual(Annotation instance, Annotation other, boolean includeNonBindingTypes)
+   {
       if (instance.annotationType().equals(getRawType()) && other.annotationType().equals(getRawType()))
       {
          for (WeldMethod<?, ?> annotatedMethod : getAnnotatedAnnotation().getMembers())
          {
-            if (!nonBindingTypes.contains(annotatedMethod))
+            if (includeNonBindingTypes || !nonBindingTypes.contains(annotatedMethod))
             {
                try
                {

Modified: core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java	2009-10-14 07:19:49 UTC (rev 4026)
+++ core/trunk/impl/src/main/java/org/jboss/weld/util/Beans.java	2009-10-14 07:26:33 UTC (rev 4027)
@@ -232,8 +232,6 @@
       {
          int modifiers = ((WeldMember) annotatedMethod).getJavaMember().getModifiers();
          boolean businessMethod = !annotatedMethod.isStatic()
-               && (Modifier.isPublic(modifiers)
-                  || Modifier.isProtected(modifiers))
                && !annotatedMethod.isAnnotationPresent(Inject.class);
 
          if (businessMethod)
@@ -479,6 +477,27 @@
       }
       return true;
    }
+
+   public static boolean findInterceptorBindingConflicts(BeanManagerImpl manager, Set<Annotation> bindings)
+   {
+      Map<Class<? extends Annotation>, Annotation> foundAnnotations = new HashMap<Class<? extends Annotation>, Annotation>();
+      for (Annotation binding: bindings)
+      {
+         if (foundAnnotations.containsKey(binding.annotationType()))
+         {
+            InterceptorBindingModel<?> bindingType = manager.getServices().get(MetaAnnotationStore.class).getInterceptorBindingModel(binding.annotationType());
+            if (!bindingType.isEqual(binding, foundAnnotations.get(binding.annotationType()), false))
+            {
+                return true;
+            }
+         }
+         else
+         {
+            foundAnnotations.put(binding.annotationType(), binding);
+         }
+      }
+      return false;      
+   }
    
 
    /**
@@ -719,5 +738,5 @@
    {
       return annotatedItem.isAnnotationPresent(Decorator.class);
    }
-   
+
 }

Modified: core/trunk/impl/src/main/java/org/jboss/weld/xml/BeansXmlParser.java
===================================================================
--- core/trunk/impl/src/main/java/org/jboss/weld/xml/BeansXmlParser.java	2009-10-14 07:19:49 UTC (rev 4026)
+++ core/trunk/impl/src/main/java/org/jboss/weld/xml/BeansXmlParser.java	2009-10-14 07:26:33 UTC (rev 4027)
@@ -28,6 +28,7 @@
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
+import javax.interceptor.Interceptor;
 
 import org.jboss.weld.DeploymentException;
 import org.jboss.weld.resources.spi.ResourceLoader;
@@ -203,7 +204,7 @@
       else if (interceptorsElements.size() == 1)
       {
          enabledInterceptorClasses = new ArrayList<Class<?>>();
-         enabledInterceptorClasses.addAll(processElement(resourceLoader, interceptorsElements.get(0)));
+         enabledInterceptorClasses.addAll(processInterceptorElement(resourceLoader, interceptorsElements.get(0)));
       }
       
    }
@@ -268,5 +269,39 @@
       }
       return list;
    }
+
+   private static List<Class<?>> processInterceptorElement(ResourceLoader resourceLoader, XmlElement element)
+   {
+      List<Class<?>> list = new ArrayList<Class<?>>();
+      for (Node child : new NodeListIterable(element.getElement().getChildNodes()))
+      {
+         String className = processNode(child);
+         if (className != null)
+         {
+            try
+            {
+               Class<?> clazz = resourceLoader.classForName(className);
+               if (!clazz.isAnnotationPresent(Interceptor.class))
+               {
+                   throw new DeploymentException("Class " + clazz.getName() + " is enabled as an interceptor," +
+                        " but it does not have the appropriate annotation");
+               }
+               else if (list.contains(clazz))
+               {
+                   throw new DeploymentException("Class " + clazz.getName() + " is listed twice as an enabled interceptor");
+               }
+               else
+               {
+                  list.add(clazz);
+               }
+            }
+            catch (ResourceLoadingException e)
+            {
+               throw new DeploymentException("Cannot load class " + className + " defined in " + element.getFile().toString());
+            }
+         }
+      }
+      return list;
+   }
    
 }



More information about the weld-commits mailing list