/* 
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

 
package javax.naming;

import java.util.Hashtable;

/**
 * The <code>Context</code> interface describes a naming context comprising a 
 * collection of bindings (see <code>javax.naming.Binding</code>) and methods 
 * for manipulating them. This interface is extended by interfaces 
 * <code>javax.naming.directory.DirContext</code> and
 * <code>javax.naming.event.EventContext</code>. The class 
 * <code>javax.naming.InitialContext</code> implements the <code>Context</code> 
 * interface.
 * <p>
 * Any of the methods may throw a <code>NamingException</code> or one of its 
 * subclasses. The specifications for those exceptions explain the 
 * circumstances in which they may be thrown.</p>
 * <p>
 * Name parameters to context methods are each relative to the context. Name
 * parameters cannot be null. The empty name, whether of type <code>Name</code> 
 * or <code>String</code>, is the name of the initial context. Names may be 
 * composed of multiple components; for example, in the filesystem name 
 * "usr/include/stdio.h", each of the components "usr", "include", "stdio.h" 
 * is an atomic component, but only "stdio.h" is the terminal atomic component. 
 * The example name may be used in context operations providing the intervening 
 * parent contexts for "usr" and "include" already exist. Finally, if the 
 * current context has name "usr/include", then the example name could be the 
 * result of <code>composeName("stdio.h","usr/include")</code>.</p>
 * <p>
 * Depending on whether a naming system supports federation, that is, names
 * that may include components from different naming systems, name parameters
 * to context methods may be considered differently as described below.</p>
 * <p>
 * In systems supporting federation, String name parameters are treated as
 * composite names. When <code>Name</code> parameters are not instances of 
 * <code>CompositeName</code>, they are deemed to be compound names 
 * (<code>CompoundName</code> instances or subclasses of them). Also, when 
 * using <code>list()</code> or <code>listBindings()</code> to obtain a
 * <code>NamingEnumeration</code>, all names in the enumeration are string 
 * representations of composite names.</p>
 * <p>
 * Where systems do not support federation, a service provider may treat name
 * parameters to context methods and names found using 
 * <code>NamingEnumeration</code> may either as composite names or as compound
 * names. See service provider documentation for details.</p>
 * <p>
 * Any <code>Name</code> parameter specified to a context method is owned by 
 * the caller and will remain unchanged, but applications should avoid 
 * modifying these <code>Name</code> objects while the operation has not 
 * completed. Any <code>Name</code> object returned by a context operation 
 * becomes owned by the caller.</p>
 * <p>
 * JNDI applications can provide preferences and configuration information,
 * such as security details for authentication to a service, using JNDI
 * environment properties. JNDI environment properties nearly all begin with
 * "java.naming." except for provider-specific properties (explained below).
 * All specified JNDI environment properties together comprise the context
 * environment and methods are available for examining and manipulating that
 * environment. The environment of a context may not necessarily contain all
 * possible JNDI properties; for example, one or more may remain unspecified.</p>
 * <p>
 * The set of standard JNDI environment properties is:
 * <pre>
 * Property name                       Value type    Notes
 * -------------                       ----------    -----
 * java.naming.applet                  F
 * java.naming.authoritative           F
 * java.naming.batchsize               F
 * java.naming.dns.url                 F
 * java.naming.factory.control         C             see LdapContext
 * java.naming.factory.initial         F
 * java.naming.factory.object          C
 * java.naming.factory.state           C
 * java.naming.factory.url.pkgs        C
 * java.naming.language                F
 * java.naming.provider.url            F
 * java.naming.referral                F
 * java.naming.security.authentication F
 * java.naming.security.credentials    F
 * java.naming.security.principal      F
 * java.naming.security.protocol       F
 * </pre></p>
 * <p>
 * For each property above marked with "C" for "concatenate", when encountered
 * while searching sources of environment properties, values are combined into
 * a single list separated by colons and becomes the resulting value of that
 * property.</p>
 * <p>
 * For each property above marked with "F" for "first occurrence", when
 * encountered while searching sources of environment properties, the first
 * value encountered is the resulting value of that property. In the latter
 * case, and with additional JNDI environment properties explained further
 * below, the type and syntax of acceptable property values should be
 * described in the corresponding documentation for the property. In
 * particular, a property may accept a value consisting of several pieces of
 * relevant information, but the search order and precedence for environment
 * properties ensures that the entire value of the first occurrence of a given
 * property is deemed the value to be used.</p>
 * <p>
 * Additional JNDI environment properties may be defined according to the
 * needs of the particular service and/or service providers and a few
 * guidelines should be followed when choosing appropriate names for them.
 * Such additional properties comprise service-specific, feature-specific,
 * or provider-specific properties.</p>
 * <p>
 * Service-specific JNDI properties may be used by all service providers that
 * offer implementations for a given service and would include the service
 * type in the property name prefix. For example, JNDI service providers for
 * Java RMI should name their service-specific JNDI properties using prefix
 * "java.naming.rmi.", or LDAP service providers should use prefix
 * "java.naming.ldap.".</p>
 * <p>
 * Feature-specific JNDI properties may be used by all service providers
 * offering implementations using a particular flavor of a feature and would
 * include the feature name and the particular flavor name in the property
 * name prefix. A common example is SASL used by several service providers for
 * security; appropriate SASL feature-specific properties would use prefix
 * "java.naming.security.sasl.".</p>
 * <p>
 * Provider-specific JNDI properties are used by only a single provider though
 * a provider may offer more than one service provider implementation. The
 * provider should ensure uniqueness of their provider properties, for example,
 * an LDAP service provider from mycom might use a service provider package
 * name such as "com.mycom.jndi.ldap." as their provider-specific prefix.</p>
 * <p>
 * JNDI environment properties can be specified in a <code>Hashtable</code> 
 * and passed as the environment parameter when creating an initial context.</p>
 * <p>
 * Two other important sources of JNDI environment properties are resource
 * files provided by applications and applet parameters (each is considered as
 * an application resource file) and by service provider implementations
 * (provider resource files) in the format of Java properties files - see
 * <code>java.util.Properties</code> class for details.</p>
 * <p>
 * At runtime, the application classpath and, where appropriate, the applet
 * codebase attribute is used to locate the classes to run; when creating the
 * first initial context, the JNDI also searches the same path for all files
 * (application resource files) called "jndi.properties"; it is the classpath
 * associated with the context <code>ClassLoader</code> (for example, the 
 * return value from <code>Thread.getContextClassLoader()</code> or from 
 * <code>ClassLoader.getSystemClassLoader()</code>) which is searched to get 
 * the resource files. Further, a path comprising the value of the "java.home" 
 * system property followed by "lib/jndi.properties" is checked for a readable 
 * file; if one exists, then that file is used as another application resource 
 * file. All application resource files found in the application classpath are 
 * examined, but JNDI properties set in a file found early will override the 
 * same properties also set in a file found later in the classpath.</p>
 * <p>
 * Provider resource files are located according to the package prefix for the
 * service provider's initial context factory and context implementation class
 * in which dot separator characters are converted into slash path separator
 * characters to construct a filepath appended with "jndiprovider.properties".
 * Consider the example where you have a service provider which supplies
 * a context <code>org.apache.harmony.jndi.example.exampleCtx</code>.
 * In this case the package prefix is <code>org.apache.harmony.jndi.example</code>. 
 * Substituting slash chars for dots & appending "jndiprovider.properties" 
 * gives you <code>org/apache/harmony/jndi/example/jndiprovider.properties</code>.</p>
 * <p>
 * An important part of service provider implementation is to specify certain
 * standard JNDI properties that are using to locate any of the various
 * factory classes needed for the implementation; these are:
 * <pre>
 * java.naming.factory.control
 * java.naming.factory.object
 * java.naming.factory.state
 * java.naming.factory.url.pkgs - package prefixes used for URL contexts
 * </pre></p>
 * <p>
 * When searching for the above 4 properties only provider resource files
 * should be examined. Although other properties may be specified in them for
 * use by the service provider implementation, the JNDI ignores properties
 * from these files other than those related to factories.</p>
 * <p>
 * It should be noted that a provider resource file's properties differ from
 * those in application resource files in that their values are not 
 * incorporated into the environment. Instead, they are read when the 
 * following methods are invoked with <code>Context</code> and 
 * <code>Hashtable</code> parameters:
 * <pre>
 * ControlFactory.getControlInstance    - uses java.naming.factory.control
 * DirectoryManager.getObjectInstance   - uses java.naming.factory.object
 * DirectoryManager.getStateToBind      - uses java.naming.factory.state
 * NamingManager.getObjectInstance      - uses java.naming.factory.object
 * NamingManager.getStateToBind         - uses java.naming.factory.state
 * </pre></p>
 * <p>
 * These methods use their <code>Hashtable</code> parameter to get the 
 * environment properties. Then they use the class loader of the 
 * <code>Context</code> parameter to look for the provider resource file. 
 * If the file is found, then the value of the required property is appended 
 * to the value of the required property in the environment. Note that it is 
 * appended for use by this method but the environment itself is unaffected.</p>
 * <p>
 * The <code>jndiprovider.properties</code> files may specify additional 
 * properties, but documentation for the service provider should clearly 
 * describe which properties are valid in this file and under what 
 * circumstances.</p>
 * <p>
 * To summarize the search order and precedence for JNDI environment
 * properties, the earliest having highest precedence:
 * <pre>
 * 1. environment parameter used to initialize an initial context,
 * 2. applet parameters, (only used if that environment param does not exist)
 * 3. system properties, (only used if that environment and applet parameter 
 *    do not exist)
 * 4. application resource files.
 * </pre></p>
 * <p>
 * It should be noted that in the case of applet parameters and system 
 * properties only a subset of the properties are read. These are the 
 * following 7:
 * <pre>
 * java.naming.dns.url
 * java.naming.factory.control
 * java.naming.factory.initial
 * java.naming.factory.object
 * java.naming.factory.state
 * java.naming.factory.url.pkgs
 * java.naming.provider.url
 * </pre></p>
 * <p>
 * For a JNDI property found in more than one of those sources, if it is one
 * of the JNDI factory list properties then values are joined into a
 * colon-separated list, otherwise the first instance of a property defines
 * the value to be used.</p>
 * <p>
 * The above search order and precedence applies when creating contexts for
 * any class implementing the <code>Context</code> interface.</p>
 * <p>
 * Although a subcontext inherits the environment of its parent context,
 * subsequent changes to either's environment has no direct effect on the
 * other. However, applications should avoid dependency on when JNDI properties
 * are used or verified as this depends on the service provider implementation.
 * As the environment of a context can be examined by any object that has a
 * reference to the context, care should be taken to assess the risk to
 * any security details stored in the environment.</p>
 * <p>
 * Multithreaded access to a single <code>Context</code> instance is only safe 
 * when client code uses appropriate synchronization and locking.</p>
 * <p>
 * When a <code>NamingEnumeration</code> is returned by a <code>Context</code> 
 * method, the operation should not be considered complete, for concurrency 
 * purposes, if the NamingEnumeration is still being used or if any referrals 
 * are still being followed resulting from that operation.</p>
 * 
 */
