You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2014/08/14 11:56:53 UTC

svn commit: r1617907 - in /tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb: config/ testing/ util/proxy/

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);