[jboss-cvs] JBossAS SVN: r102876 - in projects/metadata/ejb/trunk: src/main/java/org/jboss/metadata/annotation/creator/ejb and 9 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Mar 24 09:16:46 EDT 2010


Author: jaikiran
Date: 2010-03-24 09:16:44 -0400 (Wed, 24 Mar 2010)
New Revision: 102876

Added:
   projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/InterceptorComponentProcessor.java
   projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/InterceptorMetaDataCreator.java
   projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/
   projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/
   projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/
   projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/BeanWithInterceptors.java
   projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorA.java
   projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorB.java
   projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorC.java
   projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorD.java
   projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorWithInjectedEJB.java
   projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorWithManyInjections.java
   projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/NoOpBean.java
   projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/SimpleInterceptorWithoutAnyInjections.java
   projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/unit/
   projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/unit/InterceptorsCreatorTestCase.java
   projects/metadata/ejb/trunk/src/test/resources/org/jboss/metadata/ejb/test/interceptor/
   projects/metadata/ejb/trunk/src/test/resources/org/jboss/metadata/ejb/test/interceptor/ejb-jar-interceptors.xml
   projects/metadata/ejb/trunk/src/test/resources/org/jboss/metadata/ejb/test/interceptor/partial-dd-ejb-jar.xml
Modified:
   projects/metadata/ejb/trunk/pom.xml
   projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/ejb/jboss/JBossMetaData.java
   projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/ejb/spec/EjbJarMetaData.java
   projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/ejb/spec/InterceptorMetaData.java
   projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/ejb/spec/InterceptorsMetaData.java
Log:
JBMETA-273 Added support for creating metadata out of annotation on interceptor classes

Modified: projects/metadata/ejb/trunk/pom.xml
===================================================================
--- projects/metadata/ejb/trunk/pom.xml	2010-03-24 12:53:19 UTC (rev 102875)
+++ projects/metadata/ejb/trunk/pom.xml	2010-03-24 13:16:44 UTC (rev 102876)
@@ -147,13 +147,13 @@
     <dependency>
       <groupId>org.jboss.metadata</groupId>
       <artifactId>jboss-metadata-common</artifactId>
-      <version>2.0.0.Alpha14</version>
+      <version>2.0.0-SNAPSHOT</version>
     </dependency>
 
     <dependency>
       <groupId>org.jboss.metadata</groupId>
       <artifactId>jboss-metadata-common</artifactId>
-      <version>2.0.0.Alpha14</version>
+      <version>2.0.0-SNAPSHOT</version>
       <type>test-jar</type>
       <scope>test</scope>
     </dependency>

Added: projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/InterceptorComponentProcessor.java
===================================================================
--- projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/InterceptorComponentProcessor.java	                        (rev 0)
+++ projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/InterceptorComponentProcessor.java	2010-03-24 13:16:44 UTC (rev 102876)
@@ -0,0 +1,114 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.metadata.annotation.creator.ejb;
+
+import java.lang.reflect.AnnotatedElement;
+
+import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.jboss.AbstractComponentProcessor;
+import org.jboss.metadata.annotation.finder.AnnotationFinder;
+import org.jboss.metadata.ejb.spec.InterceptorMetaData;
+import org.jboss.metadata.ejb.spec.InterceptorsMetaData;
+import org.jboss.metadata.javaee.spec.EnvironmentRefsGroupMetaData;
+import org.jboss.metadata.javaee.spec.PersistenceContextReferencesMetaData;
+
+/**
+ * An implementation of {@link Processor} which is responsible for
+ * processing annotations which are applicable for interceptor classes.
+ * This {@link InterceptorComponentProcessor} sets up the {@link InterceptorsMetaData}
+ *  during the annotation processing
+ *  
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class InterceptorComponentProcessor<MD extends InterceptorsMetaData> extends AbstractComponentProcessor<MD>
+      implements
+         Processor<MD, Class<?>>
+{
+
+   /**
+    * @param finder
+    */
+   public InterceptorComponentProcessor(AnnotationFinder<AnnotatedElement> finder)
+   {
+      super(finder);
+
+      // TODO: We need similar processors for InterceptorMetaData (the following currently
+      // work with JBossSessionBeanMetaData)
+      //      this.addMethodProcessor(new AroundInvokeProcessor(finder));
+      //
+      //      this.addMethodProcessor(new PostActivateMethodProcessor(finder));
+      //      this.addMethodProcessor(new PrePassivateMethodProcessor(finder));
+
+   }
+
+   /**
+    * Process the passed <code>interceptorClass</code> for annotations and 
+    * creates {@link InterceptorMetaData} for that class
+    * 
+    * @param interceptorClass The interceptor class being processed for annotations
+    * @param interceptors {@link InterceptorsMetaData} which will be updated with
+    *               appropriate {@link InterceptorMetaData} while processing the interceptor class
+    */
+   @Override
+   public void process(MD interceptors, Class<?> interceptorClass)
+   {
+      // create an empty interceptor metadata for the interceptor class 
+      InterceptorMetaData interceptor = this.createInterceptorMetaData(interceptorClass);
+      // add it to the interceptors metadata
+      interceptors.add(interceptor);
+
+      // Now, time to process the interceptor class for the EnvironmentRefsGroupMetadata
+      // which includes AnnotatedEjbReferences, PersistenceUnit references, @Resource references
+      // etc...
+      EnvironmentRefsGroupMetaData environmentRefsGroup = interceptor.getJndiEnvironmentRefsGroup();
+      if (environmentRefsGroup == null)
+      {
+         environmentRefsGroup = new EnvironmentRefsGroupMetaData();
+         interceptor.setJndiEnvironmentRefsGroup(environmentRefsGroup);
+      }
+      // process
+      super.process(environmentRefsGroup, interceptorClass);
+
+      // process @PersistenceContext
+      PersistenceContextReferencesMetaData pcRefs = interceptor.getPersistenceContextRefs();
+      if (pcRefs == null)
+      {
+         pcRefs = new PersistenceContextReferencesMetaData();
+         environmentRefsGroup.setPersistenceContextRefs(pcRefs);
+      }
+      processClass(pcRefs, interceptorClass);
+   }
+
+   /**
+    * Creates a {@link InterceptorMetaData} for the passed <code>interceptorClass</code>
+    * @param interceptorClass
+    * @return
+    */
+   private InterceptorMetaData createInterceptorMetaData(Class<?> interceptorClass)
+   {
+      InterceptorMetaData interceptor = new InterceptorMetaData();
+      interceptor.setInterceptorClass(interceptorClass.getName());
+
+      return interceptor;
+   }
+}

Added: projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/InterceptorMetaDataCreator.java
===================================================================
--- projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/InterceptorMetaDataCreator.java	                        (rev 0)
+++ projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/InterceptorMetaDataCreator.java	2010-03-24 13:16:44 UTC (rev 102876)
@@ -0,0 +1,93 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.metadata.annotation.creator.ejb;
+
+import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
+
+import org.jboss.metadata.annotation.creator.AbstractCreator;
+import org.jboss.metadata.annotation.creator.Creator;
+import org.jboss.metadata.annotation.finder.AnnotationFinder;
+import org.jboss.metadata.ejb.spec.InterceptorsMetaData;
+
+/**
+ * An implementation of {@link Creator} which is responsible for creating 
+ * {@link InterceptorsMetaData} from annotated classes
+ *<p>
+ *  This {@link InterceptorMetaDataCreator} passes the classes through a 
+ *  series of annotation processors to create the {@link InterceptorsMetaData}
+ *</p>
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class InterceptorMetaDataCreator extends AbstractCreator<InterceptorsMetaData>
+      implements
+         Creator<Collection<Class<?>>, InterceptorsMetaData>
+{
+
+   /**
+    * {@inheritDoc}
+    * @param finder
+    */
+   public InterceptorMetaDataCreator(AnnotationFinder<AnnotatedElement> finder)
+   {
+      super(finder);
+
+      // add a InterceptorComponentProcessor which is responsible for processing
+      // (with the help of type/method/field annotaiton processors) annotations
+      // on the interceptor classes
+      this.addProcessor(new InterceptorComponentProcessor<InterceptorsMetaData>(finder));
+   }
+
+   /**
+    * Returns {@link InterceptorsMetaData} after processing the <code>interceptorClasses</code>
+    * 
+    * @param interceptorClasses The interceptor classes which are to be processed for
+    * annotations
+    * @see org.jboss.metadata.annotation.creator.AbstractCreator#create(java.util.Collection)
+    */
+   @Override
+   public InterceptorsMetaData create(Collection<Class<?>> interceptorClasses)
+   {
+      InterceptorsMetaData interceptorsMetaData = new InterceptorsMetaData();
+      if (interceptorClasses == null)
+      {
+         return interceptorsMetaData;
+      }
+      // process the interceptor classes for annotations
+      this.processMetaData(interceptorClasses, interceptorsMetaData);
+
+      // return the metadata populated after processing the interceptor classes
+      return interceptorsMetaData;
+   }
+
+   /**
+    * @see org.jboss.metadata.annotation.creator.AbstractCreator#validateClass(java.lang.Class)
+    */
+   @Override
+   protected boolean validateClass(Class<?> clazz)
+   {
+      // TODO: Hmm, what really is this method? Not much info available about this method
+      return true;
+   }
+
+}

