1 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 ; 22 import javax.naming.LinkRef ; 23 import javax.naming.InitialContext ; 24 import javax.annotation.Resources; 25 import javax.annotation.Resource; 26 import javax.management.ObjectName ; 27 import javax.management.MalformedObjectNameException ; 28 import java.util.List ; 29 import java.util.ArrayList ; 30 import java.util.Collection ; 31 import java.util.Iterator ; 32 import java.lang.reflect.Method ; 33 import java.lang.reflect.Field ; 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 46 public class DependsHandler 47 { 48 private static final Logger log = Logger.getLogger(DependsHandler.class); 49 50 public static Collection getAllDepends(Class ejbClass, EnterpriseBean ejb, EnterpriseBeans ejbs) 52 { 53 ArrayList depends = new ArrayList (); 54 Iterator ejbRefs = ejb.getEjbRefs().iterator(); 55 while (ejbRefs.hasNext()){ 56 String dependencyName = null; 57 try { 58 EjbRef ejbRef = (EjbRef)ejbRefs.next(); 59 String 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 dependency = new ObjectName (dependencyName); 69 depends.add(dependency); 70 } 71 catch(MalformedObjectNameException e) 72 { 73 throw new RuntimeException ("'" + dependencyName + "' is not a valid object name"); 74 } 75 } 76 77 return depends; 78 } 79 80 public static Collection getAllDepends(ClassFile cf, AnnotationsAttribute visible) 81 { 82 ArrayList depends = null; 83 84 Annotation info = visible.getAnnotation(org.jboss.annotation.ejb.Depends.class.getName()); 86 depends = getDependsValues(depends, info); 87 88 for (Iterator 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 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 getDependsValues(ArrayList 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 on = new ObjectName (sv.getValue()); 123 if (depends == null) depends = new ArrayList (); 124 depends.add(on); 125 } 126 catch(MalformedObjectNameException e) 127 { 128 throw new RuntimeException ("'" + 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 resourceCtx) throws Exception  137 { 138 Depends depends = (Depends) ((Advisor) container).resolveAnnotation(Depends.class); 139 if (depends == null) return; 140 for (String name : depends.value()) 141 { 142 ObjectName objectName = new ObjectName (name); 143 } 144 } 145 public static List loadInjectors(Container container) throws Exception  146 { 147 Class clazz = container.getBeanClass(); 148 Method [] methods = clazz.getMethods(); 149 ArrayList list = new ArrayList (); 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 ("@Depends can only be used with a set method: " + methods[i]); 156 if (methods[i].getParameterTypes().length != 1) throw new RuntimeException ("@Depends annotated setter methods can only take one parameter: " + methods[i]); 157 158 String [] names = dep.value(); 159 if (names.length != 1) throw new RuntimeException ("@Depends on a method can only take one object name: " + methods[i]); 160 ObjectName on = new ObjectName (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 clazz, Container container, ArrayList list) throws Exception  169 { 170 if (clazz == null || clazz.equals(java.lang.Object .class)) return; 171 loadFieldInjectors(clazz.getSuperclass(), container, list); 172 Field [] 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 [] names = dep.value(); 179 if (names.length != 1) throw new RuntimeException ("@Depends on a field can only take one object name: " + fields[i]); 180 ObjectName on = new ObjectName (names[0]); 181 list.add(new DependsFieldInjector(fields[i], on)); 182 } 183 } 184 } 185 } 186 | Popular Tags |