You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2006/12/07 07:37:47 UTC

svn commit: r483357 - in /incubator/openejb/trunk/openejb3: container/openejb-core/src/main/java/org/apache/openejb/alt/config/ container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ container/openejb-jee/src/main/java/org/apache/op...

Author: dblevins
Date: Wed Dec  6 22:37:43 2006
New Revision: 483357

URL: http://svn.apache.org/viewvc?view=rev&rev=483357
Log:
Initial support for OPENEJB-232: javax.ejb.EJB and OPENEJB-233: javax.ejb.EJBs
More to come

Modified:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/AnnotationDeployer.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/JndiEncInfoBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbLocalRef.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbRef.java
    incubator/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/InjectionMetaData.java

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/AnnotationDeployer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/AnnotationDeployer.java?view=diff&rev=483357&r1=483356&r2=483357
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/AnnotationDeployer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/AnnotationDeployer.java Wed Dec  6 22:37:43 2006
@@ -36,6 +36,7 @@
 import org.apache.openejb.jee.EjbRef;
 import org.apache.openejb.jee.InjectionTarget;
 import org.apache.openejb.jee.JndiConsumer;
+import org.apache.openejb.jee.EjbLocalRef;
 import org.apache.openejb.util.Logger;
 import org.apache.xbean.finder.ClassFinder;
 
@@ -56,6 +57,8 @@
 import javax.ejb.MessageDriven;
 import javax.ejb.EJB;
 import javax.ejb.EJBHome;
+import javax.ejb.EJBs;
+import javax.ejb.EJBLocalHome;
 import java.io.File;
 import java.lang.reflect.Method;
 import java.lang.reflect.Field;
@@ -424,6 +427,19 @@
         }
 
         private void buildAnnotatedRefs(Class clazz, JndiConsumer consumer) {
+            List<EJB> list = new ArrayList<EJB>();
+            EJBs ejbs = (EJBs) clazz.getAnnotation(EJBs.class);
+            if(ejbs != null){
+                list.addAll(Arrays.asList(ejbs.value()));
+            }
+            list.add((EJB) clazz.getAnnotation(EJB.class));
+
+            for (EJB ejb : list) {
+                if (ejb == null) continue;
+
+                buildEjbRef(consumer, ejb, null);
+            }
+
             ClassFinder finder = new ClassFinder(clazz);
 
             for (Field field : finder.findAnnotatedFields(EJB.class)) {
@@ -431,9 +447,7 @@
 
                 Member member = new FieldMember(field);
 
-                EjbRef ejbRef = buildEjbRef(member, ejb);
-
-                consumer.getEjbRef().add(ejbRef);
+                buildEjbRef(consumer, ejb, member);
             }
 
             for (Method method : finder.findAnnotatedMethods(EJB.class)) {
@@ -441,45 +455,67 @@
 
                 Member member = new MethodMember(method);
 
-                EjbRef ejbRef = buildEjbRef(member, ejb);
-
-                consumer.getEjbRef().add(ejbRef);
+                buildEjbRef(consumer, ejb, member);
             }
         }
 