Modified: projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/ejb/jboss/JBossMetaData.java
===================================================================
--- projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/ejb/jboss/JBossMetaData.java	2010-03-24 12:53:19 UTC (rev 102875)
+++ projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/ejb/jboss/JBossMetaData.java	2010-03-24 13:16:44 UTC (rev 102876)
@@ -21,10 +21,13 @@
 */
 package org.jboss.metadata.ejb.jboss;
 
+import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
+import javax.interceptor.Interceptors;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlTransient;
@@ -33,9 +36,15 @@
 import org.jboss.metadata.common.ejb.IEjbJarMetaData;
 import org.jboss.metadata.common.jboss.LoaderRepositoryMetaData;
 import org.jboss.metadata.ejb.jboss.jndipolicy.spi.DeploymentSummary;
+import org.jboss.metadata.ejb.spec.AroundInvokeMetaData;
+import org.jboss.metadata.ejb.spec.AroundInvokesMetaData;
 import org.jboss.metadata.ejb.spec.EjbJar3xMetaData;
 import org.jboss.metadata.ejb.spec.EjbJarMetaData;
 import org.jboss.metadata.ejb.spec.EnterpriseBeansMetaData;
+import org.jboss.metadata.ejb.spec.InterceptorBindingMetaData;
+import org.jboss.metadata.ejb.spec.InterceptorBindingsMetaData;
+import org.jboss.metadata.ejb.spec.InterceptorClassesMetaData;
+import org.jboss.metadata.ejb.spec.InterceptorMetaData;
 import org.jboss.metadata.ejb.spec.InterceptorsMetaData;
 import org.jboss.metadata.ejb.spec.RelationsMetaData;
 import org.jboss.metadata.ejb.spec.SecurityIdentityMetaData;
@@ -181,6 +190,15 @@
       return interceptors;
    }
    
+   public void setInterceptors(InterceptorsMetaData interceptors)
+   {
+      if (interceptors == null)
+      {
+         throw new IllegalArgumentException("Cannot set null InterceptorsMetaData");
+      }
+      this.interceptors = interceptors;
+   }
+   
    /**
     * Get the jboss.xml version.
     * 
@@ -1009,4 +1027,253 @@
    {
       return null;
    }
+   
+   /**
+    * Returns the {@link InterceptorsMetaData} which are applicable for the <code>beanName</code>
+    * in the <code>jbossMetaData</code>
+    * <p>
+    *   An interceptor is considered as bound to an EJB if there's atleast one interceptor
+    *   binding between the EJB and the interceptor class. The interceptor binding can either
+    *   be through the use of <interceptor-binding> element in ejb-jar.xml or through the
+    *   use of {@link Interceptors} annotation(s) in the EJB class. 
+    * </p>
+    * <p>
+    *   If the EJB has an around-invoke element which uses class name other than the EJB class name,
+    *   then even that class is considered as an interceptor class and is considered to be bound to
+    *   the EJB.
+    * </p>
+    * <p>
+    *   For example:
+    *   <session>
+    *       <ejb-name>Dummy</ejb-name>
+    *       <ejb-class>org.myapp.ejb.MyBean</ejb-class>
+    *       <around-invoke>
+    *           <class>org.myapp.SomeClass</class>
+    *           <method-name>blah</method-name>
+    *       </around-invoke>
+    *   </session>
+    *   
+    *   The <code>org.myapp.SomeClass</code> will be considered as a interceptor class bound to the EJB, 
+    *   <code>org.myapp.ejb.MyBean</code>, even if there is no explicit interceptor binding between that EJB
+    *   and the <code>org.myapp.SomeClass</code>
+    * </p>
+    * 
+    * @param beanName The EJB name
+    * @param jbossMetaData The {@link JBossMetaData} corresponding to the <code>beanName</code>
+    * @return
+    * @throws NullPointerException If either of <code>beanName</code> or <code>jbossMetaData</code>
+    *               is null
+    */
+   public static InterceptorsMetaData getInterceptors(String beanName, JBossMetaData jbossMetaData)
+   {
+      InterceptorsMetaData beanApplicableInterceptors = new InterceptorsMetaData();
+      if (jbossMetaData.getAssemblyDescriptor() == null)
+      {
+         return beanApplicableInterceptors;
+      }
+      InterceptorBindingsMetaData allInterceptorBindings = jbossMetaData.getAssemblyDescriptor()
+            .getInterceptorBindings();
+      if (allInterceptorBindings == null)
+      {
+         return beanApplicableInterceptors;
+      }
+      InterceptorsMetaData allInterceptors = jbossMetaData.getInterceptors();
+      if (allInterceptors == null || allInterceptors.isEmpty())
+      {
+         return beanApplicableInterceptors;
+      }
+      return getInterceptors(beanName, allInterceptors, allInterceptorBindings);
+   }
+
+   
+   /**
+    * Returns all interceptor classes which are present in the passed <code>jbossMetaData</code>.
+    * <p>
+    *   A class is considered an interceptor class, if it is listed in either of the following:
+    *   <ul>
+    *       <li>In the <interceptor> element of ejb-jar.xml</li>
+    *       <li>In the <interceptor-binding> element of ejb-jar.xml</li>
+    *       <li>In the <class> sub-element of <around-invoke> element in the ejb-jar.xml</li>
+    *       <li>Marked as an interceptor class through the use of {@link Interceptors} annotation
+    *           in a bean class</li>
+    *   </ul>
+    * </p>
+    * @param jbossMetaData The {@link JBossMetaData} which will scanned for interceptor classes
+    * @return
+    * 
+    */
+   public static Collection<String> getAllInterceptorClasses(JBossMetaData jbossMetaData) 
+   {
+      Collection<String> allInterceptorClassNames = new HashSet<String>();
+
+      // process <interceptors>
+      InterceptorsMetaData interceptorsMetadata = jbossMetaData.getInterceptors();
+      if (interceptorsMetadata != null)
+      {
+         for (InterceptorMetaData interceptor : interceptorsMetadata)
+         {
+            if (interceptor.getInterceptorClass() != null)
+            {
+               allInterceptorClassNames.add(interceptor.getInterceptorClass());
+            }
+         }
+      }
+      // process <interceptor-bindings> (a.k.a @Interceptors)
+      JBossAssemblyDescriptorMetaData assemblyDescriptor = jbossMetaData.getAssemblyDescriptor();
+      if (assemblyDescriptor != null)
+      {
+         InterceptorBindingsMetaData interceptorBindings = assemblyDescriptor.getInterceptorBindings();
+         if (interceptorBindings != null)
+         {
+            for (InterceptorBindingMetaData interceptorBinding : interceptorBindings)
+            {
+               if (interceptorBinding != null)
+               {
+                  InterceptorClassesMetaData interceptorClasses = interceptorBinding.getInterceptorClasses();
+                  if (interceptorClasses != null)
+                  {
+                     for (String interceptorClass : interceptorClasses)
+                     {
+                        allInterceptorClassNames.add(interceptorClass);
+                     }
+   
+                  }
+               }
+            }
+         }
+      }
+      // process around-invoke
+      JBossEnterpriseBeansMetaData enterpriseBeans = jbossMetaData.getEnterpriseBeans();
+      if (enterpriseBeans != null)
+      {
+         for (JBossEnterpriseBeanMetaData enterpriseBean : enterpriseBeans)
+         {
+            String enterpriseBeanClassName = enterpriseBean.getEjbClass();
+            AroundInvokesMetaData aroundInvokes = null;
+            if (enterpriseBean.isSession())
+            {
+               JBossSessionBeanMetaData sessionBean = (JBossSessionBeanMetaData) enterpriseBean;
+               aroundInvokes = sessionBean.getAroundInvokes();
+            }
+            else if (enterpriseBean.isMessageDriven())
+            {
+               JBossMessageDrivenBeanMetaData messageDrivenBean = (JBossMessageDrivenBeanMetaData) enterpriseBean;
+               aroundInvokes = messageDrivenBean.getAroundInvokes();
+            }
+
+            if (aroundInvokes == null || aroundInvokes.isEmpty())
+            {
+               continue;
+            }
+
+            for (AroundInvokeMetaData aroundInvoke : aroundInvokes)
+            {
+               String targetClass = aroundInvoke.getClassName();
+               if (targetClass == null)
+               {
+                  continue;
+               }
+               // if the target class name is not the class name of the EJB,
+               // then as per the xsd, it is considered an interceptor class
+               if (targetClass.equals(enterpriseBeanClassName) == false)
+               {
+                  // it's an interceptor class
+                  allInterceptorClassNames.add(targetClass);
+               }
+            }
+         }
+      }
+      // return the interceptor class names
+      return allInterceptorClassNames;
+   }
+
+   /**
+    * Utility method which, given a bean name, all interceptors available in a deployment
+    * and the all the interceptor binding information, will return only those interceptors
+    * which are applicable to the EJB corresponding to the bean name
+    * 
+    * @param ejbName Name of the EJB
+    * @param allInterceptors {@link InterceptorsMetaData} of all interceptors
+    * @param allInterceptorBindings {@link InterceptorBindingsMetaData} of all interceptor bindings
+    * @return
+    */
+   private static InterceptorsMetaData getInterceptors(String ejbName, InterceptorsMetaData allInterceptors,
+         InterceptorBindingsMetaData allInterceptorBindings)
+   {
+      InterceptorsMetaData beanApplicableInterceptors = new InterceptorsMetaData();
+      // the default interceptors (ejbname = *) will be 
+      // considered as *not* applicable for a bean, if *all* the interceptor
+      // bindings for that bean, have set the exclude-default-interceptors to true
+      boolean includeDefaultInterceptors = false;
+      InterceptorsMetaData defaultInterceptors = new InterceptorsMetaData();
+      for (InterceptorBindingMetaData binding : allInterceptorBindings)
+      {
+         // the interceptor binding corresponds to the bean we are interested in
+         if (ejbName != null && ejbName.equals(binding.getEjbName()))
+         {
+            // atleast one interceptor binding on the bean, is interested
+            // in the default interceptors (ejbname = *). So set the flag to include the default
+            // interceptors in the list of applicable interceptors
+            if (binding.isExcludeDefaultInterceptors() == false)
+            {
+               includeDefaultInterceptors = true;
+            }
+            InterceptorClassesMetaData interceptorClasses = binding.getInterceptorClasses();
+            // interceptor binding has no classes, so move on to the next interceptor binding
+            if (interceptorClasses == null || interceptorClasses.isEmpty())
+            {
+               continue;
+            }
+            for (String interceptorClass : interceptorClasses)
+            {
+               // get the corresponding interceptor metadata for the interceptor class
+               InterceptorMetaData interceptorMetaData = allInterceptors.get(interceptorClass);
+               // TODO: the interceptor metadata for a interceptor class will only be
+               // null, if the metadata isn't fully populated/processed. Let's not thrown
+               // any errors and just ignore such cases for now
+               if (interceptorMetaData != null)
+               {
+                  // include this interceptor metadata as applicable for the bean
+                  beanApplicableInterceptors.add(interceptorMetaData);
+               }
+            }
+         }
+         else if (binding.getEjbName().equals("*")) // binding for default interceptors
+         {
+            InterceptorClassesMetaData interceptorClasses = binding.getInterceptorClasses();
+            // no interceptor class, so skip to next interceptor binding
+            if (interceptorClasses == null || interceptorClasses.isEmpty())
+            {
+               continue;
+            }
+            for (String interceptorClass : interceptorClasses)
+            {
+               InterceptorMetaData interceptorMetaData = allInterceptors.get(interceptorClass);
+               // TODO: the interceptor metadata for a interceptor class will only be
+               // null, if the metadata isn't fully populated/processed. Let's not thrown
+               // any errors and just ignore such cases for now
+               if (interceptorMetaData != null)
+               {
+                  // add the interceptor metadata to the set of default interceptors.
+                  // Whether or not these default interceptors are applicable for 
+                  // the bean being processed, will be decide later
+                  defaultInterceptors.add(interceptorMetaData);
+               }
+            }
+         }
+      }
+      // if the default interceptors (ejb name= *) are to be included 
+      // for this bean.
+      // the default interceptors (ejbname = *) will be 
+      // considered as *not* applicable for a bean, if *all* the interceptor
+      // bindings for that bean, have set the exclude-default-interceptors to true
+      if (includeDefaultInterceptors)
+      {
+         beanApplicableInterceptors.addAll(defaultInterceptors);
+      }
+
+      // return the interceptors which are applicable for the bean
+      return beanApplicableInterceptors;
+   }
+
 }

