001 /*
002 @license.text@
003 */
004 package biz.hammurapi.config;
005
006 import java.util.Hashtable;
007
008 import javax.naming.InitialContext;
009 import javax.naming.NamingException;
010
011 import org.apache.xpath.XPathAPI;
012 import org.w3c.dom.Element;
013 import org.w3c.dom.Node;
014 import org.w3c.dom.traversal.NodeIterator;
015
016 import biz.hammurapi.convert.CompositeConverter;
017 import biz.hammurapi.xml.dom.DOMUtils;
018
019 /**
020 * Binds to jndi context and bridges pv-naming with jndi naming.
021 *
022 * @author Pavel Vlasov
023 * @revision $Revision$
024 */
025 public class JndiBridge extends ComponentBase implements DomConfigurable {
026 private Hashtable ctxProps = new Hashtable();
027
028 private javax.naming.Context master;
029
030 private String name;
031
032 public JndiBridge() {
033 super();
034 }
035
036 public void start() throws ConfigurationException {
037 try {
038 InitialContext jndiContext = new InitialContext(ctxProps);
039 master = (javax.naming.Context) (name == null ? jndiContext : jndiContext.lookup(name));
040 } catch (NamingException e) {
041 throw new ConfigurationException(e);
042 }
043 }
044
045 public void stop() throws ConfigurationException {
046 if (master != null) {
047 try {
048 master.close();
049 } catch (NamingException e) {
050 throw new ConfigurationException(e);
051 }
052 }
053 }
054
055 protected Object getChild(String name) {
056 try {
057 return master.lookup(name);
058 } catch (NamingException e) {
059 throw new RuntimeConfigurationException("Lookup failed for '" + name + "' " + e, e);
060 }
061 }
062
063 public void configure(Node configNode, Context context) throws ConfigurationException {
064 try {
065 NodeIterator nit = XPathAPI.selectNodeIterator(configNode, "environment-property");
066 Element e;
067 while ((e = (Element) nit.nextNode()) != null) {
068 Object value = DOMUtils.getNonBlankElementText(e);
069 if (e.hasAttribute("type")) {
070 value = CompositeConverter.getDefaultConverter().convert(value, Class.forName(e.getAttribute("type")), false);
071 }
072 ctxProps.put(e.getAttribute("name"), value);
073 }
074 Element ce = (Element) configNode;
075 if (ce.hasAttribute("jndi-name")) {
076 name = ce.getAttribute("jndi-name");
077 }
078 } catch (Exception e) {
079 throw new ConfigurationException(e);
080 }
081 }
082
083 }