public interface Context {

    /*
     * -------------------------------------------------------------------
     * Constants
     * -------------------------------------------------------------------
     */

    /**
     * A constant containing environment property name "java.naming.applet". 
     * The property may remain unspecified or may be specified within the 
     * environment parameter used when creating an initial context. When 
     * this environment property is specified, its value must be the currently 
     * executing instance of <code>java.applet.Applet</code> to enable the 
     * operation of initial context creation to search applet parameters first 
     * for other environment properties which may have been specified, before 
     * searching for properties in the constructor environment parameter, 
     * system properties, and application resource files.
     */
    public static final String APPLET = "java.naming.applet"; //$NON-NLS-1$

    /**
     * A constant containing environment property name 
     * "java.naming.authoritative". An application specifies this property to 
     * indicate whether naming requests must be made to the most authoritative 
     * naming service instance or not. The property may remain unspecified or 
     * may be specified with a string value. If unspecified, the property 
     * value is considered to be "false". A value of "true" means requests 
     * should be made to the most authoritative naming service replicas or 
     * caches that may be available. Any value other than "true" means 
     * requests may be made to any instance of the naming service which need 
     * not be, but may include, the most authoritative.
     */
    public static final String AUTHORITATIVE = "java.naming.authoritative"; //$NON-NLS-1$