Modified: projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/ejb/spec/EjbJarMetaData.java
===================================================================
--- projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/ejb/spec/EjbJarMetaData.java	2010-03-24 12:53:19 UTC (rev 102875)
+++ projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/ejb/spec/EjbJarMetaData.java	2010-03-24 13:16:44 UTC (rev 102876)
@@ -21,6 +21,10 @@
 */
 package org.jboss.metadata.ejb.spec;
 
+import java.util.Collection;
+import java.util.HashSet;
+
+import javax.interceptor.Interceptors;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -279,4 +283,252 @@
          throw new IllegalArgumentException("Null assemblyDescriptor");
       this.assemblyDescriptor = (AssemblyDescriptorMetaData) assemblyDescriptor;
    }
+   
+   /**
+    * Returns the {@link InterceptorsMetaData} which are applicable for the <code>beanName</code>
+    * in the <code>ejbJarMetaData</code>
+    * <p>
+    *   An interceptor is considered as bound to an EJB if there's atleast one interceptor
+    *   binding between the EJB and the interceptor class. The interceptor binding can either
+    *   be through the use of <interceptor-binding> element in ejb-jar.xml or through the
+    *   use of {@link Interceptors} annotation(s) in the EJB class. 
+    * </p>
+    * <p>
+    *   If the EJB has an around-invoke element which uses class name other than the EJB class name,
+    *   then even that class is considered as an interceptor class and is considered to be bound to
+    *   the EJB.
+    * </p>
+    * <p>
+    *   For example:
+    *   <session>
+    *       <ejb-name>Dummy</ejb-name>
+    *       <ejb-class>org.myapp.ejb.MyBean</ejb-class>
+    *       <around-invoke>
+    *           <class>org.myapp.SomeClass</class>
+    *           <method-name>blah</method-name>
+    *       </around-invoke>
+    *   </session>
+    *   
+    *   The <code>org.myapp.SomeClass</code> will be considered as a interceptor class bound to the EJB, 
+    *   <code>org.myapp.ejb.MyBean</code>, even if there is no explicit interceptor binding between that EJB
+    *   and the <code>org.myapp.SomeClass</code>
+    * </p>
+    * 
+    * @param beanName The EJB name
+    * @param ejbJarMetaData The {@link EjbJarMetaData} corresponding to the <code>beanName</code>
+    * @return
+    * @throws NullPointerException If either of <code>beanName</code> or <code>ejbJarMetaData</code>
+    *               is null
+    */
+   public static InterceptorsMetaData getInterceptors(String beanName, EjbJarMetaData ejbJarMetaData)
+   {
+      InterceptorsMetaData beanApplicableInterceptors = new InterceptorsMetaData();
+      if (ejbJarMetaData.getAssemblyDescriptor() == null)
+      {
+         return beanApplicableInterceptors;
+      }
+      InterceptorBindingsMetaData allInterceptorBindings = ejbJarMetaData.getAssemblyDescriptor()
+            .getInterceptorBindings();
+      if (allInterceptorBindings == null)
+      {
+         return beanApplicableInterceptors;
+      }
+      InterceptorsMetaData allInterceptors = ejbJarMetaData.getInterceptors();
+      if (allInterceptors == null || allInterceptors.isEmpty())
+      {
+         return beanApplicableInterceptors;
+      }
+      return getInterceptors(beanName, allInterceptors, allInterceptorBindings);
+   }
+
+   /**
+    * Returns all interceptor classes which are present in the passed <code>ejbJar</code>.
+    * <p>
+    *   A class is considered an interceptor class, if it is listed in either of the following:
+    *   <ul>
+    *       <li>In the <interceptor> element of ejb-jar.xml</li>
+    *       <li>In the <interceptor-binding> element of ejb-jar.xml</li>
+    *       <li>In the <class> sub-element of <around-invoke> element in the ejb-jar.xml</li>
+    *       <li>Marked as an interceptor class through the use of {@link Interceptors} annotation
+    *           in a bean class</li>
+    *   </ul>
+    * </p>
+    * @param ejbJar The {@link EjbJarMetaData} which will scanned for interceptor classes
+    * @return
+    * 
+    */
+   public static Collection<String> getAllInterceptorClasses(EjbJarMetaData ejbJar) 
+   {
+      Collection<String> allInterceptorClassNames = new HashSet<String>();
+
+      // process <interceptors>
+      InterceptorsMetaData interceptorsMetadata = ejbJar.getInterceptors();
+      if (interceptorsMetadata != null)
+      {
+         for (InterceptorMetaData interceptor : interceptorsMetadata)
+         {
+            if (interceptor.getInterceptorClass() != null)
+            {
+               allInterceptorClassNames.add(interceptor.getInterceptorClass());
+            }
+         }
+      }
+      // process <interceptor-bindings> (a.k.a @Interceptors)
+      AssemblyDescriptorMetaData assemblyDescriptor = ejbJar.getAssemblyDescriptor();
+      if (assemblyDescriptor != null)
+      {
+         InterceptorBindingsMetaData interceptorBindings = assemblyDescriptor.getInterceptorBindings();
+         if (interceptorBindings != null)
+         {
+            for (InterceptorBindingMetaData interceptorBinding : interceptorBindings)
+            {
+               if (interceptorBinding != null)
+               {
+                  InterceptorClassesMetaData interceptorClasses = interceptorBinding.getInterceptorClasses();
+                  if (interceptorClasses != null)
+                  {
+                     for (String interceptorClass : interceptorClasses)
+                     {
+                        allInterceptorClassNames.add(interceptorClass);
+                     }
+   
+                  }
+               }
+            }
+         }
+      }
+      // process around-invoke
+      EnterpriseBeansMetaData enterpriseBeans = ejbJar.getEnterpriseBeans();
+      if (enterpriseBeans != null)
+      {
+         for (EnterpriseBeanMetaData enterpriseBean : enterpriseBeans)
+         {
+            String enterpriseBeanClassName = enterpriseBean.getEjbClass();
+            AroundInvokesMetaData aroundInvokes = null;
+            if (enterpriseBean.isSession())
+            {
+               SessionBeanMetaData sessionBean = (SessionBeanMetaData) enterpriseBean;
+               aroundInvokes = sessionBean.getAroundInvokes();
+            }
+            else if (enterpriseBean.isMessageDriven())
+            {
+               MessageDrivenBeanMetaData messageDrivenBean = (MessageDrivenBeanMetaData) enterpriseBean;
+               aroundInvokes = messageDrivenBean.getAroundInvokes();
+            }
+
+            if (aroundInvokes == null || aroundInvokes.isEmpty())
+            {
+               continue;
+            }
+
+            for (AroundInvokeMetaData aroundInvoke : aroundInvokes)
+            {
+               String targetClass = aroundInvoke.getClassName();
+               if (targetClass == null)
+               {
+                  continue;
+               }
+               // if the target class name is not the class name of the EJB,
+               // then as per the xsd, it is considered an interceptor class
+               if (targetClass.equals(enterpriseBeanClassName) == false)
+               {
+                  // it's an interceptor class
+                  allInterceptorClassNames.add(targetClass);
+               }
+            }
+         }
+      }
+      // return the interceptor class names
+      return allInterceptorClassNames;
+   }
+
+   /**
+    * Utility method which, given a bean name, all interceptors available in a deployment
+    * and the all the interceptor binding information, will return only those interceptors
+    * which are applicable to the EJB corresponding to the bean name
+    * 
+    * @param ejbName Name of the EJB
+    * @param allInterceptors {@link InterceptorsMetaData} of all interceptors
+    * @param allInterceptorBindings {@link InterceptorBindingsMetaData} of all interceptor bindings
+    * @return
+    */
+   private static InterceptorsMetaData getInterceptors(String ejbName, InterceptorsMetaData allInterceptors,
+         InterceptorBindingsMetaData allInterceptorBindings)
+   {
+      InterceptorsMetaData beanApplicableInterceptors = new InterceptorsMetaData();
+      // the default interceptors (ejbname = *) will be 
+      // considered as *not* applicable for a bean, if *all* the interceptor
+      // bindings for that bean, have set the exclude-default-interceptors to true
+      boolean includeDefaultInterceptors = false;
+      InterceptorsMetaData defaultInterceptors = new InterceptorsMetaData();
+      for (InterceptorBindingMetaData binding : allInterceptorBindings)
+      {
+         // the interceptor binding corresponds to the bean we are interested in
+         if (ejbName != null && ejbName.equals(binding.getEjbName()))
+         {
+            // atleast one interceptor binding on the bean, is interested
+            // in the default interceptors (ejbname = *). So set the flag to include the default
+            // interceptors in the list of applicable interceptors
+            if (binding.isExcludeDefaultInterceptors() == false)
+            {
+               includeDefaultInterceptors = true;
+            }
+            InterceptorClassesMetaData interceptorClasses = binding.getInterceptorClasses();
+            // interceptor binding has no classes, so move on to the next interceptor binding
+            if (interceptorClasses == null || interceptorClasses.isEmpty())
+            {
+               continue;
+            }
+            for (String interceptorClass : interceptorClasses)
+            {
+               // get the corresponding interceptor metadata for the interceptor class
+               InterceptorMetaData interceptorMetaData = allInterceptors.get(interceptorClass);
+               // TODO: the interceptor metadata for a interceptor class will only be
+               // null, if the metadata isn't fully populated/processed. Let's not thrown
+               // any errors and just ignore such cases for now
+               if (interceptorMetaData != null)
+               {
+                  // include this interceptor metadata as applicable for the bean
+                  beanApplicableInterceptors.add(interceptorMetaData);
+               }
+            }
+         }
+         else if (binding.getEjbName().equals("*")) // binding for default interceptors
+         {
+            InterceptorClassesMetaData interceptorClasses = binding.getInterceptorClasses();
+            // no interceptor class, so skip to next interceptor binding
+            if (interceptorClasses == null || interceptorClasses.isEmpty())
+            {
+               continue;
+            }
+            for (String interceptorClass : interceptorClasses)
+            {
+               InterceptorMetaData interceptorMetaData = allInterceptors.get(interceptorClass);
+               // TODO: the interceptor metadata for a interceptor class will only be
+               // null, if the metadata isn't fully populated/processed. Let's not thrown
+               // any errors and just ignore such cases for now
+               if (interceptorMetaData != null)
+               {
+                  // add the interceptor metadata to the set of default interceptors.
+                  // Whether or not these default interceptors are applicable for 
+                  // the bean being processed, will be decide later
+                  defaultInterceptors.add(interceptorMetaData);
+               }
+            }
+         }
+      }
+      // if the default interceptors (ejb name= *) are to be included 
+      // for this bean.
+      // the default interceptors (ejbname = *) will be 
+      // considered as *not* applicable for a bean, if *all* the interceptor
+      // bindings for that bean, have set the exclude-default-interceptors to true
+      if (includeDefaultInterceptors)
+      {
+         beanApplicableInterceptors.addAll(defaultInterceptors);
+      }
+
+      // return the interceptors which are applicable for the bean
+      return beanApplicableInterceptors;
+   }
+
 }

