[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