    /**
     * A constant containing environment property name "java.naming.batchsize".
     * An application specifies this property to indicate a preference to 
     * receive operation results in batches of the given size from the service 
     * provider. The property may remain unspecified or may be specified with 
     * an integer expressed as a string value. If unspecified, the batch size 
     * of operation results is determined by the service provider. The service 
     * provider implementation may use or ignore the specified value.
     */
    public static final String BATCHSIZE = "java.naming.batchsize"; //$NON-NLS-1$

    /**
     * A constant containing environment property name "java.naming.dns.url". 
     * The property specifies a DNS-scheme URL including the DNS host 
     * including domain names, if any; for example, "dns://9.28.36.7/apache.org". 
     * If the application uses any JNDI URL with DNS names and a search for 
     * this property fails, then the naming operation will throw a 
     * <code>ConfigurationException</code>.
     */
    public static final String DNS_URL = "java.naming.dns.url"; //$NON-NLS-1$

    /**
     * A constant containing environment property name
     * "java.naming.factory.initial". The property specifies the name of the
     * factory class, fully-qualified, that will be used to create an initial
     * context; for example, "mycom.jndi.testing.spi.DazzleContextFactory". 
     * If the property is not specified, any operation requiring an initial 
     * context will throw a <code>NoInitialContextException</code>.
     */
    public static final String INITIAL_CONTEXT_FACTORY =
        "java.naming.factory.initial"; //$NON-NLS-1$

