| 1 7 package winstone.jndi; 8 9 import java.lang.reflect.Constructor ; 10 import java.lang.reflect.Method ; 11 import java.util.ArrayList ; 12 import java.util.Collection ; 13 import java.util.HashMap ; 14 import java.util.Iterator ; 15 import java.util.List ; 16 import java.util.Map ; 17 import java.util.Properties ; 18 19 import javax.naming.CompositeName ; 20 import javax.naming.Context ; 21 import javax.naming.InitialContext ; 22 import javax.naming.Name ; 23 import javax.naming.NamingException ; 24 25 import winstone.JNDIManager; 26 import winstone.Logger; 27 import winstone.WinstoneResourceBundle; 28 import winstone.jndi.resourceFactories.WinstoneDataSource; 29 30 36 public class ContainerJNDIManager implements JNDIManager { 37 public static final WinstoneResourceBundle JNDI_RESOURCES = new WinstoneResourceBundle("winstone.jndi.LocalStrings"); 38 39 protected Map objectsToCreate; 40 41 46 public ContainerJNDIManager(Map args, List webXmlNodes, ClassLoader loader) { 47 this.objectsToCreate = new HashMap (); 49 50 Collection keys = new ArrayList (args != null ? args.keySet() : (Collection ) new ArrayList ()); 51 for (Iterator i = keys.iterator(); i.hasNext();) { 52 String key = (String ) i.next(); 53 54 if (key.startsWith("jndi.resource.")) { 55 String resName = key.substring(14); 56 String className = (String ) args.get(key); 57 String value = (String ) args.get("jndi.param." + resName 58 + ".value"); 59 Logger.log(Logger.FULL_DEBUG, JNDI_RESOURCES, 60 "ContainerJNDIManager.CreatingResourceArgs", resName); 61 Object obj = createObject(resName.trim(), className.trim(), 62 value, args, loader); 63 if (obj != null) 64 this.objectsToCreate.put(resName, obj); 65 } 66 } 67 } 68 69 73 public void setup() { 74 75 try { 76 InitialContext ic = new InitialContext (); 77 for (Iterator i = this.objectsToCreate.keySet().iterator(); i.hasNext();) { 78 String name = (String ) i.next(); 79 try { 80 Name fullName = new CompositeName (name); 81 Context currentContext = ic; 82 while (fullName.size() > 1) { 83 try { 85 currentContext = currentContext 86 .createSubcontext(fullName.get(0)); 87 } catch (NamingException err) { 88 currentContext = (Context ) currentContext 89 .lookup(fullName.get(0)); 90 } 91 fullName = fullName.getSuffix(1); 92 } 93 ic.bind(name, this.objectsToCreate.get(name)); 94 Logger.log(Logger.FULL_DEBUG, JNDI_RESOURCES, 95 "ContainerJNDIManager.BoundResource", name); 96 } catch (NamingException err) { 97 Logger.log(Logger.ERROR, JNDI_RESOURCES, 98 "ContainerJNDIManager.ErrorBindingResource", 99 name, err); 100 } 101 } 102 Logger.log(Logger.DEBUG, JNDI_RESOURCES, 103 "ContainerJNDIManager.SetupComplete", "" + this.objectsToCreate.size()); 104 } catch (NamingException err) { 105 Logger.log(Logger.ERROR, JNDI_RESOURCES, 106 "ContainerJNDIManager.ErrorGettingInitialContext", err); 107 } 108 } 109 110 114 public void tearDown() { 115 try { 116 InitialContext ic = new InitialContext (); 117 for (Iterator i = this.objectsToCreate.keySet().iterator(); i 118 .hasNext();) { 119 String name = (String ) i.next(); 120 try { 121 ic.unbind(name); 122 } catch (NamingException err) { 123 Logger.log(Logger.ERROR, JNDI_RESOURCES, 124 "ContainerJNDIManager.ErrorUnbindingResource", name, 125 err); 126 } 127 Object unboundObject = this.objectsToCreate.get(name); 128 if (unboundObject instanceof WinstoneDataSource) 129 ((WinstoneDataSource) unboundObject).destroy(); 130 Logger.log(Logger.FULL_DEBUG, JNDI_RESOURCES, 131 "ContainerJNDIManager.UnboundResource", name); 132 } 133 Logger.log(Logger.DEBUG, JNDI_RESOURCES, 134 "ContainerJNDIManager.TeardownComplete", "" + this.objectsToCreate.size()); 135 } catch (NamingException err) { 136 Logger.log(Logger.ERROR, JNDI_RESOURCES, 137 "ContainerJNDIManager.ErrorGettingInitialContext", err); 138 } 139 } 140 141 144 protected Object createObject(String name, String className, String value, 145 Map args, ClassLoader loader) { 146 147 if ((className == null) || (name == null)) 148 return null; 149 150 ClassLoader cl = Thread.currentThread().getContextClassLoader(); 152 Thread.currentThread().setContextClassLoader(loader); 153 154 try { 155 if (className.equals("javax.sql.DataSource")) { 157 try { 158 return new WinstoneDataSource(name, extractRelevantArgs(args, name), loader); 159 } catch (Throwable err) { 160 Logger.log(Logger.ERROR, JNDI_RESOURCES, 161 "ContainerJNDIManager.ErrorBuildingDatasource", name, err); 162 } 163 } 164 165 else if (className.equals("javax.mail.Session")) { 167 try { 168 Class smtpClass = Class.forName(className, true, loader); 169 Method smtpMethod = smtpClass.getMethod("getInstance", 170 new Class [] { Properties .class, 171 Class.forName("javax.mail.Authenticator") }); 172 return smtpMethod.invoke(null, new Object [] { 173 extractRelevantArgs(args, name), null }); 174 } catch (Throwable err) { 176 Logger.log(Logger.ERROR, JNDI_RESOURCES, 177 "ContainerJNDIManager.ErrorBuildingMailSession", 178 name, err); 179 } 180 } 181 182 else if (value != null) { 184 try { 185 Class objClass = Class.forName(className.trim(), true, loader); 186 Constructor objConstr = objClass 187 .getConstructor(new Class [] { String .class }); 188 return objConstr.newInstance(new Object [] { value }); 189 } catch (Throwable err) { 190 Logger.log(Logger.ERROR, JNDI_RESOURCES, 191 "ContainerJNDIManager.ErrorBuildingObject", new String [] { 192 name, className }, err); 193 } 194 } 195 196 return null; 197 198 } finally { 199 Thread.currentThread().setContextClassLoader(cl); 200 } 201 } 202 203 206 private Properties extractRelevantArgs(Map input, String name) { 207 Properties relevantArgs = new Properties (); 208 for (Iterator i = input.keySet().iterator(); i.hasNext();) { 209 String key = (String ) i.next(); 210 if (key.startsWith("jndi.param." + name + ".")) 211 relevantArgs.put(key.substring(12 + name.length()), input 212 .get(key)); 213 } 214 return relevantArgs; 215 } 216 217 } 218 | Popular Tags |