KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jboss > ejb3 > injection > DependsHandler


1 /*
2  * JBoss, the OpenSource EJB server
3  *
4  * Distributable under LGPL license.
5  * See terms of license at gnu.org.
6  */

7 package org.jboss.ejb3.injection;
8
9 import org.jboss.ejb3.Container;
10 import org.jboss.annotation.ejb.Depends;
11 import org.jboss.ejb3.dd.EjbJarDDObjectFactory;
12 import org.jboss.ejb3.dd.EjbRef;
13 import org.jboss.ejb3.dd.EnterpriseBean;
14 import org.jboss.ejb3.dd.EnterpriseBeans;
15 import org.jboss.ejb3.dd.SessionEnterpriseBean;
16 import org.jboss.aop.Advisor;
17 import org.jboss.logging.Logger;
18 import org.jboss.naming.Util;
19 import org.jboss.annotation.ejb.Depends;
20
21 import javax.naming.Context JavaDoc;
22 import javax.naming.LinkRef JavaDoc;
23 import javax.naming.InitialContext JavaDoc;
24 import javax.annotation.Resources;
25 import javax.annotation.Resource;
26 import javax.management.ObjectName JavaDoc;
27 import javax.management.MalformedObjectNameException JavaDoc;
28 import java.util.List JavaDoc;
29 import java.util.ArrayList JavaDoc;
30 import java.util.Collection JavaDoc;
31 import java.util.Iterator JavaDoc;
32 import java.lang.reflect.Method JavaDoc;
33 import java.lang.reflect.Field JavaDoc;
34
35 import javassist.bytecode.ClassFile;
36 import javassist.bytecode.AnnotationsAttribute;
37 import javassist.bytecode.annotation.Annotation;
38 import javassist.bytecode.annotation.ArrayMemberValue;
39 import javassist.bytecode.annotation.MemberValue;
40 import javassist.bytecode.annotation.StringMemberValue;
41
42 /**
43  * @author <a HREF="mailto:kabir.khan@jboss.org">Kabir Khan</a>
44  * @version $Revision: 1.4.2.2 $
45  */

