Repository: tomee Updated Branches: refs/heads/master c72fb7204 -> df25e829d
moving cdi activation for EJB modules earlier to scan modules (ie respect the spec) Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/df25e829 Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/df25e829 Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/df25e829 Branch: refs/heads/master Commit: df25e829d9313b19fe5d8c6172eccfb1cbfb671b Parents: c72fb72 Author: Romain manni-Bucau <rmannibu...@gmail.com> Authored: Sat Aug 13 18:01:26 2016 +0200 Committer: Romain manni-Bucau <rmannibu...@gmail.com> Committed: Sat Aug 13 18:01:26 2016 +0200 ---------------------------------------------------------------------- .../java/org/apache/openejb/cdi/CdiEjbBean.java | 9 ++ .../openejb/config/AnnotationDeployer.java | 90 ++++++++++++-------- .../openejb/config/EjbJarInfoBuilder.java | 23 ----- .../cxf/rs/CdiConstructorInjectionTest.java | 2 + .../openejb/server/cxf/rs/EJBProviderTest.java | 2 + 5 files changed, 66 insertions(+), 60 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/df25e829/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java index 9e5c809..30d381e 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java @@ -454,6 +454,15 @@ public class CdiEjbBean<T> extends BaseEjbBean<T> implements InterceptedMarker, } @Override + public void defineInterceptorStack(final Bean<T> bean, final AnnotatedType<T> annotatedType, final WebBeansContext webBeansContext) { + super.defineInterceptorStack(bean, + isDynamicBean(bean) ? + (AnnotatedType<T>) webBeansContext.getAnnotatedElementFactory() + .newAnnotatedType(CdiEjbBean.class.cast(bean).getBeanContext().getManagedClass()) : annotatedType, + webBeansContext); + } + + @Override protected boolean needsProxy() { return !bean.beanContext.isDynamicallyImplemented() && super.needsProxy(); } http://git-wip-us.apache.org/repos/asf/tomee/blob/df25e829/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java b/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java index 93fcf5b..528fb33 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java @@ -246,6 +246,8 @@ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; @@ -1298,43 +1300,6 @@ public class AnnotationDeployer implements DynamicDeployer { final IAnnotationFinder finder = ejbModule.getFinder(); - - final Map<URL, List<String>> managedClasses; - { - final Beans beans = ejbModule.getBeans(); - - if (beans != null) { - managedClasses = beans.getManagedClasses(); - getBeanClasses(beans.getUri(), finder, managedClasses, beans.getNotManagedClasses(), ejbModule.getAltDDs()); - - // passing jar location to be able to manage maven classes/test-classes which have the same moduleId - String id = ejbModule.getModuleId(); - if (ejbModule.getJarLocation() != null && - (ejbModule.getJarLocation().contains(ejbModule.getModuleId() + "/target/test-classes".replace("/", File.separator)) || - ejbModule.getJarLocation().contains(ejbModule.getModuleId() + "/build/classes/test".replace("/", File.separator)))) { - // with maven/gradle if both src/main/java and src/test/java are deployed - // moduleId.Comp exists twice so it fails - // here we simply modify the test comp bean name to avoid it - id += "_test"; - } - final String name = BeanContext.Comp.openejbCompName(id); - final org.apache.openejb.jee.ManagedBean managedBean = new CompManagedBean(name, BeanContext.Comp.class); - managedBean.setTransactionType(TransactionType.BEAN); - ejbModule.getEjbJar().addEnterpriseBean(managedBean); - - if ("true".equals(SystemInstance.get().getProperty("openejb.cdi.support.@Startup", "true"))) { - final List<Annotated<Class<?>>> forceStart = finder.findMetaAnnotatedClasses(Startup.class); - final List<String> startupBeans = beans.getStartupBeans(); - for (final Annotated<Class<?>> clazz : forceStart) { - startupBeans.add(clazz.get().getName()); - } - } - } else { - managedClasses = new HashMap<>(); - } - } - - // Fill in default sessionType for xml declared EJBs for (final EnterpriseBean bean : ejbModule.getEjbJar().getEnterpriseBeans()) { if (!(bean instanceof SessionBean)) { @@ -1534,6 +1499,57 @@ public class AnnotationDeployer implements DynamicDeployer { } } + { // after having found EJB for auto CDI activation + final Map<URL, List<String>> managedClasses; + Beans beans = ejbModule.getBeans(); + if (beans == null && !ejbModule.getEjbJar().getEnterpriseBeansByEjbName().isEmpty() + && Boolean.parseBoolean(ejbModule.getProperties().getProperty("openejb.cdi.activated", "true")) + && Boolean.parseBoolean(SystemInstance.get().getProperty("openejb.cdi.activated-on-ejb", "true"))) { + logger.info("Activating CDI in ACTIVATED mode in module '" + ejbModule.getModuleUri() + "' cause EJB were found\n" + + " add openejb.cdi.activated=false in application.properties to switch it off or\n" + + " openejb.cdi.activated-on-ejb=false in conf/system.properties" + + " to switch it off"); + beans = new Beans(); + beans.setBeanDiscoveryMode("ANNOTATED"); + beans.setVersion("1.1"); + try { + ejbModule.getModuleUri().toURL(); + beans.setUri(ejbModule.getModuleUri().toASCIIString()); + } catch (final MalformedURLException | IllegalArgumentException iae) { // test? fake a URI + beans.setUri(URI.create("jar:file://!/" + ejbModule.getModuleUri().toASCIIString() + "/META-INF/beans.xml").toASCIIString()); + } + ejbModule.setBeans(beans); + } + + if (beans != null) { + managedClasses = beans.getManagedClasses(); + getBeanClasses(beans.getUri(), finder, managedClasses, beans.getNotManagedClasses(), ejbModule.getAltDDs()); + + // passing jar location to be able to manage maven classes/test-classes which have the same moduleId + String id = ejbModule.getModuleId(); + if (ejbModule.getJarLocation() != null && + (ejbModule.getJarLocation().contains(ejbModule.getModuleId() + "/target/test-classes".replace("/", File.separator)) || + ejbModule.getJarLocation().contains(ejbModule.getModuleId() + "/build/classes/test".replace("/", File.separator)))) { + // with maven/gradle if both src/main/java and src/test/java are deployed + // moduleId.Comp exists twice so it fails + // here we simply modify the test comp bean name to avoid it + id += "_test"; + } + final String name = BeanContext.Comp.openejbCompName(id); + final org.apache.openejb.jee.ManagedBean managedBean = new CompManagedBean(name, BeanContext.Comp.class); + managedBean.setTransactionType(TransactionType.BEAN); + ejbModule.getEjbJar().addEnterpriseBean(managedBean); + + if ("true".equals(SystemInstance.get().getProperty("openejb.cdi.support.@Startup", "true"))) { + final List<Annotated<Class<?>>> forceStart = finder.findMetaAnnotatedClasses(Startup.class); + final List<String> startupBeans = beans.getStartupBeans(); + for (final Annotated<Class<?>> clazz : forceStart) { + startupBeans.add(clazz.get().getName()); + } + } + } + } + // ejb can be rest bean and only then in standalone so scan providers here too // adding them to app since they should be in the app classloader if (ejbModule.getAppModule() != null) { http://git-wip-us.apache.org/repos/asf/tomee/blob/df25e829/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java b/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java index bf3e7c0..1d0ba80 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java @@ -102,7 +102,6 @@ import org.apache.openejb.util.Messages; import org.apache.webbeans.spi.BeanArchiveService; import java.net.MalformedURLException; -import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; @@ -314,28 +313,6 @@ public class EjbJarInfoBuilder { bda.decorators.addAll(beans.getDecorators()); bda.stereotypeAlternatives.addAll(beans.getAlternativeStereotypes()); } - } else if (!ejbJar.enterpriseBeans.isEmpty() && Boolean.parseBoolean(jar.getProperties().getProperty("openejb.cdi.activated", "true"))) { - // TOMEE-1901 - ejbJar.beans = new BeansInfo(); - ejbJar.beans.version = "1.1"; - ejbJar.beans.discoveryMode = "ANNOTATED"; - - - final BeansInfo.BDAInfo bdaInfo = new BeansInfo.BDAInfo(); - try { - bdaInfo.uri = ejbJar.moduleUri == null ? DEFAULT_BEANS_XML_KEY.toURI() : ejbJar.moduleUri; - try { - bdaInfo.uri.toURL(); - } catch (final MalformedURLException | IllegalArgumentException iae) { // test? fake a URI - bdaInfo.uri = URI.create("jar:file://!/" + bdaInfo.uri.toASCIIString() + "/META-INF/beans.xml"); - } - } catch (final URISyntaxException e) { - logger.warning(e.getMessage(), e); - } - ejbJar.beans.noDescriptorBdas.add(bdaInfo); - for (final EnterpriseBeanInfo ebi : ejbJar.enterpriseBeans) { - bdaInfo.managedClasses.add(ebi.ejbClass); - } } return ejbJar; http://git-wip-us.apache.org/repos/asf/tomee/blob/df25e829/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CdiConstructorInjectionTest.java ---------------------------------------------------------------------- diff --git a/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CdiConstructorInjectionTest.java b/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CdiConstructorInjectionTest.java index 72b70eb..7b2a643c 100644 --- a/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CdiConstructorInjectionTest.java +++ b/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CdiConstructorInjectionTest.java @@ -30,6 +30,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.context.Dependent; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; @@ -77,6 +78,7 @@ public class CdiConstructorInjectionTest { assertEquals("GET", WebClient.create("http://localhost:" + port + "/app").path("/bar").get(String.class)); } + @Dependent public static class Service { public String bar() { return "service"; http://git-wip-us.apache.org/repos/asf/tomee/blob/df25e829/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EJBProviderTest.java ---------------------------------------------------------------------- diff --git a/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EJBProviderTest.java b/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EJBProviderTest.java index 91bd323..88ee612 100644 --- a/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EJBProviderTest.java +++ b/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EJBProviderTest.java @@ -30,6 +30,7 @@ import javax.annotation.Resource; import javax.ejb.LocalBean; import javax.ejb.SessionContext; import javax.ejb.Singleton; +import javax.enterprise.context.Dependent; import javax.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; @@ -108,6 +109,7 @@ public class EJBProviderTest { } } + @Dependent public static class Helper { String data() { return "Oh Yeah!";