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;
+ }
}