1 22 package org.jboss.injection; 23 24 import java.lang.reflect.InvocationTargetException ; 25 import java.lang.reflect.Method ; 26 import javax.naming.Context ; 27 import javax.naming.NamingException ; 28 import org.jboss.ejb3.BeanContext; 29 import org.jboss.logging.Logger; 30 31 37 public class JndiMethodInjector implements Injector, PojoInjector 38 { 39 private static final Logger log = Logger.getLogger(JndiMethodInjector.class); 40 41 private Method setMethod; 42 private String jndiName; 43 private Context ctx; 44 45 public JndiMethodInjector(Method setMethod, String jndiName, Context ctx) 46 { 47 this.setMethod = setMethod; 48 setMethod.setAccessible(true); 49 this.jndiName = jndiName; 50 this.ctx = ctx; 51 } 52 53 public void inject(BeanContext bctx) 54 { 55 inject(bctx, bctx.getInstance()); 56 } 57 58 public Class getInjectionClass() 59 { 60 return setMethod.getParameterTypes()[0]; 61 } 62 63 protected Object lookup(String jndiName, Class param) 64 { 65 Object dependency = null; 66 67 try 68 { 69 dependency = ctx.lookup(jndiName); 70 } 71 catch (NamingException e) 72 { 73 e.printStackTrace(); 74 throw new RuntimeException ("Unable to @Inject jndi dependency: " + jndiName + " into method " + setMethod, e); 75 } 76 return dependency; 77 } 78 79 public void inject(BeanContext bctx, Object instance) 80 { 81 inject(instance); 82 } 83 84 public void inject(Object instance) 85 { 86 Object dependency = lookup(jndiName, setMethod.getParameterTypes()[0]); 87 88 Object [] args = {dependency}; 89 try 90 { 91 setMethod.invoke(instance, args); 92 } 93 catch (IllegalAccessException e) 94 { 95 throw new RuntimeException (e); } 97 catch (IllegalArgumentException e) 98 { 99 String type = "UNKNOWN"; 100 if (dependency != null) type = dependency.getClass().getName(); 101 throw new RuntimeException ("Non matching type for @Inject of setter: " + setMethod + " for type: " + type, e); } 103 catch (InvocationTargetException e) 104 { 105 throw new RuntimeException (e.getCause()); } 107 } 108 } 109 | Popular Tags |