Modified: projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/ejb/spec/InterceptorMetaData.java
===================================================================
--- projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/ejb/spec/InterceptorMetaData.java	2010-03-24 12:53:19 UTC (rev 102875)
+++ projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/ejb/spec/InterceptorMetaData.java	2010-03-24 13:16:44 UTC (rev 102876)
@@ -351,4 +351,71 @@
          return environment.getDataSources();
       return null;
    }
+   
+   /**
+    * Merge two instances of {@link InterceptorMetaData}
+    * 
+    * @param override The override interceptor metadata (usually the metadata created out of xml deployment descriptor)
+    * @param original The original interceptor metadata (usually the metadata created out of annotation scanning)
+    */
+   public void merge(InterceptorMetaData override, InterceptorMetaData original)
+   {
+      super.merge(override, original);
+      
+      // merge interceptor class name
+      if (original != null && original.getInterceptorClass() != null)
+      {
+         this.setInterceptorClass(original.getInterceptorClass());
+      }
+      if (override != null && override.getInterceptorClass() != null)
+      {
+         this.setInterceptorClass(override.getInterceptorClass());
+      }
+      
+      // merge environment
+      if(this.environment == null)
+         this.environment = new EnvironmentRefsGroupMetaData();
+      Environment overriddenEnv = override != null ? override.getJndiEnvironmentRefsGroup() : null;
+      Environment originalEnv = original != null ? original.getJndiEnvironmentRefsGroup() : null;
+      this.environment.merge(overriddenEnv, originalEnv, "", "", false);
+
+      // merge around-invokes
+      if(aroundInvokes == null)
+         aroundInvokes = new AroundInvokesMetaData();
+      if (original != null && override != null)
+      {
+         this.aroundInvokes.merge(override.getAroundInvokes(), original.getAroundInvokes());
+      }
+      else if (original != null)
+      {
+         if (original.getAroundInvokes() != null)
+         {
+            this.aroundInvokes.addAll(original.getAroundInvokes());   
+         }
+         
+      }
+      else if (override != null)
+      {
+         if (override.getAroundInvokes() != null)
+         {
+            this.aroundInvokes.addAll(override.getAroundInvokes());
+         }
+      }
+      
+      // merge post-activate(s)
+      if(this.postActivates == null)
+         this.postActivates = new LifecycleCallbacksMetaData();
+      if(override != null && override.postActivates != null)
+         postActivates.addAll(override.postActivates);
+      if(original != null && original.postActivates != null)
+         postActivates.addAll(original.postActivates);
+
+      // merge pre-passivate(s)      
+      if(prePassivates == null)
+         prePassivates = new LifecycleCallbacksMetaData();
+      if(override != null && override.prePassivates != null)
+         prePassivates.addAll(override.prePassivates);
+      if(original != null && original.prePassivates != null)
+         prePassivates.addAll(original.prePassivates);
+   }
 }

