[jboss-cvs] JBossAS SVN: r90513 - in projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3: interceptor and 1 other directory.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Tue Jun 23 04:17:32 EDT 2009
Author: wolfc
Date: 2009-06-23 04:17:32 -0400 (Tue, 23 Jun 2009)
New Revision: 90513
Modified:
projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/Ejb3HandlerFactory.java
projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/InterceptorInfoRepository.java
Log:
EJBTHREE-1852: removed obsolete code from InterceptorInfoRepository
Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/Ejb3HandlerFactory.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/Ejb3HandlerFactory.java 2009-06-23 08:16:13 UTC (rev 90512)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/Ejb3HandlerFactory.java 2009-06-23 08:17:32 UTC (rev 90513)
@@ -22,14 +22,11 @@
package org.jboss.ejb3;
import java.net.URL;
-import org.jboss.ejb3.metamodel.EjbJarDD;
-import org.jboss.ejb3.metamodel.EjbJarDDObjectFactory;
-import org.jboss.ejb3.metamodel.JBossDDObjectFactory;
-import org.jboss.ejb3.interceptor.InterceptorInfoRepository;
-import org.jboss.metadata.ejb.jboss.JBossMetaData;
import javassist.bytecode.ClassFile;
+import org.jboss.metadata.ejb.jboss.JBossMetaData;
+
public abstract class Ejb3HandlerFactory
{
public abstract Ejb3Handler createHandler(ClassFile cf) throws Exception;
@@ -43,12 +40,8 @@
{
this.di = di;
this.dd = di.getMetaData();
-
- InterceptorInfoRepository repository = this.di.getDeploymentUnit().getInterceptorInfoRepository();
- repository.initialise(dd);
}
-
-
+
public Ejb3Handler createHandler(ClassFile cf) throws Exception
{
return new Ejb3DescriptorHandler(di, cf, dd);
Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/InterceptorInfoRepository.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/InterceptorInfoRepository.java 2009-06-23 08:16:13 UTC (rev 90512)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/interceptor/InterceptorInfoRepository.java 2009-06-23 08:17:32 UTC (rev 90513)
@@ -21,45 +21,14 @@
*/
package org.jboss.ejb3.interceptor;
-import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.rmi.RemoteException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
import javax.ejb.CreateException;
-import javax.ejb.PostActivate;
-import javax.ejb.PrePassivate;
-import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
-import org.jboss.ejb3.EJBContainer;
import org.jboss.logging.Logger;
-import org.jboss.metadata.ejb.jboss.JBossMetaData;
-import org.jboss.metadata.ejb.spec.AroundInvokeMetaData;
-import org.jboss.metadata.ejb.spec.AroundInvokesMetaData;
-import org.jboss.metadata.ejb.spec.InterceptorBindingMetaData;
-import org.jboss.metadata.ejb.spec.InterceptorBindingsMetaData;
-import org.jboss.metadata.ejb.spec.InterceptorMetaData;
-import org.jboss.metadata.ejb.spec.InterceptorOrderMetaData;
-import org.jboss.metadata.ejb.spec.InterceptorsMetaData;
-import org.jboss.metadata.ejb.spec.MethodParametersMetaData;
-import org.jboss.metadata.ejb.spec.NamedMethodMetaData;
-import org.jboss.metadata.javaee.spec.LifecycleCallbackMetaData;
-import org.jboss.metadata.javaee.spec.LifecycleCallbacksMetaData;
/**
* A repository of interceptor details shared amongst all containers in this deployment.
@@ -79,471 +48,11 @@
{
private static Logger log = Logger.getLogger(InterceptorInfoRepository.class);
- private ClassLoader classLoader;
-
- private Set<String> beanClasses = new HashSet<String>();
-
- private InterceptorsMetaData interceptorsXml;
-
- private InterceptorBindingsMetaData bindingsXml;
-
- private ConcurrentMap<Class<?>, InterceptorInfo> infos = new ConcurrentHashMap<Class<?>, InterceptorInfo>();
-
- private ConcurrentMap<String, InterceptorInfo> ejbInfos = new ConcurrentHashMap<String, InterceptorInfo>();
-
- private LinkedHashSet<InterceptorInfo> defaultInterceptors = null;
-
- private InterceptorSorter sorter = new InterceptorSorter();
-
public InterceptorInfoRepository(ClassLoader classLoader)
{
- assert classLoader != null : "classLoader is null";
-
- this.classLoader = classLoader;
+ log.warn("EJBTHREE-1852: InterceptorInfoRepository is deprecated");
}
-
- public void initialise(JBossMetaData dd)
- {
- this.interceptorsXml = dd.getInterceptors();
-
- if (dd.getAssemblyDescriptor() != null)
- {
- this.bindingsXml = dd.getAssemblyDescriptor().getInterceptorBindings();
- }
-
- initialiseInfosFromXml();
- initialiseDefaultInterceptors();
- }
-
- public void addBeanClass(String classname)
- {
- beanClasses.add(classname);
- }
-
- public InterceptorInfo getInterceptorInfo(Class clazz)
- {
- initialiseInfosFromXml();
- return infos.get(clazz);
- }
-
- public HashSet<InterceptorInfo> getDefaultInterceptors()
- {
- return defaultInterceptors;
- }
-
- public boolean hasDefaultInterceptors()
- {
- return defaultInterceptors.size() > 0;
- }
-
- /*
- public ArrayList<InterceptorInfo> getClassInterceptors(EJBContainer container)
- {
- javax.interceptor.Interceptors interceptors = (javax.interceptor.Interceptors) container
- .resolveAnnotation(javax.interceptor.Interceptors.class);
- ArrayList<InterceptorInfo> infos = getInterceptorsFromAnnotation(container, interceptors);
-
- return infos;
- }
- */
- public ArrayList<InterceptorInfo> getMethodInterceptors(EJBContainer container, Method m)
- {
- javax.interceptor.Interceptors interceptors = (javax.interceptor.Interceptors) container.resolveAnnotation(m,
- javax.interceptor.Interceptors.class);
- ArrayList<InterceptorInfo> infos = getInterceptorsFromAnnotation(container, interceptors);
-
- return infos;
- }
-
- public Method[] getBeanClassAroundInvokes(EJBContainer container)
- {
- return getBeanClassInterceptors(container, AroundInvoke.class);
- }
-
- public Method[] getBeanClassPostConstructs(EJBContainer container)
- {
- return getBeanClassInterceptors(container, PostConstruct.class);
- }
-
- public Method[] getBeanClassPostActivates(EJBContainer container)
- {
- return getBeanClassInterceptors(container, PostActivate.class);
- }
-
- public Method[] getBeanClassPrePassivates(EJBContainer container)
- {
- return getBeanClassInterceptors(container, PrePassivate.class);
- }
-
- public Method[] getBeanClassPreDestroys(EJBContainer container)
- {
- return getBeanClassInterceptors(container, PreDestroy.class);
- }
-
- private Method[] getBeanClassInterceptors(EJBContainer container, Class type)
- {
- InterceptorInfo info = getOrInitialiseFromAnnotations(container);
- return getMethodsForEvent(info, type);
- }
-
- /*
- public InterceptorInfo[] getBusinessInterceptors(EJBContainer container, Method method)
- {
- return getInterceptors(container, AroundInvoke.class, method);
- }
-
- public InterceptorInfo[] getPostConstructInterceptors(EJBContainer container)
- {
- return getInterceptors(container, PostConstruct.class, null);
- }
-
- public InterceptorInfo[] getPostActivateInterceptors(EJBContainer container)
- {
- return getInterceptors(container, PostActivate.class, null);
- }
-
- public InterceptorInfo[] getPrePassivateInterceptors(EJBContainer container)
- {
- return getInterceptors(container, PrePassivate.class, null);
- }
-
- public InterceptorInfo[] getPreDestroyInterceptors(EJBContainer container)
- {
- return getInterceptors(container, PreDestroy.class, null);
- }
- */
-
- /*
- private InterceptorInfo[] getInterceptors(EJBContainer container, Class type, Method method)
- {
- ArrayList<InterceptorInfo> interceptors = new ArrayList<InterceptorInfo>();
-
- if (!hasAnnotation(container, ExcludeDefaultInterceptors.class, method))
- {
- HashSet<InterceptorInfo> infos = getDefaultInterceptors();
- if (infos != null)
- {
- interceptors.addAll(trimUnwanted(infos, type));
- }
- sorter.sortDefaultInterceptors(container, interceptors);
- }
-
-
- if (!hasAnnotation(container, ExcludeClassInterceptors.class, method))
- {
- List<InterceptorInfo> infos = container.getClassInterceptors();
- if (infos != null)
- {
- interceptors.addAll(trimUnwanted(infos, type));
- }
-
- if (type != AroundInvoke.class)
- {
- List<InterceptorInfo> methodOnlyInterceptors = getMethodOnlyInterceptorsForLifecycle(container, type, interceptors);
- if (infos != null)
- interceptors.addAll(methodOnlyInterceptors);
- }
- sorter.sortClassInterceptors(container, interceptors);
- }
-
- if (type == AroundInvoke.class)
- {
- List<InterceptorInfo> infos = getMethodInterceptors(container, method);
- if (infos != null)
- interceptors.addAll(trimUnwanted(infos, type));
- sorter.sortMethodInterceptors(container, method, interceptors);
- }
-
- InterceptorInfo[] ints = interceptors.toArray(new InterceptorInfo[interceptors.size()]);
- return ints;
- }
- */
-
- /*
- private List<InterceptorInfo> getMethodOnlyInterceptorsForLifecycle(EJBContainer container, Class type, List<InterceptorInfo> infos)
- {
- HashSet<InterceptorInfo> methodLevelInterceptors = (HashSet<InterceptorInfo>)container.getApplicableInterceptors().clone();
-
- for (InterceptorInfo info : infos)
- {
- if (methodLevelInterceptors.contains(info))
- {
- methodLevelInterceptors.remove(info);
- }
- }
-
- if (defaultInterceptors != null)
- {
- for (InterceptorInfo info : defaultInterceptors)
- {
- if (methodLevelInterceptors.contains(info))
- {
- methodLevelInterceptors.remove(info);
- }
- }
- }
-
- List<InterceptorInfo> trimmedInfos = trimUnwanted(methodLevelInterceptors, type);
- return trimmedInfos;
- }
- */
-
- /*
- private boolean hasAnnotation(EJBContainer container, Class annotation, Method method)
- {
- if (container.getAnnotation(annotation) != null)
- {
- return true;
- }
-
- if (method != null)
- {
- return container.resolveAnnotation(method, annotation) != null;
- }
-
- return false;
- }
- */
-
- private List<InterceptorInfo> trimUnwanted(Collection<InterceptorInfo> interceptors, Class type)
- {
- ArrayList<InterceptorInfo> ints = new ArrayList<InterceptorInfo>(interceptors.size());
- ints.addAll(interceptors);
-
- for (Iterator<InterceptorInfo> it = ints.iterator(); it.hasNext();)
- {
- InterceptorInfo info = it.next();
- if (!hasMethodsForEvent(info, type))
- {
- it.remove();
- }
- }
-
- return ints;
- }
-
- private boolean hasMethodsForEvent(InterceptorInfo info, Class type)
- {
- return getMethodsForEvent(info, type) != null;
- }
-
- private Method[] getMethodsForEvent(InterceptorInfo info, Class type)
- {
- if (type == AroundInvoke.class)
- return info.getAroundInvokes();
- else if (type == PostConstruct.class)
- return info.getPostConstructs();
- else if (type == PostActivate.class)
- return info.getPostActivates();
- else if (type == PrePassivate.class)
- return info.getPrePassivates();
- else if (type == PreDestroy.class)
- return info.getPreDestroys();
- return null;
- }
-
- private ArrayList<InterceptorInfo> getInterceptorsFromAnnotation(EJBContainer container,
- javax.interceptor.Interceptors interceptors)
- {
- ArrayList<InterceptorInfo> inters = new ArrayList<InterceptorInfo>();
- if (interceptors == null)
- return inters;
-
- for (Class clazz : interceptors.value())
- {
- InterceptorInfo info = getOrInitialiseFromAnnotations(clazz);
- validateInterceptorForContainer(container, info.getClazz());
- inters.add(info);
- }
-
- return inters;
- }
-
- private void validateInterceptorForContainer(EJBContainer container, Class interceptor)
- {
- if (beanClasses.contains(interceptor.getName()))
- {
- if (!interceptor.equals(container.getClazz()))
- {
- throw new RuntimeException("Bean class " + interceptor.getName() + " cannot be used as an interceptor for "
- + container.getEjbName());
- }
- }
- }
-
- private void initialiseInfosFromXml()
- {
- if (interceptorsXml != null)
- {
- //Initialise all interceptor entries so we know which classes we have xml for
- HashMap<String, AnnotationInitialiser> initialisers = new HashMap<String, AnnotationInitialiser>();
- for (InterceptorMetaData xml : interceptorsXml)
- {
- XmlInitialiser init = new XmlInitialiser(xml);
- initialisers.put(xml.getInterceptorClass(), init);
- }
-
- //Create entries recursively, top classes first so we get the method hierarchies
- for (InterceptorMetaData xml : interceptorsXml)
- {
- String clazz = xml.getInterceptorClass();
- initialiseSuperClassesFirstFromXmlOrAnnotations(initialisers, clazz);
- }
-
- }
- }
-
- private InterceptorInfo initialiseSuperClassesFirstFromXmlOrAnnotations(
- HashMap<String, AnnotationInitialiser> initialisers, String superClassName)
- {
- if ("java.lang.Object".equals(superClassName))
- {
- return null;
- }
-
- AnnotationInitialiser initialiser = initialisers.get(superClassName);
- if (initialiser == null)
- {
- initialiser = new AnnotationInitialiser(superClassName, InterceptorSignatureValidator.instance);
- initialisers.put(initialiser.getClazz().getName(), initialiser);
- }
- InterceptorInfo superInfo = initialiseSuperClassesFirstFromXmlOrAnnotations(
- initialisers, initialiser.getClazz().getSuperclass().getName());
-
- InterceptorInfo info = initialiser.getInfo();
- info.calculateHierarchy(superInfo);
- infos.put(info.getClazz(), info);
- return info;
- }
-
- /*
- * Default interceptors are defined using xml only
- */
- private void initialiseDefaultInterceptors()
- {
- defaultInterceptors = new LinkedHashSet<InterceptorInfo>();
-
- if (bindingsXml != null)
- {
- for (InterceptorBindingMetaData bindingXml : bindingsXml)
- {
- if (bindingXml.getEjbName().equals("*") && bindingXml.getMethod() == null)
- {
- for (String classname : bindingXml.getInterceptorClasses())
- {
- if (beanClasses.contains(classname))
- {
- throw new RuntimeException("Bean class defined in default binding " + classname);
- }
- InterceptorInfo info = getOrInitialiseFromAnnotations(classname);
- defaultInterceptors.add(info);
- }
- }
- }
- }
- }
-
- private InterceptorInfo getOrInitialiseFromAnnotations(String classname)
- {
- Class clazz = loadClass(classname);
- return getOrInitialiseFromAnnotations(clazz);
- }
-
- private InterceptorInfo getOrInitialiseFromAnnotations(Class clazz)
- {
- InterceptorInfo info = infos.get(clazz);
-
- if (info == null)
- {
- synchronized (this)
- {
- info = infos.get(clazz);
- if (info == null)
- {
- info = initialiseFromAnnotations(clazz);
- infos.put(clazz, info);
- }
- }
- }
-
- return info;
- }
-
- private InterceptorInfo initialiseFromAnnotations(Class clazz)
- {
- InterceptorInfo superInfo = null;
- if (clazz.getSuperclass() != Object.class)
- {
- superInfo = getOrInitialiseFromAnnotations(clazz.getSuperclass());
- }
-
- AnnotationInitialiser init = new AnnotationInitialiser(clazz, InterceptorSignatureValidator.instance);
- InterceptorInfo info = init.getInfo();
- info.calculateHierarchy(superInfo);
- return info;
- }
-
- private InterceptorInfo getOrInitialiseFromAnnotations(EJBContainer container)
- {
- InterceptorInfo info = ejbInfos.get(container.getEjbName());
-
- if (info == null)
- {
- synchronized (this)
- {
- info = ejbInfos.get(container.getEjbName());
- if (info == null)
- {
- info = initialiseFromAnnotations(container);
- ejbInfos.put(container.getEjbName(), info);
- }
- }
- }
-
- return info;
- }
-
- private InterceptorInfo initialiseFromAnnotations(EJBContainer container)
- {
- //Currently I see no way in spec for specifying interceptors of an ejb super class using xml,
- //use annotations only to initialise super classes, and don't store these
- InterceptorInfo superInfo = initialiseContainerSuperClassFromAnnotationsOnly(container.getClazz().getSuperclass());
- AnnotationInitialiser init = new ContainerInitialiser(container);
- InterceptorInfo info = init.getInfo();
- info.calculateHierarchy(superInfo);
- return info;
- }
-
- private InterceptorInfo initialiseContainerSuperClassFromAnnotationsOnly(Class clazz)
- {
- InterceptorInfo superInfo = null;
- if (clazz != Object.class)
- {
- superInfo = initialiseContainerSuperClassFromAnnotationsOnly(clazz.getSuperclass());
- }
-
- AnnotationInitialiser init = new AnnotationInitialiser(clazz, BeanSignatureValidator.instance);
- InterceptorInfo info = init.getInfo();
- info.calculateHierarchy(superInfo);
- return info;
- }
-
-
- private Class<?> loadClass(String name)
- {
- try
- {
- if(log.isTraceEnabled())
- log.trace("Loading interceptor " + name + " from " + classLoader);
- return classLoader.loadClass(name);
- }
- catch (ClassNotFoundException e)
- {
- throw new RuntimeException("Interceptor class not found: " + name + " in class loader " + classLoader, e);
- }
- }
-
private static boolean checkExceptions(Class<?> allowedExceptions[], Method method)
{
for(Class<?> exception : method.getExceptionTypes())
@@ -563,46 +72,6 @@
return true;
}
- public static boolean checkValidBusinessSignature(Method method)
- {
- int modifiers = method.getModifiers();
-
- if (!Modifier.isStatic(modifiers))
- {
- if (method.getReturnType().equals(Object.class))
- {
- Class[] params = method.getParameterTypes();
- if (params.length == 1 && params[0].equals(InvocationContext.class))
- {
- Class[] exceptions = method.getExceptionTypes();
- if (exceptions.length == 1 && exceptions[0].equals(Exception.class))
- {
- return true;
- }
- }
- }
- }
- return false;
- }
-
- public static boolean checkValidLifecycleSignature(Method method)
- {
- int modifiers = method.getModifiers();
-
- if (!Modifier.isStatic(modifiers))
- {
- if (method.getReturnType().equals(Void.TYPE))
- {
- Class[] params = method.getParameterTypes();
- if (params.length == 1 && params[0].equals(InvocationContext.class))
- {
- return true;
- }
- }
- }
- return false;
- }
-
/**
* EJB3 12.4
* Lifecycle methods may throw runtime exceptions, but not application exceptions.
@@ -635,527 +104,43 @@
return false;
}
- public static String simpleType(Class type)
+ public static boolean checkValidBusinessSignature(Method method)
{
- Class ret = type;
- if (ret.isArray())
- {
- Class arr = ret;
- String array = "";
- while (arr.isArray())
- {
- array += "[]";
- arr = arr.getComponentType();
- }
- return arr.getName() + array;
- }
- return ret.getName();
- }
-
+ int modifiers = method.getModifiers();
- private interface SignatureValidator
- {
- boolean checkValidLifecycle(Method m);
- boolean checkValidAround(Method m);
- }
-
- private static class InterceptorSignatureValidator implements SignatureValidator
- {
- static SignatureValidator instance = new InterceptorSignatureValidator();
- public boolean checkValidAround(Method m)
+ if (!Modifier.isStatic(modifiers))
{
- return checkValidBusinessSignature(m);
- }
-
- public boolean checkValidLifecycle(Method m)
- {
- return checkValidLifecycleSignature(m);
- }
- }
-
- private static class BeanSignatureValidator implements SignatureValidator
- {
- static SignatureValidator instance = new BeanSignatureValidator();
- public boolean checkValidAround(Method m)
- {
- return checkValidBusinessSignature(m);
- }
-
- public boolean checkValidLifecycle(Method m)
- {
- return checkValidBeanLifecycleSignature(m);
- }
- }
-
-
- private class AnnotationInitialiser
- {
- SignatureValidator signatureValidator;
- Class clazz;
-
- InterceptorInfo info;
-
- AnnotationInitialiser(String classname, SignatureValidator signatureValidator)
- {
- clazz = loadClass(classname);
- this.signatureValidator = signatureValidator;
- info = new InterceptorInfo(clazz);
- }
-
- AnnotationInitialiser(Class clazz, SignatureValidator signatureValidator)
- {
- this.clazz = clazz;
- this.signatureValidator = signatureValidator;
- info = new InterceptorInfo(clazz);
- }
-
- public Class getClazz()
- {
- return clazz;
- }
-
- InterceptorInfo getInfo()
- {
- for (Method method : clazz.getDeclaredMethods())
+ if (method.getReturnType().equals(Object.class))
{
- info.setAroundInvoke(resolveAroundInvoke(method));
- info.setPostConstruct(resolvePostConstruct(method));
- info.setPostActivate(resolvePostActivate(method));
- info.setPreDestroy(resolvePreDestroy(method));
- info.setPrePassivate(resolvePrePassivate(method));
- }
- return info;
- }
-
- Method resolveAroundInvoke(Method method)
- {
- AroundInvoke ann = (AroundInvoke) getAnnotation(method, AroundInvoke.class);
- if (ann != null)
- {
- if (!signatureValidator.checkValidAround(method))
+ Class[] params = method.getParameterTypes();
+ if (params.length == 1 && params[0].equals(InvocationContext.class))
{
- throw new RuntimeException("@" + ((Annotation) ann).annotationType().getName()
- + " annotated method in has the wrong signature - " + method);
- }
- return method;
- }
- return null;
- }
-
- Method resolvePostConstruct(Method method)
- {
- PostConstruct ann = (PostConstruct) getAnnotation(method, PostConstruct.class);
- return resolveLifecycleMethod(method, ann);
- }
-
- Method resolvePostActivate(Method method)
- {
- PostActivate ann = (PostActivate) getAnnotation(method, PostActivate.class);
- return resolveLifecycleMethod(method, ann);
- }
-
- Method resolvePreDestroy(Method method)
- {
- PreDestroy ann = (PreDestroy) getAnnotation(method, PreDestroy.class);
- return resolveLifecycleMethod(method, ann);
- }
-
- Method resolvePrePassivate(Method method)
- {
- PrePassivate ann = (PrePassivate) getAnnotation(method, PrePassivate.class);
- return resolveLifecycleMethod(method, ann);
- }
-
- Method resolveLifecycleMethod(Method method, Annotation ann)
- {
- if (ann != null)
- {
- if (!signatureValidator.checkValidLifecycle(method))
- {
- throw new RuntimeException("@" + ((Annotation) ann).annotationType().getName()
- + " annotated method has the wrong signature - " + method);
- }
- return method;
- }
- return null;
- }
-
- Object getAnnotation(Method method, Class annotation)
- {
- return method.getAnnotation(annotation);
- }
-
- }
-
- private class ContainerInitialiser extends AnnotationInitialiser
- {
- EJBContainer container;
-
- public ContainerInitialiser(EJBContainer container)
- {
- // FIXME ContainerInitialiser constructor
- super(container.getBeanClass(), BeanSignatureValidator.instance);
- this.container = container;
- }
-
- Object getAnnotation(Method method, Class annotation)
- {
- return container.resolveAnnotation(method, annotation);
- }
-
- /*
- * Lifecycle methods on bean class have a different signature from those defined on
- *
- */
- Method resolveLifecycleMethod(Method method, Annotation ann)
- {
- if (ann != null)
- {
- if (!signatureValidator.checkValidLifecycle(method))
- {
- throw new RuntimeException("@" + ann.annotationType().getName()
- + " annotated method has the wrong signature - " + method + " (EJB3 12.4)");
- }
- return method;
- }
- return null;
- }
- }
-
- private class XmlInitialiser extends AnnotationInitialiser
- {
- InterceptorMetaData xml;
-
- XmlInitialiser(InterceptorMetaData xml)
- {
- super(xml.getInterceptorClass(), InterceptorSignatureValidator.instance);
- this.xml = xml;
- }
-
- InterceptorInfo getInfo()
- {
- info.setAroundInvoke(findInterceptorMethodFromXml("around-invoke-method", xml.getAroundInvokes()));
- info.setPostConstruct(findInterceptorMethodFromXml("post-construct-method", xml.getPostConstructs()));
- info.setPostActivate(findInterceptorMethodFromXml("post-activate-method", xml.getPostActivates()));
- info.setPreDestroy(findInterceptorMethodFromXml("pre-destroy-method", xml.getPreDestroys()));
- info.setPrePassivate(findInterceptorMethodFromXml("pre-passivate-method", xml.getPrePassivates()));
- super.getInfo();
- info.setXml(xml);
- return info;
- }
-
- Method findInterceptorMethodFromXml(String lookingFor, AroundInvokesMetaData aroundInvokes)
- {
- if (aroundInvokes == null)
- return null;
- if(aroundInvokes.size() != 1)
- throw new RuntimeException("NYI");
-
- AroundInvokeMetaData aroundInvoke = aroundInvokes.get(0);
- return findInterceptorMethodFromXml(lookingFor, aroundInvoke.getClassName(), aroundInvoke.getMethodName());
- }
-
- Method findInterceptorMethodFromXml(String lookingFor, LifecycleCallbacksMetaData lifecycleCallbacks)
- {
- if (lifecycleCallbacks == null)
- return null;
- if(lifecycleCallbacks.size() != 1)
- throw new RuntimeException("NYI");
-
- LifecycleCallbackMetaData lifecycleCallback = lifecycleCallbacks.get(0);
- return findInterceptorMethodFromXml(lookingFor, lifecycleCallback.getClassName(), lifecycleCallback.getMethodName());
- }
-
- Method findInterceptorMethodFromXml(String lookingFor, String className, String methodName)
- {
- if (xml == null)
- return null;
-
- // If a class name is specified look in there, else in the surrounding class
- Class<?> cls;
- if(className == null)
- cls = clazz;
- else
- cls = loadClass(className);
-
- if (methodName == null || methodName.trim().equals(""))
- {
- throw new RuntimeException(lookingFor + " must contain a valid method name for interceptor "
- + clazz.getName());
- }
-
- List<Method> possible = new ArrayList<Method>();
- for (java.lang.reflect.Method method : cls.getDeclaredMethods())
- {
- if (methodName.equals(method.getName()))
- {
- possible.add(method);
- }
- }
-
- if (possible.size() == 0)
- {
- throw new RuntimeException(lookingFor + " can't find method " + methodName + " on " + cls.getName());
- }
-
- Method found = null;
-
- for (Method method : possible)
- {
- // TODO: barf, use a validator as parameter
- if (lookingFor.equals("around-invoke-method"))
- {
- if (signatureValidator.checkValidAround(method))
+ Class[] exceptions = method.getExceptionTypes();
+ if (exceptions.length == 1 && exceptions[0].equals(Exception.class))
{
- found = method;
+ return true;
}
}
- else
- {
- if (signatureValidator.checkValidLifecycle(method))
- {
- found = method;
- }
- }
}
-
- if (found == null)
- {
- // TODO: improve error message
- throw new RuntimeException(lookingFor + " has the wrong method signature for interceptor "
- + clazz.getName());
- }
-
- return found;
}
+ return false;
}
- private class InterceptorSorter
+ public static boolean checkValidLifecycleSignature(Method method)
{
- boolean initialised;
- List<InterceptorBindingMetaData> orderedBindings;
-
- private void initialise()
- {
- if (!initialised)
- {
- synchronized(this)
- {
- if (bindingsXml != null)
- {
- for (InterceptorBindingMetaData binding : bindingsXml)
- {
- if (binding.isTotalOrdering())
- {
- //Validate each interceptor only occurs once
- HashSet<String> names = new HashSet<String>();
- for(String className : binding.getInterceptorOrder())
- {
- if (names.contains(className))
- {
- throw new RuntimeException(className + " occurs more than once in ordered binding " +
- getInterceptorBindingString(binding));
- }
- names.add(className);
- }
-
- if (orderedBindings == null)
- {
- orderedBindings = new ArrayList<InterceptorBindingMetaData>();
- }
- orderedBindings.add(binding);
- }
- }
- }
- }
- log.trace("orderedBindings = " + orderedBindings);
- initialised = true;
- }
- }
-
- void sortDefaultInterceptors(EJBContainer container, ArrayList<InterceptorInfo> infos)
- {
- initialise();
- if (orderedBindings == null) return;
- InterceptorOrderMetaData bindingOrder = null;
- for (InterceptorBindingMetaData binding : orderedBindings)
- {
- if (binding.getEjbName().equals("*"))
- {
- if (bindingOrder != null)
- {
- throw new RuntimeException("There should only be one interceptor-binding specifying " +
- "the order of default interceptors " + getInterceptorBindingString(binding));
- }
- bindingOrder = binding.getInterceptorOrder();
- }
- }
- sortInterceptors(infos, bindingOrder);
- }
-
- void sortClassInterceptors(EJBContainer container, ArrayList<InterceptorInfo> infos)
- {
- initialise();
- if (orderedBindings == null) return;
- InterceptorOrderMetaData bindingOrder = null;
- for (InterceptorBindingMetaData binding : orderedBindings)
- {
- if(binding.getMethod() != null)
- continue;
- if (binding.getEjbName().equals(container.getEjbName()))
- {
- if (bindingOrder != null)
- {
- throw new RuntimeException("There should only be one interceptor-binding specifying " +
- "the order of class interceptors: " + getInterceptorBindingString(binding));
- }
- bindingOrder = binding.getInterceptorOrder();
- }
- }
- sortInterceptors(infos, bindingOrder);
- }
-
- void sortMethodInterceptors(EJBContainer container, Method method, ArrayList<InterceptorInfo> infos)
- {
- initialise();
- if (orderedBindings == null) return;
- InterceptorOrderMetaData methodNoParamsOrder = null;
- InterceptorOrderMetaData methodParamsOrder = null;
- for (InterceptorBindingMetaData binding : orderedBindings)
- {
- if (binding.getEjbName().equals(container.getEjbName()))
- {
- NamedMethodMetaData bindingMethod = binding.getMethod();
- if (bindingMethod != null)
- {
- if (bindingMethod.getMethodParams() == null)
- {
- if (methodNoParamsOrder != null)
- {
- throw new RuntimeException("There should only be one interceptor-binding specifying " +
- "the order of method interceptors: " + getInterceptorBindingString(binding));
- }
- methodNoParamsOrder = binding.getInterceptorOrder();
- }
- else
- {
- Class<?>[] params = method.getParameterTypes();
- List<String> methodParams = bindingMethod.getMethodParams();
- if (methodParams.size() == params.length)
- {
- boolean matches = true;
- for (int i = 0 ; i < params.length ; i++)
- {
- if (!simpleType(params[i]).equals(methodParams.get(i)))
- {
- matches = false;
- break;
- }
- }
-
- if (matches)
- {
- if (methodParamsOrder != null)
- {
- boolean first = false;
- StringBuffer paramBuf = new StringBuffer();
- paramBuf.append("(");
- for (String par : methodParams)
- {
- if (!first) paramBuf.append(",");
- paramBuf.append(par);
- }
- paramBuf.append(")");
- throw new RuntimeException("There should only be one interceptor-binding specifying " +
- "the order of method interceptors: " + getInterceptorBindingString(binding));
- }
-
- methodParamsOrder = binding.getInterceptorOrder();
- }
- }
- }
- }
- }
- }
-
- if (methodParamsOrder != null)
- {
- sortInterceptors(infos, methodParamsOrder);
-
- }
- else
- {
- sortInterceptors(infos, methodNoParamsOrder);
- }
- }
-
- void sortInterceptors(ArrayList<InterceptorInfo> infos, InterceptorOrderMetaData interceptorOrder)
- {
- if (interceptorOrder == null) return;
- Collections.sort(infos, new InterceptorComparator(interceptorOrder));
- }
+ int modifiers = method.getModifiers();
- String getInterceptorBindingString(InterceptorBindingMetaData binding)
+ if (!Modifier.isStatic(modifiers))
{
- StringBuffer buf = new StringBuffer();
-
- buf.append(binding.getEjbName());
- NamedMethodMetaData method = binding.getMethod();
- if(method != null)
+ if (method.getReturnType().equals(Void.TYPE))
{
- buf.append("." + method.getMethodName());
- MethodParametersMetaData methodParams = method.getMethodParams();
- if (methodParams != null)
+ Class[] params = method.getParameterTypes();
+ if (params.length == 1 && params[0].equals(InvocationContext.class))
{
- buf.append("(");
- for (int i = 0 ; i < methodParams.size() ; )
- {
- if (i == 0) buf.append(",");
- buf.append(methodParams.get(i));
- }
- buf.append(")");
+ return true;
}
}
-
- return buf.toString();
}
+ return false;
}
-
- private class InterceptorComparator implements Comparator<InterceptorInfo>
- {
- List<String> ordered;
-
- InterceptorComparator(InterceptorOrderMetaData ordered)
- {
- assert ordered != null : "ordered is null";
-
- this.ordered = new ArrayList<String>(ordered);
- }
-
- public int compare(InterceptorInfo o1, InterceptorInfo o2)
- {
- int pos1 = ordered.indexOf(o1.getClazz().getName());
- int pos2 = ordered.indexOf(o2.getClazz().getName());
-
- //Make anything not specified in the order come last
- if (pos1 < 0) pos1 = Integer.MAX_VALUE;
- if (pos2 < 0) pos2 = Integer.MAX_VALUE;
-
- if (pos1 < pos2)
- {
- return -1;
- }
- else if (pos1 > pos2)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
-
-
- }
-
}
More information about the jboss-cvs-commits
mailing list