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 2012/03/21 23:59:12 UTC

svn commit: r1303612 - in /openejb/trunk/openejb/container: openejb-core/src/main/java/org/apache/openejb/assembler/classic/ openejb-core/src/main/java/org/apache/openejb/config/ openejb-core/src/test/java/org/apache/openejb/cdi/ openejb-jee/src/main/j...

Author: rmannibucau
Date: Wed Mar 21 22:59:11 2012
New Revision: 1303612

URL: http://svn.apache.org/viewvc?rev=1303612&view=rev
Log:
OPENEJB-1800 managing @EJB injection of local bean through abstract class

Added:
    openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/cdi/AbstractCDIInjectionTest.java
Modified:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbResolver.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiBuilder.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/JndiEncInfoBuilder.java
    openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/cdi/AbstractInjectionTest.java
    openejb/trunk/openejb/container/openejb-jee/src/main/java/org/apache/openejb/jee/SessionBean.java

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbResolver.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbResolver.java?rev=1303612&r1=1303611&r2=1303612&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbResolver.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbResolver.java Wed Mar 21 22:59:11 2012
@@ -117,6 +117,9 @@ public class EjbResolver {
 
         if (bean.localbean) {
             addInterfaces(new Interfaces(bean.ejbClass, Type.LOCAL, bean.ejbDeploymentId));
+            for (String parent : bean.parents) {
+                addInterfaces(new Interfaces(parent, Type.LOCAL, bean.ejbDeploymentId));
+            }
         }
     }
 

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java?rev=1303612&r1=1303611&r2=1303612&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java Wed Mar 21 22:59:11 2012
@@ -53,6 +53,7 @@ public abstract class EnterpriseBeanInfo
     public String proxy;
     public final List<String> businessLocal = new ArrayList<String>();
     public final List<String> businessRemote = new ArrayList<String>();