    /**
     * A constant containing environment property name "java.naming.language". 
     * The property indicates the preferred language for operations with the 
     * service provider. The property may remain unspecified or should be a 
     * string comprising a list of language tags according to RFC 1766 
     * separated by colons. When not specified, the language preference is 
     * selected by the service provider.
     */
    public static final String LANGUAGE = "java.naming.language"; //$NON-NLS-1$

    /**
     * A constant containing environment property name 
     * "java.naming.factory.object". The property specifies a list of object 
     * factories to be used when the application requests an instance of a 
     * specified object. The value is a string comprising a list of fully 
     * qualified object factory class names separated by colons.
     */
    public static final String OBJECT_FACTORIES = "java.naming.factory.object"; //$NON-NLS-1$

    /**
     * A constant containing environment property name 
     * "java.naming.provider.url". The property specifies configuration 
     * options for use by the a service provider. The property may remain 
     * unspecified or should be a URL string; for example, 
     * "ldap://ahost.myfirm.com:389". If not specified, the service provider 
     * selects its default configuration.
     */
    public static final String PROVIDER_URL = "java.naming.provider.url"; //$NON-NLS-1$

    /**
     * A constant containing environment property name "java.naming.referral".
     * The property specifies how the service provider should process any 
     * referrals encountered during a naming operation. The property may 
     * remain unspecified or specified as one of the following strings:
     * <ul>
     * <li>"follow" service provider should always follow referrals</li>
     * <li>"ignore" service provider should ignore referrals</li>
     * <li>"throw"  service provider should throw ReferralException if it 
     * encounters a referral</li>
     *</ul>
     * When not specified, the service provider selects a default value.
     */
    public static final String REFERRAL = "java.naming.referral"; //$NON-NLS-1$

    /**
     * A constant containing environment property name
     * "java.naming.security.authentication". The property specifies the 
     * security level to be used in naming operations. The property may remain
     * unspecified or be one of the strings "none", "simple", "strong". When 
     * not specified, the service provider selects a default value.
     */
    public static final String SECURITY_AUTHENTICATION =
        "java.naming.security.authentication"; //$NON-NLS-1$

