Return-Path: Mailing-List: contact tomcat-dev-help@jakarta.apache.org; run by ezmlm Delivered-To: mailing list tomcat-dev@jakarta.apache.org Received: (qmail 22586 invoked by uid 500); 2 Nov 2000 06:14:19 -0000 Delivered-To: apmail-jakarta-tomcat-4.0-cvs@apache.org Received: (qmail 22583 invoked by uid 1135); 2 Nov 2000 06:14:18 -0000 Date: 2 Nov 2000 06:14:18 -0000 Message-ID: <20001102061418.22582.qmail@locus.apache.org> From: remm@locus.apache.org To: jakarta-tomcat-4.0-cvs@apache.org Subject: cvs commit: jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/java javaURLContextFactory.java remm 00/11/01 22:14:18 Modified: catalina STATUS.html build.xml catalina/src/bin catalina.bat catalina.sh catalina/src/share/org/apache/catalina/core LocalStrings.properties StandardContext.java StandardContextValve.java catalina/src/share/org/apache/catalina/startup Catalina.java Embedded.java EmbeddedManager.java EmbeddedManagerMBean.java Added: catalina/src/share/org/apache/naming Constants.java ContextAccessController.java ContextBindings.java EjbRefAddr.java LocalStrings.properties NameParserImpl.java NamingContext.java NamingContextBindingsEnumeration.java NamingContextEnumeration.java NamingEntry.java NamingService.java NamingServiceMBean.java ResourceEnvRefAddr.java ResourceRefAddr.java SelectorContext.java StringManager.java catalina/src/share/org/apache/naming/factory LocalStrings.properties catalina/src/share/org/apache/naming/java javaURLContextFactory.java Log: - JNDI implementation which provides a per web application naming environment. - 100% independent from Catalina (root package name : org.apache.naming). - The Context implementation supports federation, links and references. - Web application environment support ("java" URL scheme), which is a special read-only JNDI context populated using the web app deployment descriptor. - Updated STATUS.html to reflect that addition. - Generic references are used for EJB and Resources. A set of factories (org.apache.naming.factory) will be provided to interface various popular J2EE providers, whenever possible. - Each web application can also get a writable initial context, which is NOT accessible to other web applications. - Adds various switches in Catalina to enable / disable the naming support : * "-nonaming" command line option completely disables naming * Embedded.setUseNaming(false) also completely disables naming (useful is the embedding application provides its own naming environment) * In server.xml, a new attribute of Context element, "useNaming" can be used to disable the naming support for a specific web application. * By default, internal naming is enabled for each of the web applications. - Updates to the JMX wrapper to Embedded to reflect this. - JMX wrapper to the naming service (named NamingService). It has simple start and stop commands which initialize / restore to previous values when you stop the required environment variables. Revision Changes Path 1.3 +1 -9 jakarta-tomcat-4.0/catalina/STATUS.html Index: STATUS.html =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/STATUS.html,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- STATUS.html 2000/10/10 01:25:22 1.2 +++ STATUS.html 2000/11/02 06:14:07 1.3 @@ -115,14 +115,6 @@ Action Item Volunteers - - Low - Implement the optional web application environment support - described in Section 9.9 of the Servlet API Specification Version 2.2, - and Chapter 5 of the Java2 Platform Enterprise Edition Version 1.2 - Specification. - --- - @@ -313,7 +305,7 @@

