001: /*--
002:
003: Copyright (C) 2002-2005 Adrian Price.
004: All rights reserved.
005:
006: Redistribution and use in source and binary forms, with or without
007: modification, are permitted provided that the following conditions
008: are met:
009:
010: 1. Redistributions of source code must retain the above copyright
011: notice, this list of conditions, and the following disclaimer.
012:
013: 2. Redistributions in binary form must reproduce the above copyright
014: notice, this list of conditions, and the disclaimer that follows
015: these conditions in the documentation and/or other materials
016: provided with the distribution.
017:
018: 3. The names "OBE" and "Open Business Engine" must not be used to
019: endorse or promote products derived from this software without prior
020: written permission. For written permission, please contact
021: adrianprice@sourceforge.net.
022:
023: 4. Products derived from this software may not be called "OBE" or
024: "Open Business Engine", nor may "OBE" or "Open Business Engine"
025: appear in their name, without prior written permission from
026: Adrian Price (adrianprice@users.sourceforge.net).
027:
028: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
029: WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
030: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
031: DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT,
032: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
033: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
034: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
035: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
036: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
037: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
038: POSSIBILITY OF SUCH DAMAGE.
039:
040: For more information on OBE, please see
041: <http://obe.sourceforge.net/>.
042:
043: */
044:
045: package org.obe.client.api.rmi;
046:
047: import org.obe.client.api.ClientConfig;
048:
049: import javax.naming.Context;
050: import javax.naming.InitialContext;
051: import javax.naming.NamingException;
052: import javax.sql.DataSource;
053: import java.util.Hashtable;
054:
055: /**
056: * This class can be used for remote access to the JNDI tree.
057: *
058: * @author Adrian Price
059: */
060: public final class JNDIHelper {
061: // OBE EJBs all refer to their data source by this environment name.
062: public static final String EJB_DATA_SOURCE = "java:comp/env/jdbc/TxDataSource";
063: // This is the external JNDI name for OBE's data source.
064: public static final String DEFAULT_DATA_SOURCE = "java:/org/obe/jdbc/DataSource";
065:
066: /**
067: * This method can be used from a J2EE server.
068: *
069: * @return Context
070: * @throws NamingException
071: */
072: public static InitialContext getInitialContext()
073: throws NamingException {
074: return getInitialContext(null, null, null);
075: }
076:
077: /**
078: * This method allows access to different URLs, but with the default
079: * username.
080: *
081: * @param url Server URL.
082: * @return A JNDI InitialContext object.
083: * @throws NamingException
084: */
085: public static InitialContext getInitialContext(String url)
086: throws NamingException {
087:
088: return getInitialContext(url, null, null);
089: }
090:
091: /**
092: * This method is used on the server when a new username is needed for the
093: * JNDI context.
094: *
095: * @param username
096: * @param credentials
097: * @return Context
098: * @throws NamingException
099: */
100: public static InitialContext getInitialContext(String username,
101: Object credentials) throws NamingException {
102:
103: return getInitialContext(null, username, credentials);
104: }
105:
106: /**
107: * This method allows client code to specify URL and credentials with which
108: * to connect. <em>N.B. The caller must close the returned context.</em>
109: *
110: * @param url
111: * @param username
112: * @param credentials
113: * @return A InitialContext object.
114: * @throws NamingException
115: */
116: public static InitialContext getInitialContext(String url,
117: String username, Object credentials) throws NamingException {
118:
119: Hashtable h = new Hashtable();
120:
121: // Under some circumstances it can be necessary to override the default
122: // JNDI initial context factory. For example, certain RPC tunnelling
123: // protocols wrap default JNDI objects with their own marshalling
124: // mechanism.
125: String icfOverride = ClientConfig
126: .getJNDIInitialContextFactoryClass();
127: if (icfOverride != null)
128: h.put(Context.INITIAL_CONTEXT_FACTORY, icfOverride);
129:
130: if (url != null)
131: h.put(Context.PROVIDER_URL, url);
132:
133: if (username != null) {
134: h.put(Context.SECURITY_PRINCIPAL, username);
135:
136: if (credentials != null)
137: h.put(Context.SECURITY_CREDENTIALS, credentials);
138: }
139:
140: return new InitialContext(h);
141: }
142:
143: /**
144: * This method returns a DataSource object from JNDI.
145: *
146: * @param name Name of the DataSource object
147: * @param ctx JNDI Context.
148: * @return DataSource object from JNDI
149: * @throws NamingException
150: */
151: public static DataSource getDataSource(String name, Context ctx)
152: throws NamingException {
153:
154: return (DataSource) ctx.lookup(name);
155: }
156:
157: /**
158: * This method returns a DataSource object from JNDI. This method will open
159: * and close a temporary JNDI context.
160: *
161: * @param name Name of the DataSource object
162: * @return DataSource object from JNDI
163: * @throws NamingException
164: */
165: public static DataSource getDataSource(String name)
166: throws NamingException {
167: Context ctx = getInitialContext();
168: try {
169: return getDataSource(name, ctx);
170: } finally {
171: ctx.close();
172: }
173: }
174:
175: // Do not instantiate this class.
176: private JNDIHelper() {
177: }
178: }
|