JNDI DummyContext

Como parte de un proyecto que estoy desarrollando con java, he decidido utilizar JNDI en un módulo como una interfaz estándar para obtener "repositorios" de objetos en tiempo de ejecución. Muchos servidores de aplicaciones (Glassfish, Tomcat, Jetty, entre otros) proveen una implementación disponible para las aplicaciones que se ejecuten en éste, sin embargo para hacer pruebas resulta conveniente contar con un SPI de JNDI independiente y sencillo.

La implementación puede ser extremadamente sencilla, tomando en cuenta sólo la funcionalidad que se necesita para cada aplicación:

TestDummyContext.java

  1. package org.devpower.test.jndi;
  2.  
  3. public class TestDummyContext {
  4.  
  5. public static void main(String[] args) {
  6. System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
  7. "org.devpower.test.jndi.DummyContextFactory");
  8.  
  9. Context context = new InitialContext();
  10. System.out.println(context.lookup("test"));
  11. }
  12. }

DummyContextFactory.java

  1. package org.devpower.test.jndi;
  2.  
  3. import java.util.Map;
  4. import java.util.HashMap;
  5. import java.util.Hashtable;
  6. import javax.naming.NamingException;
  7. import javax.naming.Context;
  8.  
  9. /**
  10.  * Esta factory es la encargada de proveer la implementación
  11.  * del contexto que se inicializará al crear un nuevo InitialContext
  12.  */
  13. public class DummyContextFactory implements InitialContextFactory {
  14.  
  15. /**
  16.   * Este objeto sólo guarda referencias a objetos en un
  17.   * HashMap<String, Object>, todos los métodos lanzan
  18.   * una excepción de tipo UnsupportedOperationException
  19.   * excepto bind(String name, Object object) y lookup(String name)
  20.   * que son utilizados en el ejemplo.
  21.   */
  22. private static class DummyContext implements Context {
  23.  
  24. private Map<String, Object> bindings;
  25.  
  26. public DummyContext() {
  27. this.bindings = new HashMap<String, Object>();
  28. }
  29.  
  30. @Override
  31. public void bind(String name, Object obj) throws NamingException {
  32. bindings.put(name, obj);
  33. }
  34.  
  35. @Override
  36. public Object lookup(String name) throws NamingException {
  37. return bindings.get(name);
  38. }
  39.  
  40. /**
  41.   * LOS DEMÁS MÉTODOS QUE SÓLO LANZAN UnsupportedOperationException
  42.   * se excluyen...
  43.   *
  44.   */
  45. }
  46.  
  47. private static final DummyContext context;
  48.  
  49. static {
  50. context = new DummyContext();
  51.  
  52. context.bind("test", new Object());
  53. }
  54.  
  55. public Context getInitialContext(Hashtable<?, ?> env)
  56. throws NamingException {
  57.  
  58. return context;
  59. }
  60. }

Posted by:

Share:

Leave a Reply



(Your email will not be publicly displayed.)