    /**
     * A constant containing environment property name
     * "java.naming.security.credentials". The property specifies credentials 
     * of the security principal so that the caller can be authenticated to 
     * the naming service. The property may remain unspecified or be a value
     * according to the authentication scheme controlling access to the 
     * service. When not specified, the service provider determines how to 
     * respond to service requests affected by the lack of security 
     * credentials.
     */
    public static final String SECURITY_CREDENTIALS =
        "java.naming.security.credentials"; //$NON-NLS-1$

    /**
     * A constant containing environment property name
     * "java.naming.security.principal". The property the name of the security
     * principal to be used when the caller needs to be authenticated to the
     * naming service. The property may remain unspecified or be a value
     * according to the authentication scheme controlling access to the 
     * service. When not specified, the service provider determines how to 
     * respond to service requests affected by the lack of a security 
     * principal.
     */
    public static final String SECURITY_PRINCIPAL =
        "java.naming.security.principal"; //$NON-NLS-1$

    /**
     * A constant containing environment property name
     * "java.naming.security.protocol". The property the name of the security
     * protocol to be used with the naming service. The property may remain
     * unspecified or be specified as a string according to the service 
     * provider implementation. When not specified, the service provider 
     * determines how to respond to service requests.
     */
    public static final String SECURITY_PROTOCOL =
        "java.naming.security.protocol"; //$NON-NLS-1$

    /**
     * A constant containing environment property name 
     * "java.naming.factory.state". The property specifies a list of state 
     * factories to be used when the application requests the state of a 
     * specified object. The value is a string comprising a list of fully 
     * qualified state factory class names separated by colons. The property 
     * may remain unspecified.
     */
    public static final String STATE_FACTORIES = "java.naming.factory.state"; //$NON-NLS-1$

    /**
     * A constant containing environment property name
     * "java.naming.factory.url.pkgs". The property specifies a list of 
     * package prefixes that are used to load URL context factories. The value 
     * is a string comprising a list of package prefixes for class names of 
     * URL context factory classes separated by colons. The property may 
     * remain unspecified. In any case, prefix "com.sun.jndi.url" is 
     * automatically added to the list of specified package prefixes or used 
     * as the only package prefix when the property is unspecified.
     */
    public static final String URL_PKG_PREFIXES =
        "java.naming.factory.url.pkgs"; //$NON-NLS-1$

    /*
     * -------------------------------------------------------------------
     * Methods
     * -------------------------------------------------------------------
     */

    /**
     * Adds or replaces the environment property specified by the non-null 
     * string parameter into the environment of this context with the 
     * specified object value. Returns the previous property value if 
     * replaced, or null if the property did not exist in the environment.
     * 
     * @param s the name of the property to add
     * @param o the value of the property to add
     * @return  the previous property value if replaced, or null if the
     *          property did not exist in the environment.
     * @throws NamingException if an error occurs.
     */
    public Object addToEnvironment(String s, Object o) throws NamingException;

    /**
     * Binds the specified name to the specified object in this context. The
     * specified name may not be null. The specified object may be null when 
     * a name bound to a null object is meaningful in the semantics of the
     * underlying naming system, otherwise a <code>NamingException</code> 
     * is thrown.
     * 
     * @param n a <code>Name</code>, may not be null
     * @param o an object to bind with the name, may be null
     * @throws NamingException if an error occurs.
     */
    public void bind(Name n, Object o) throws NamingException;

    /**
     * Binds the specified name to the specified object in this context. The
     * specified name may not be null. The specified object may be null when 
     * a name bound to a null object is meaningful in the semantics of the
     * underlying naming system, otherwise a <code>NamingException</code> 
     * is thrown.
     * 
     * @param s a name in string, may not be null
     * @param o an object to bind with the name, may be null
     * @throws NamingException if an error occurs.
     */
    public void bind(String s, Object o) throws NamingException;

    /**
     * Closes this context. The result of any further operations on a closed
     * context is undefined. 
     * 
     * @throws NamingException if an error occurs.
     */
    public void close() throws NamingException;