+    public final List<String> parents = new ArrayList<String>();
     public boolean localbean;
 
     public String ejbClass;

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiBuilder.java?rev=1303612&r1=1303611&r2=1303612&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiBuilder.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiBuilder.java Wed Mar 21 22:59:11 2012
@@ -400,6 +400,13 @@ public class JndiBuilder {
 
                 optionalBind(bindings, ref, "openejb/Deployment/" + format(bean.getDeploymentID(), beanClass.getName(), InterfaceType.LOCALBEAN));
 
+                // if the user inject the EJB using a parent class
+                if (!bean.getBeanClass().isInterface()) {
+                    for(Class<?> clazz = bean.getBeanClass().getSuperclass(); !clazz.equals(Object.class); clazz = clazz.getSuperclass()) {
+                        optionalBind(bindings, ref, "openejb/Deployment/" + format(bean.getDeploymentID(), clazz.getName(), InterfaceType.LOCALBEAN));
+                    }
+                }
+
                 String internalName = "openejb/Deployment/" + format(bean.getDeploymentID(), beanClass.getName(), InterfaceType.BUSINESS_LOCALBEAN_HOME);
                 bind(internalName, ref, bindings, beanInfo, beanClass);
 

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java?rev=1303612&r1=1303611&r2=1303612&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java Wed Mar 21 22:59:11 2012
@@ -187,7 +187,7 @@ public class JndiEncBuilder {
             } else if (referenceInfo.ejbDeploymentId == null) {
                 reference = new LazyEjbReference(new Ref(referenceInfo), moduleUri, useCrossClassLoaderRef);
             } else {
-                String jndiName = "openejb/Deployment/" + JndiBuilder.format(referenceInfo.ejbDeploymentId, referenceInfo.interfaceClassName, InterfaceType.BUSINESS_REMOTE);
+                String jndiName = "openejb/Deployment/" + JndiBuilder.format(referenceInfo.ejbDeploymentId, referenceInfo.interfaceClassName, referenceInfo.localbean ? InterfaceType.LOCALBEAN : InterfaceType.BUSINESS_REMOTE);
                 if (useCrossClassLoaderRef && referenceInfo.externalReference) {
                     reference = new CrossClassLoaderJndiReference(jndiName);
                 } else {

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1303612&r1=1303611&r2=1303612&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Wed Mar 21 22:59:11 2012
@@ -2151,12 +2151,20 @@ public class AnnotationDeployer implemen
                     if (remoteBean instanceof SessionBean) {
                         SessionBean sessionBean = (SessionBean) remoteBean;
 
+                        // add parents
+                        sessionBean.getParents().add(clazz.getName());
+                        if (!clazz.isInterface()) {
+                            for(Class<?> current = clazz.getSuperclass(); !current.equals(Object.class); current = current.getSuperclass()) {
+                                sessionBean.getParents().add(current.getName());
+                            }
+                        }
+
                         /*
-                         * @Remote
-                         * @Local
-                         * @WebService
-                         * @WebServiceProvider
-                         */
+                        * @Remote
+                        * @Local
+                        * @WebService
+                        * @WebServiceProvider
+                        */
                         processSessionInterfaces(sessionBean, clazz, ejbModule);
 
                         /*

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java?rev=1303612&r1=1303611&r2=1303612&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java Wed Mar 21 22:59:11 2012
@@ -631,6 +631,7 @@ public class EjbJarInfoBuilder {
         bean.localHome = s.getLocalHome();
         bean.local = s.getLocal();
         bean.proxy = s.getProxy();
+        bean.parents.addAll(s.getParents());
         bean.businessLocal.addAll(s.getBusinessLocal());
         bean.businessRemote.addAll(s.getBusinessRemote());
         TransactionType txType = s.getTransactionType();

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/JndiEncInfoBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/JndiEncInfoBuilder.java?rev=1303612&r1=1303611&r2=1303612&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/JndiEncInfoBuilder.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/JndiEncInfoBuilder.java Wed Mar 21 22:59:11 2012
@@ -16,23 +16,57 @@
  */
 package org.apache.openejb.config;
 
-import static org.apache.openejb.assembler.classic.EjbResolver.Scope.EJBJAR;
-import static org.apache.openejb.assembler.classic.EjbResolver.Scope.EAR;
-import org.apache.openejb.OpenEJBException;
-import org.apache.openejb.assembler.classic.*;
-import org.apache.openejb.jee.*;
-import org.apache.openejb.loader.SystemInstance;
-import org.apache.openejb.util.LogCategory;
-import org.apache.openejb.util.Logger;
-import org.apache.openejb.util.Messages;
-
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.HashMap;
+import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.assembler.classic.AppInfo;
+import org.apache.openejb.assembler.classic.EjbJarInfo;
+import org.apache.openejb.assembler.classic.EjbLocalReferenceInfo;
+import org.apache.openejb.assembler.classic.EjbReferenceInfo;
+import org.apache.openejb.assembler.classic.EjbResolver;
+import org.apache.openejb.assembler.classic.EnterpriseBeanInfo;
+import org.apache.openejb.assembler.classic.EnvEntryInfo;
+import org.apache.openejb.assembler.classic.InjectableInfo;
+import org.apache.openejb.assembler.classic.InjectionInfo;
+import org.apache.openejb.assembler.classic.JndiEncInfo;
+import org.apache.openejb.assembler.classic.PersistenceContextReferenceInfo;
+import org.apache.openejb.assembler.classic.PersistenceUnitReferenceInfo;
+import org.apache.openejb.assembler.classic.PortRefInfo;
+import org.apache.openejb.assembler.classic.ReferenceLocationInfo;
+import org.apache.openejb.assembler.classic.ResourceEnvReferenceInfo;
+import org.apache.openejb.assembler.classic.ResourceReferenceInfo;
+import org.apache.openejb.assembler.classic.ServiceReferenceInfo;
+import org.apache.openejb.jee.EjbLocalRef;
+import org.apache.openejb.jee.EjbReference;
+import org.apache.openejb.jee.EnterpriseBean;
+import org.apache.openejb.jee.EnvEntry;
+import org.apache.openejb.jee.Injectable;
+import org.apache.openejb.jee.InjectionTarget;
+import org.apache.openejb.jee.JndiConsumer;
+import org.apache.openejb.jee.JndiReference;
+import org.apache.openejb.jee.MessageDestinationRef;
+import org.apache.openejb.jee.PersistenceContextRef;
+import org.apache.openejb.jee.PersistenceContextType;
+import org.apache.openejb.jee.PersistenceUnitRef;
+import org.apache.openejb.jee.PortComponentRef;
+import org.apache.openejb.jee.Property;
+import org.apache.openejb.jee.ResAuth;
+import org.apache.openejb.jee.ResourceEnvRef;
+import org.apache.openejb.jee.ResourceRef;
+import org.apache.openejb.jee.ServiceRef;
+import org.apache.openejb.jee.SessionBean;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
+import org.apache.openejb.util.Messages;
+
+import static org.apache.openejb.assembler.classic.EjbResolver.Scope.EAR;
+import static org.apache.openejb.assembler.classic.EjbResolver.Scope.EJBJAR;
 
 /**
  * @version $Rev$ $Date$
@@ -375,7 +409,7 @@ public class JndiEncInfoBuilder {
 
     private boolean isIntefaceLocalBean(String moduleId, String interfaceClassName) {
         EnterpriseBeanInfo beanInfo = getInterfaceBeanInfo(moduleId, interfaceClassName);
-        return isLocalBean(beanInfo) && beanInfo.ejbClass.equals(interfaceClassName);
+        return isLocalBean(beanInfo) && beanInfo.parents.contains(interfaceClassName);
     }
 
     private EnterpriseBeanInfo getInterfaceBeanInfo(String moduleId, String interfaceClassName) {
@@ -396,6 +430,15 @@ public class JndiEncInfoBuilder {
             }
         }
 
+        // look if it is an abstract injection (local bean)
+        for (EjbJarInfo ejbJar : ejbJars) {
+            for (EnterpriseBeanInfo enterpriseBean : ejbJar.enterpriseBeans) {
+                if (enterpriseBean.parents.contains(interfaceClassName)) {
+                    return enterpriseBean;
+                }
+            }
+        }
+
         return null;
     }
 

Added: openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/cdi/AbstractCDIInjectionTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/cdi/AbstractCDIInjectionTest.java?rev=1303612&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/cdi/AbstractCDIInjectionTest.java (added)
+++ openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/cdi/AbstractCDIInjectionTest.java Wed Mar 21 22:59:11 2012
@@ -0,0 +1,78 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.cdi;
+
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+import org.apache.openejb.config.EjbModule;
+import org.apache.openejb.jee.Beans;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.Empty;
+import org.apache.openejb.jee.StatelessBean;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.junit.Module;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static junit.framework.Assert.assertTrue;
+
+@RunWith(ApplicationComposer.class)
+public class AbstractCDIInjectionTest {
+    @Inject private AppCDI cdi;
+
+
+    @Module public EjbModule app() throws Exception {
+        final StatelessBean bean = new StatelessBean(AppJpaDAO.class);
+        bean.setLocalBean(new Empty());
+
+        final StatelessBean test = new StatelessBean(AppCDI.class);
+        bean.setLocalBean(new Empty());
+
+        final EjbJar ejbJar = new EjbJar();
+        ejbJar.addEnterpriseBean(bean);
+        ejbJar.addEnterpriseBean(test);
+
+        final Beans beans = new Beans();
+        beans.addManagedClass(PlcBaseDAO.class);
+        beans.addManagedClass(PlcBaseJpaDAO.class);
+
+        final EjbModule jar = new EjbModule(ejbJar);
+        jar.setBeans(beans);
+
+        return jar;
+    }
+
+    public static abstract class PlcBaseDAO {}
+
+    public static abstract class PlcBaseJpaDAO extends PlcBaseDAO {}
+
+    @Stateless
+    public static class AppJpaDAO extends PlcBaseJpaDAO {}
+
+    public static class AppCDI {
+        @Inject
+        private PlcBaseDAO baseDao;
+
+        public boolean ok() {
+            return baseDao != null;
+        }
+    }
+
+    @Test public void valid()  {
+        assertTrue(cdi.ok());
+    }
+}

Modified: openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/cdi/AbstractInjectionTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/cdi/AbstractInjectionTest.java?rev=1303612&r1=1303611&r2=1303612&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/cdi/AbstractInjectionTest.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/cdi/AbstractInjectionTest.java Wed Mar 21 22:59:11 2012
@@ -16,9 +16,8 @@
  */
 package org.apache.openejb.cdi;
 
+import javax.ejb.EJB;
 import javax.ejb.Stateless;
-import javax.inject.Inject;
-import javax.inject.Named;
 import org.apache.openejb.config.EjbModule;
 import org.apache.openejb.jee.Beans;
 import org.apache.openejb.jee.EjbJar;
@@ -33,20 +32,23 @@ import static junit.framework.Assert.ass
 
 @RunWith(ApplicationComposer.class)
 public class AbstractInjectionTest {
-    @Inject private AppCDI cdi;
+    @EJB private AppCDI cdi;
 
 
     @Module public EjbModule app() throws Exception {
         final StatelessBean bean = new StatelessBean(AppJpaDAO.class);
         bean.setLocalBean(new Empty());
 
+        final StatelessBean test = new StatelessBean(AppCDI.class);
+        bean.setLocalBean(new Empty());
+
         final EjbJar ejbJar = new EjbJar();
         ejbJar.addEnterpriseBean(bean);
+        ejbJar.addEnterpriseBean(test);
 
         final Beans beans = new Beans();
         beans.addManagedClass(PlcBaseDAO.class);
         beans.addManagedClass(PlcBaseJpaDAO.class);
-        beans.addManagedClass(AppCDI.class);
 
         final EjbModule jar = new EjbModule(ejbJar);
         jar.setBeans(beans);
@@ -61,10 +63,10 @@ public class AbstractInjectionTest {
     @Stateless
     public static class AppJpaDAO extends PlcBaseJpaDAO {}
 
-    @Named
     public static class AppCDI {
-        @Inject
+        @EJB
         private PlcBaseDAO baseDao;
+
         public boolean ok() {
             return baseDao != null;
         }

Modified: openejb/trunk/openejb/container/openejb-jee/src/main/java/org/apache/openejb/jee/SessionBean.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-jee/src/main/java/org/apache/openejb/jee/SessionBean.java?rev=1303612&r1=1303611&r2=1303612&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-jee/src/main/java/org/apache/openejb/jee/SessionBean.java (original)
+++ openejb/trunk/openejb/container/openejb-jee/src/main/java/org/apache/openejb/jee/SessionBean.java Wed Mar 21 22:59:11 2012
@@ -259,6 +259,9 @@ public class SessionBean implements Remo
     @XmlTransient
     private String proxy;
 
+    @XmlTransient
+    private Collection<String> parents = new ArrayList<String>(); // always needed so initialize it early
+
     public SessionBean() {
     }
 
@@ -906,4 +909,8 @@ public class SessionBean implements Remo
     public String getProxy() {
         return proxy;
     }
+
+    public Collection<String> getParents() {
+        return parents;
+    }
 }