-$Id: STATUS.html,v 1.2 2000/10/10 01:25:22 craigmcc Exp $ +$Id: STATUS.html,v 1.3 2000/11/02 06:14:07 remm Exp $
1.19 +10 -3 jakarta-tomcat-4.0/catalina/build.xml Index: build.xml =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/build.xml,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- build.xml 2000/10/12 23:34:09 1.18 +++ build.xml 2000/11/02 06:14:07 1.19 @@ -82,7 +82,12 @@ + includes="org/apache/catalina/startup/Bootstrap.class,org/apache/catalina/loader/**" + /> + @@ -151,7 +156,8 @@ + basedir="${catalina.build}/classes" + excludes="**/org/apache/naming/**" /> @@ -184,7 +190,8 @@ + basedir="${catalina.build}/classes" + excludes="**/org/apache/naming/**" /> 1.12 +2 -2 jakarta-tomcat-4.0/catalina/src/bin/catalina.bat Index: catalina.bat =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/bin/catalina.bat,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- catalina.bat 2000/10/16 18:50:56 1.11 +++ catalina.bat 2000/11/02 06:14:08 1.12 @@ -12,7 +12,7 @@ rem rem JAVA_HOME Must point at your Java Development Kit installation. rem -rem $Id: catalina.bat,v 1.11 2000/10/16 18:50:56 craigmcc Exp $ +rem $Id: catalina.bat,v 1.12 2000/11/02 06:14:08 remm Exp $ rem --------------------------------------------------------------------------- @@ -55,7 +55,7 @@ rem ----- Set Up The Runtime Classpath ---------------------------------------- set CP=%CATALINA_HOME%\bin\bootstrap.jar;%CATALINA_HOME%\bin\servlet.jar -set CP=%CP%;%JAVA_HOME%\lib\tools.jar +set CP=%CP%;%CATALINA_HOME%\bin\naming.jar;%JAVA_HOME%\lib\tools.jar set CLASSPATH=%CP% echo Using CLASSPATH: %CLASSPATH% 1.8 +2 -2 jakarta-tomcat-4.0/catalina/src/bin/catalina.sh Index: catalina.sh =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/bin/catalina.sh,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- catalina.sh 2000/10/16 18:27:45 1.7 +++ catalina.sh 2000/11/02 06:14:08 1.8 @@ -12,7 +12,7 @@ # # JAVA_HOME Must point at your Java Development Kit installation. # -# $Id: catalina.sh,v 1.7 2000/10/16 18:27:45 craigmcc Exp $ +# $Id: catalina.sh,v 1.8 2000/11/02 06:14:08 remm Exp $ # ----------------------------------------------------------------------------- @@ -33,7 +33,7 @@ # ----- Set Up The System Classpath ------------------------------------------- -CP=$CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/servlet.jar +CP=$CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/servlet.jar:$CATALINA_HOME/bin/naming.jar if [ -f $JAVA_HOME/lib/tools.jar ] ; then CP=$CP:$JAVA_HOME/lib/tools.jar 1.18 +4 -0 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/LocalStrings.properties Index: LocalStrings.properties =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/LocalStrings.properties,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- LocalStrings.properties 2000/10/22 09:55:52 1.17 +++ LocalStrings.properties 2000/11/02 06:14:09 1.18 @@ -51,6 +51,10 @@ standardContext.stoppingLoader=Exception stopping Loader standardContext.stoppingManager=Exception stopping Manager standardContext.stoppingWrapper=Exception stopping Wrapper for servlet {0} +standardContext.invalidEnvEntryValue={0} environment entry has an invalid value for specified type +standardContext.invalidEnvEntryType={0} environment entry has an invalid type +standardContext.bindFailed=Bind naming operation failed : {0} +standardContext.namingInitFailed=Error initializing naming context for context {0} standardEngine.alreadyStarted=Engine has already been started standardEngine.mappingError=MAPPING configuration error for server name {0} standardEngine.notHost=Child of an Engine must be a Host 1.25 +225 -4 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardContext.java Index: StandardContext.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardContext.java,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- StandardContext.java 2000/10/29 00:35:04 1.24 +++ StandardContext.java 2000/11/02 06:14:09 1.25 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardContext.java,v 1.24 2000/10/29 00:35:04 craigmcc Exp $ - * $Revision: 1.24 $ - * $Date: 2000/10/29 00:35:04 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardContext.java,v 1.25 2000/11/02 06:14:09 remm Exp $ + * $Revision: 1.25 $ + * $Date: 2000/11/02 06:14:09 $ * * ==================================================================== * @@ -71,6 +71,8 @@ import java.util.HashMap; import java.util.Iterator; import java.util.TreeMap; +import java.util.Hashtable; +import java.util.StringTokenizer; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; @@ -78,6 +80,16 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.naming.NamingException; +import javax.naming.InitialContext; +import javax.naming.Reference; +import javax.naming.StringRefAddr; +import org.apache.naming.NamingContext; +import org.apache.naming.ContextBindings; +import org.apache.naming.ContextAccessController; +import org.apache.naming.EjbRefAddr; +import org.apache.naming.ResourceRefAddr; +import org.apache.naming.ResourceEnvRefAddr; import org.apache.catalina.Container; import org.apache.catalina.ContainerListener; import org.apache.catalina.Context; @@ -114,7 +126,8 @@ * requests directed to a particular servlet. * * @author Craig R. McClanahan - * @version $Revision: 1.24 $ $Date: 2000/10/29 00:35:04 $ + * @author Remy Maucherat + * @version $Revision: 1.25 $ $Date: 2000/11/02 06:14:09 $ */ public final class StandardContext @@ -399,10 +412,34 @@ private String wrapperClass = "org.apache.catalina.core.StandardWrapper"; - // -----------------------------------------------------Context Properties + /** + * JNDI use flag. + */ + private boolean useNaming = true; + + // ----------------------------------------------------- Context Properties + /** + * Returns true if the internal naming support is used. + */ + public boolean isUseNaming() { + + return (useNaming); + + } + + + /** + * Enables or disables naming. + */ + public void setUseNaming(boolean useNaming) { + this.useNaming = useNaming; + } + + + /** * Return the set of initialized application listener objects, * in the order they were specified in the web application deployment * descriptor, for this application. @@ -2736,6 +2773,24 @@ if (!available) return; + // Reading the "catalina.useNaming" environment variable + String useNamingProperty = System.getProperty("catalina.useNaming"); + if ((useNamingProperty != null) + && (useNamingProperty.equals("false"))) { + useNaming = false; + } + + // Create and register the associated naming context, if internal + // naming is used + if (isUseNaming()) { + try { + createNamingContext(); + } catch (NamingException e) { + log(sm.getString("standardContext.namingInitFailed", + getName())); + } + } + // Configure and call application event listeners and filters listenerStart(); filterStart(); @@ -2870,6 +2925,172 @@ super.addDefaultMapper(this.mapperClass); } + + + // -------------------------------------------------------- Private Methods + + + /** + * Create and initialize the JNDI naming context. + */ + private void createNamingContext() + throws NamingException { + + Hashtable contextEnv = new Hashtable(); + javax.naming.Context namingContext = + new NamingContext(contextEnv, getName()); + ContextAccessController.setSecurityToken(getName(), this); + ContextBindings.bindContext(getName(), namingContext, this); + ContextBindings.bindThread(getName(), this); + + // Setting the context in read/write mode + ContextAccessController.setWritable(getName(), this); + + // Creating the comp subcontext + javax.naming.Context compCtx = namingContext.createSubcontext("comp"); + javax.naming.Context envCtx = compCtx.createSubcontext("env"); + + // Now parsing the entries defined in the env, and adding them to the + // naming context + + // Environment entries + Iterator envsList = envs.values().iterator(); + + while (envsList.hasNext()) { + ContextEnvironment env = (ContextEnvironment) envsList.next(); + Object value = null; + // Instantiating a new instance of the correct object type, and + // initializing it. + String type = env.getType(); + try { + if (type.equals("java.lang.String")) { + value = env.getValue(); + } else if (type.equals("java.lang.Byte")) { + value = Byte.decode(env.getValue()); + } else if (type.equals("java.lang.Short")) { + value = Short.decode(env.getValue()); + } else if (type.equals("java.lang.Integer")) { + value = Integer.decode(env.getValue()); + } else if (type.equals("java.lang.Long")) { + value = Long.decode(env.getValue()); + } else if (type.equals("java.lang.Boolean")) { + value = Boolean.valueOf(env.getValue()); + } else if (type.equals("java.lang.Double")) { + value = Double.valueOf(env.getValue()); + } else if (type.equals("java.lang.Float")) { + value = Float.valueOf(env.getValue()); + } else { + log(sm.getString("standardContext.invalidEnvEntryType", + env.getName())); + } + } catch (NumberFormatException e) { + log(sm.getString("standardContext.invalidEnvEntryValue", + env.getName())); + } + // Binding the object to the appropriate name + if (value != null) { + try { + createSubcontexts(envCtx, env.getName()); + envCtx.bind(env.getName(), value); + } catch (NamingException e) { + log(sm.getString("standardContext.invalidEnvEntryValue", + e)); + } + } + + } + + // EJB references + Iterator ejbsList = ejbs.values().iterator(); + + while (ejbsList.hasNext()) { + ContextEjb ejb = (ContextEjb) ejbsList.next(); + // Create a reference to the EJB. + EjbRefAddr ejbRefAddr = new EjbRefAddr + (ejb.getType(), ejb.getHome(), ejb.getRemote(), ejb.getLink(), + ejb.getRunAs()); + Reference ref = new Reference(ejb.getType(), ejbRefAddr); + // Adding the additional parameters, if any + + try { + createSubcontexts(compCtx, ejb.getName()); + compCtx.bind(ejb.getName(), ref); + } catch (NamingException e) { + log(sm.getString("standardContext.bindFailed", e)); + } + + } + + // Resources + Iterator resourcesList = resources.values().iterator(); + + while (resourcesList.hasNext()) { + ContextResource resource = (ContextResource) resourcesList.next(); + // Create a reference to the resource. + ResourceRefAddr resourceRefAddr = new ResourceRefAddr + (resource.getType(), resource.getDescription(), + resource.getScope(), resource.getAuth()); + Reference ref = new Reference(resource.getType(), resourceRefAddr); + // Adding the additional parameters, if any + + try { + createSubcontexts(compCtx, resource.getName()); + compCtx.bind(resource.getName(), ref); + } catch (NamingException e) { + log(sm.getString("standardContext.bindFailed", e)); + } + + } + + // Resources Env + Iterator resourceEnvsKeyList = resourceEnvRefs.keySet().iterator(); + + while (resourceEnvsKeyList.hasNext()) { + String key = (String) resourceEnvsKeyList.next(); + String type = (String) resourceEnvRefs.get(key); + // Create a reference to the resource env. + Reference ref = new Reference(type); + ref.add(new StringRefAddr("name", key)); + ref.add(new StringRefAddr("type", type)); + // Adding the additional parameters, if any + + try { + createSubcontexts(compCtx, key); + compCtx.bind(key, ref); + } catch (NamingException e) { + log(sm.getString("standardContext.bindFailed", e)); + } + + } + + // Setting the context in read only mode + ContextAccessController.setReadOnly(getName()); + + ContextBindings.unbindThread(getName(), this); + + } + + + /** + * Create all intermediate subcontexts. + */ + private void createSubcontexts(javax.naming.Context ctx, String name) + throws NamingException { + javax.naming.Context currentContext = ctx; + StringTokenizer tokenizer = new StringTokenizer(name, "/"); + while (tokenizer.hasMoreTokens()) { + String token = tokenizer.nextToken(); + if ((!token.equals("")) && (tokenizer.hasMoreTokens())) { + try { + currentContext = currentContext.createSubcontext(token); + } catch (NamingException e) { + // Silent catch. Probably an object is already bound in + // the context. + } + } + } + } + /** 1.4 +21 -4 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardContextValve.java Index: StandardContextValve.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardContextValve.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- StandardContextValve.java 2000/10/03 21:30:36 1.3 +++ StandardContextValve.java 2000/11/02 06:14:09 1.4 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardContextValve.java,v 1.3 2000/10/03 21:30:36 craigmcc Exp $ - * $Revision: 1.3 $ - * $Date: 2000/10/03 21:30:36 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardContextValve.java,v 1.4 2000/11/02 06:14:09 remm Exp $ + * $Revision: 1.4 $ + * $Date: 2000/11/02 06:14:09 $ * * ==================================================================== * @@ -69,6 +69,8 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.naming.NamingException; +import org.apache.naming.ContextBindings; import org.apache.catalina.Container; import org.apache.catalina.Request; import org.apache.catalina.Response; @@ -85,7 +87,7 @@ * when processing HTTP requests. * * @author Craig R. McClanahan - * @version $Revision: 1.3 $ $Date: 2000/10/03 21:30:36 $ + * @version $Revision: 1.4 $ $Date: 2000/11/02 06:14:09 $ */ final class StandardContextValve @@ -162,7 +164,22 @@ // Ask this Wrapper to process this Request response.setContext(context); + + if (context.isUseNaming()) { + try { + // Bind the thread to the context + ContextBindings.bindThread(context.getName(), context); + } catch (NamingException e) { + e.printStackTrace(); + } + } + wrapper.invoke(request, response); + + if (context.isUseNaming()) { + // Unbind the thread to the context + ContextBindings.unbindThread(context.getName(), context); + } } 1.8 +32 -6 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/Catalina.java Index: Catalina.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/Catalina.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- Catalina.java 2000/10/01 00:22:52 1.7 +++ Catalina.java 2000/11/02 06:14:10 1.8 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/Catalina.java,v 1.7 2000/10/01 00:22:52 craigmcc Exp $ - * $Revision: 1.7 $ - * $Date: 2000/10/01 00:22:52 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/Catalina.java,v 1.8 2000/11/02 06:14:10 remm Exp $ + * $Revision: 1.8 $ + * $Date: 2000/11/02 06:14:10 $ * * ==================================================================== * @@ -95,7 +95,7 @@ * * * @author Craig R. McClanahan - * @version $Revision: 1.7 $ $Date: 2000/10/01 00:22:52 $ + * @version $Revision: 1.8 $ $Date: 2000/11/02 06:14:10 $ */ public class Catalina { @@ -141,6 +141,12 @@ protected boolean stopping = false; + /** + * Are we using naming ? + */ + protected boolean useNaming = true; + + // ----------------------------------------------------------- Main Program @@ -223,6 +229,8 @@ isConfig = true; } else if (args[i].equals("-debug")) { debug = true; + } else if (args[i].equals("-nonaming")) { + useNaming = false; } else if (args[i].equals("-help")) { usage(); return (false); @@ -633,6 +641,22 @@ System.exit(1); } + // Setting additional variables + if (!useNaming) { + System.setProperty("catalina.useNaming", "false"); + } else { + System.setProperty("catalina.useNaming", "true"); + String value = "org.apache.naming"; + String oldValue = + System.getProperty(javax.naming.Context.URL_PKG_PREFIXES); + if (oldValue != null) { + value = oldValue + ":" + value; + } + System.setProperty(javax.naming.Context.URL_PKG_PREFIXES, value); + System.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY, + "org.apache.naming.java.javaURLContextFactory"); + } + // Start the new server if (server instanceof Lifecycle) { try { @@ -709,8 +733,10 @@ */ protected void usage() { - System.out.println("usage: java org.apache.catalina.startup.Catalina" + - " [ -config {pathname} ] [ -debug ] { start | stop }"); + System.out.println + ("usage: java org.apache.catalina.startup.Catalina" + + " [ -config {pathname} ] [ -debug ]" + + " [ -nonaming ] { start | stop }"); } 1.4 +51 -4 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/Embedded.java Index: Embedded.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/Embedded.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- Embedded.java 2000/10/16 18:27:51 1.3 +++ Embedded.java 2000/11/02 06:14:11 1.4 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/Embedded.java,v 1.3 2000/10/16 18:27:51 craigmcc Exp $ - * $Revision: 1.3 $ - * $Date: 2000/10/16 18:27:51 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/Embedded.java,v 1.4 2000/11/02 06:14:11 remm Exp $ + * $Revision: 1.4 $ + * $Date: 2000/11/02 06:14:11 $ * * ==================================================================== * @@ -145,7 +145,7 @@ * * * @author Craig R. McClanahan - * @version $Revision: 1.3 $ $Date: 2000/10/16 18:27:51 $ + * @version $Revision: 1.4 $ $Date: 2000/11/02 06:14:11 $ */ public class Embedded implements Lifecycle { @@ -197,6 +197,12 @@ /** + * Is naming enabled ? + */ + protected boolean useNaming = true; + + + /** * The set of Engines that have been deployed in this server. Normally * there will only be one. */ @@ -288,6 +294,31 @@ /** + * Return true if naming is enabled. + */ + public boolean isUseNaming() { + + return (this.useNaming); + + } + + + /** + * Enables or disables naming support. + * + * @param useNaming The new use naming value + */ + public void setUseNaming(boolean useNaming) { + + boolean oldUseNaming = this.useNaming; + this.useNaming = useNaming; + support.firePropertyChange("useNaming", new Boolean(oldUseNaming), + new Boolean(this.useNaming)); + + } + + + /** * Return the Logger for this component. */ public Logger getLogger() { @@ -861,6 +892,22 @@ (sm.getString("embedded.alreadyStarted")); lifecycle.fireLifecycleEvent(START_EVENT, null); started = true; + + // Initialize some naming specific properties + if (!useNaming) { + System.setProperty("catalina.useNaming", "false"); + } else { + System.setProperty("catalina.useNaming", "true"); + String value = "org.apache.naming"; + String oldValue = + System.getProperty(javax.naming.Context.URL_PKG_PREFIXES); + if (oldValue != null) { + value = oldValue + ":" + value; + } + System.setProperty(javax.naming.Context.URL_PKG_PREFIXES, value); + System.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY, + "org.apache.naming.java.javaURLContextFactory"); + } // Start our defined Engines first for (int i = 0; i < engines.length; i++) { 1.2 +20 -2 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/EmbeddedManager.java Index: EmbeddedManager.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/EmbeddedManager.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- EmbeddedManager.java 2000/10/07 18:35:11 1.1 +++ EmbeddedManager.java 2000/11/02 06:14:11 1.2 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/EmbeddedManager.java,v 1.1 2000/10/07 18:35:11 remm Exp $ - * $Revision: 1.1 $ - * $Date: 2000/10/07 18:35:11 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/EmbeddedManager.java,v 1.2 2000/11/02 06:14:11 remm Exp $ + * $Revision: 1.2 $ + * $Date: 2000/11/02 06:14:11 $ * * ==================================================================== * @@ -87,7 +87,7 @@ * Implementation of the Catalina JMX MBean as a wrapper of the Catalina class. * * @author Remy Maucherat - * @version $Revision: 1.1 $ + * @version $Revision: 1.2 $ */ public final class EmbeddedManager @@ -277,6 +277,24 @@ */ public void setDebug(int debug) { embedded.setDebug(debug); + } + + + /** + * Return true if naming is enabled. + */ + public boolean isUseNaming() { + return embedded.isUseNaming(); + } + + + /** + * Enables or disables naming support. + * + * @param useNaming The new use naming value + */ + public void setUseNaming(boolean useNaming) { + embedded.setUseNaming(useNaming); } 1.2 +16 -2 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/EmbeddedManagerMBean.java Index: EmbeddedManagerMBean.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/EmbeddedManagerMBean.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- EmbeddedManagerMBean.java 2000/10/07 18:35:11 1.1 +++ EmbeddedManagerMBean.java 2000/11/02 06:14:11 1.2 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/EmbeddedManagerMBean.java,v 1.1 2000/10/07 18:35:11 remm Exp $ - * $Revision: 1.1 $ - * $Date: 2000/10/07 18:35:11 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/EmbeddedManagerMBean.java,v 1.2 2000/11/02 06:14:11 remm Exp $ + * $Revision: 1.2 $ + * $Date: 2000/11/02 06:14:11 $ * * ==================================================================== * @@ -82,7 +82,7 @@ * Embedded MBean interface. * * @author Remy Maucherat - * @version $Revision: 1.1 $ + * @version $Revision: 1.2 $ */ public interface EmbeddedManagerMBean { @@ -149,6 +149,20 @@ * @param debug The new debugging detail level */ public void setDebug(int debug); + + + /** + * Return true if naming is enabled. + */ + public boolean isUseNaming(); + + + /** + * Enables or disables naming support. + * + * @param useNaming The new use naming value + */ + public void setUseNaming(boolean useNaming); /** 1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/Constants.java Index: Constants.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/Constants.java,v 1.1 2000/11/02 06:14:15 remm Exp $ * $Revision: 1.1 $ * $Date: 2000/11/02 06:14:15 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.naming; /** * Static constants for this package. */ public final class Constants { public static final String Package = "org.apache.naming"; } 1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/ContextAccessController.java Index: ContextAccessController.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/ContextAccessController.java,v 1.1 2000/11/02 06:14:16 remm Exp $ * $Revision: 1.1 $ * $Date: 2000/11/02 06:14:16 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.naming; import java.util.Hashtable; import javax.naming.NamingException; /** * Handles the access control on the JNDI contexts. * * @author Remy Maucherat * @version $Revision: 1.1 $ $Date: 2000/11/02 06:14:16 $ */ public class ContextAccessController { // -------------------------------------------------------------- Variables /** * Catalina context names on which writing is not allowed. */ private static Hashtable readOnlyContexts = new Hashtable(); /** * Security tokens repository. */ private static Hashtable securityTokens = new Hashtable(); // --------------------------------------------------------- Public Methods /** * Set a security token for a context. Can be set only once. * * @param name Name of the context * @param context Security token */ public static void setSecurityToken(String name, Object token) { if ((!securityTokens.containsKey(name)) && (token != null)) { securityTokens.put(name, token); } } /** * Check a submitted security token. The submitted token must be equal to * the token present in the repository. If no token is present for the * context, then returns true. * * @param name Name of the context * @param context Submitted security token */ public static boolean checkSecurityToken (String name, Object token) { Object refToken = securityTokens.get(name); if (refToken == null) return (true); if ((refToken != null) && (refToken.equals(token))) return (true); return (false); } /** * Allow writing to a context. * * @param name Name of the context * @param token Security token */ public static void setWritable(String name, Object token) { if (checkSecurityToken(name, token)) readOnlyContexts.remove(name); } /** * Set whether or not a context is writable. * * @param name Name of the context */ public static void setReadOnly(String name) { readOnlyContexts.put(name, name); } /** * Returns if a context is writable. * * @param name Name of the context */ public static boolean isWritable(String name) { return !(readOnlyContexts.containsKey(name)); } } 1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/ContextBindings.java Index: ContextBindings.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/ContextBindings.java,v 1.1 2000/11/02 06:14:16 remm Exp $ * $Revision: 1.1 $ * $Date: 2000/11/02 06:14:16 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.naming; import java.util.Hashtable; import javax.naming.NamingException; import javax.naming.Context; /** * Handles the associations : *
    *
  • Catalina context name with the NamingContext
  • *
  • Calling thread with the NamingContext
  • *
