001: /*
002: * JBoss, Home of Professional Open Source
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * by the @authors tag. See the copyright.txt in the distribution for a
005: * full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jnp.server;
023:
024: import java.util.Enumeration;
025: import java.util.Hashtable;
026:
027: import javax.naming.Context;
028: import javax.naming.InitialContext;
029: import javax.naming.RefAddr;
030: import javax.naming.Reference;
031: import javax.naming.StringRefAddr;
032:
033: import org.jboss.logging.Logger;
034: import org.jboss.naming.ENCFactory;
035: import org.jnp.interfaces.Naming;
036: import org.jnp.interfaces.NamingContext;
037:
038: /**
039: * A naming pojo that wraps the Naming server implementation. This is
040: * a refactoring of the legacy org.jnp.server.Main into a
041: *
042: * @author Scott.Stark@jboss.org
043: * @version $Revision:$
044: */
045: public class NamingBeanImpl implements NamingBean {
046: private static Logger log = Logger.getLogger(NamingBeanImpl.class);
047: // Attributes ----------------------------------------------------
048: /** The Naming interface server implementation */
049: protected Naming theServer;
050: /** A flag indicating if theServer will be set as the NamingContext.setLocal value */
051: protected boolean InstallGlobalService = true;
052: /** A flag indicating if theServer will try to use the NamingContext.setLocal value */
053: protected boolean UseGlobalService = true;
054:
055: // Static --------------------------------------------------------
056: public static void main(String[] args) throws Exception {
057: new Main().start();
058: }
059:
060: // Constructors --------------------------------------------------
061: public NamingBeanImpl() {
062: }
063:
064: // Public --------------------------------------------------------
065: public Naming getNamingInstance() {
066: return theServer;
067: }
068:
069: public boolean getInstallGlobalService() {
070: return InstallGlobalService;
071: }
072:
073: public void setInstallGlobalService(boolean flag) {
074: this .InstallGlobalService = flag;
075: }
076:
077: public boolean getUseGlobalService() {
078: return UseGlobalService;
079: }
080:
081: public void setUseGlobalService(boolean flag) {
082: this .UseGlobalService = flag;
083: }
084:
085: public void start() throws Exception {
086: // Create the local naming service instance if it does not exist
087: if (theServer == null) {
088: // See if we should try to reuse the current local server
089: if (UseGlobalService == true)
090: theServer = NamingContext.localServer;
091: // If not, or there is no server create one
092: if (theServer == null)
093: theServer = new NamingServer();
094: else {
095: // We need to wrap the server to allow exporting it
096: NamingServerWrapper wrapper = new NamingServerWrapper(
097: theServer);
098: theServer = wrapper;
099: }
100: log.debug("Using NamingServer: " + theServer);
101: if (InstallGlobalService == true) {
102: // Set local server reference
103: NamingContext.setLocal(theServer);
104: log
105: .debug("Installed global NamingServer: "
106: + theServer);
107: }
108: }
109:
110: /* Create a default InitialContext and dump out its env to show what properties
111: were used in its creation. If we find a Context.PROVIDER_URL property
112: issue a warning as this means JNDI lookups are going through RMI.
113: */
114: InitialContext iniCtx = new InitialContext();
115: Hashtable env = iniCtx.getEnvironment();
116: log.debug("InitialContext Environment: ");
117: Object providerURL = null;
118: for (Enumeration keys = env.keys(); keys.hasMoreElements();) {
119: Object key = keys.nextElement();
120: Object value = env.get(key);
121: String type = value == null ? "" : value.getClass()
122: .getName();
123: log.debug("key=" + key + ", value(" + type + ")=" + value);
124: if (key.equals(Context.PROVIDER_URL))
125: providerURL = value;
126: }
127: // Warn if there was a Context.PROVIDER_URL
128: if (providerURL != null)
129: log
130: .warn("Context.PROVIDER_URL in server jndi.properties, url="
131: + providerURL);
132:
133: /* Bind an ObjectFactory to "java:comp" so that "java:comp/env" lookups
134: produce a unique context for each thread contexxt ClassLoader that
135: performs the lookup.
136: */
137: ClassLoader topLoader = Thread.currentThread()
138: .getContextClassLoader();
139: ENCFactory.setTopClassLoader(topLoader);
140: RefAddr refAddr = new StringRefAddr("nns", "ENC");
141: Reference envRef = new Reference("javax.namingMain.Context",
142: refAddr, ENCFactory.class.getName(), null);
143: Context ctx = (Context) iniCtx.lookup("java:");
144: ctx.rebind("comp", envRef);
145: ctx.close();
146: iniCtx.close();
147:
148: }
149:
150: public void stop() {
151: }
152:
153: }
|