Modified: projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/ejb/spec/InterceptorsMetaData.java
===================================================================
--- projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/ejb/spec/InterceptorsMetaData.java	2010-03-24 12:53:19 UTC (rev 102875)
+++ projects/metadata/ejb/trunk/src/main/java/org/jboss/metadata/ejb/spec/InterceptorsMetaData.java	2010-03-24 13:16:44 UTC (rev 102876)
@@ -24,7 +24,6 @@
 import javax.xml.bind.annotation.XmlType;
 
 import org.jboss.metadata.javaee.support.MappedMetaDataWithDescriptions;
-import org.jboss.metadata.merge.MergeUtil;
 import org.jboss.xb.annotations.JBossXmlChild;
 
 /**
@@ -54,9 +53,68 @@
       addAll(interceptors);
    }
    
+   /**
+    * Merge an overriden {@link InterceptorsMetaData} with the original {@link InterceptorsMetaData}
+    * @param override
+    * @param original
+    */
    public void merge(InterceptorsMetaData override, InterceptorsMetaData original)
    {
       super.merge(override, original);
-      MergeUtil.merge(this, override, original);
+      
+      if (original != null)
+      {
+         for (InterceptorMetaData originalInterceptorMetaData : original)
+         {
+            if (override != null)
+            {
+               // Check whether there is an overridden interceptor metadata
+               // for the original interceptor class
+               String interceptorClass = originalInterceptorMetaData.getInterceptorClass();
+               InterceptorMetaData match = override.get(interceptorClass);
+               // no overriden metadata found, so add the original interceptor metadata
+               if (match == null)
+               {
+                  add(originalInterceptorMetaData);
+               }
+            }
+            else
+            {
+               // no override, so add the original interceptor metadata
+               add(originalInterceptorMetaData);
+            }
+         }
+      }
+
+      if (override != null)
+      {
+         for (InterceptorMetaData overriddenInerceptorMetaData : override)
+         {
+            InterceptorMetaData originalInterceptorMetaData = null;
+            if (original != null)
+            {
+               String interceptorClassName = overriddenInerceptorMetaData.getInterceptorClass();
+               originalInterceptorMetaData = original.get(interceptorClassName);
+            }
+
+            // If both original and overriden interceptor metadata are present for a
+            // a interceptor class, then *merge* those InterceptorMetadata and add
+            // the merged interceptor to the list
+            if (originalInterceptorMetaData != null)
+            {
+               InterceptorMetaData mergedInterceptorMetaData = new InterceptorMetaData();
+               // merge the original and overridden
+               mergedInterceptorMetaData.merge(overriddenInerceptorMetaData, originalInterceptorMetaData);
+               // add the merged interceptor metadata
+               add(mergedInterceptorMetaData);
+            }
+            else
+            {
+               // there was no original interceptor metadata, so add this
+               // overridden interceptor metadata to the list
+               add(overriddenInerceptorMetaData);
+            }
+         }
+      }
    }
 }

