Author: rmannibucau Date: Thu Aug 14 09:56:53 2014 New Revision: 1617907 URL: http://svn.apache.org/r1617907 Log: fixing meta for tests
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/FinderFactory.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1617907&r1=1617906&r2=1617907&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Thu Aug 14 09:56:53 2014 @@ -1790,7 +1790,7 @@ public class AnnotationDeployer implemen */ buildAnnotatedRefs(beanInfo, annotationFinder, beanInfo.getClassLoader()); - processWebServiceClientHandlers(beanInfo, beanInfo.getClassLoader()); + processWebServiceClientHandlers(beanInfo, annotationFinder, beanInfo.getClassLoader()); } @@ -1911,7 +1911,20 @@ public class AnnotationDeployer implemen validateRemoteClientRefs(classLoader, client, remoteClients); - processWebServiceClientHandlers(client, classLoader); + final IAnnotationFinder finder = clientModule.getFinder(); + if (!AnnotationFinder.class.isInstance(finder)) { + final Class<?>[] loadedClasses = new Class<?>[finder.getAnnotatedClassNames().size()]; + int i = 0; + for (final String s : finder.getAnnotatedClassNames()) { + try { + loadedClasses[i++] = classLoader.loadClass(s); + } catch (final ClassNotFoundException e) { + // no-op + } + } + clientModule.getFinderReference().set(new FinderFactory.OpenEJBAnnotationFinder(new ClassesArchive(loadedClasses))); + } + processWebServiceClientHandlers(client, AnnotationFinder.class.cast(clientModule.getFinder()), classLoader); return clientModule; } @@ -2238,7 +2251,7 @@ public class AnnotationDeployer implemen */ buildAnnotatedRefs(webApp, annotationFinder, classLoader); - processWebServiceClientHandlers(webApp, classLoader); + processWebServiceClientHandlers(webApp, annotationFinder, classLoader); return webModule; } @@ -2271,27 +2284,31 @@ public class AnnotationDeployer implemen continue; } - final boolean dynamicBean = DynamicProxyImplFactory.isKnownDynamicallyImplemented(clazz); final MetaAnnotatedClass<?> metaClass = new MetaAnnotatedClass(clazz); + final boolean dynamicBean = DynamicProxyImplFactory.isKnownDynamicallyImplemented(metaClass, clazz); - final AnnotationFinder finder; + AnnotationFinder finder = null; // created lazily since not always needed final AnnotationFinder annotationFinder; - if (ejbModule.getFinder() instanceof AnnotationFinder) { - final AnnotationFinder af = (AnnotationFinder) ejbModule.getFinder(); + AnnotationFinder af = (AnnotationFinder) ejbModule.getFinder(); final List<Class<?>> ancestors = Classes.ancestors(clazz); + if (dynamicBean) { + final Proxy p = metaClass.getAnnotation(Proxy.class); + if (p != null) { + ancestors.add(p.value()); + } + } + final String[] names = new String[ancestors.size()]; int i = 0; for (final Class<?> ancestor : ancestors) { names[i++] = ancestor.getName(); } annotationFinder = af.select(names); - finder = af.select(clazz.getName()); - } else { + } else { // shouldn't occur if (!dynamicBean) { annotationFinder = createFinder(clazz); - finder = new AnnotationFinder(new ClassesArchive(clazz)); } else { final Class<?>[] classes; final Proxy proxy = metaClass.getAnnotation(Proxy.class); @@ -2301,7 +2318,6 @@ public class AnnotationDeployer implemen classes = new Class<?>[]{clazz, proxy.value()}; } annotationFinder = createFinder(classes); - finder = new AnnotationFinder(new ClassesArchive(classes)); } } @@ -2353,6 +2369,9 @@ public class AnnotationDeployer implemen if (bean.getTransactionType() == TransactionType.CONTAINER) { processAttributes(new TransactionAttributeHandler(assemblyDescriptor, ejbName), clazz, annotationFinder); } else { + if (finder == null) { + finder = annotationFinder.select(clazz.getName()); + } checkAttributes(new TransactionAttributeHandler(assemblyDescriptor, ejbName), ejbName, ejbModule, finder, "invalidTransactionAttribute"); } @@ -2722,9 +2741,9 @@ public class AnnotationDeployer implemen buildAnnotatedRefs(bean, annotationFinder, classLoader); - processWebServiceHandlers(ejbModule, bean); + processWebServiceHandlers(ejbModule, bean, annotationFinder); - processWebServiceClientHandlers(bean, classLoader); + processWebServiceClientHandlers(bean, annotationFinder, classLoader); try { if (BeanContext.Comp.class.getName().equals(bean.getEjbClass())) { @@ -2771,7 +2790,7 @@ public class AnnotationDeployer implemen */ buildAnnotatedRefs(interceptor, annotationFinder, classLoader); - processWebServiceClientHandlers(interceptor, classLoader); + processWebServiceClientHandlers(interceptor, annotationFinder, classLoader); /** * Interceptors do not have their own section in ejb-jar.xml for resource references @@ -4672,9 +4691,9 @@ public class AnnotationDeployer implemen /** * Scan for @EJB, @Resource, @WebServiceRef, @PersistenceUnit, and @PersistenceContext on WebService HandlerChain classes */ - private void processWebServiceHandlers(final EjbModule ejbModule, final EnterpriseBean bean) throws OpenEJBException { + private void processWebServiceHandlers(final EjbModule ejbModule, final EnterpriseBean bean, final AnnotationFinder finder) throws OpenEJBException { // add webservice handler classes to the class finder used in annotation processing - final Set<Class<?>> classes = new HashSet<Class<?>>(); + final Set<String> classes = new HashSet<>(); if (ejbModule.getWebservices() != null) { for (final WebserviceDescription webservice : ejbModule.getWebservices().getWebserviceDescription()) { for (final PortComponent port : webservice.getPortComponent()) { @@ -4690,19 +4709,15 @@ public class AnnotationDeployer implemen for (final Handler handler : handlerChain.getHandler()) { final String handlerClass = realClassName(handler.getHandlerClass()); if (handlerClass != null) { - try { - final Class handlerClazz = ejbModule.getClassLoader().loadClass(handlerClass); - classes.add(handlerClazz); - } catch (final ClassNotFoundException e) { - throw new OpenEJBException("Unable to load webservice handler class: " + handlerClass, e); - } + classes.add(handlerClass); } } } } } } - final AnnotationFinder handlersFinder = createFinder(classes.toArray(new Class<?>[classes.size()])); + classes.add(bean.getEjbClass()); + final AnnotationFinder handlersFinder = finder.select(classes); buildAnnotatedRefs(bean, handlersFinder, ejbModule.getClassLoader()); } @@ -4713,13 +4728,13 @@ public class AnnotationDeployer implemen * @param classLoader * @throws OpenEJBException */ - private void processWebServiceClientHandlers(final JndiConsumer consumer, final ClassLoader classLoader) throws OpenEJBException { + private void processWebServiceClientHandlers(final JndiConsumer consumer, final AnnotationFinder finder, final ClassLoader classLoader) throws OpenEJBException { if (SystemInstance.get().hasProperty("openejb.geronimo")) { return; } - final Set<Class<?>> processedClasses = new HashSet<Class<?>>(); - final Set<Class<?>> handlerClasses = new HashSet<Class<?>>(); + final Set<String> processedClasses = new HashSet<>(); + final Set<String> handlerClasses = new HashSet<>(); do { // get unprocessed handler classes handlerClasses.clear(); @@ -4731,12 +4746,7 @@ public class AnnotationDeployer implemen for (final org.apache.openejb.jee.HandlerChain handlerChain : chains.getHandlerChain()) { for (final Handler handler : handlerChain.getHandler()) { if (handler.getHandlerClass() != null) { - try { - final Class clazz = classLoader.loadClass(realClassName(handler.getHandlerClass())); - handlerClasses.add(clazz); - } catch (final ClassNotFoundException e) { - throw new OpenEJBException("Unable to load webservice handler class: " + handler.getHandlerClass(), e); - } + handlerClasses.add(realClassName(handler.getHandlerClass())); } } } @@ -4744,7 +4754,7 @@ public class AnnotationDeployer implemen handlerClasses.removeAll(processedClasses); // process handler classes - final AnnotationFinder handlerAnnotationFinder = createFinder(handlerClasses.toArray(new Class<?>[handlerClasses.size()])); + final AnnotationFinder handlerAnnotationFinder = finder.select(handlerClasses); /* * @EJB @@ -5124,11 +5134,6 @@ public class AnnotationDeployer implemen return null; } - private boolean getFirstt(final List<?> list) { - return list.size() > 0; - } - - /** * Remote interface validation * Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1617907&r1=1617906&r2=1617907&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java Thu Aug 14 09:56:53 2014 @@ -1124,7 +1124,7 @@ public class DeploymentLoader implements try { finder = FinderFactory.createFinder(appModule); } catch (final Exception e) { - finder = new FinderFactory.ModuleLimitedFinder(new org.apache.xbean.finder.AnnotationFinder(new WebappAggregatedArchive(appModule.getClassLoader(), appModule.getAltDDs(), xmls))); + finder = new FinderFactory.ModuleLimitedFinder(new FinderFactory.OpenEJBAnnotationFinder(new WebappAggregatedArchive(appModule.getClassLoader(), appModule.getAltDDs(), xmls))); } appModule.setEarLibFinder(finder); Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/FinderFactory.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/FinderFactory.java?rev=1617907&r1=1617906&r2=1617907&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/FinderFactory.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/FinderFactory.java Thu Aug 14 09:56:53 2014 @@ -20,6 +20,12 @@ package org.apache.openejb.config; import org.apache.openejb.OpenEJBRuntimeException; import org.apache.openejb.jee.Beans; import org.apache.openejb.jee.EnterpriseBean; +import org.apache.openejb.jee.Handler; +import org.apache.openejb.jee.HandlerChain; +import org.apache.openejb.jee.PortComponent; +import org.apache.openejb.jee.Servlet; +import org.apache.openejb.jee.SessionBean; +import org.apache.openejb.jee.WebserviceDescription; import org.apache.openejb.loader.SystemInstance; import org.apache.xbean.finder.Annotated; import org.apache.xbean.finder.AnnotationFinder; @@ -69,14 +75,23 @@ public class FinderFactory { if (module instanceof WebModule) { final WebModule webModule = (WebModule) module; finder = newFinder(new WebappAggregatedArchive(webModule, webModule.getScannableUrls())); + if (!finder.foundSomething()) { // test case (AppComposer with new WebApp()) + finder = fallbackAnnotationFinder(module); + } finder.link(); } else if (module instanceof ConnectorModule) { final ConnectorModule connectorModule = (ConnectorModule) module; finder = newFinder(new ConfigurableClasspathArchive(connectorModule, connectorModule.getLibraries())); + if (!finder.foundSomething()) { // test case + finder = fallbackAnnotationFinder(module); + } finder.link(); } else if (module instanceof AppModule) { final Collection<URL> urls = NewLoaderLogic.applyBuiltinExcludes(new UrlSet(AppModule.class.cast(module).getAdditionalLibraries())).getUrls(); finder = newFinder(new WebappAggregatedArchive(module.getClassLoader(), module.getAltDDs(), urls)); + if (!finder.foundSomething()) { // test case + finder = fallbackAnnotationFinder(module); + } } else if (module.getJarLocation() != null) { final String location = module.getJarLocation(); final File file = new File(location); @@ -118,9 +133,8 @@ public class FinderFactory { } private Class<?>[] ensureMinimalClasses(final DeploymentModule module) { + final Collection<Class<?>> finderClasses = new HashSet<>(); if (EjbModule.class.isInstance(module)) { - final Collection<Class<?>> finderClasses = new HashSet<>(); - final EjbModule ejb = EjbModule.class.cast(module); final EnterpriseBean[] enterpriseBeans = ejb.getEjbJar().getEnterpriseBeans(); @@ -130,12 +144,44 @@ public class FinderFactory { } for (final EnterpriseBean bean : enterpriseBeans) { + final String name; + if (SessionBean.class.isInstance(bean)) { + final SessionBean sessionBean = SessionBean.class.cast(bean); + if (sessionBean.getProxy() == null) { + name = sessionBean.getEjbClass(); + } else { + name = sessionBean.getProxy(); + } + } else { + name = bean.getEjbClass(); + } try { - finderClasses.addAll(ancestors(classLoader.loadClass(bean.getEjbClass()))); + final Class<?> clazz = classLoader.loadClass(name); + finderClasses.addAll(ancestors(clazz)); } catch (final ClassNotFoundException e) { // no-op } } + if (ejb.getWebservices() != null) { + for (final WebserviceDescription webservice : ejb.getWebservices().getWebserviceDescription()) { + for (final PortComponent port : webservice.getPortComponent()) { + if (port.getHandlerChains() == null) { + continue; + } + for (final HandlerChain handlerChain : port.getHandlerChains().getHandlerChain()) { + for (final Handler handler : handlerChain.getHandler()) { + if (handler.getHandlerClass() != null) { + try { + finderClasses.addAll(ancestors(classLoader.loadClass(handler.getHandlerClass()))); + } catch (final ClassNotFoundException e) { + // no-op + } + } + } + } + } + } + } for (final org.apache.openejb.jee.Interceptor interceptor : ejb.getEjbJar().getInterceptors()) { try { finderClasses.addAll(ancestors(classLoader.loadClass(interceptor.getInterceptorClass()))); @@ -177,10 +223,38 @@ public class FinderFactory { } } } - - return finderClasses.toArray(new Class<?>[finderClasses.size()]); + } else if (WebModule.class.isInstance(module)) { + final WebModule web = WebModule.class.cast(module); + final ClassLoader classLoader = web.getClassLoader(); + if (web.getWebApp() != null) { + for (final Servlet s : web.getWebApp().getServlet()) { + final String servletClass = s.getServletClass(); + if (servletClass == null) { + continue; + } + try { + finderClasses.addAll(ancestors(classLoader.loadClass(servletClass))); + } catch (final ClassNotFoundException e) { + // no-op + } + } + for (final String s : web.getRestClasses()) { + try { + finderClasses.addAll(ancestors(classLoader.loadClass(s))); + } catch (final ClassNotFoundException e) { + // no-op + } + } + for (final String s : web.getEjbWebServices()) { + try { + finderClasses.addAll(ancestors(classLoader.loadClass(s))); + } catch (final ClassNotFoundException e) { + // no-op + } + } + } } - return new Class<?>[0]; + return finderClasses.toArray(new Class<?>[finderClasses.size()]); } private static OpenEJBAnnotationFinder newFinder(final Archive archive) { @@ -215,14 +289,19 @@ public class FinderFactory { } } - public static class ModuleLimitedFinder implements IAnnotationFinder { - private final IAnnotationFinder delegate; + public static class ModuleLimitedFinder implements IAnnotationFinder, AnnotationFinderDelegate { + private final OpenEJBAnnotationFinder delegate; - public ModuleLimitedFinder(final IAnnotationFinder delegate) { + public ModuleLimitedFinder(final OpenEJBAnnotationFinder delegate) { this.delegate = delegate; } @Override + public OpenEJBAnnotationFinder getOpenEJBFinder() { + return delegate; + } + + @Override public boolean isAnnotationPresent(final Class<? extends Annotation> annotation) { return delegate.isAnnotationPresent(annotation); } @@ -435,7 +514,11 @@ public class FinderFactory { } } - public static class OpenEJBAnnotationFinder extends AnnotationFinder { + public static interface AnnotationFinderDelegate { + OpenEJBAnnotationFinder getOpenEJBFinder(); + } + + public static class OpenEJBAnnotationFinder extends AnnotationFinder implements AnnotationFinderDelegate { private static final String[] JVM_SCANNING_CONFIG = SystemInstance.get().getProperty("openejb.scanning.xbean.jvm", "java.").split(","); public OpenEJBAnnotationFinder(final Archive archive) { @@ -443,6 +526,11 @@ public class FinderFactory { } @Override + public OpenEJBAnnotationFinder getOpenEJBFinder() { + return this; + } + + @Override protected boolean isJvm(final String name) { return sharedIsJvm(name); } Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java?rev=1617907&r1=1617906&r2=1617907&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java Thu Aug 14 09:56:53 2014 @@ -104,6 +104,7 @@ import java.util.Properties; import java.util.concurrent.Callable; import static org.apache.openejb.config.DeploymentFilterable.DEPLOYMENTS_CLASSPATH_PROPERTY; +import static org.apache.openejb.util.Classes.ancestors; @SuppressWarnings("deprecation") public final class ApplicationComposers { @@ -313,7 +314,7 @@ public final class ApplicationComposers ejbDeployment.setDeploymentId(testClass.getName()); final EjbModule ejbModule = new EjbModule(ejbJar, openejbJar); - ejbModule.setFinder(new FinderFactory.OpenEJBAnnotationFinder(new ClassesArchive(testClass))); + ejbModule.setFinder(new FinderFactory.OpenEJBAnnotationFinder(new ClassesArchive(ancestors(testClass)))); appModule.getEjbModules().add(ejbModule); } Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java?rev=1617907&r1=1617906&r2=1617907&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java Thu Aug 14 09:56:53 2014 @@ -33,6 +33,10 @@ import java.lang.reflect.Method; public class DynamicProxyImplFactory { public static boolean isKnownDynamicallyImplemented(final Class<?> clazz) { final Annotated<Class<?>> metaClass = new MetaAnnotatedClass(clazz); + return isKnownDynamicallyImplemented(metaClass, clazz); + } + + public static boolean isKnownDynamicallyImplemented(final Annotated<?> metaClass, final Class<?> clazz) { return clazz.isInterface() && (metaClass.getAnnotation(PersistenceContext.class) != null || metaClass.getAnnotation(Proxy.class) != null);