* * @author Remy Maucherat * @version $Revision: 1.1 $ $Date: 2000/11/02 06:14:16 $ */ public class ContextBindings { // -------------------------------------------------------------- Variables /** * Bindings Catalina context name - naming context. Keyed by context name. */ private static Hashtable contextNameBindings = new Hashtable(); /** * Bindings thread - naming context. Keyed by thread id. */ private static Hashtable threadBindings = new Hashtable(); /** * Bindings thread - name. Keyed by thread id. */ private static Hashtable threadNameBindings = new Hashtable(); /** * The string manager for this package. */ protected static StringManager sm = StringManager.getManager(Constants.Package); // --------------------------------------------------------- Public Methods /** * Binds a context name. * * @param name Name of the context * @param context Associated naming context instance */ public static void bindContext(String name, Context context) { bindContext(name, context, null); } /** * Binds a context name. * * @param name Name of the context * @param context Associated naming context instance * @param token Security token */ public static void bindContext(String name, Context context, Object token) { if (ContextAccessController.checkSecurityToken(name, token)) contextNameBindings.put(name, context); } /** * Unbind context name. * * @param name Name of the context */ public static void unbindContext(String name) { unbindContext(name, null); } /** * Unbind context name. * * @param name Name of the context * @param token Security token */ public static void unbindContext(String name, Object token) { if (ContextAccessController.checkSecurityToken(name, token)) contextNameBindings.remove(name); } /** * Retrieve a naming context. * * @param name Name of the context */ public static Context getContext(String name) { return (Context) contextNameBindings.get(name); } /** * Binds a naming context to a thread. * * @param name Name of the context * @param token Security token */ public static void bindThread(String name) throws NamingException { bindThread(name, null); } /** * Binds a naming context to a thread. * * @param name Name of the context */ public static void bindThread(String name, Object token) throws NamingException { if (ContextAccessController.checkSecurityToken(name, token)) { Context context = (Context) contextNameBindings.get(name); if (context == null) throw new NamingException (sm.getString("contextBindings.unknownContext", name)); threadBindings.put(Thread.currentThread(), context); threadNameBindings.put(Thread.currentThread(), name); } } /** * Unbinds a naming context to a thread. * * @param name Name of the context */ public static void unbindThread(String name) { unbindThread(null); } /** * Unbinds a naming context to a thread. * * @param name Name of the context * @param token Security token */ public static void unbindThread(String name, Object token) { if (ContextAccessController.checkSecurityToken(name, token)) { threadBindings.remove(Thread.currentThread()); threadNameBindings.remove(Thread.currentThread()); } } /** * Retrieves the naming context bound to a thread. */ public static Context getThread() throws NamingException { Context context = (Context) threadBindings.get(Thread.currentThread()); if (context == null) throw new NamingException (sm.getString("contextBindings.noContextBoundToThread")); return context; } /** * Retrieves the naming context name bound to a thread. */ public static String getThreadName() throws NamingException { String name = (String) threadNameBindings.get(Thread.currentThread()); if (name == null) throw new NamingException (sm.getString("contextBindings.noContextBoundToThread")); return name; } /** * Tests if current thread is bound to a context. */ public static boolean isThreadBound() { return (threadBindings.containsKey(Thread.currentThread())); } } 1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/EjbRefAddr.java Index: EjbRefAddr.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/EjbRefAddr.java,v 1.1 2000/11/02 06:14:16 remm Exp $ * $Revision: 1.1 $ * $Date: 2000/11/02 06:14:16 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.naming; import javax.naming.RefAddr; /** * Represents a reference address to an EJB. * * @author Remy Maucherat * @version $Revision: 1.1 $ $Date: 2000/11/02 06:14:16 $ */ public class EjbRefAddr extends RefAddr { // -------------------------------------------------------------- Constants /** * Ref address type. */ public static final String TYPE = "ejb-ref"; // ----------------------------------------------------------- Constructors /** * EJB Reference. * * @param ejbType EJB type * @param home Home interface classname * @param remote Remote interface classname * @param link EJB link * @param runAs Run As */ public EjbRefAddr(String ejbType, String home, String remote, String link, String runAs) { super(TYPE); this.ejbType = ejbType; this.home = home; this.remote = remote; this.link = link; this.runAs = runAs; } // ----------------------------------------------------- Instance Variables /** * EJB type. */ protected String ejbType; /** * Home interface. */ protected String home; /** * Remote interface. */ protected String remote; /** * Link. */ protected String link; /** * Run as. */ protected String runAs; // -------------------------------------------------------- RefAddr Methods /** * Returns the contents of the address. */ public Object getContent() { return this; } // ------------------------------------------------------------- Properties /** * EJB type accessor. */ public String getEjbType() { return (this.ejbType); } /** * Home accessor. */ public String getHome() { return (this.home); } /** * Remote accessor. */ public String getRemote() { return (this.remote); } /** * Link accessor. */ public String getLink() { return (this.link); } /** * RunAs accessor. */ public String getRunAs() { return (this.runAs); } } 1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/LocalStrings.properties Index: LocalStrings.properties =================================================================== contextBindings.unknownContext=Unknown context name : {0} contextBindings.noContextBoundToThread=No naming context bound to this thread selectorContext.noJavaUrl=This context must be accessed throught a java: URL namingContext.contextExpected=Name is not bound to a Context namingContext.nameNotBound=Name {0} is not bound in this Context namingContext.readOnly=Context is read only namingContext.invalidName=Name is not valid namingContext.alreadyBound=Name {0} is already bound in this Context namingContext.noAbsoluteName=Can't generate an absolute name for this namespace 1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/NameParserImpl.java Index: NameParserImpl.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/NameParserImpl.java,v 1.1 2000/11/02 06:14:16 remm Exp $ * $Revision: 1.1 $ * $Date: 2000/11/02 06:14:16 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.naming; import javax.naming.NameParser; import javax.naming.Name; import javax.naming.NamingException; import javax.naming.CompositeName; /** * Parses names. * * @author Remy Maucherat * @version $Revision: 1.1 $ $Date: 2000/11/02 06:14:16 $ */ public class NameParserImpl implements NameParser { // ----------------------------------------------------- Instance Variables // ----------------------------------------------------- NameParser Methods /** * Parses a name into its components. * * @param name The non-null string name to parse * @return A non-null parsed form of the name using the naming convention * of this parser. */ public Name parse(String name) throws NamingException { return new CompositeName(name); } } 1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/NamingContext.java Index: NamingContext.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/NamingContext.java,v 1.1 2000/11/02 06:14:16 remm Exp $ * $Revision: 1.1 $ * $Date: 2000/11/02 06:14:16 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.naming; import java.util.Hashtable; import java.util.Enumeration; import javax.naming.Context; import javax.naming.Name; import javax.naming.LinkRef; import javax.naming.CompositeName; import javax.naming.NameParser; import javax.naming.Referenceable; import javax.naming.Reference; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.NameNotFoundException; import javax.naming.NotContextException; import javax.naming.InitialContext; import javax.naming.OperationNotSupportedException; import javax.naming.spi.NamingManager; /** * Catalina JNDI Context implementation. * * @author Remy Maucherat * @version $Revision: 1.1 $ $Date: 2000/11/02 06:14:16 $ */ public class NamingContext implements Context { // -------------------------------------------------------------- Constants /** * Name parser for this context. */ protected static final NameParser nameParser = new NameParserImpl(); // ----------------------------------------------------------- Constructors /** * Builds a naming context using the given environment. */ public NamingContext(Hashtable env, String name) throws NamingException { this.bindings = new Hashtable(); // FIXME ? Could be put in the environment ? this.name = name; // Populating the environment hashtable if (env != null ) { Enumeration envEntries = env.keys(); while (envEntries.hasMoreElements()) { String entryName = (String) envEntries.nextElement(); addToEnvironment(entryName, env.get(entryName)); } } } /** * Builds a naming context using the given environment. */ public NamingContext(Hashtable env, String name, Hashtable bindings) throws NamingException { this(env, name); this.bindings = bindings; } // ----------------------------------------------------- Instance Variables /** * Environment. */ protected Hashtable env; /** * The string manager for this package. */ protected StringManager sm = StringManager.getManager(Constants.Package); /** * Bindings in this Context. */ protected Hashtable bindings; /** * Name of the associated Catalina Context. */ protected String name; // --------------------------------------------------------- Public Methods // -------------------------------------------------------- Context Methods /** * Retrieves the named object. If name is empty, returns a new instance * of this context (which represents the same naming context as this * context, but its environment may be modified independently and it may * be accessed concurrently). * * @param name the name of the object to look up * @return the object bound to name * @exception NamingException if a naming exception is encountered */ public Object lookup(Name name) throws NamingException { return lookup(name, true); } /** * Retrieves the named object. * * @param name the name of the object to look up * @return the object bound to name * @exception NamingException if a naming exception is encountered */ public Object lookup(String name) throws NamingException { return lookup(new CompositeName(name), true); } /** * Binds a name to an object. All intermediate contexts and the target * context (that named by all but terminal atomic component of the name) * must already exist. * * @param name the name to bind; may not be empty * @param obj the object to bind; possibly null * @exception NameAlreadyBoundException if name is already bound * @exception InvalidAttributesException if object did not supply all * mandatory attributes * @exception NamingException if a naming exception is encountered */ public void bind(Name name, Object obj) throws NamingException { bind(name, obj, false); } /** * Binds a name to an object. * * @param name the name to bind; may not be empty * @param obj the object to bind; possibly null * @exception NameAlreadyBoundException if name is already bound * @exception InvalidAttributesException if object did not supply all * mandatory attributes * @exception NamingException if a naming exception is encountered */ public void bind(String name, Object obj) throws NamingException { bind(new CompositeName(name), obj); } /** * Binds a name to an object, overwriting any existing binding. All * intermediate contexts and the target context (that named by all but * terminal atomic component of the name) must already exist. *

* If the object is a DirContext, any existing attributes associated with * the name are replaced with those of the object. Otherwise, any * existing attributes associated with the name remain unchanged. * * @param name the name to bind; may not be empty * @param obj the object to bind; possibly null * @exception InvalidAttributesException if object did not supply all * mandatory attributes * @exception NamingException if a naming exception is encountered */ public void rebind(Name name, Object obj) throws NamingException { bind(name, obj, true); } /** * Binds a name to an object, overwriting any existing binding. * * @param name the name to bind; may not be empty * @param obj the object to bind; possibly null * @exception InvalidAttributesException if object did not supply all * mandatory attributes * @exception NamingException if a naming exception is encountered */ public void rebind(String name, Object obj) throws NamingException { rebind(new CompositeName(name), obj); } /** * Unbinds the named object. Removes the terminal atomic name in name * from the target context--that named by all but the terminal atomic * part of name. *

* This method is idempotent. It succeeds even if the terminal atomic * name is not bound in the target context, but throws * NameNotFoundException if any of the intermediate contexts do not exist. * * @param name the name to bind; may not be empty * @exception NameNotFoundException if an intermediate context does not * exist * @exception NamingException if a naming exception is encountered */ public void unbind(Name name) throws NamingException { checkWritable(); while ((!name.isEmpty()) && (name.get(0).length() == 0)) name = name.getSuffix(1); if (name.isEmpty()) throw new NamingException (sm.getString("namingContext.invalidName")); NamingEntry entry = (NamingEntry) bindings.get(name.get(0)); if (entry == null) { throw new NameNotFoundException (sm.getString("namingContext.nameNotBound", name.get(0))); } if (name.size() > 1) { if (entry.type == NamingEntry.CONTEXT) { ((Context) entry.value).unbind(name.getSuffix(1)); } else { throw new NamingException (sm.getString("namingContext.contextExpected")); } } else { bindings.remove(name.get(0)); } } /** * Unbinds the named object. * * @param name the name to bind; may not be empty * @exception NameNotFoundException if an intermediate context does not * exist * @exception NamingException if a naming exception is encountered */ public void unbind(String name) throws NamingException { unbind(new CompositeName(name)); } /** * Binds a new name to the object bound to an old name, and unbinds the * old name. Both names are relative to this context. Any attributes * associated with the old name become associated with the new name. * Intermediate contexts of the old name are not changed. * * @param oldName the name of the existing binding; may not be empty * @param newName the name of the new binding; may not be empty * @exception NameAlreadyBoundException if newName is already bound * @exception NamingException if a naming exception is encountered */ public void rename(Name oldName, Name newName) throws NamingException { Object value = lookup(oldName); bind(newName, value); unbind(oldName); } /** * Binds a new name to the object bound to an old name, and unbinds the * old name. * * @param oldName the name of the existing binding; may not be empty * @param newName the name of the new binding; may not be empty * @exception NameAlreadyBoundException if newName is already bound * @exception NamingException if a naming exception is encountered */ public void rename(String oldName, String newName) throws NamingException { rename(new CompositeName(oldName), new CompositeName(newName)); } /** * Enumerates the names bound in the named context, along with the class * names of objects bound to them. The contents of any subcontexts are * not included. *

* If a binding is added to or removed from this context, its effect on * an enumeration previously returned is undefined. * * @param name the name of the context to list * @return an enumeration of the names and class names of the bindings in * this context. Each element of the enumeration is of type NameClassPair. * @exception NamingException if a naming exception is encountered */ public NamingEnumeration list(Name name) throws NamingException { // Removing empty parts while ((!name.isEmpty()) && (name.get(0).length() == 0)) name = name.getSuffix(1); if (name.isEmpty()) { return new NamingContextEnumeration(bindings.elements()); } NamingEntry entry = (NamingEntry) bindings.get(name.get(0)); if (entry == null) { throw new NameNotFoundException (sm.getString("namingContext.nameNotBound", name.get(0))); } if (entry.type != NamingEntry.CONTEXT) { throw new NamingException (sm.getString("namingContext.contextExpected")); } return ((Context) entry.value).list(name.getSuffix(1)); } /** * Enumerates the names bound in the named context, along with the class * names of objects bound to them. * * @param name the name of the context to list * @return an enumeration of the names and class names of the bindings in * this context. Each element of the enumeration is of type NameClassPair. * @exception NamingException if a naming exception is encountered */ public NamingEnumeration list(String name) throws NamingException { return list(new CompositeName(name)); } /** * Enumerates the names bound in the named context, along with the * objects bound to them. The contents of any subcontexts are not * included. *

* If a binding is added to or removed from this context, its effect on * an enumeration previously returned is undefined. * * @param name the name of the context to list * @return an enumeration of the bindings in this context. * Each element of the enumeration is of type Binding. * @exception NamingException if a naming exception is encountered */ public NamingEnumeration listBindings(Name name) throws NamingException { // Removing empty parts while ((!name.isEmpty()) && (name.get(0).length() == 0)) name = name.getSuffix(1); if (name.isEmpty()) { return new NamingContextBindingsEnumeration(bindings.elements()); } NamingEntry entry = (NamingEntry) bindings.get(name.get(0)); if (entry == null) { throw new NameNotFoundException (sm.getString("namingContext.nameNotBound", name.get(0))); } if (entry.type != NamingEntry.CONTEXT) { throw new NamingException (sm.getString("namingContext.contextExpected")); } return ((Context) entry.value).listBindings(name.getSuffix(1)); } /** * Enumerates the names bound in the named context, along with the * objects bound to them. * * @param name the name of the context to list * @return an enumeration of the bindings in this context. * Each element of the enumeration is of type Binding. * @exception NamingException if a naming exception is encountered */ public NamingEnumeration listBindings(String name) throws NamingException { return listBindings(new CompositeName(name)); } /** * Destroys the named context and removes it from the namespace. Any * attributes associated with the name are also removed. Intermediate * contexts are not destroyed. *

* This method is idempotent. It succeeds even if the terminal atomic * name is not bound in the target context, but throws * NameNotFoundException if any of the intermediate contexts do not exist. * * In a federated naming system, a context from one naming system may be * bound to a name in another. One can subsequently look up and perform * operations on the foreign context using a composite name. However, an * attempt destroy the context using this composite name will fail with * NotContextException, because the foreign context is not a "subcontext" * of the context in which it is bound. Instead, use unbind() to remove * the binding of the foreign context. Destroying the foreign context * requires that the destroySubcontext() be performed on a context from * the foreign context's "native" naming system. * * @param name the name of the context to be destroyed; may not be empty * @exception NameNotFoundException if an intermediate context does not * exist * @exception NotContextException if the name is bound but does not name * a context, or does not name a context of the appropriate type */ public void destroySubcontext(Name name) throws NamingException { checkWritable(); while ((!name.isEmpty()) && (name.get(0).length() == 0)) name = name.getSuffix(1); if (name.isEmpty()) throw new NamingException (sm.getString("namingContext.invalidName")); NamingEntry entry = (NamingEntry) bindings.get(name.get(0)); if (entry == null) { throw new NameNotFoundException (sm.getString("namingContext.nameNotBound", name.get(0))); } if (name.size() > 1) { if (entry.type == NamingEntry.CONTEXT) { ((Context) entry.value).unbind(name.getSuffix(1)); } else { throw new NamingException (sm.getString("namingContext.contextExpected")); } } else { if (entry.type == NamingEntry.CONTEXT) { ((Context) entry.value).close(); bindings.remove(name.get(0)); } else { throw new NotContextException (sm.getString("namingContext.contextExpected")); } } } /** * Destroys the named context and removes it from the namespace. * * @param name the name of the context to be destroyed; may not be empty * @exception NameNotFoundException if an intermediate context does not * exist * @exception NotContextException if the name is bound but does not name * a context, or does not name a context of the appropriate type */ public void destroySubcontext(String name) throws NamingException { destroySubcontext(name); } /** * Creates and binds a new context. Creates a new context with the given * name and binds it in the target context (that named by all but * terminal atomic component of the name). All intermediate contexts and * the target context must already exist. * * @param name the name of the context to create; may not be empty * @return the newly created context * @exception NameAlreadyBoundException if name is already bound * @exception InvalidAttributesException if creation of the subcontext * requires specification of mandatory attributes * @exception NamingException if a naming exception is encountered */ public Context createSubcontext(Name name) throws NamingException { checkWritable(); Context newContext = new NamingContext(env, this.name); bind(name, newContext); return newContext; } /** * Creates and binds a new context. * * @param name the name of the context to create; may not be empty * @return the newly created context * @exception NameAlreadyBoundException if name is already bound * @exception InvalidAttributesException if creation of the subcontext * requires specification of mandatory attributes * @exception NamingException if a naming exception is encountered */ public Context createSubcontext(String name) throws NamingException { return createSubcontext(new CompositeName(name)); } /** * Retrieves the named object, following links except for the terminal * atomic component of the name. If the object bound to name is not a * link, returns the object itself. * * @param name the name of the object to look up * @return the object bound to name, not following the terminal link * (if any). * @exception NamingException if a naming exception is encountered */ public Object lookupLink(Name name) throws NamingException { return lookup(name, false); } /** * Retrieves the named object, following links except for the terminal * atomic component of the name. * * @param name the name of the object to look up * @return the object bound to name, not following the terminal link * (if any). * @exception NamingException if a naming exception is encountered */ public Object lookupLink(String name) throws NamingException { return lookup(new CompositeName(name), false); } /** * Retrieves the parser associated with the named context. In a * federation of namespaces, different naming systems will parse names * differently. This method allows an application to get a parser for * parsing names into their atomic components using the naming convention * of a particular naming system. Within any single naming system, * NameParser objects returned by this method must be equal (using the * equals() test). * * @param name the name of the context from which to get the parser * @return a name parser that can parse compound names into their atomic * components * @exception NamingException if a naming exception is encountered */ public NameParser getNameParser(Name name) throws NamingException { while ((!name.isEmpty()) && (name.get(0).length() == 0)) name = name.getSuffix(1); if (name.isEmpty()) return nameParser; if (name.size() > 1) { Object obj = bindings.get(name.get(0)); if (obj instanceof Context) { return ((Context) obj).getNameParser(name.getSuffix(1)); } else { throw new NotContextException (sm.getString("namingContext.contextExpected")); } } return nameParser; } /** * Retrieves the parser associated with the named context. * * @param name the name of the context from which to get the parser * @return a name parser that can parse compound names into their atomic * components * @exception NamingException if a naming exception is encountered */ public NameParser getNameParser(String name) throws NamingException { return getNameParser(new CompositeName(name)); } /** * Composes the name of this context with a name relative to this context. *

* Given a name (name) relative to this context, and the name (prefix) * of this context relative to one of its ancestors, this method returns * the composition of the two names using the syntax appropriate for the * naming system(s) involved. That is, if name names an object relative * to this context, the result is the name of the same object, but * relative to the ancestor context. None of the names may be null. * * @param name a name relative to this context * @param prefix the name of this context relative to one of its ancestors * @return the composition of prefix and name * @exception NamingException if a naming exception is encountered */ public Name composeName(Name name, Name prefix) throws NamingException { prefix = (Name) name.clone(); return prefix.addAll(name); } /** * Composes the name of this context with a name relative to this context. * * @param name a name relative to this context * @param prefix the name of this context relative to one of its ancestors * @return the composition of prefix and name * @exception NamingException if a naming exception is encountered */ public String composeName(String name, String prefix) throws NamingException { return prefix + "/" + name; } /** * Adds a new environment property to the environment of this context. If * the property already exists, its value is overwritten. * * @param propName the name of the environment property to add; may not * be null * @param propVal the value of the property to add; may not be null * @exception NamingException if a naming exception is encountered */ public Object addToEnvironment(String propName, Object propVal) throws NamingException { return env.put(propName, propVal); } /** * Removes an environment property from the environment of this context. * * @param propName the name of the environment property to remove; * may not be null * @exception NamingException if a naming exception is encountered */ public Object removeFromEnvironment(String propName) throws NamingException { return env.remove(propName); } /** * Retrieves the environment in effect for this context. See class * description for more details on environment properties. * The caller should not make any changes to the object returned: their * effect on the context is undefined. The environment of this context * may be changed using addToEnvironment() and removeFromEnvironment(). * * @return the environment of this context; never null * @exception NamingException if a naming exception is encountered */ public Hashtable getEnvironment() throws NamingException { return env; } /** * Closes this context. This method releases this context's resources * immediately, instead of waiting for them to be released automatically * by the garbage collector. * This method is idempotent: invoking it on a context that has already * been closed has no effect. Invoking any other method on a closed * context is not allowed, and results in undefined behaviour. * * @exception NamingException if a naming exception is encountered */ public void close() throws NamingException { env.clear(); } /** * Retrieves the full name of this context within its own namespace. *

* Many naming services have a notion of a "full name" for objects in * their respective namespaces. For example, an LDAP entry has a * distinguished name, and a DNS record has a fully qualified name. This * method allows the client application to retrieve this name. The string * returned by this method is not a JNDI composite name and should not be * passed directly to context methods. In naming systems for which the * notion of full name does not make sense, * OperationNotSupportedException is thrown. * * @return this context's name in its own namespace; never null * @exception OperationNotSupportedException if the naming system does * not have the notion of a full name * @exception NamingException if a naming exception is encountered */ public String getNameInNamespace() throws NamingException { throw new OperationNotSupportedException (sm.getString("namingContext.noAbsoluteName")); //FIXME ? } // ------------------------------------------------------ Protected Methods /** * Retrieves the named object. * * @param name the name of the object to look up * @param resolveLinks If true, the links will be resolved * @return the object bound to name * @exception NamingException if a naming exception is encountered */ protected Object lookup(Name name, boolean resolveLinks) throws NamingException { // Removing empty parts while ((!name.isEmpty()) && (name.get(0).length() == 0)) name = name.getSuffix(1); if (name.isEmpty()) { // If name is empty, a newly allocated naming context is returned return new NamingContext(env, this.name, bindings); } NamingEntry entry = (NamingEntry) bindings.get(name.get(0)); if (entry == null) { throw new NameNotFoundException (sm.getString("namingContext.nameNotBound", name.get(0))); } if (name.size() > 1) { // If the size of the name is greater that 1, then we go through a // number of subcontexts. if (entry.type != NamingEntry.CONTEXT) { throw new NamingException (sm.getString("namingContext.contextExpected")); } return ((Context) entry.value).lookup(name.getSuffix(1)); } else { if ((resolveLinks) && (entry.type == NamingEntry.LINK_REF)) { String link = ((LinkRef) entry.value).getLinkName(); if (link.startsWith(".")) { // Link relative to this context return lookup(link.substring(1)); } else { return (new InitialContext(env)).lookup(link); } } else if (entry.type == NamingEntry.REFERENCE) { try { return NamingManager.getObjectInstance (entry.value, name, this, env); } catch (Exception e) { throw new NamingException(e.getMessage()); } } else { return entry.value; } } } /** * Binds a name to an object. All intermediate contexts and the target * context (that named by all but terminal atomic component of the name) * must already exist. * * @param name the name to bind; may not be empty * @param obj the object to bind; possibly null * @param rebind if true, then perform a rebind (ie, overwrite) * @exception NameAlreadyBoundException if name is already bound * @exception InvalidAttributesException if object did not supply all * mandatory attributes * @exception NamingException if a naming exception is encountered */ protected void bind(Name name, Object obj, boolean rebind) throws NamingException { checkWritable(); while ((!name.isEmpty()) && (name.get(0).length() == 0)) name = name.getSuffix(1); if (name.isEmpty()) throw new NamingException (sm.getString("namingContext.invalidName")); NamingEntry entry = (NamingEntry) bindings.get(name.get(0)); if (name.size() > 1) { if (entry == null) { throw new NameNotFoundException (sm.getString("namingContext.nameNotBound", name.get(0))); } if (entry.type == NamingEntry.CONTEXT) { if (rebind) { ((Context) entry.value).rebind(name.getSuffix(1), obj); } else { ((Context) entry.value).bind(name.getSuffix(1), obj); } } else { throw new NamingException (sm.getString("namingContext.contextExpected")); } } else { if ((!rebind) && (entry != null)) { throw new NamingException (sm.getString("namingContext.alreadyBound")); } else { // Getting the type of the object and wrapping it within a new // NamingEntry if (obj instanceof Context) { entry = new NamingEntry(name.get(0), obj, NamingEntry.CONTEXT); } else if (obj instanceof LinkRef) { entry = new NamingEntry(name.get(0), obj, NamingEntry.LINK_REF); } else if (obj instanceof Reference) { entry = new NamingEntry(name.get(0), obj, NamingEntry.REFERENCE); } else if (obj instanceof Referenceable) { obj = ((Referenceable) obj).getReference(); entry = new NamingEntry(name.get(0), obj, NamingEntry.REFERENCE); } else { entry = new NamingEntry(name.get(0), obj, NamingEntry.ENTRY); } bindings.put(name.get(0), entry); } } } /** * Returns true if writing is allowed on this context. */ protected boolean isWritable() { return ContextAccessController.isWritable(name); } /** * Throws a naming exception is Context is not writable. */ protected void checkWritable() throws NamingException { if (!isWritable()) throw new NamingException(sm.getString("namingContext.readOnly")); } } 1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/NamingContextBindingsEnumeration.java Index: NamingContextBindingsEnumeration.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/NamingContextBindingsEnumeration.java,v 1.1 2000/11/02 06:14:16 remm Exp $ * $Revision: 1.1 $ * $Date: 2000/11/02 06:14:16 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.naming; import java.util.Hashtable; import java.util.Vector; import java.util.Enumeration; import javax.naming.NamingException; import javax.naming.NamingEnumeration; import javax.naming.Binding; /** * Naming enumeration implementation. * * @author Remy Maucherat * @version $Revision: 1.1 $ $Date: 2000/11/02 06:14:16 $ */ public class NamingContextBindingsEnumeration implements NamingEnumeration { // ----------------------------------------------------------- Constructors public NamingContextBindingsEnumeration(Vector entries) { enum = entries.elements(); } public NamingContextBindingsEnumeration(Enumeration enum) { this.enum = enum; } // -------------------------------------------------------------- Variables /** * Underlying enumeration. */ protected Enumeration enum; // --------------------------------------------------------- Public Methods /** * Retrieves the next element in the enumeration. */ public Object next() throws NamingException { return nextElement(); } /** * Determines whether there are any more elements in the enumeration. */ public boolean hasMore() throws NamingException { return enum.hasMoreElements(); } /** * Closes this enumeration. */ public void close() throws NamingException { } public boolean hasMoreElements() { return enum.hasMoreElements(); } public Object nextElement() { NamingEntry entry = (NamingEntry) enum.nextElement(); return new Binding(entry.name, entry.value.getClass().getName(), entry.value, true); } } 1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/NamingContextEnumeration.java Index: NamingContextEnumeration.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/NamingContextEnumeration.java,v 1.1 2000/11/02 06:14:16 remm Exp $ * $Revision: 1.1 $ * $Date: 2000/11/02 06:14:16 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.naming; import java.util.Hashtable; import java.util.Vector; import java.util.Enumeration; import javax.naming.NamingException; import javax.naming.NamingEnumeration; import javax.naming.NameClassPair; /** * Naming enumeration implementation. * * @author Remy Maucherat * @version $Revision: 1.1 $ $Date: 2000/11/02 06:14:16 $ */ public class NamingContextEnumeration implements NamingEnumeration { // ----------------------------------------------------------- Constructors public NamingContextEnumeration(Vector entries) { enum = entries.elements(); } public NamingContextEnumeration(Enumeration enum) { this.enum = enum; } // -------------------------------------------------------------- Variables /** * Underlying enumeration. */ protected Enumeration enum; // --------------------------------------------------------- Public Methods /** * Retrieves the next element in the enumeration. */ public Object next() throws NamingException { return nextElement(); } /** * Determines whether there are any more elements in the enumeration. */ public boolean hasMore() throws NamingException { return enum.hasMoreElements(); } /** * Closes this enumeration. */ public void close() throws NamingException { } public boolean hasMoreElements() { return enum.hasMoreElements(); } public Object nextElement() { NamingEntry entry = (NamingEntry) enum.nextElement(); return new NameClassPair(entry.name, entry.value.getClass().getName()); } } 1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/NamingEntry.java Index: NamingEntry.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/NamingEntry.java,v 1.1 2000/11/02 06:14:16 remm Exp $ * $Revision: 1.1 $ * $Date: 2000/11/02 06:14:16 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.naming; /** * Represents a binding in a NamingContext. * * @author Remy Maucherat * @version $Revision: 1.1 $ $Date: 2000/11/02 06:14:16 $ */ public class NamingEntry { // -------------------------------------------------------------- Constants public static final int ENTRY = 0; public static final int LINK_REF = 1; public static final int REFERENCE = 2; public static final int CONTEXT = 10; // ----------------------------------------------------------- Constructors public NamingEntry(String name, Object value, int type) { this.name = name; this.value = value; this.type = type; } // ----------------------------------------------------- Instance Variables /** * The type instance variable is used to avoid unsing RTTI when doing * lookups. */ public int type; public String name; public Object value; // --------------------------------------------------------- Object Methods public boolean equals(Object obj) { if ((obj != null) && (obj instanceof NamingEntry)) { return name.equals(((NamingEntry) obj).name); } else { return false; } } public int hashCode() { return name.hashCode(); } } 1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/NamingService.java Index: NamingService.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/NamingService.java,v 1.1 2000/11/02 06:14:16 remm Exp $ * $Revision: 1.1 $ * $Date: 2000/11/02 06:14:16 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.naming; import javax.naming.Context; import javax.management.NotificationBroadcasterSupport; import javax.management.ObjectName; import javax.management.MBeanServer; import javax.management.MBeanRegistration; import javax.management.AttributeChangeNotification; import javax.management.Notification; /** * Implementation of the NamingService JMX MBean. * * @author Remy Maucherat * @version $Revision: 1.1 $ */ public final class NamingService extends NotificationBroadcasterSupport implements NamingServiceMBean, MBeanRegistration { // ----------------------------------------------------- Instance Variables /** * Status of the Slide domain. */ private int state = STOPPED; /** * Notification sequence number. */ private long sequenceNumber = 0; /** * Old URL packages value. */ private String oldUrlValue = ""; /** * Old initial context value. */ private String oldIcValue = ""; // ---------------------------------------------- MBeanRegistration Methods public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception { return new ObjectName(OBJECT_NAME); } public void postRegister(Boolean registrationDone) { if (!registrationDone.booleanValue()) destroy(); } public void preDeregister() throws Exception { } public void postDeregister() { destroy(); } // ----------------------------------------------------- SlideMBean Methods /** * Retruns the Catalina component name. */ public String getName() { return NAME; } /** * Returns the state. */ public int getState() { return state; } /** * Returns a String representation of the state. */ public String getStateString() { return states[state]; } /** * Start the servlet container. */ public void start() throws Exception { Notification notification = null; if (state != STOPPED) return; state = STARTING; // Notifying the MBEan server that we're starting notification = new AttributeChangeNotification (this, sequenceNumber++, System.currentTimeMillis(), "Starting " + NAME, "State", "java.lang.Integer", new Integer(STOPPED), new Integer(STARTING)); sendNotification(notification); try { String value = "org.apache.naming"; String oldValue = System.getProperty(Context.URL_PKG_PREFIXES); if (oldValue != null) { oldUrlValue = oldValue; value = oldValue + ":" + value; } System.setProperty(Context.URL_PKG_PREFIXES, value); oldValue = System.getProperty(Context.INITIAL_CONTEXT_FACTORY); if (oldValue != null) { oldIcValue = oldValue; } System.setProperty(Context.INITIAL_CONTEXT_FACTORY, Constants.Package + ".java.javaURLContextFactory"); } catch (Throwable t) { state = STOPPED; notification = new AttributeChangeNotification (this, sequenceNumber++, System.currentTimeMillis(), "Stopped " + NAME, "State", "java.lang.Integer", new Integer(STARTING), new Integer(STOPPED)); sendNotification(notification); } state = STARTED; notification = new AttributeChangeNotification (this, sequenceNumber++, System.currentTimeMillis(), "Started " + NAME, "State", "java.lang.Integer", new Integer(STARTING), new Integer(STARTED)); sendNotification(notification); } /** * Stop the servlet container. */ public void stop() { Notification notification = null; if (state != STARTED) return; state = STOPPING; notification = new AttributeChangeNotification (this, sequenceNumber++, System.currentTimeMillis(), "Stopping " + NAME, "State", "java.lang.Integer", new Integer(STARTED), new Integer(STOPPING)); sendNotification(notification); try { System.setProperty(Context.URL_PKG_PREFIXES, oldUrlValue); System.setProperty(Context.INITIAL_CONTEXT_FACTORY, oldIcValue); } catch (Throwable t) { // FIXME t.printStackTrace(); } state = STOPPED; notification = new AttributeChangeNotification (this, sequenceNumber++, System.currentTimeMillis(), "Stopped " + NAME, "State", "java.lang.Integer", new Integer(STOPPING), new Integer(STOPPED)); sendNotification(notification); } /** * Destroy servlet container (if any is running). */ public void destroy() { if (getState() != STOPPED) stop(); } } 1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/NamingServiceMBean.java Index: NamingServiceMBean.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/NamingServiceMBean.java,v 1.1 2000/11/02 06:14:16 remm Exp $ * $Revision: 1.1 $ * $Date: 2000/11/02 06:14:16 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.naming; /** * Naming MBean interface. * * @author Remy Maucherat * @version $Revision: 1.1 $ */ public interface NamingServiceMBean { // -------------------------------------------------------------- Constants /** * Status constants. */ public static final String[] states = {"Stopped", "Stopping", "Starting", "Started"}; public static final int STOPPED = 0; public static final int STOPPING = 1; public static final int STARTING = 2; public static final int STARTED = 3; /** * Component name. */ public static final String NAME = "Apache JNDI Naming Service"; /** * Object name. */ public static final String OBJECT_NAME = ":service=Naming"; // ------------------------------------------------------ Interface Methods /** * Retruns the JNDI component name. */ public String getName(); /** * Returns the state. */ public int getState(); /** * Returns a String representation of the state. */ public String getStateString(); /** * Start the servlet container. */ public void start() throws Exception; /** * Stop the servlet container. */ public void stop(); /** * Destroy servlet container (if any is running). */ public void destroy(); } 1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/ResourceEnvRefAddr.java Index: ResourceEnvRefAddr.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/ResourceEnvRefAddr.java,v 1.1 2000/11/02 06:14:16 remm Exp $ * $Revision: 1.1 $ * $Date: 2000/11/02 06:14:16 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.naming; import javax.naming.RefAddr; /** * Represents a reference address to a resource environment. * * @author Remy Maucherat * @version $Revision: 1.1 $ $Date: 2000/11/02 06:14:16 $ */ public class ResourceEnvRefAddr extends RefAddr { // -------------------------------------------------------------- Constants /** * Ref address type. */ public static final String TYPE = "resource-env-ref"; // ----------------------------------------------------------- Constructors /** * Resource env reference. * * @param type Type */ public ResourceEnvRefAddr(String resourceType) { super(TYPE); this.resourceType = resourceType; } // ----------------------------------------------------- Instance Variables /** * Resource environment reference type. */ protected String resourceType; // -------------------------------------------------------- RefAddr Methods /** * Returns the contents of the address. */ public Object getContent() { return this; } // ------------------------------------------------------------- Properties /** * Resource type accessor. */ public String getResourceType() { return resourceType; } } 1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/ResourceRefAddr.java Index: ResourceRefAddr.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/ResourceRefAddr.java,v 1.1 2000/11/02 06:14:16 remm Exp $ * $Revision: 1.1 $ * $Date: 2000/11/02 06:14:16 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.naming; import java.util.Hashtable; import javax.naming.RefAddr; /** * Represents a reference address to a resource. * * @author Remy Maucherat * @version $Revision: 1.1 $ $Date: 2000/11/02 06:14:16 $ */ public class ResourceRefAddr extends RefAddr { // -------------------------------------------------------------- Constants /** * Ref address type. */ public static final String TYPE = "resource-ref"; // ----------------------------------------------------------- Constructors /** * Resource Reference. * * @param resourceClass Resource class * @param scope Resource scope * @param auth Resource authetication */ public ResourceRefAddr(String resourceClass, String description, String scope, String auth) { super(TYPE); this.resourceClass = resourceClass; this.description = description; this.scope = scope; this.auth = auth; } // ----------------------------------------------------- Instance Variables /** * Resource class. */ protected String resourceClass; /** * Description. */ protected String description; /** * Scope. */ protected String scope; /** * Authentication type. */ protected String auth; // -------------------------------------------------------- RefAddr Methods /** * Returns the contents of the address. */ public Object getContent() { return this; } // ------------------------------------------------------------- Properties /** * Resource class accessor. */ public String getResourceClass() { return (this.resourceClass); } /** * Description accessor. */ public String getDescription() { return (this.description); } /** * Scope accessor. */ public String getScope() { return (this.scope); } /** * Auth accessor. */ public String getAuth() { return (this.auth); } } 1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/SelectorContext.java Index: SelectorContext.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/SelectorContext.java,v 1.1 2000/11/02 06:14:16 remm Exp $ * $Revision: 1.1 $ * $Date: 2000/11/02 06:14:16 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.naming; import java.util.Hashtable; import javax.naming.Context; import javax.naming.Name; import javax.naming.NameParser; import javax.naming.NamingEnumeration; import javax.naming.NamingException; /** * Catalina JNDI Context implementation. * * @author Remy Maucherat * @version $Revision: 1.1 $ $Date: 2000/11/02 06:14:16 $ */ public class SelectorContext implements Context { // -------------------------------------------------------------- Constants /** * Namespace URL. */ public static final String prefix = "java:"; /** * Namespace URL length. */ public static final int prefixLength = prefix.length(); // ----------------------------------------------------------- Constructors /** * Builds a Catalina selector context using the given environment. */ public SelectorContext(Hashtable env) { this.env = env; } /** * Builds a Catalina selector context using the given environment. */ public SelectorContext(Hashtable env, boolean initialContext) { this(env); this.initialContext = initialContext; } // ----------------------------------------------------- Instance Variables /** * Environment. */ protected Hashtable env; /** * The string manager for this package. */ protected StringManager sm = StringManager.getManager(Constants.Package); /** * Request for an initial context. */ protected boolean initialContext = false; // --------------------------------------------------------- Public Methods // -------------------------------------------------------- Context Methods /** * Retrieves the named object. If name is empty, returns a new instance * of this context (which represents the same naming context as this * context, but its environment may be modified independently and it may * be accessed concurrently). * * @param name the name of the object to look up * @return the object bound to name * @exception NamingException if a naming exception is encountered */ public Object lookup(Name name) throws NamingException { // Strip the URL header // Find the appropriate NamingContext according to the current bindings // Execute the lookup on that context return getBoundContext().lookup(parseName(name)); } /** * Retrieves the named object. * * @param name the name of the object to look up * @return the object bound to name * @exception NamingException if a naming exception is encountered */ public Object lookup(String name) throws NamingException { // Strip the URL header // Find the appropriate NamingContext according to the current bindings // Execute the lookup on that context return getBoundContext().lookup(parseName(name)); } /** * Binds a name to an object. All intermediate contexts and the target * context (that named by all but terminal atomic component of the name) * must already exist. * * @param name the name to bind; may not be empty * @param obj the object to bind; possibly null * @exception NameAlreadyBoundException if name is already bound * @exception InvalidAttributesException if object did not supply all * mandatory attributes * @exception NamingException if a naming exception is encountered */ public void bind(Name name, Object obj) throws NamingException { getBoundContext().bind(parseName(name), obj); } /** * Binds a name to an object. * * @param name the name to bind; may not be empty * @param obj the object to bind; possibly null * @exception NameAlreadyBoundException if name is already bound * @exception InvalidAttributesException if object did not supply all * mandatory attributes * @exception NamingException if a naming exception is encountered */ public void bind(String name, Object obj) throws NamingException { getBoundContext().bind(parseName(name), obj); } /** * Binds a name to an object, overwriting any existing binding. All * intermediate contexts and the target context (that named by all but * terminal atomic component of the name) must already exist. *

* If the object is a DirContext, any existing attributes associated with * the name are replaced with those of the object. Otherwise, any * existing attributes associated with the name remain unchanged. * * @param name the name to bind; may not be empty * @param obj the object to bind; possibly null * @exception InvalidAttributesException if object did not supply all * mandatory attributes * @exception NamingException if a naming exception is encountered */ public void rebind(Name name, Object obj) throws NamingException { getBoundContext().rebind(parseName(name), obj); } /** * Binds a name to an object, overwriting any existing binding. * * @param name the name to bind; may not be empty * @param obj the object to bind; possibly null * @exception InvalidAttributesException if object did not supply all * mandatory attributes * @exception NamingException if a naming exception is encountered */ public void rebind(String name, Object obj) throws NamingException { getBoundContext().rebind(parseName(name), obj); } /** * Unbinds the named object. Removes the terminal atomic name in name * from the target context--that named by all but the terminal atomic * part of name. *

* This method is idempotent. It succeeds even if the terminal atomic * name is not bound in the target context, but throws * NameNotFoundException if any of the intermediate contexts do not exist. * * @param name the name to bind; may not be empty * @exception NameNotFoundException if an intermediate context does not * exist * @exception NamingException if a naming exception is encountered */ public void unbind(Name name) throws NamingException { getBoundContext().unbind(parseName(name)); } /** * Unbinds the named object. * * @param name the name to bind; may not be empty * @exception NameNotFoundException if an intermediate context does not * exist * @exception NamingException if a naming exception is encountered */ public void unbind(String name) throws NamingException { getBoundContext().unbind(parseName(name)); } /** * Binds a new name to the object bound to an old name, and unbinds the * old name. Both names are relative to this context. Any attributes * associated with the old name become associated with the new name. * Intermediate contexts of the old name are not changed. * * @param oldName the name of the existing binding; may not be empty * @param newName the name of the new binding; may not be empty * @exception NameAlreadyBoundException if newName is already bound * @exception NamingException if a naming exception is encountered */ public void rename(Name oldName, Name newName) throws NamingException { getBoundContext().rename(parseName(oldName), parseName(newName)); } /** * Binds a new name to the object bound to an old name, and unbinds the * old name. * * @param oldName the name of the existing binding; may not be empty * @param newName the name of the new binding; may not be empty * @exception NameAlreadyBoundException if newName is already bound * @exception NamingException if a naming exception is encountered */ public void rename(String oldName, String newName) throws NamingException { getBoundContext().rename(parseName(oldName), parseName(newName)); } /** * Enumerates the names bound in the named context, along with the class * names of objects bound to them. The contents of any subcontexts are * not included. *

* If a binding is added to or removed from this context, its effect on * an enumeration previously returned is undefined. * * @param name the name of the context to list * @return an enumeration of the names and class names of the bindings in * this context. Each element of the enumeration is of type NameClassPair. * @exception NamingException if a naming exception is encountered */ public NamingEnumeration list(Name name) throws NamingException { return getBoundContext().list(parseName(name)); } /** * Enumerates the names bound in the named context, along with the class * names of objects bound to them. * * @param name the name of the context to list * @return an enumeration of the names and class names of the bindings in * this context. Each element of the enumeration is of type NameClassPair. * @exception NamingException if a naming exception is encountered */ public NamingEnumeration list(String name) throws NamingException { return getBoundContext().list(parseName(name)); } /** * Enumerates the names bound in the named context, along with the * objects bound to them. The contents of any subcontexts are not * included. *

* If a binding is added to or removed from this context, its effect on * an enumeration previously returned is undefined. * * @param name the name of the context to list * @return an enumeration of the bindings in this context. * Each element of the enumeration is of type Binding. * @exception NamingException if a naming exception is encountered */ public NamingEnumeration listBindings(Name name) throws NamingException { return getBoundContext().listBindings(parseName(name)); } /** * Enumerates the names bound in the named context, along with the * objects bound to them. * * @param name the name of the context to list * @return an enumeration of the bindings in this context. * Each element of the enumeration is of type Binding. * @exception NamingException if a naming exception is encountered */ public NamingEnumeration listBindings(String name) throws NamingException { return getBoundContext().listBindings(parseName(name)); } /** * Destroys the named context and removes it from the namespace. Any * attributes associated with the name are also removed. Intermediate * contexts are not destroyed. *

* This method is idempotent. It succeeds even if the terminal atomic * name is not bound in the target context, but throws * NameNotFoundException if any of the intermediate contexts do not exist. * * In a federated naming system, a context from one naming system may be * bound to a name in another. One can subsequently look up and perform * operations on the foreign context using a composite name. However, an * attempt destroy the context using this composite name will fail with * NotContextException, because the foreign context is not a "subcontext" * of the context in which it is bound. Instead, use unbind() to remove * the binding of the foreign context. Destroying the foreign context * requires that the destroySubcontext() be performed on a context from * the foreign context's "native" naming system. * * @param name the name of the context to be destroyed; may not be empty * @exception NameNotFoundException if an intermediate context does not * exist * @exception NotContextException if the name is bound but does not name * a context, or does not name a context of the appropriate type */ public void destroySubcontext(Name name) throws NamingException { getBoundContext().destroySubcontext(parseName(name)); } /** * Destroys the named context and removes it from the namespace. * * @param name the name of the context to be destroyed; may not be empty * @exception NameNotFoundException if an intermediate context does not * exist * @exception NotContextException if the name is bound but does not name * a context, or does not name a context of the appropriate type */ public void destroySubcontext(String name) throws NamingException { getBoundContext().destroySubcontext(parseName(name)); } /** * Creates and binds a new context. Creates a new context with the given * name and binds it in the target context (that named by all but * terminal atomic component of the name). All intermediate contexts and * the target context must already exist. * * @param name the name of the context to create; may not be empty * @return the newly created context * @exception NameAlreadyBoundException if name is already bound * @exception InvalidAttributesException if creation of the subcontext * requires specification of mandatory attributes * @exception NamingException if a naming exception is encountered */ public Context createSubcontext(Name name) throws NamingException { return getBoundContext().createSubcontext(parseName(name)); } /** * Creates and binds a new context. * * @param name the name of the context to create; may not be empty * @return the newly created context * @exception NameAlreadyBoundException if name is already bound * @exception InvalidAttributesException if creation of the subcontext * requires specification of mandatory attributes * @exception NamingException if a naming exception is encountered */ public Context createSubcontext(String name) throws NamingException { return getBoundContext().createSubcontext(parseName(name)); } /** * Retrieves the named object, following links except for the terminal * atomic component of the name. If the object bound to name is not a * link, returns the object itself. * * @param name the name of the object to look up * @return the object bound to name, not following the terminal link * (if any). * @exception NamingException if a naming exception is encountered */ public Object lookupLink(Name name) throws NamingException { return getBoundContext().lookupLink(parseName(name)); } /** * Retrieves the named object, following links except for the terminal * atomic component of the name. * * @param name the name of the object to look up * @return the object bound to name, not following the terminal link * (if any). * @exception NamingException if a naming exception is encountered */ public Object lookupLink(String name) throws NamingException { return getBoundContext().lookupLink(parseName(name)); } /** * Retrieves the parser associated with the named context. In a * federation of namespaces, different naming systems will parse names * differently. This method allows an application to get a parser for * parsing names into their atomic components using the naming convention * of a particular naming system. Within any single naming system, * NameParser objects returned by this method must be equal (using the * equals() test). * * @param name the name of the context from which to get the parser * @return a name parser that can parse compound names into their atomic * components * @exception NamingException if a naming exception is encountered */ public NameParser getNameParser(Name name) throws NamingException { return getBoundContext().getNameParser(parseName(name)); } /** * Retrieves the parser associated with the named context. * * @param name the name of the context from which to get the parser * @return a name parser that can parse compound names into their atomic * components * @exception NamingException if a naming exception is encountered */ public NameParser getNameParser(String name) throws NamingException { return getBoundContext().getNameParser(parseName(name)); } /** * Composes the name of this context with a name relative to this context. *

* Given a name (name) relative to this context, and the name (prefix) * of this context relative to one of its ancestors, this method returns * the composition of the two names using the syntax appropriate for the * naming system(s) involved. That is, if name names an object relative * to this context, the result is the name of the same object, but * relative to the ancestor context. None of the names may be null. * * @param name a name relative to this context * @param prefix the name of this context relative to one of its ancestors * @return the composition of prefix and name * @exception NamingException if a naming exception is encountered */ public Name composeName(Name name, Name prefix) throws NamingException { prefix = (Name) name.clone(); return prefix.addAll(name); } /** * Composes the name of this context with a name relative to this context. * * @param name a name relative to this context * @param prefix the name of this context relative to one of its ancestors * @return the composition of prefix and name * @exception NamingException if a naming exception is encountered */ public String composeName(String name, String prefix) throws NamingException { return prefix + "/" + name; } /** * Adds a new environment property to the environment of this context. If * the property already exists, its value is overwritten. * * @param propName the name of the environment property to add; may not * be null * @param propVal the value of the property to add; may not be null * @exception NamingException if a naming exception is encountered */ public Object addToEnvironment(String propName, Object propVal) throws NamingException { return getBoundContext().addToEnvironment(propName, propVal); } /** * Removes an environment property from the environment of this context. * * @param propName the name of the environment property to remove; * may not be null * @exception NamingException if a naming exception is encountered */ public Object removeFromEnvironment(String propName) throws NamingException { return getBoundContext().removeFromEnvironment(propName); } /** * Retrieves the environment in effect for this context. See class * description for more details on environment properties. * The caller should not make any changes to the object returned: their * effect on the context is undefined. The environment of this context * may be changed using addToEnvironment() and removeFromEnvironment(). * * @return the environment of this context; never null * @exception NamingException if a naming exception is encountered */ public Hashtable getEnvironment() throws NamingException { return getBoundContext().getEnvironment(); } /** * Closes this context. This method releases this context's resources * immediately, instead of waiting for them to be released automatically * by the garbage collector. * This method is idempotent: invoking it on a context that has already * been closed has no effect. Invoking any other method on a closed * context is not allowed, and results in undefined behaviour. * * @exception NamingException if a naming exception is encountered */ public void close() throws NamingException { getBoundContext().close(); } /** * Retrieves the full name of this context within its own namespace. *

* Many naming services have a notion of a "full name" for objects in * their respective namespaces. For example, an LDAP entry has a * distinguished name, and a DNS record has a fully qualified name. This * method allows the client application to retrieve this name. The string * returned by this method is not a JNDI composite name and should not be * passed directly to context methods. In naming systems for which the * notion of full name does not make sense, * OperationNotSupportedException is thrown. * * @return this context's name in its own namespace; never null * @exception OperationNotSupportedException if the naming system does * not have the notion of a full name * @exception NamingException if a naming exception is encountered */ public String getNameInNamespace() throws NamingException { return prefix; } // ------------------------------------------------------ Protected Methods /** * Get the bound context. */ protected Context getBoundContext() throws NamingException { if (initialContext) { String ICName = "IC_" + ContextBindings.getThreadName(); Context initialContext = ContextBindings.getContext(ICName); if (initialContext == null) { // Allocating a new context and binding it to the appropriate // name initialContext = new NamingContext(env, ICName); ContextBindings.bindContext(ICName, initialContext); } return initialContext; } else { return ContextBindings.getThread(); } } /** * Strips the URL header. * * @return the parsed name * @exception NamingException if there is no "java:" header or if no * naming context has been bound to this thread */ protected String parseName(String name) throws NamingException { if ((!initialContext) && (name.startsWith(prefix))) { return (name.substring(prefixLength)); } else { if (initialContext) { return (name); } else { throw new NamingException (sm.getString("selectorContext.noJavaUrl")); } } } /** * Strips the URL header. * * @return the parsed name * @exception NamingException if there is no "java:" header or if no * naming context has been bound to this thread */ protected Name parseName(Name name) throws NamingException { if ((!initialContext) && (!name.isEmpty()) && (name.get(0).equals(prefix))) { return (name.getSuffix(1)); } else { if (initialContext) { return (name); } else { throw new NamingException (sm.getString("selectorContext.noJavaUrl")); } } } } 1.1 jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/StringManager.java Index: StringManager.java =================================================================== /* * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/StringManager.java,v 1.1 2000/11/02 06:14:16 remm Exp $ * $Revision: 1.1 $ * $Date: 2000/11/02 06:14:16 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.naming; import java.text.MessageFormat; import java.util.Hashtable; import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; /** * An internationalization / localization helper class which reduces * the bother of handling ResourceBundles and takes care of the * common cases of message formating which otherwise require the * creation of Object arrays and such. * *

The StringManager operates on a package basis. One StringManager * per package can be created and accessed via the getManager method * call. * *

The StringManager will look for a ResourceBundle named by * the package name given plus the suffix of "LocalStrings". In * practice, this means that the localized information will be contained * in a LocalStrings.properties file located in the package * directory of the classpath. * *

Please see the documentation for java.util.ResourceBundle for * more information. * * @author James Duncan Davidson [duncan@eng.sun.com] * @author James Todd [gonzo@eng.sun.com] */ public class StringManager { /** * The ResourceBundle for this StringManager. */ private ResourceBundle bundle; /** * Creates a new StringManager for a given package. This is a * private method and all access to it is arbitrated by the * static getManager method call so that only one StringManager * per package will be created. * * @param packageName Name of package to create StringManager for. */ private StringManager(String packageName) { String bundleName = packageName + ".LocalStrings"; bundle = ResourceBundle.getBundle(bundleName); } /** * Get a string from the underlying resource bundle. * * @param key */ public String getString(String key) { if (key == null) { String msg = "key is null"; throw new NullPointerException(msg); } String str = null; try { str = bundle.getString(key); } catch (MissingResourceException mre) { str = "Cannot find message associated with key '" + key + "'"; } return str; } /** * Get a string from the underlying resource bundle and format * it with the given set of arguments. * * @param key * @param args */ public String getString(String key, Object[] args) { String iString = null; String value = getString(key); // this check for the runtime exception is some pre 1.1.6 // VM's don't do an automatic toString() on the passed in // objects and barf out try { // ensure the arguments are not null so pre 1.2 VM's don't barf Object nonNullArgs[] = args; for (int i=0; i. * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.naming.java; import java.util.Hashtable; import javax.naming.Name; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.spi.ObjectFactory; import javax.naming.spi.InitialContextFactory; import org.apache.naming.SelectorContext; import org.apache.naming.NamingContext; import org.apache.naming.ContextBindings; /** * Context factory for the "java:" namespace. *

* Important note : This factory MUST be associated with the "java" URL * prefix, which can be done by either : *

    *
  • Adding a * java.naming.factory.url.pkgs=org.apache.catalina.util.naming property * to the JNDI properties file
  • *
  • Setting an environment variable named Context.URL_PKG_PREFIXES with * its value including the org.apache.catalina.util.naming package name. * More detail about this can be found in the JNDI documentation : * {@link javax.naming.spi.NamingManager#getURLContext(java.lang.String, java.util.Hashtable)}.
  • *
* * @author Remy Maucherat * @version $Revision: 1.1 $ $Date: 2000/11/02 06:14:18 $ */ public class javaURLContextFactory implements ObjectFactory, InitialContextFactory { // ----------------------------------------------------------- Constructors // -------------------------------------------------------------- Constants public static final String MAIN = "initialContext"; // ----------------------------------------------------- Instance Variables /** * Initial context. */ protected static Context initialContext = null; // --------------------------------------------------------- Public Methods // -------------------------------------------------- ObjectFactory Methods /** * Crete a new Context's instance. */ public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws NamingException { if (ContextBindings.isThreadBound()) { return new SelectorContext(environment); } else { return null; } } /** * Get a new (writable) initial context. */ public Context getInitialContext(Hashtable environment) throws NamingException { if (ContextBindings.isThreadBound()) { // Redirect the request to the bound initial context return new SelectorContext(environment, true); } else { // If the thread is not bound, return a shared writable context if (initialContext == null) initialContext = new NamingContext(environment, MAIN); return initialContext; } } }