    /**
     * Combines two names into a composite name according to the syntax for 
     * this context. The name <code>pfx</code> is expected to be the name of 
     * one or more of the immediate parent contexts of this context. The name 
     * <code>n</code> is a name relative to this context. Neither 
     * <code>pfx</code> nor <code>n</code> may be null. The combined result 
     * is a name which is relative to the specified parent context names.
     * 
     * @param n     a <code>Name</code>, may not be null
     * @param pfx   a <code>Name</code> serves as perfix, may not be null
     * @return      the combined name
     * @throws NamingException if an error occurs.
     */
    public Name composeName(Name n, Name pfx) throws NamingException;

    /**
     * Combines two names into a composite name according to the syntax for 
     * this context. The name <code>pfx</code> is expected to be the name of 
     * one or more of the immediate parent contexts of this context. The name 
     * <code>s</code> is a name relative to this context. Neither 
     * <code>pfx</code> nor <code>s</code> may be null. The combined result 
     * is a name which is relative to the specified parent context names.
     * 
     * @param s     a name in string, may not be null
     * @param pfx   a name in string, serves as prefix, may not be null
     * @return      the combined name in string
     * @throws NamingException if an error occurs.
     */
    public String composeName(String s, String pfx) throws NamingException;

    /**
     * Creates a new context with the specified name as a child of this 
     * context and creates a binding for the name with the new context 
     * object in this context. This is analogous to creating a new lower 
     * level in a hierarchical naming system.
     * 
     * @param n the name of the new subcontext
     * @return  the created subcontext
     * @throws NamingException if an error occurs.
     */
    public Context createSubcontext(Name n) throws NamingException;

    /**
     * Creates a new context with the specified name as a child of this 
     * context and creates a binding for the name with the new context 
     * object in this context. This is analogous to creating a new lower 
     * level in a hierarchical naming system.
     * 
     * @param s the name of the new subcontext, in string
     * @return  the created subcontext
     * @throws NamingException if an error occurs.
     */
    public Context createSubcontext(String s) throws NamingException;

    /**
     * Removes a child context with the specified name from this context 
     * together with any attributes associated with that name. If the 
     * specified context does not exist, but intervening contexts do exist, 
     * then the operation is is considered to succeed.
     * <p>
     * Care must be taken with composite names crossing multiple naming 
     * systems. A composite name containing a name component which is bound 
     * to an object in a different naming system cannot be used to destroy 
     * that name subcontext because the subcontext is not of the same type 
     * as the context containing the binding. <code>Unbind()</code> can be 
     * used to destroy the binding of the specified name in this context to 
     * the object in the other naming system. To remove the context object 
     * in the other naming system, first obtain a context belonging to the 
     * other naming system, then use <code>destroySubcontext()</code> on that 
     * context.</p>
     * 
     * @param n the name of the subcontext to destroy
     * @throws NamingException if an error occurs.
     */
    public void destroySubcontext(Name n) throws NamingException;

    /**
     * Removes a child context with the specified name from this context 
     * together with any attributes associated with that name. If the 
     * specified context does not exist, but intervening contexts do exist, 
     * then the operation is considered to succeed.
     * <p>
     * Care must be taken with composite names crossing multiple naming 
     * systems. A composite name containing a name component which is bound 
     * to an object in a different naming system cannot be used to destroy 
     * that name subcontext because the subcontext is not of the same type 
     * as the context containing the binding. <code>Unbind()</code> can be 
     * used to destroy the binding of the specified name in this context to 
     * the object in the other naming system. To remove the context object 
     * in the other naming system, first obtain a context belonging to the 
     * other naming system, then use <code>destroySubcontext()</code> on that 
     * context.</p>
     * 
     * @param s the name of the subcontext to destroy
     * @throws NamingException if an error occurs.
     */
    public void destroySubcontext(String s) throws NamingException;

    /**
     * Returns a non-null reference to the current environment properties for 
     * this context. The only proper ways to modify the properties for this 
     * context are using the <code>addToEnvironment()</code> and 
     * <code>removeFromEnvironment()</code> methods.
     * 
     * @return  a non-null reference to the current environment properties for 
     *          this context, which should not be modified
     * @throws NamingException if an error occurs.
     */
    public Hashtable<?, ?> getEnvironment() throws NamingException;

