001: /*
002: * CoadunationLib: The coaduntion implementation library.
003: * Copyright (C) 2006 Rift IT Contracting
004: *
005: * This library is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU Lesser General Public
007: * License as published by the Free Software Foundation; either
008: * version 2.1 of the License, or (at your option) any later version.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * Lesser General Public License for more details.
014: *
015: * You should have received a copy of the GNU Lesser General Public
016: * License along with this library; if not, write to the Free Software
017: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
018: *
019: * ContextManager.java
020: *
021: * This object managers a context.
022: */
023:
024: // package path
025: package com.rift.coad.lib.naming;
026:
027: // logging import
028: import org.apache.log4j.Logger;
029:
030: // java imports
031: import java.util.StringTokenizer;
032: import javax.naming.Context;
033: import javax.naming.InitialContext;
034: import javax.naming.CompositeName;
035:
036: /**
037: * This object managers a context.
038: *
039: * @author Brett Chaldecott
040: */
041: public class ContextManager {
042:
043: // the class log variable
044: protected Logger log = Logger.getLogger(ContextManager.class
045: .getName());
046:
047: // the classes private member variables.
048: private Context baseContext = null;
049: private String base = null;
050: private String contextPath = null;
051:
052: /**
053: * Creates a new instance of ContextManager
054: *
055: * @param base The base string context.
056: * @exception NamingException
057: */
058: public ContextManager(String base) throws NamingException {
059: this .base = base;
060: if (base.endsWith("/")) {
061: this .base = base.substring(0, base.length() - 1);
062: }
063: baseContext = initContext(this .base);
064: }
065:
066: /**
067: * This method will bind the object to the context.
068: *
069: * @param name The name of the context.
070: * @param ref The reference to the object.
071: * @exception NamingException
072: */
073: public void bind(String name, Object ref) throws NamingException {
074: try {
075: if (ref == null) {
076: throw new NamingException(
077: "The reference to bind is null");
078: }
079: String bindName = name;
080: if (contextPath != null) {
081: bindName = contextPath + "/" + name;
082: }
083: log.info("Binding [" + bindName + "]");
084: baseContext.bind(bindName, ref);
085: } catch (NamingException ex) {
086: throw ex;
087: } catch (Exception ex) {
088: log.error("Failed to bind to the context : "
089: + ex.getMessage(), ex);
090: throw new NamingException(
091: "Failed to bind the object to the context : "
092: + ex.getMessage(), ex);
093: }
094: }
095:
096: /**
097: * This method will un bind the object from the context.
098: *
099: * @param name The name of the context.
100: * @exception NamingException
101: */
102: public void unbind(String name) throws NamingException {
103: try {
104: String bindName = name;
105: if (contextPath != null) {
106: bindName = contextPath + "/" + name;
107: }
108: baseContext.unbind(bindName);
109: log.info("Un-bound [" + base + "/" + name + "]");
110: } catch (Exception ex) {
111: log.error("Failed to unbind to the context : "
112: + ex.getMessage(), ex);
113: throw new NamingException(
114: "Failed to unbind the object to the context : "
115: + ex.getMessage(), ex);
116: }
117: }
118:
119: /**
120: * This method setups the initial context.
121: *
122: * @return The reference to the base context.
123: * @param base The base context.
124: */
125: private Context initContext(String base) throws NamingException {
126: try {
127: Context context = new InitialContext();
128: StringTokenizer stringTok = new StringTokenizer(base, "/");
129: while (stringTok.hasMoreTokens()) {
130: String entry = stringTok.nextToken();
131: Context subContext = null;
132: try {
133: subContext = (Context) context.lookup(entry);
134: } catch (Exception exc) {
135: // nothing
136: } finally {
137: if (subContext == null) {
138: try {
139: subContext = context
140: .createSubcontext(entry);
141: } catch (javax.naming.OperationNotSupportedException ex) {
142: // this is to deal with some JNDI implementations
143: // not supporting createSubcontext
144: contextPath = base;
145: return context;
146: } catch (javax.naming.NameAlreadyBoundException ex) {
147: contextPath = base;
148: return context;
149: }
150: }
151: }
152: context = subContext;
153: }
154: return context;
155: } catch (Exception ex) {
156: log.error(
157: "Failed to init the context : " + ex.getMessage(),
158: ex);
159: throw new NamingException("Failed to init the context : "
160: + ex.getMessage(), ex);
161: }
162: }
163: }
|