1 55 package org.lateralnz.common.util; 56 57 import java.util.HashMap ; 58 import java.util.Hashtable ; 59 import java.util.Map ; 60 import java.util.MissingResourceException ; 61 import java.util.ResourceBundle ; 62 import java.util.StringTokenizer ; 63 64 import javax.ejb.EJBHome ; 65 import javax.ejb.EJBObject ; 66 import javax.naming.Context ; 67 import javax.naming.InitialContext ; 68 import javax.naming.Name ; 69 import javax.naming.NameNotFoundException ; 70 import javax.naming.NamingException ; 71 import javax.naming.spi.ObjectFactory ; 72 import javax.naming.Reference ; 73 import javax.naming.RefAddr ; 74 import javax.naming.StringRefAddr ; 75 import javax.rmi.PortableRemoteObject ; 76 77 import org.apache.log4j.Logger; 78 79 85 public final class JNDIUtils implements Constants, ObjectFactory { 86 private static final Logger log = Logger.getLogger(JNDIUtils.class.getName()); 87 private static final String NAME = "name"; 88 private static final String LOCALHOST = "localhost"; 89 private static final String DOT_ALIAS = ".alias"; 90 91 private static final NamingException NO_DEFAULT_CONTEXT = new NamingException ("no default context"); 92 93 private static Context DEFAULT_CONTEXT = null; 94 private static Context EJB_CONTEXT = null; 95 public static Context DAO_CONTEXT = null; 96 97 private static String defaultContextName = null; 98 private static String ejbContextName = null; 99 private static String daoContextName = null; 100 101 private static String ejbPrefix = null; 102 103 private static ResourceBundle resources; 104 private static Map contexts = new HashMap (); 105 private static Map nonSerializableObjects = new HashMap (); 106 107 108 static { 109 resources = ResourceUtils.getStaticBundle(JNDIUtils.class); 110 try { 111 defaultContextName = resources.getString("default_context.alias"); 112 } 113 catch (Exception e) {} 114 115 try { 116 ejbContextName = resources.getString("ejb_context.alias"); 117 } 118 catch (Exception e) {} 119 120 try { 121 daoContextName = resources.getString("dao_context.alias"); 122 } 123 catch (Exception e) {} 124 125 if (defaultContextName != null) { 126 try { 127 DEFAULT_CONTEXT = getContext(defaultContextName); 128 log.info("got default context " + DEFAULT_CONTEXT); 129 } 130 catch (Exception e) { 131 log.error("error loading default context"); 132 e.printStackTrace(); 133 } 134 } 135 136 if (ejbContextName != null) { 137 try { 138 EJB_CONTEXT = getContext(ejbContextName); 139 } 140 catch (Exception e) { 141 log.error("error loading ejb context"); 142 e.printStackTrace(); 143 } 144 145 } 146 147 if (daoContextName != null) { 148 try { 149 DAO_CONTEXT = getContext(daoContextName); 150 } 151 catch (Exception e) { 152 log.error("error loading dao context"); 153 e.printStackTrace(); 154 } 155 } 156 } 157 158 161 public static final Context getContext(String contextName) throws NamingException { 162 return getContext(contextName, LOCALHOST); 163 } 164 165 168 public static final Context getContext(String contextName, String server) throws NamingException { 169 Context ctx = null; 170 if (log.isDebugEnabled()) { 171 log.debug("getContext(" + contextName + "," + server + ")"); 172 } 173 174 if (ResourceUtils.hasString(resources, contextName + DOT_ALIAS)) { 175 contextName = resources.getString(contextName + DOT_ALIAS); 176 if (log.isDebugEnabled()) { 177 log.debug("found alias, context now " + contextName); 178 } 179 } 180 181 String name = contextName + UNDERSCORE + server; 182 183 if (contexts.containsKey(name)) { 184 ctx = (Context )contexts.get(name); 185 } 186 else { 187 Hashtable ht = new Hashtable (); 188 String ctxparams = null; 189 try { 190 ctxparams = resources.getString(contextName + ".params"); 191 } 192 catch (MissingResourceException mre) { 193 } 195 196 if (!StringUtils.isEmpty(ctxparams)) { 197 StringTokenizer st = new StringTokenizer (ctxparams, COMMA); 198 199 while (st.hasMoreTokens()) { 200 String param = st.nextToken(); 201 try { 202 ht.put(param, resources.getString(contextName + DOT + param)); 203 } 204 catch (MissingResourceException mre) { 205 throw new NamingException ("param " + param + " does not contain a value"); 206 } 207 } 208 } 209 210 if (ht.size() < 1) { 211 ctx = new InitialContext (); 212 } 213 else { 214 String tmp = (String )ht.get(Context.PROVIDER_URL); 215 if (!StringUtils.isEmpty(tmp)) { 216 ht.put(Context.PROVIDER_URL, StringUtils.replace(tmp, "<!--server-->", server)); 217 } 218 219 ctx = new InitialContext (ht); 220 } 221 222 if (log.isDebugEnabled()) { 223 log.debug("context " + name + " = " + ctx + ", env=" + ht.toString()); 224 } 225 contexts.put(name, ctx); 226 } 227 return ctx; 228 } 229 230 public static final Context getDefaultContext() { 231 return DEFAULT_CONTEXT; 232 } 233 234 237 public static void bind(String objectName, Object obj) throws NamingException { 238 if (DEFAULT_CONTEXT == null) { 239 throw NO_DEFAULT_CONTEXT; 240 } 241 else { 242 bind(DEFAULT_CONTEXT, objectName, obj); 243 } 244 } 245 246 249 public static void bind(Context ctx, String objectName, Object obj) throws NamingException { 250 if (log.isDebugEnabled()) { 251 log.debug("binding " + objectName + " into default context " + ctx); 252 } 253 ctx.rebind(objectName, obj); 254 } 255 256 259 public static final void bindNonSerializable(String name, Object obj, Context ctx) throws NamingException { 260 Reference ref = new Reference (obj.getClass().getName(), JNDIUtils.class.getName(), null); 261 ref.add(new StringRefAddr (NAME, name)); 262 ctx.rebind(name, ref); 263 nonSerializableObjects.put(name, obj); 264 } 265 266 public static final Context createSubcontext(Context ctx, String name) throws NamingException { 267 Context context; 268 try { 269 context = (Context )ctx.lookup(name); 270 } 271 catch (NameNotFoundException nnfe) { 272 context = ctx.createSubcontext(name); 273 } 274 return context; 275 } 276 277 280 public static void unbind(String objectName) throws NamingException { 281 if (DEFAULT_CONTEXT == null) { 282 throw NO_DEFAULT_CONTEXT; 283 } 284 else { 285 unbind(DEFAULT_CONTEXT, objectName); 286 } 287 } 288 289 292 public static void unbind(Context ctx, String objectName) throws NamingException { 293 ctx.unbind(objectName); 294 } 295 296 299 public static final Object get(String objectName) throws NamingException { 300 if (DEFAULT_CONTEXT == null) { 301 throw NO_DEFAULT_CONTEXT; 302 } 303 else { 304 return get(DEFAULT_CONTEXT, objectName); 305 } 306 } 307 308 311 public static final Object get(Context ctx, String objectName) throws NamingException { 312 if (StringUtils.isEmpty(objectName)) { 313 throw new NamingException ("no object name specified"); 314 } 315 316 return ctx.lookup(objectName); 317 } 318 319 322 public static final EJBHome getEJBHome(String ejbName, Class ejbHomeClass) throws NamingException { 323 if (EJB_CONTEXT == null) { 324 throw NO_DEFAULT_CONTEXT; 325 } 326 else { 327 return getEJBHome(EJB_CONTEXT, ejbName, ejbHomeClass); 328 } 329 } 330 331 334 public static final EJBHome getEJBHome(Context ctx, String ejbName, Class ejbHomeClass) throws NamingException { 335 Object tmp = get(ctx, ejbName); 336 337 return (EJBHome )PortableRemoteObject.narrow(tmp, ejbHomeClass); 338 } 339 340 343 public static final void remove(EJBObject obj) { 344 if (obj != null) { 345 try { 346 obj.remove(); 347 } 351 catch (Exception e) {} 352 } 353 } 354 355 356 357 public Object getObjectInstance(Object obj, Name name, Context ctx, Hashtable environment) throws NamingException { 358 Reference ref = (Reference )obj; 359 Object rtn = nonSerializableObjects.get(getProperty(ref, "name")); 360 System.out.println("JNDI " + getProperty(ref, "name") + ", " + rtn.getClass().getName()); 361 return rtn; 362 } 363 364 protected String getProperty(Reference ref, String s) { 365 RefAddr addr = ref.get(s); 366 if (addr == null) { 367 return null; 368 } 369 return (String )addr.getContent(); 370 } 371 372 public static final void main(String [] args) { 373 try { 374 Object obj = JNDIUtils.getEJBHome(args[0], Class.forName(args[1])); 375 System.out.println(">> got object " + obj.getClass().getName()); 376 java.lang.reflect.Method method = obj.getClass().getMethod("create", null); 377 Object ejb = method.invoke(obj, null); 378 System.out.println(">> got ejb " + ejb.getClass().getName()); 379 java.lang.reflect.Method ejbmethod = ejb.getClass().getMethod(args[2], null); 380 System.out.println(ejbmethod.invoke(ejb, null)); 381 } 382 catch (Exception e) { 383 e.printStackTrace(); 384 } 385 } 386 } | Popular Tags |