-        private EjbRef buildEjbRef(Member member, EJB ejb) {
+        private void buildEjbRef(JndiConsumer consumer, EJB ejb, Member member) {
             EjbRef ejbRef = new EjbRef();
 
-            // Set the member name where this will be injected
-            InjectionTarget target = new InjectionTarget();
-            target.setInjectionTargetClass(member.getDeclaringClass().getName());
-            target.setInjectionTargetName(member.getName());
-            ejbRef.getInjectionTarget().add(target);
+            // This is how we deal with the fact that we don't know
+            // whether to use an EjbLocalRef or EjbRef (remote).
+            // We flag it uknown and let the linking code take care of
+            // figuring out what to do with it.
+            ejbRef.setType(EjbRef.Type.UNKNOWN);
+
+            if (member != null){
+                // Set the member name where this will be injected
+                InjectionTarget target = new InjectionTarget();
+                target.setInjectionTargetClass(member.getDeclaringClass().getName());
+                target.setInjectionTargetName(member.getName());
+                ejbRef.getInjectionTarget().add(target);
+            }
 
             Class interfce = ejb.beanInterface();
             if (interfce.equals(Object.class)){
-                interfce = member.getType();
+                interfce = (member == null)? null: member.getType();
             }
 
-            // Get the home and remote interfaces
-            if (EJBHome.class.isAssignableFrom(interfce)){
-                ejbRef.setHome(interfce.getName());
-                Method[] methods = interfce.getMethods();
-                for (Method method : methods) {
-                    if (method.getName().startsWith("create")){
-                        ejbRef.setRemote(method.getReturnType().getName());
-                        break;
+            if (interfce != null && !interfce.equals(Object.class)){
+                if (EJBHome.class.isAssignableFrom(interfce)){
+                    ejbRef.setHome(interfce.getName());
+                    Method[] methods = interfce.getMethods();
+                    for (Method method : methods) {
+                        if (method.getName().startsWith("create")){
+                            ejbRef.setRemote(method.getReturnType().getName());
+                            break;
+                        }
+                    }
+                    ejbRef.setType(EjbRef.Type.REMOTE);
+                } else if (EJBLocalHome.class.isAssignableFrom(interfce)){
+                    ejbRef.setHome(interfce.getName());
+                    Method[] methods = interfce.getMethods();
+                    for (Method method : methods) {
+                        if (method.getName().startsWith("create")){
+                            ejbRef.setRemote(method.getReturnType().getName());
+                            break;
+                        }
+                    }
+                    ejbRef.setType(EjbRef.Type.LOCAL);
+                } else {
+                    ejbRef.setRemote(interfce.getName());
+                    if (interfce.getAnnotation(Local.class) != null) {
+                        ejbRef.setType(EjbRef.Type.LOCAL);
+                    } else if (interfce.getAnnotation(Remote.class) != null) {
+                        ejbRef.setType(EjbRef.Type.REMOTE);
                     }
                 }
-            } else {
-                // Must be a business interface ref
-                ejbRef.setRemote(interfce.getName());
             }
 
             // Get the ejb-ref-name
             String refName = ejb.name();
             if (refName.equals("")){
-                refName = member.getDeclaringClass().getName() +"/"+ member.getName();
+                refName = (member == null) ? null : member.getDeclaringClass().getName() + "/" + member.getName();
             }
             ejbRef.setEjbRefName(refName);
 
@@ -496,7 +532,16 @@
                 mappedName = null;
             }
             ejbRef.setMappedName(mappedName);
-            return ejbRef;
+
+            switch(ejbRef.getType()){
+                case UNKNOWN:
+                case REMOTE:
+                    consumer.getEjbRef().add(ejbRef);
+                    break;
+                case LOCAL:
+                    consumer.getEjbLocalRef().add(new EjbLocalRef(ejbRef));
+                    break;
+            }
         }
 
         private List<Class> copy(List<Class> classes) {

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/JndiEncInfoBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/JndiEncInfoBuilder.java?view=diff&rev=483357&r1=483356&r2=483357
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/JndiEncInfoBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/JndiEncInfoBuilder.java Wed Dec  6 22:37:43 2006
@@ -99,6 +99,8 @@
         /* Build Resource References *****************/
         jndi.resourceRefs.addAll(buildResourceRefInfos(jndiConsumer));
 
+        buildAmbiguousEjbRefInfos(jndi, jndiConsumer, ejbName);
+
         jndi.ejbReferences.addAll(buildEjbRefInfos(jndiConsumer, ejbName));
 
         jndi.ejbLocalReferences.addAll(buildEjbLocalRefInfos(jndiConsumer, ejbName));
@@ -111,6 +113,40 @@
         ArrayList<PersistenceUnitInfo> infos = new ArrayList<PersistenceUnitInfo>();
         // TODO: Marshall the data over
         return infos;
+    }
+
+    private void buildAmbiguousEjbRefInfos(JndiEncInfo jndi, JndiConsumer jndiConsumer, String referringComponent) throws OpenEJBException {
+        ArrayList<EjbRef> ejbRefs = new ArrayList<EjbRef>(jndiConsumer.getEjbRef());
+        for (EjbRef ejb : ejbRefs) {
+            if (ejb.getType() != EjbRef.Type.UNKNOWN) continue;
+
+            String interfce = ejb.getRemote();
+
+            EnterpriseBeanInfo otherBean = null;
+
+            if (ejb.getEjbLink() != null) {
+                String ejbLink = ejb.getEjbLink();
+                otherBean = byEjbName.get(ejbLink);
+            }
+
+            if (otherBean != null){
+                if (interfce.equals(otherBean.businessRemote)){
+                    ejb.setType(EjbRef.Type.REMOTE);
+                }  else {
+                    ejb.setType(EjbRef.Type.LOCAL);
+                    jndiConsumer.getEjbRef().remove(ejb);
+                    jndiConsumer.getEjbLocalRef().add(new EjbLocalRef(ejb));
+                }
+            } else {
+                if (byInterfaces.get("r="+ejb.getRemote()+":"+ejb.getHome()) != null){
+                    ejb.setType(EjbRef.Type.REMOTE);
+                } else {
+                    ejb.setType(EjbRef.Type.LOCAL);
+                    jndiConsumer.getEjbRef().remove(ejb);
+                    jndiConsumer.getEjbLocalRef().add(new EjbLocalRef(ejb));
+                }
+            }
+        }
     }
 
     private List<EjbLocalReferenceInfo> buildEjbLocalRefInfos(JndiConsumer item, String referringComponent) throws OpenEJBException {

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java?view=diff&rev=483357&r1=483356&r2=483357
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java Wed Dec  6 22:37:43 2006
@@ -116,7 +116,7 @@
                 if (referenceInfo.homeType == null){
                     String jndiName = "java:openejb/ejb/" + location.ejbDeploymentId + "BusinessRemote";
                     reference = new IntraVmJndiReference(jndiName);
-                }else {
+                } else {
                     // TODO: Before JndiNameStrategy can be used, this assumption has to be updated
                     String jndiName = "java:openejb/ejb/" + location.ejbDeploymentId;
                     reference = new IntraVmJndiReference(jndiName);
@@ -130,12 +130,19 @@
 
         for (int i = 0; i < ejbLocalReferences.length; i++) {
             EjbLocalReferenceInfo referenceInfo = ejbLocalReferences[i];
-
             EjbReferenceLocationInfo location = referenceInfo.location;
+
+            Reference reference = null;
+
             if (location != null && !location.remote) {
-                // TODO: Before JndiNameStrategy can be used, this assumption has to be updated
-                String jndiName = "java:openejb/ejb/" + location.ejbDeploymentId + "Local";
-                Reference reference = new IntraVmJndiReference(jndiName);
+                if (referenceInfo.homeType == null){
+                    // TODO: Before JndiNameStrategy can be used, this assumption has to be updated
+                    String jndiName = "java:openejb/ejb/" + location.ejbDeploymentId + "BusinessLocal";
+                    reference = new IntraVmJndiReference(jndiName);
+                } else {
+                    String jndiName = "java:openejb/ejb/" + location.ejbDeploymentId + "Local";
+                    reference = new IntraVmJndiReference(jndiName);
+                }
                 bindings.put(normalize(referenceInfo.referenceName), wrapReference(reference));
             }
         }

Modified: incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbLocalRef.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbLocalRef.java?view=diff&rev=483357&r1=483356&r2=483357
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbLocalRef.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbLocalRef.java Wed Dec  6 22:37:43 2006
@@ -84,6 +84,22 @@
     @XmlID
     protected String id;
 
+    public EjbLocalRef() {
+    }
+
+    public EjbLocalRef(EjbRef ref) {
+        this.ejbRefName = ref.getEjbRefName();
+        this.ejbRefType = ref.getEjbRefType();
+        this.ejbLink = ref.getEjbLink();
+        this.mappedName = ref.getMappedName();
+        this.description = ref.getDescription();
+        this.injectionTarget = ref.getInjectionTarget();
+        this.local = ref.getRemote();
+        this.localHome = ref.getHome();
+    }
+
+
+
     public List<Text> getDescription() {
         if (description == null) {
             description = new ArrayList<Text>();

Modified: incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbRef.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbRef.java?view=diff&rev=483357&r1=483356&r2=483357
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbRef.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbRef.java Wed Dec  6 22:37:43 2006
@@ -24,6 +24,7 @@
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlID;
 import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 import java.util.ArrayList;
@@ -83,6 +84,21 @@
     @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
     @XmlID
     protected String id;
+
+    public static enum Type {
+        UNKNOWN, LOCAL, REMOTE;
+    }
+
+    @XmlTransient
+    protected Type type = Type.REMOTE;
+
+    public Type getType() {
+        return type;
+    }
+
+    public void setType(Type type) {
+        this.type = type;
+    }
 
     public List<Text> getDescription() {
         if (description == null) {

Modified: incubator/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/InjectionMetaData.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/InjectionMetaData.java?view=diff&rev=483357&r1=483356&r2=483357
==============================================================================
--- incubator/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/InjectionMetaData.java (original)
+++ incubator/openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/InjectionMetaData.java Wed Dec  6 22:37:43 2006
@@ -40,9 +40,22 @@
     }
 
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        int size = in.readInt();
+        for (int i = 0; i < size; i++) {
+            String jndiName = (String) in.readObject();
+            String name = (String) in.readObject();
+            String target = (String) in.readObject();
+            addInjection(target, name, jndiName);
+        }
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeInt(injections.size());
+        for (Injection injection : injections) {
+            out.writeObject(injection.getJndiName());
+            out.writeObject(injection.getName());
+            out.writeObject(injection.getTargetClass());
+        }
     }
 
 }