Added: projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/BeanWithInterceptors.java
===================================================================
--- projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/BeanWithInterceptors.java	                        (rev 0)
+++ projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/BeanWithInterceptors.java	2010-03-24 13:16:44 UTC (rev 102876)
@@ -0,0 +1,49 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.metadata.ejb.test.interceptor.annotation.creator;
+
+import javax.ejb.Stateless;
+import javax.interceptor.Interceptors;
+import javax.interceptor.InvocationContext;
+
+/**
+ * BeanWithInterceptors
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+ at Interceptors ({InterceptorB.class, InterceptorA.class})
+ at Stateless
+public class BeanWithInterceptors
+{
+
+   @Interceptors ({InterceptorWithManyInjections.class})
+   public void something()
+   {
+      
+   }
+   
+   public Object someAroundInvokeMethod(InvocationContext ctx)
+   {
+      return null;
+   }
+}

Added: projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorA.java
===================================================================
--- projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorA.java	                        (rev 0)
+++ projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorA.java	2010-03-24 13:16:44 UTC (rev 102876)
@@ -0,0 +1,33 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.metadata.ejb.test.interceptor.annotation.creator;
+
+/**
+ * InterceptorA
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class InterceptorA
+{
+
+}

Added: projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorB.java
===================================================================
--- projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorB.java	                        (rev 0)
+++ projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorB.java	2010-03-24 13:16:44 UTC (rev 102876)
@@ -0,0 +1,33 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.metadata.ejb.test.interceptor.annotation.creator;
+
+/**
+ * InterceptorB
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class InterceptorB
+{
+
+}

Added: projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorC.java
===================================================================
--- projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorC.java	                        (rev 0)
+++ projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorC.java	2010-03-24 13:16:44 UTC (rev 102876)
@@ -0,0 +1,33 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.metadata.ejb.test.interceptor.annotation.creator;
+
+/**
+ * InterceptorC
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class InterceptorC
+{
+
+}

Added: projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorD.java
===================================================================
--- projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorD.java	                        (rev 0)
+++ projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorD.java	2010-03-24 13:16:44 UTC (rev 102876)
@@ -0,0 +1,33 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.metadata.ejb.test.interceptor.annotation.creator;
+
+/**
+ * InterceptorD
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class InterceptorD
+{
+
+}

Added: projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorWithInjectedEJB.java
===================================================================
--- projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorWithInjectedEJB.java	                        (rev 0)
+++ projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorWithInjectedEJB.java	2010-03-24 13:16:44 UTC (rev 102876)
@@ -0,0 +1,45 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.metadata.ejb.test.interceptor.annotation.creator;
+
+import javax.ejb.EJB;
+
+/**
+ * InterceptorWithInjectedEJB
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class InterceptorWithInjectedEJB
+{
+
+   @EJB
+   private NoOpBean bean; 
+   
+   private NoOpBean methodInjectedBean;
+   
+   @EJB
+   public void setMethodInjectedBean(NoOpBean bean)
+   {
+      this.methodInjectedBean = bean;
+   }
+}

Added: projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorWithManyInjections.java
===================================================================
--- projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorWithManyInjections.java	                        (rev 0)
+++ projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/InterceptorWithManyInjections.java	2010-03-24 13:16:44 UTC (rev 102876)
@@ -0,0 +1,63 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.metadata.ejb.test.interceptor.annotation.creator;
+
+import javax.annotation.Resource;
+import javax.ejb.EJB;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceContext;
+import javax.persistence.PersistenceUnit;
+import javax.sql.DataSource;
+
+/**
+ * InterceptorWithManyInjections
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class InterceptorWithManyInjections
+{
+
+   @EJB
+   private NoOpBean bean;
+   
+   @PersistenceContext (name="entityMan", unitName = "someunit")
+   private EntityManager em;
+   
+   @PersistenceUnit
+   private EntityManagerFactory emf;
+   
+   private DataSource methodInjectedDS;
+   
+   @Resource (name = "datasource")
+   public void setMethodInjectedDS(DataSource ds)
+   {
+      this.methodInjectedDS = ds;
+   }
+   
+   @EJB
+   public void setDummyEJB(NoOpBean dummy)
+   {
+      
+   }
+}

Added: projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/NoOpBean.java
===================================================================
--- projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/NoOpBean.java	                        (rev 0)
+++ projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/NoOpBean.java	2010-03-24 13:16:44 UTC (rev 102876)
@@ -0,0 +1,36 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.metadata.ejb.test.interceptor.annotation.creator;
+
+import javax.ejb.Stateless;
+
+/**
+ * NoOpBean
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+ at Stateless
+public interface NoOpBean
+{
+
+}

Added: projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/SimpleInterceptorWithoutAnyInjections.java
===================================================================
--- projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/SimpleInterceptorWithoutAnyInjections.java	                        (rev 0)
+++ projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/SimpleInterceptorWithoutAnyInjections.java	2010-03-24 13:16:44 UTC (rev 102876)
@@ -0,0 +1,40 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.metadata.ejb.test.interceptor.annotation.creator;
+
+import javax.interceptor.InvocationContext;
+
+/**
+ * SimpleInterceptor
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class SimpleInterceptorWithoutAnyInjections
+{
+
+   public Object intercept(InvocationContext ctx) throws Exception
+   {
+      // do nothing
+      return null;
+   }
+}

Added: projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/unit/InterceptorsCreatorTestCase.java
===================================================================
--- projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/unit/InterceptorsCreatorTestCase.java	                        (rev 0)
+++ projects/metadata/ejb/trunk/src/test/java/org/jboss/metadata/ejb/test/interceptor/annotation/creator/unit/InterceptorsCreatorTestCase.java	2010-03-24 13:16:44 UTC (rev 102876)
@@ -0,0 +1,477 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.metadata.ejb.test.interceptor.annotation.creator.unit;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.lang.reflect.AnnotatedElement;
+import java.net.URL;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jboss.logging.Logger;
+import org.jboss.metadata.annotation.creator.ejb.InterceptorMetaDataCreator;
+import org.jboss.metadata.annotation.creator.ejb.jboss.JBoss50Creator;
+import org.jboss.metadata.annotation.finder.AnnotationFinder;
+import org.jboss.metadata.annotation.finder.DefaultAnnotationFinder;
+import org.jboss.metadata.ejb.jboss.JBoss50MetaData;
+import org.jboss.metadata.ejb.jboss.JBossMetaData;
+import org.jboss.metadata.ejb.spec.EjbJar31MetaData;
+import org.jboss.metadata.ejb.spec.EjbJarMetaData;
+import org.jboss.metadata.ejb.spec.InterceptorMetaData;
+import org.jboss.metadata.ejb.spec.InterceptorsMetaData;
+import org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorA;
+import org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorB;
+import org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorC;
+import org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorD;
+import org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorWithInjectedEJB;
+import org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorWithManyInjections;
+import org.jboss.metadata.ejb.test.interceptor.annotation.creator.SimpleInterceptorWithoutAnyInjections;
+import org.jboss.metadata.javaee.spec.AnnotatedEJBReferencesMetaData;
+import org.jboss.metadata.javaee.spec.PersistenceContextReferencesMetaData;
+import org.jboss.metadata.javaee.spec.PersistenceUnitReferencesMetaData;
+import org.jboss.metadata.javaee.spec.ResourceInjectionMetaData;
+import org.jboss.metadata.javaee.spec.ResourceInjectionTargetMetaData;
+import org.jboss.metadata.javaee.spec.ResourceReferencesMetaData;
+import org.jboss.test.metadata.common.PackageScanner;
+import org.jboss.test.metadata.common.ScanPackage;
+import org.jboss.xb.binding.JBossXBException;
+import org.jboss.xb.binding.Unmarshaller;
+import org.jboss.xb.binding.UnmarshallerFactory;
+import org.jboss.xb.binding.resolver.MultiClassSchemaResolver;
+import org.jboss.xb.binding.resolver.MutableSchemaResolver;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * Tests that the interceptor annotation processing and merging of 
+ * interceptor metadata works as expected
+ *
+ * @author Jaikiran Pai
+ * @version $Revision: $
+ */
+public class InterceptorsCreatorTestCase
+{
+
+   private static Logger logger = Logger.getLogger(InterceptorsCreatorTestCase.class);
+
+   private static UnmarshallerFactory unmarshallerFactory = UnmarshallerFactory.newInstance();
+
+   private static MutableSchemaResolver schemaBindingResolver;
+
+   @BeforeClass
+   public static void beforeClass()
+   {
+      schemaBindingResolver = new MultiClassSchemaResolver();
+      schemaBindingResolver.mapLocationToClass("ejb-jar_3_1.xsd", EjbJar31MetaData.class);
+   }
+
+   /**
+    * Tests that the annotations in an interceptor class are processed
+    * correctly
+    * 
+    * @throws Exception
+    */
+   @Test
+   @ScanPackage("org.jboss.metadata.ejb.test.interceptor.annotation.creator")
+   public void testInterceptorClassAnnotationProcessing() throws Exception
+   {
+      AnnotationFinder<AnnotatedElement> finder = new DefaultAnnotationFinder<AnnotatedElement>();
+      InterceptorMetaDataCreator interceptorMetaDataCreator = new InterceptorMetaDataCreator(finder);
+      Collection<Class<?>> classes = new HashSet<Class<?>>();
+      classes.add(SimpleInterceptorWithoutAnyInjections.class);
+      classes.add(InterceptorWithInjectedEJB.class);
+      classes.add(InterceptorWithManyInjections.class);
+      
+      InterceptorsMetaData interceptors = interceptorMetaDataCreator.create(classes);
+
+      assertNotNull("Interceptors metadata created was null", interceptors);
+
+      logger.info("Found " + interceptors.size() + " interceptors");
+
+      String simpleInterceptorClass = SimpleInterceptorWithoutAnyInjections.class.getName();
+      InterceptorMetaData simpleInterceptorWithoutInjection = this.getInterceptor(interceptors, simpleInterceptorClass);
+
+      assertNotNull("Interceptor for class " + simpleInterceptorWithoutInjection + " not found in metadata",
+            simpleInterceptorWithoutInjection);
+
+      // test that the simple interceptor without any injections was 
+      // processed correctly
+      this.assertNoInjectionInterceptor(simpleInterceptorWithoutInjection);
+      
+      // test that the other 2 interceptors have been set with the correct
+      // ResourceInjectionTargetMetaData
+      this.assertEJBInjectionInterceptor(interceptors);
+      this.assertInterceptorWithManyInjections(interceptors);
+   }
+
+   /**
+    * <ul>
+    * <li>Creates {@link EjbJarMetaData} from a ejb-jar.xml</li>
+    * <li>Then creates {@link InterceptorsMetaData} from annotation scanning of interceptor classes
+    * through {@link InterceptorMetaDataCreator}</li>
+    * <li>Merges the interceptors metadata created through ejb-jar.xml with the one 
+    * created from annotaion scanning</li>
+    * <li>Tests the merged {@link InterceptorsMetaData} to check that if holds the
+    * expected metadata</li>
+    * </ul>
+    *  
+    * @throws Exception
+    */
+   @Test
+   public void testInterceptorXMLProcessing() throws Exception
+   {
+      EjbJarMetaData ejbJarMetaData = unmarshal(EjbJarMetaData.class,
+            "/org/jboss/metadata/ejb/test/interceptor/ejb-jar-interceptors.xml");
+      assertNotNull(ejbJarMetaData);
+
+      // Get all possible interceptor classes 
+      Collection<Class<?>> interceptorClasses = this.loadClasses(EjbJarMetaData.getAllInterceptorClasses(ejbJarMetaData));
+      AnnotationFinder<AnnotatedElement> finder = new DefaultAnnotationFinder<AnnotatedElement>();
+      InterceptorMetaDataCreator interceptorMetaDataCreator = new InterceptorMetaDataCreator(finder);
+      // create metadata for these interceptor classes
+      InterceptorsMetaData annotatedInterceptorsMetaData = interceptorMetaDataCreator.create(interceptorClasses);
+
+      // merge the interceptors metadata from the xml and annotation processing
+      InterceptorsMetaData mergedInterceptorsMetaData = new InterceptorsMetaData();
+      mergedInterceptorsMetaData.merge(ejbJarMetaData.getInterceptors(), annotatedInterceptorsMetaData);
+
+   // make sure the merged interceptors metadata has the correct info
+      Assert.assertEquals("Unexpected number of interceptors after merging", 6, mergedInterceptorsMetaData.size());
+
+      InterceptorMetaData interceptorA = mergedInterceptorsMetaData.get(InterceptorA.class.getName());
+      InterceptorMetaData interceptorB = mergedInterceptorsMetaData.get(InterceptorB.class.getName());
+      InterceptorMetaData interceptorC = mergedInterceptorsMetaData.get(InterceptorC.class.getName());
+      InterceptorMetaData interceptorD = mergedInterceptorsMetaData.get(InterceptorD.class.getName());
+      InterceptorMetaData interceptorWithInjectedEJB = mergedInterceptorsMetaData.get(InterceptorWithInjectedEJB.class
+            .getName());
+      InterceptorMetaData interceptorWithManyInjections = mergedInterceptorsMetaData
+            .get(InterceptorWithManyInjections.class.getName());
+
+      // make sure that the InterceptorMetadata for all the expected interceptors is present 
+      Assert.assertNotNull("Interceptor metadata not found for " + InterceptorA.class, interceptorA);
+      Assert.assertNotNull("Interceptor metadata not found for " + InterceptorB.class, interceptorB);
+      Assert.assertNotNull("Interceptor metadata not found for " + InterceptorC.class, interceptorC);
+      Assert.assertNotNull("Interceptor metadata not found for " + InterceptorD.class, interceptorD);
+      Assert.assertNotNull("Interceptor metadata not found for " + InterceptorWithInjectedEJB.class,
+            interceptorWithInjectedEJB);
+      Assert.assertNotNull("Interceptor metadata not found for " + InterceptorWithManyInjections.class,
+            interceptorWithManyInjections);
+
+      // test that the interceptors which do not have anything to be injected,
+      // have the appropriate metadata
+      this.assertNoInjectionInterceptor(interceptorA);
+      this.assertNoInjectionInterceptor(interceptorB);
+      this.assertNoInjectionInterceptor(interceptorC);
+      this.assertNoInjectionInterceptor(interceptorD);
+
+      // test that the interceptor with EJB injection is processed correctly
+      this.assertEJBInjectionInterceptor(mergedInterceptorsMetaData);
+      // test that the interceptor with many injections is processed correctly
+      this.assertInterceptorWithManyInjections(mergedInterceptorsMetaData);
+
+   }
+
+   /**
+    *  <ul>
+    * <li>Creates {@link EjbJarMetaData} from a ejb-jar.xml</li>
+    * <li>Then creates {@link JBossMetaData} from annotation scanning on EJBs</li>
+    * <li> Merges the {@link EjbJarMetaData} with the {@link JBossMetaData}</li>
+    * <li>Then creates {@link InterceptorsMetaData} from annotation scanning of interceptor classes
+    * through {@link InterceptorMetaDataCreator}</li>
+    * <li>Merges the interceptors metadata with the  interceptors metadata in  the merged {@link JBossMetaData}</li>
+    * <li>Tests the merged {@link InterceptorsMetaData} to check that if holds the
+    * expected metadata</li>
+    * </ul>
+    * @throws Exception
+    */
+   @Test
+   @ScanPackage("org.jboss.metadata.ejb.test.interceptor.annotation.creator")
+   public void testMergedJBossMetaData() throws Exception
+   {
+      EjbJarMetaData jarMetaData = unmarshal(EjbJarMetaData.class,
+            "/org/jboss/metadata/ejb/test/interceptor/partial-dd-ejb-jar.xml");
+      assertNotNull(jarMetaData);
+      // create jbossmetadata out of ejbjarmetadata
+      JBossMetaData jbossMetadataFromXml = new JBoss50MetaData();
+      jbossMetadataFromXml.merge(null, jarMetaData);
+
+      
+      AnnotationFinder<AnnotatedElement> finder = new DefaultAnnotationFinder<AnnotatedElement>();
+      JBoss50Creator creator = new JBoss50Creator(finder);
+      Collection<Class<?>> classes = PackageScanner.loadClasses();
+      JBossMetaData jbossMetaData = creator.create(classes);
+      
+      // now merge (annotations and xml metadata)
+      JBossMetaData mergedJBossMetaData = new JBoss50MetaData();
+      // note, xml overrides annotations and hence this order of parameter passing
+      mergedJBossMetaData.merge(jbossMetadataFromXml, jbossMetaData);
+      
+      Collection<Class<?>> interceptorClasses = this.loadClasses(JBossMetaData.getAllInterceptorClasses(mergedJBossMetaData));
+      InterceptorMetaDataCreator interceptorMetaDataCreator = new InterceptorMetaDataCreator(finder);
+      InterceptorsMetaData annotatedInterceptorsMetaData = interceptorMetaDataCreator.create(interceptorClasses);
+
+      // merge
+      InterceptorsMetaData mergedInterceptorsMetaData = new InterceptorsMetaData();
+      mergedInterceptorsMetaData.merge(mergedJBossMetaData.getInterceptors(), annotatedInterceptorsMetaData);
+      
+      // make sure the merged interceptors metadata has the correct info
+      Assert.assertEquals("Unexpected number of interceptors after merging", 6, mergedInterceptorsMetaData.size());
+
+      InterceptorMetaData interceptorA = mergedInterceptorsMetaData.get(InterceptorA.class.getName());
+      InterceptorMetaData interceptorB = mergedInterceptorsMetaData.get(InterceptorB.class.getName());
+      InterceptorMetaData interceptorC = mergedInterceptorsMetaData.get(InterceptorC.class.getName());
+      InterceptorMetaData interceptorD = mergedInterceptorsMetaData.get(InterceptorD.class.getName());
+      InterceptorMetaData interceptorWithInjectedEJB = mergedInterceptorsMetaData.get(InterceptorWithInjectedEJB.class
+            .getName());
+      InterceptorMetaData interceptorWithManyInjections = mergedInterceptorsMetaData
+            .get(InterceptorWithManyInjections.class.getName());
+
+      // make sure that the InterceptorMetadata for all the expected interceptors is present 
+      Assert.assertNotNull("Interceptor metadata not found for " + InterceptorA.class, interceptorA);
+      Assert.assertNotNull("Interceptor metadata not found for " + InterceptorB.class, interceptorB);
+      Assert.assertNotNull("Interceptor metadata not found for " + InterceptorC.class, interceptorC);
+      Assert.assertNotNull("Interceptor metadata not found for " + InterceptorD.class, interceptorD);
+      Assert.assertNotNull("Interceptor metadata not found for " + InterceptorWithInjectedEJB.class,
+            interceptorWithInjectedEJB);
+      Assert.assertNotNull("Interceptor metadata not found for " + InterceptorWithManyInjections.class,
+            interceptorWithManyInjections);
+
+      // test that the interceptors which do not have anything to be injected,
+      // have the appropriate metadata
+      this.assertNoInjectionInterceptor(interceptorA);
+      this.assertNoInjectionInterceptor(interceptorB);
+      this.assertNoInjectionInterceptor(interceptorC);
+      this.assertNoInjectionInterceptor(interceptorD);
+
+      // test that the interceptor with EJB injection is processed correctly
+      this.assertEJBInjectionInterceptor(mergedInterceptorsMetaData);
+      // test that the interceptor with many injections is processed correctly
+      this.assertInterceptorWithManyInjections(mergedInterceptorsMetaData);
+
+   }
+
+   /**
+    * Utility method to load classes from class names
+    * @param classNames
+    * @return
+    * @throws ClassNotFoundException
+    */
+   private Collection<Class<?>> loadClasses(Collection<String> classNames) throws ClassNotFoundException
+   {
+      ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+      Collection<Class<?>> interceptorClasses = new HashSet<Class<?>>();
+      for (String interceptorClassName : classNames)
+      {
+         interceptorClasses.add(tccl.loadClass(interceptorClassName));
+      }
+      return interceptorClasses;
+   }
+
+   /**
+    * Utility method
+    * @param <T>
+    * @param type
+    * @param resource
+    * @return
+    * @throws JBossXBException
+    */
+   private static <T> T unmarshal(Class<T> type, String resource) throws JBossXBException
+   {
+      Unmarshaller unmarshaller = unmarshallerFactory.newUnmarshaller();
+      unmarshaller.setValidation(false);
+      URL url = type.getResource(resource);
+      if (url == null)
+         throw new IllegalArgumentException("Failed to find resource " + resource);
+      return type.cast(unmarshaller.unmarshal(url.toString(), schemaBindingResolver));
+   }
+
+   private void assertEJBInjectionInterceptor(InterceptorsMetaData interceptors)
+   {
+      String interceptorClassWithEJBInjections = InterceptorWithInjectedEJB.class.getName();
+      InterceptorMetaData interceptorWithEJBInjections = this.getInterceptor(interceptors,
+            interceptorClassWithEJBInjections);
+
+      assertNotNull("Interceptor for class " + interceptorClassWithEJBInjections + " not found in metadata",
+            interceptorWithEJBInjections);
+
+      AnnotatedEJBReferencesMetaData annotatedEJBRefs = interceptorWithEJBInjections.getAnnotatedEjbReferences();
+      assertNotNull("Annotated EJB references not created for interceptor " + interceptorClassWithEJBInjections,
+            annotatedEJBRefs);
+      Assert.assertEquals("Unexpected number of annotated EJB references", 2, annotatedEJBRefs.size());
+      this.assertInjectionFound(annotatedEJBRefs, interceptorClassWithEJBInjections, "bean");
+      this.assertInjectionFound(annotatedEJBRefs, interceptorClassWithEJBInjections, "setMethodInjectedBean");
+
+      // rest of it should be null or empty
+      this.assertNullOrEmpty(interceptorWithEJBInjections.getPersistenceContextRefs());
+      this.assertNullOrEmpty(interceptorWithEJBInjections.getPersistenceUnitRefs());
+   }
+   
+
+   private void assertInterceptorWithManyInjections(InterceptorsMetaData interceptors)
+   {
+      String interceptorClassWithManyInjections = InterceptorWithManyInjections.class.getName();
+      InterceptorMetaData interceptorWithManyInjections = this.getInterceptor(interceptors,
+            interceptorClassWithManyInjections);
+
+      assertNotNull("Interceptor for class " + interceptorClassWithManyInjections + " not found in metadata",
+            interceptorWithManyInjections);
+
+      AnnotatedEJBReferencesMetaData annotatedEJBRefs = interceptorWithManyInjections.getAnnotatedEjbReferences();
+      // @EJB
+      assertNotNull("Annotated EJB references not created for interceptor " + interceptorClassWithManyInjections,
+            annotatedEJBRefs);
+      Assert.assertEquals("Unexpected number of annotated EJB references", 2, annotatedEJBRefs.size());
+      this.assertInjectionFound(annotatedEJBRefs, interceptorClassWithManyInjections, "bean");
+      this.assertInjectionFound(annotatedEJBRefs, interceptorClassWithManyInjections, "setDummyEJB");
+
+      // @PersistenceContext
+      PersistenceContextReferencesMetaData persistenceContextRefs = interceptorWithManyInjections
+            .getPersistenceContextRefs();
+      assertNotNull("@PersistenceContext references not created for interceptor " + interceptorClassWithManyInjections,
+            persistenceContextRefs);
+      Assert.assertEquals("Unexpected number of @PersistenceContext references", 1, persistenceContextRefs.size());
+
+      this.assertInjectionFound(persistenceContextRefs, interceptorClassWithManyInjections, "em");
+
+      // @PersistenceUnit
+      PersistenceUnitReferencesMetaData persistenceUnitRefs = interceptorWithManyInjections.getPersistenceUnitRefs();
+      assertNotNull("@PersistenceUnit references not created for interceptor " + interceptorClassWithManyInjections,
+            persistenceUnitRefs);
+      Assert.assertEquals("Unexpected number of @PersistenceUnit references", 1, persistenceUnitRefs.size());
+
+      this.assertInjectionFound(persistenceUnitRefs, interceptorClassWithManyInjections, "emf");
+
+      // @Resource
+      ResourceReferencesMetaData resourceRefs = interceptorWithManyInjections.getResourceReferences();
+      assertNotNull("@Resource references not created for interceptor " + interceptorClassWithManyInjections,
+            resourceRefs);
+      Assert.assertEquals("Unexpected number of @Resource references", 1, resourceRefs.size());
+
+      this.assertInjectionFound(resourceRefs, interceptorClassWithManyInjections, "setMethodInjectedDS");
+   }
+
+   /**
+    * Utility method to return {@link InterceptorMetaData} from {@link InterceptorsMetaData}
+    * for the passed <code>interceptorClassName</code> 
+    * @param interceptors
+    * @param interceptorClassName
+    * @return
+    */
+   private InterceptorMetaData getInterceptor(InterceptorsMetaData interceptors, String interceptorClassName)
+   {
+      if (interceptors == null)
+      {
+         return null;
+      }
+      for (InterceptorMetaData interceptor : interceptors)
+      {
+         if (interceptor.getInterceptorClass() != null
+               && interceptor.getInterceptorClass().equals(interceptorClassName))
+         {
+            return interceptor;
+         }
+      }
+      return null;
+   }
+
+   /**
+    * Utility method to test the {@link InterceptorMetaData} which is not expected
+    * to contain any injections 
+    * @param interceptor
+    */
+   private void assertNoInjectionInterceptor(InterceptorMetaData interceptor)
+   {
+      this.assertNullOrEmpty(interceptor.getAnnotatedEjbReferences());
+      this.assertNullOrEmpty(interceptor.getPersistenceContextRefs());
+      this.assertNullOrEmpty(interceptor.getPersistenceUnitRefs());
+      this.assertNullOrEmpty(interceptor.getResourceReferences());
+      this.assertNullOrEmpty(interceptor.getMessageDestinationReferences());
+
+   }
+
+   /**
+    * Utility method
+    * @param <M>
+    * @param injections
+    */
+   private <M extends ResourceInjectionMetaData> void assertNullOrEmpty(Collection<M> injections)
+   {
+      if (injections == null)
+      {
+         return;
+      }
+      Assert.assertEquals(0, injections.size());
+   }
+
+   /**
+    * Utility method to test that the {@link ResourceInjectionTargetMetaData} for the   
+    * passed targetClass and targetName is available in the passed {@link ResourceInjectionMetaData}s
+    * @param <M>
+    * @param resourceInjectionMetadatas
+    * @param targetClass
+    * @param targetName
+    */
+   private <M extends ResourceInjectionMetaData> void assertInjectionFound(Iterable<M> resourceInjectionMetadatas,
+         String targetClass, String targetName)
+   {
+      boolean pcInjectionFound = false;
+      for (ResourceInjectionMetaData resourceInjectionMetadata : resourceInjectionMetadatas)
+      {
+         Set<ResourceInjectionTargetMetaData> injectionTargets = resourceInjectionMetadata.getInjectionTargets();
+         ResourceInjectionTargetMetaData injectionTarget = this.findResourceInjectionTargetMetaData(injectionTargets,
+               targetClass, targetName);
+         if (injectionTarget != null)
+         {
+            pcInjectionFound = true;
+            break;
+         }
+      }
+      Assert.assertTrue("Injection target class = " + targetClass + " target name= " + targetName
+            + " not found in metadata", pcInjectionFound);
+   }
+
+   /**
+    * Utility method which returns the correct {@link ResourceInjectionTargetMetaData} for the passed
+    * targetClass and targetName
+    * @param injections
+    * @param targetClass
+    * @param targetName
+    * @return
+    */
+   private ResourceInjectionTargetMetaData findResourceInjectionTargetMetaData(
+         Set<ResourceInjectionTargetMetaData> injections, String targetClass, String targetName)
+   {
+      for (ResourceInjectionTargetMetaData injection : injections)
+      {
+         String injectionTargetClass = injection.getInjectionTargetClass();
+         String injectionTargetName = injection.getInjectionTargetName();
+         if (targetClass.equals(injectionTargetClass) && targetName.equals(injectionTargetName))
+         {
+            return injection;
+         }
+      }
+      return null;
+   }
+}