46 public class DependsHandler
47 {
48    private static final Logger log = Logger.getLogger(DependsHandler.class);
49
50    //TODO provide for dependencies/ejb-refs outside of current deployement descriptor
51
public static Collection JavaDoc getAllDepends(Class JavaDoc ejbClass, EnterpriseBean ejb, EnterpriseBeans ejbs)
52    {
53       ArrayList JavaDoc depends = new ArrayList JavaDoc();
54       Iterator JavaDoc ejbRefs = ejb.getEjbRefs().iterator();
55       while (ejbRefs.hasNext()){
56          String JavaDoc dependencyName = null;
57          try {
58             EjbRef ejbRef = (EjbRef)ejbRefs.next();
59             String JavaDoc remote = ejbRef.getRemote();
60             EnterpriseBean reference = ejbs.findEjbByRemote(remote);
61             if (reference != null){
62                if (reference.getJndiName() != null)
63                   remote = reference.getJndiName();
64                else
65                   remote = reference.getEjbClass();
66             }
67             dependencyName = "jboss.j2ee:service=EJB3,name=" + remote;
68             ObjectName JavaDoc dependency = new ObjectName JavaDoc(dependencyName);
69             depends.add(dependency);
70          }
71          catch(MalformedObjectNameException JavaDoc e)
72          {
73             throw new RuntimeException JavaDoc("'" + dependencyName + "' is not a valid object name");
74          }
75       }
76     
77       return depends;
78    }
79    
80    public static Collection JavaDoc getAllDepends(ClassFile cf, AnnotationsAttribute visible)
81    {
82       ArrayList JavaDoc depends = null;
83
84       //Get the class annotation
85
Annotation info = visible.getAnnotation(org.jboss.annotation.ejb.Depends.class.getName());
86       depends = getDependsValues(depends, info);
87
88       //Get the method annotations
89
for (Iterator JavaDoc methods = cf.getMethods().iterator() ; methods.hasNext() ; )
90       {
91          javassist.bytecode.MethodInfo minfo = (javassist.bytecode.MethodInfo) methods.next();
92          AnnotationsAttribute mgroup = (AnnotationsAttribute) minfo.getAttribute(AnnotationsAttribute.visibleTag);
93          if (mgroup == null) continue;
94          javassist.bytecode.annotation.Annotation binfo = mgroup.getAnnotation(Depends.class.getName());
95          depends = getDependsValues(depends, binfo);
96       }
97
98       for (Iterator JavaDoc fields = cf.getFields().iterator() ; fields.hasNext() ; )
99       {
100          javassist.bytecode.FieldInfo finfo = (javassist.bytecode.FieldInfo) fields.next();
101          AnnotationsAttribute mgroup = (AnnotationsAttribute) finfo.getAttribute(AnnotationsAttribute.visibleTag);
102          if (mgroup == null) continue;
103          javassist.bytecode.annotation.Annotation binfo = mgroup.getAnnotation(Depends.class.getName());
104          depends = getDependsValues(depends, binfo);
105       }
106
107       return depends;
108    }
109
110    private static ArrayList JavaDoc getDependsValues(ArrayList JavaDoc depends, Annotation info)
111    {
112       if (info == null) return depends;
113
114       ArrayMemberValue amv = (ArrayMemberValue) info.getMemberValue("value");
115       MemberValue[] values = amv.getValue();
116
117       for (int i = 0 ; i < values.length ; i++)
118       {
119          StringMemberValue sv = (StringMemberValue)values[i];
120          try
121          {
122             ObjectName JavaDoc on = new ObjectName JavaDoc(sv.getValue());
123             if (depends == null) depends = new ArrayList JavaDoc();
124             depends.add(on);
125          }
126          catch(MalformedObjectNameException JavaDoc e)
127          {
128             throw new RuntimeException JavaDoc("'" + sv.getValue() + "' is not a valid object name");
129          }
130       }
131       return depends;
132    }
133
134
135
136    private static void loadResourcesAnnotation(Container container, Context JavaDoc resourceCtx) throws Exception JavaDoc
137    {
138       Depends depends = (Depends) ((Advisor) container).resolveAnnotation(Depends.class);
139       if (depends == null) return;
140       for (String JavaDoc name : depends.value())
141       {
142          ObjectName JavaDoc objectName = new ObjectName JavaDoc(name);
143       }
144    }
145    public static List JavaDoc loadInjectors(Container container) throws Exception JavaDoc
146    {
147       Class JavaDoc clazz = container.getBeanClass();
148       Method JavaDoc[] methods = clazz.getMethods();
149       ArrayList JavaDoc list = new ArrayList JavaDoc();
150       for (int i = 0; i < methods.length; i++)
151       {
152          Depends dep = (Depends) ((Advisor) container).resolveAnnotation(methods[i], Depends.class);
153          if (dep != null)
154          {
155             if (!methods[i].getName().startsWith("set")) throw new RuntimeException JavaDoc("@Depends can only be used with a set method: " + methods[i]);
156             if (methods[i].getParameterTypes().length != 1) throw new RuntimeException JavaDoc("@Depends annotated setter methods can only take one parameter: " + methods[i]);
157
158             String JavaDoc[] names = dep.value();
159             if (names.length != 1) throw new RuntimeException JavaDoc("@Depends on a method can only take one object name: " + methods[i]);
160             ObjectName JavaDoc on = new ObjectName JavaDoc(names[0]);
161             list.add(new DependsMethodInjector(methods[i], on));
162          }
163       }
164       loadFieldInjectors(clazz, container, list);
165       return list;
166    }
167
168    private static void loadFieldInjectors(Class JavaDoc clazz, Container container, ArrayList JavaDoc list) throws Exception JavaDoc
169    {
170       if (clazz == null || clazz.equals(java.lang.Object JavaDoc.class)) return;
171       loadFieldInjectors(clazz.getSuperclass(), container, list);
172       Field JavaDoc[] fields = clazz.getDeclaredFields();
173       for (int i = 0; i < fields.length; i++)
174       {
175          Depends dep = (Depends) ((Advisor) container).resolveAnnotation(fields[i], Depends.class);
176          if (dep != null)
177          {
178             String JavaDoc[] names = dep.value();
179             if (names.length != 1) throw new RuntimeException JavaDoc("@Depends on a field can only take one object name: " + fields[i]);
180             ObjectName JavaDoc on = new ObjectName JavaDoc(names[0]);
181             list.add(new DependsFieldInjector(fields[i], on));
182          }
183       }
184    }
185 }
186
Popular Tags