    /**
     * Returns the complete name as a string for this context in the 
     * namespace. For example, in a namespace accessed using a file system 
     * service provider on a computer running the Windows operating system, 
     * <code>getNameInNamespace()</code> will return a string comprising the 
     * current working disk drive such as "F:\". The returned name is never 
     * null and should not be used in any naming operations.
     * 
     * @return  the complete name as a string for this context in the 
     *          namespace
     * @throws NamingException if an error occurs.
     * @throws OperationNotSupportedException in cases of naming systems 
     *          where a full name has no meaning.
     */
    public String getNameInNamespace() throws NamingException;

    /**
     * Returns a parser object for the named context. When using a federation
     * of naming systems in which each has its own rules for parsing names for
     * its namespace, each naming system will have a different parser. The 
     * parser for a given context can parse a name composed of several 
     * components into atomic components according to the rules for the naming 
     * system associated with the specified context.
     * 
     * @param n a <code>Name</code>
     * @return  a parser object for the named context
     * @throws NamingException if an error occurs.
     */
    public NameParser getNameParser(Name n) throws NamingException;

    /**
     * Returns a parser object for the named context. When using a federation
     * of naming systems in which each has its own rules for parsing names for
     * its namespace, each naming system will have a different parser. The 
     * parser for a given context can parse a name composed of several 
     * components into atomic components according to the rules for the naming 
     * system associated with the specified context.
     * 
     * @param s a name in string
     * @return  a parser object for the named context
     * @throws NamingException if an error occurs.
     */
    public NameParser getNameParser(String s) throws NamingException;

    /**
     * Returns an enumeration of the bindings of the context for the specified
     * name excluding any bindings for any subcontexts. If any binding for the
     * context is changed before closing the enumeration, the state of the
     * enumeration is undefined. Each element of the enumeration is a
     * <code>NameClassPair</code> object.
     * 
     * @param n a <code>Name</code>
     * @return  an enumeration of the bindings of the context for the 
     *          specified name excluding any bindings for any subcontexts
     * @throws NamingException if an error occurs.
     */
    public NamingEnumeration<NameClassPair> list(Name n)
        throws NamingException;

    /**
     * Returns an enumeration of the bindings of the context for the specified
     * name excluding any bindings for any subcontexts. If any binding for the
     * context is changed before closing the enumeration, the state of the
     * enumeration is undefined. Each element of the enumeration is a
     * <code>NameClassPair</code> object.
     * 
     * @param s a name in string
     * @return  an enumeration of the bindings of the context for the 
     *          specified name excluding any bindings for any subcontexts
     * @throws NamingException if an error occurs.
     */
    public NamingEnumeration<NameClassPair> list(String s)
        throws NamingException;

    /**
     * Returns an enumeration of the bindings of the context for the specified
     * name excluding any bindings for any subcontexts. If any binding for the
     * context is changed before closing the enumeration, the state of the
     * enumeration is undefined. Each element of the enumeration is a
     * <code>Binding</code> object. 
     * 
     * @param n a <code>Name</code>
     * @return  an enumeration of the bindings of the context for the specified
     *          name excluding any bindings for any subcontexts
     * @throws NamingException if an error occurs.
     */
    public NamingEnumeration<Binding> listBindings(Name n)
        throws NamingException;

    /**
     * Returns an enumeration of the bindings of the context for the specified
     * name excluding any bindings for any subcontexts. If any binding for the
     * context is changed before closing the enumeration, the state of the
     * enumeration is undefined. Each element of the enumeration is a
     * <code>Binding</code> object. 
     * 
     * @param s a name in string
     * @return  an enumeration of the bindings of the context for the specified
     *          name excluding any bindings for any subcontexts
     * @throws NamingException if an error occurs.
     */
    public NamingEnumeration<Binding> listBindings(String s) throws NamingException;

    /**
     * Returns the object bound to the specified name in this context. If the
     * specified name is empty, a new instance of this context is returned,
     * complete with its own environment properties. 
     * 
     * @param n a <code>Name</code> to lookup
     * @return  the object bound to the specified name in this context
     * @throws NamingException if an error occurs.
     */
    public Object lookup(Name n) throws NamingException;