Added: projects/metadata/ejb/trunk/src/test/resources/org/jboss/metadata/ejb/test/interceptor/ejb-jar-interceptors.xml
===================================================================
--- projects/metadata/ejb/trunk/src/test/resources/org/jboss/metadata/ejb/test/interceptor/ejb-jar-interceptors.xml	                        (rev 0)
+++ projects/metadata/ejb/trunk/src/test/resources/org/jboss/metadata/ejb/test/interceptor/ejb-jar-interceptors.xml	2010-03-24 13:16:44 UTC (rev 102876)
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
+      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
+          http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
+      version="3.1">
+      
+      <enterprise-beans>
+        <session>
+            <ejb-name>DummyBean</ejb-name>
+            <ejb-class>Dummy</ejb-class>
+            <around-invoke>
+                <class>org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorWithManyInjections</class>
+                <method-name>dummyMethod</method-name>
+            </around-invoke>
+        </session>
+      </enterprise-beans>
+      
+      <interceptors>
+        <interceptor>
+            <interceptor-class>org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorA</interceptor-class>
+        </interceptor>
+        <interceptor>
+            <interceptor-class>org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorB</interceptor-class>
+        </interceptor>
+        <interceptor>
+            <interceptor-class>org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorWithInjectedEJB</interceptor-class>
+        </interceptor>
+        <interceptor>
+            <interceptor-class>org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorD</interceptor-class>
+            <around-invoke>
+                <method-name>dummy</method-name>
+            </around-invoke>
+        </interceptor>
+        
+      </interceptors>
+    
+    <assembly-descriptor>
+        <interceptor-binding>
+            <ejb-name>*</ejb-name>
+            <interceptor-class>org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorC</interceptor-class>
+        </interceptor-binding>
+        <interceptor-binding>
+            <ejb-name>DummyBean</ejb-name>
+            <interceptor-class>org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorD</interceptor-class>
+        </interceptor-binding>
+        <interceptor-binding>
+            <ejb-name>DummyBean</ejb-name>
+            <interceptor-class>org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorWithInjectedEJB</interceptor-class>
+            <method>
+                <method-name>test</method-name>
+            </method>
+        </interceptor-binding>
+        
+    </assembly-descriptor>              
+</ejb-jar>      
\ No newline at end of file

