/*
* Copyright 1999-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package javax.naming;
import java.util.Hashtable;
import javax.naming.spi.NamingManager;
import com.sun.naming.internal.ResourceManager;
/**
* This class is the starting context for performing naming operations.
*
* All naming operations are relative to a context.
* The initial context implements the Context interface and
* provides the starting point for resolution of names.
*
*
* When the initial context is constructed, its environment
* is initialized with properties defined in the environment parameter
* passed to the constructor, and in any
* application resource files.
* In addition, a small number of standard JNDI properties may
* be specified as system properties or as applet parameters
* (through the use of {@link Context#APPLET}).
* These special properties are listed in the field detail sections of the
* Context and
* LdapContext
* interface documentation.
*
* JNDI determines each property's value by merging
* the values from the following two sources, in order:
*
*
* The first occurrence of the property from the constructor's
* environment parameter and (for appropriate properties) the applet
* parameters and system properties.
*
* The application resource files (jndi.properties).
*
* For each property found in both of these two sources, or in
* more than one application resource file, the property's value
* is determined as follows. If the property is
* one of the standard JNDI properties that specify a list of JNDI
* factories (see Context),
* all of the values are
* concatenated into a single colon-separated list. For other
* properties, only the first value found is used.
*
*
* The initial context implementation is determined at runtime.
* The default policy uses the environment property
* "{@link Context#INITIAL_CONTEXT_FACTORY java.naming.factory.initial}",
* which contains the class name of the initial context factory.
* An exception to this policy is made when resolving URL strings, as described
* below.
*
* When a URL string (a String of the form
* scheme_id:rest_of_name) is passed as a name parameter to
* any method, a URL context factory for handling that scheme is
* located and used to resolve the URL. If no such factory is found,
* the initial context specified by
* "java.naming.factory.initial" is used. Similarly, when a
* CompositeName object whose first component is a URL string is
* passed as a name parameter to any method, a URL context factory is
* located and used to resolve the first name component.
* See {@link NamingManager#getURLContext
* NamingManager.getURLContext()} for a description of how URL
* context factories are located.
*
* This default policy of locating the initial context and URL context
* factories may be overridden
* by calling
* NamingManager.setInitialContextFactoryBuilder().
*
* NoInitialContextException is thrown when an initial context cannot
* be instantiated. This exception can be thrown during any interaction
* with the InitialContext, not only when the InitialContext is constructed.
* For example, the implementation of the initial context might lazily
* retrieve the context only when actual methods are invoked on it.
* The application should not have any dependency on when the existence
* of an initial context is determined.
*
* When the environment property "java.naming.factory.initial" is
* non-null, the InitialContext constructor will attempt to create the
* initial context specified therein. At that time, the initial context factory
* involved might throw an exception if a problem is encountered. However,
* it is provider implementation-dependent when it verifies and indicates
* to the users of the initial context any environment property- or
* connection- related problems. It can do so lazily--delaying until
* an operation is performed on the context, or eagerly, at the time
* the context is constructed.
*
* An InitialContext instance is not synchronized against concurrent
* access by multiple threads. Multiple threads each manipulating a
* different InitialContext instance need not synchronize.
* Threads that need to access a single InitialContext instance
* concurrently should synchronize amongst themselves and provide the
* necessary locking.
*
* @author Rosanna Lee
* @author Scott Seligman
*
* @see Context
* @see NamingManager#setInitialContextFactoryBuilder
* NamingManager.setInitialContextFactoryBuilder
* @since JNDI 1.1 / Java 2 Platform, Standard Edition, v 1.3
*/
public class InitialContext implements Context {
/**
* The environment associated with this InitialContext.
* It is initialized to null and is updated by the constructor
* that accepts an environment or by the init() method.
* @see #addToEnvironment
* @see #removeFromEnvironment
* @see #getEnvironment
*/
protected Hashtable