    /**
     * Returns the object bound to the specified name in this context. If the
     * specified name is empty, a new instance of this context is returned,
     * complete with its own environment properties.
     * 
     * @param s a name to lookup
     * @return  the object bound to the specified name in this context
     * @throws NamingException if an error occurs.
     */
    public Object lookup(String s) throws NamingException;

    /**
     * Returns the object bound to the specified name in this context by 
     * following any links. If the specified name is not a link, then the 
     * object is returned.
     * 
     * @param n a <code>Name</code> to lookup
     * @return  the object bound to the specified name in this context by 
     *          following any links
     * @throws NamingException if an error occurs.
     */
    public Object lookupLink(Name n) throws NamingException;

    /**
     * Returns the object bound to the specified name in this context by 
     * following any links. If the specified name is not a link, then the 
     * object is returned.
     * 
     * @param s a name in string to lookup
     * @return  the object bound to the specified name in this context by 
     *          following any links
     * @throws NamingException if an error occurs.
     */
    public Object lookupLink(String s) throws NamingException;

    /**
     * Binds the specified name to the specified object, replacing any 
     * existing binding for the specified name. The specified name may 
     * not be empty. The specified object may be null.
     * 
     * @param n a <code>Name</code> to rebind, may not be null
     * @param o an object to bind with the name, may be null
     * @throws NamingException if an error occurs.
     */
    public void rebind(Name n, Object o) throws NamingException;

    /**
     * Binds the specified name to the specified object, replacing any 
     * existing binding for the specified name. The specified name may 
     * not be empty. The specified object may be null.
     * 
     * @param s a name in string to rebind, may not be null
     * @param o an object tobind with the name, may be null
     * @throws NamingException if an error occurs.
     */
    public void rebind(String s, Object o) throws NamingException;

    /**
     * Removes the environment property specified by the non-null parameter 
     * from the environment of this context. Returns the value that the 
     * property had before removal, or null if the property did not exist 
     * in the environment.
     * 
     * @param s a property name
     * @return  the value that the property had before removal, or null if the 
     *          property did not exist in the environment
     * @throws NamingException if an error occurs.
     */
    public Object removeFromEnvironment(String s) throws NamingException;

    /**
     * Binds a specified new name to the object, and any attributes, 
     * previously bound to the specified old name. The old name is removed 
     * from the bindings for this context.
     * 
     * @param nOld  the old name
     * @param nNew  the new name
     * @throws NameAlreadyBoundException if the new is already bound
     * @throws NamingException if an error occurs.
     */
    public void rename(Name nOld, Name nNew) throws NamingException;

    /**
     * Binds a specified new name to the object, and any attributes, 
     * previously bound to the specified old name. The old name is removed 
     * from the bindings for this context. Neither the new nor the old name 
     * may be empty.
     * 
     * @param sOld  the old name in string
     * @param sNew  the new name in string
     * @throws NameAlreadyBoundException if the new is already bound
     * @throws NamingException if an error occurs.
     */
    public void rename(String sOld, String sNew) throws NamingException;

    /**
     * Removes the terminal atomic name component of the specified name from 
     * the bindings in this context, together with any attributes associated 
     * with the terminal atomic name. Providing that other parts of the 
     * specified name exist in this context's bindings, the operation succeeds 
     * whether or not the terminal atomic name exists, otherwise a 
     * <code>NameNotFoundException</code> is thrown.
     * Any intermediate contexts remain unchanged.
     * 
     * @param n a <code>Name</code> to unbind
     * @throws NamingException if an error occurs.
     */
    public void unbind(Name n) throws NamingException;

    /**
     * Removes the terminal atomic name component of the specified name from 
     * the bindings in this context, together with any attributes associated 
     * with the terminal atomic name. Providing that other parts of the 
     * specified name exist in this context's bindings, the operation succeeds 
     * whether or not the terminal atomic name exists, otherwise a 
     * <code>NameNotFoundException</code> is thrown.
     * Any intermediate contexts remain unchanged.
     * 
     * @param s a name in string to unbind
     * @throws NamingException if an error occurs.
     */
    public void unbind(String s) throws NamingException;

}