Added: projects/metadata/ejb/trunk/src/test/resources/org/jboss/metadata/ejb/test/interceptor/partial-dd-ejb-jar.xml
===================================================================
--- projects/metadata/ejb/trunk/src/test/resources/org/jboss/metadata/ejb/test/interceptor/partial-dd-ejb-jar.xml	                        (rev 0)
+++ projects/metadata/ejb/trunk/src/test/resources/org/jboss/metadata/ejb/test/interceptor/partial-dd-ejb-jar.xml	2010-03-24 13:16:44 UTC (rev 102876)
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
+      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
+          http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
+      version="3.1">
+      
+      <enterprise-beans>
+        <session>
+            <ejb-name>BeanWithInterceptors</ejb-name>
+            <ejb-class>org.jboss.metadata.ejb.test.interceptor.annotation.creator.BeanWithInterceptors</ejb-class>
+            <around-invoke>
+                <method-name>someAroundInvokeMethod</method-name>
+            </around-invoke>
+            <around-invoke>
+                <class>org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorWithInjectedEJB</class>
+                <method-name>aroundInvoke</method-name>
+            </around-invoke>
+        </session>
+        <session>
+            <ejb-name>SomeDummyBean</ejb-name>
+            <ejb-class>DForDummy</ejb-class>
+        </session>
+      </enterprise-beans>
+    
+    <assembly-descriptor>
+        <interceptor-binding>
+            <ejb-name>*</ejb-name>
+            <interceptor-class>org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorC</interceptor-class>
+        </interceptor-binding>
+        <interceptor-binding>
+            <ejb-name>BeanWithInterceptors</ejb-name>
+            <interceptor-class>org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorD</interceptor-class>
+        </interceptor-binding>
+        <interceptor-binding>
+            <ejb-name>SomeDummyBean</ejb-name>
+            <interceptor-class>org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorA</interceptor-class>
+            <interceptor-class>org.jboss.metadata.ejb.test.interceptor.annotation.creator.InterceptorB</interceptor-class>
+            <method>
+                <method-name>test</method-name>
+            </method>
+        </interceptor-binding>
+        
+    </assembly-descriptor>              
+</ejb-jar>      
\ No newline at end of file




More information about the jboss-cvs-commits mailing list