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