You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ml...@apache.org on 2006/06/01 13:00:27 UTC

svn commit: r410833 - in /incubator/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/javax/naming/ldap: ControlFactory.java InitialLdapContext.java LdapReferralException.java

Author: mloenko
Date: Thu Jun  1 04:00:26 2006
New Revision: 410833

URL: http://svn.apache.org/viewvc?rev=410833&view=rev
Log:
fixes for HARMONY-544
javax.naming.ldap generifications

Modified:
    incubator/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/javax/naming/ldap/ControlFactory.java
    incubator/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/javax/naming/ldap/InitialLdapContext.java
    incubator/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/javax/naming/ldap/LdapReferralException.java

Modified: incubator/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/javax/naming/ldap/ControlFactory.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/javax/naming/ldap/ControlFactory.java?rev=410833&r1=410832&r2=410833&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/javax/naming/ldap/ControlFactory.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/javax/naming/ldap/ControlFactory.java Thu Jun  1 04:00:26 2006
@@ -11,164 +11,164 @@
  * 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.ldap;
-
-import java.util.Hashtable;
-import javax.naming.Context;
-import javax.naming.NamingException;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-import org.apache.harmony.jndi.internal.EnvironmentReader;
-
-/**
- * This abstract class is used for factories which create controls as used in 
- * LDAPv3.
- * These factories are used by service providers to obtain control instances 
- * when they receive a response control.
- *
- * @see Control
- * 
- */
-public abstract class ControlFactory {
-
-    /*
-     * -------------------------------------------------------------------
-     * Constructors
-     * -------------------------------------------------------------------
-     */
-
-    /**
-     * Constructs a <code>ControlFactory</code> instance with no parameters.
-     */
-    protected ControlFactory() {
-    	super();
-    }
-
-    /*
-     * -------------------------------------------------------------------
-     * Methods
-     * -------------------------------------------------------------------
-     */
-
-    /**
-     * Uses this control factory to create a particular type of <code>Control
-     * </code> based on the supplied control.
-     * It is likely that the supplied control contains data encoded in BER 
-     * format as received from an LDAP server. Returns <code>null</code> if the
-     * factory cannot create a <code>Control</code> else it returns the type of
-     * <code>Control</code> created by the factory.
-
-     * 
-     * @param c                 the supplied control
-     * @throws NamingException  If an error is encountered.
-     * @return the control
-     */
-    public abstract Control getControlInstance(Control c)
-        throws NamingException;
-
-    /**
-     * Creates a particular type of control based on the supplied control c.
-     * It is likely that the supplied control contains data encoded in BER 
-     * format as received from an LDAP server.
-     * <p>
-     * This method tries the factories in LdapContext.CONTROL_FACTORIES, 
-     * first from the supplied <code>Hashtable</code> then from the resource
-     * provider files of the supplied <code>Context</code>.</p>
-     * <p> 
-     * It returns the supplied control if no factories are loaded or a control
-     * cannot be created. Otherwise, a new <code>Control</code> instance is 
-     * returned.
-     * 
-     * @param c                 the supplied <code>Control</code> instance
-     * @param ctx               the supplied <code>Context</code> instance
-     * @param h                 the supplier JNDI environment properties
-     * @return                  the supplied control if no factories are loaded
-     *                          or a control cannot be created, otherwise a new 
-     *                          <code>Control</code> instance
-     * @throws NamingException  If an error is encountered.
-     */
-    public static Control getControlInstance(
-        Control c,
-        Context ctx,
-        Hashtable h)
-        throws NamingException {
-
-        // obtain control factories from hashtable and provider resource file
-        String fnames[] =
-            EnvironmentReader
-                .getFactoryNamesFromEnvironmentAndProviderResource(
-                h,
-                ctx,
-                LdapContext.CONTROL_FACTORIES);
-
-        // for each control factory
-        for (int i = 0; i < fnames.length; i++) {
-            // new factory instance by its class name
-            ControlFactory factory = null;
-            try {
-                factory =
-                    (ControlFactory) classForName(fnames[i]).newInstance();
-            } catch (Exception e) {
-                continue;
-            }
-            // try obtaining a Control using the factory
-            Control control = factory.getControlInstance(c);
-            // if a Control is obtained successfully, return it
-            if (null != control) {
-                return control;
-            }
-        }
-
-        // all factories failed, return the input argument c
-        return c;
-    }
-
-    /*
-     * Use the context class loader or the system class loader to load the
-     * specified class, in a privileged manner.
-     */
-    private static Class classForName(final String className)
-        throws ClassNotFoundException {
-
-        Class cls =
-            (Class) AccessController.doPrivileged(new PrivilegedAction() {
-            public Object run() {
-                // try thread context class loader first
-                try {
-                    return Class.forName(
-                        className,
-                        true,
-                        Thread.currentThread().getContextClassLoader());
-                } catch (ClassNotFoundException e) {
-                	// Ignored
-                }
-                // try system class loader second
-                try {
-                    return Class.forName(
-                        className,
-                        true,
-                        ClassLoader.getSystemClassLoader());
-                } catch (ClassNotFoundException e1) {
-                	// Ignored
-                }
-                // return null, if fail to load class
-                return null;
-            }
-        });
-
-        if (cls == null) {
-            throw new ClassNotFoundException(
-                "class " + className + " not found"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-        return cls;
-
-    }
-
-}
-
-
+ */
+
+
+package javax.naming.ldap;
+
+import java.util.Hashtable;
+import javax.naming.Context;
+import javax.naming.NamingException;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+import org.apache.harmony.jndi.internal.EnvironmentReader;
+
+/**
+ * This abstract class is used for factories which create controls as used in 
+ * LDAPv3.
+ * These factories are used by service providers to obtain control instances 
+ * when they receive a response control.
+ *
+ * @see Control
+ * 
+ */
+public abstract class ControlFactory {
+
+    /*
+     * -------------------------------------------------------------------
+     * Constructors
+     * -------------------------------------------------------------------
+     */
+
+    /**
+     * Constructs a <code>ControlFactory</code> instance with no parameters.
+     */
+    protected ControlFactory() {
+    	super();
+    }
+
+    /*
+     * -------------------------------------------------------------------
+     * Methods
+     * -------------------------------------------------------------------
+     */
+
+    /**
+     * Uses this control factory to create a particular type of <code>Control
+     * </code> based on the supplied control.
+     * It is likely that the supplied control contains data encoded in BER 
+     * format as received from an LDAP server. Returns <code>null</code> if the
+     * factory cannot create a <code>Control</code> else it returns the type of
+     * <code>Control</code> created by the factory.
+
+     * 
+     * @param c                 the supplied control
+     * @throws NamingException  If an error is encountered.
+     * @return the control
+     */
+    public abstract Control getControlInstance(Control c)
+        throws NamingException;
+
+    /**
+     * Creates a particular type of control based on the supplied control c.
+     * It is likely that the supplied control contains data encoded in BER 
+     * format as received from an LDAP server.
+     * <p>
+     * This method tries the factories in LdapContext.CONTROL_FACTORIES, 
+     * first from the supplied <code>Hashtable</code> then from the resource
+     * provider files of the supplied <code>Context</code>.</p>
+     * <p> 
+     * It returns the supplied control if no factories are loaded or a control
+     * cannot be created. Otherwise, a new <code>Control</code> instance is 
+     * returned.
+     * 
+     * @param c                 the supplied <code>Control</code> instance
+     * @param ctx               the supplied <code>Context</code> instance
+     * @param h                 the supplier JNDI environment properties
+     * @return                  the supplied control if no factories are loaded
+     *                          or a control cannot be created, otherwise a new 
+     *                          <code>Control</code> instance
+     * @throws NamingException  If an error is encountered.
+     */
+    public static Control getControlInstance(
+        Control c,
+        Context ctx,
+        Hashtable<?, ?> h)
+        throws NamingException {
+
+        // obtain control factories from hashtable and provider resource file
+        String fnames[] =
+            EnvironmentReader
+                .getFactoryNamesFromEnvironmentAndProviderResource(
+                h,
+                ctx,
+                LdapContext.CONTROL_FACTORIES);
+
+        // for each control factory
+        for (int i = 0; i < fnames.length; i++) {
+            // new factory instance by its class name
+            ControlFactory factory = null;
+            try {
+                factory =
+                    (ControlFactory) classForName(fnames[i]).newInstance();
+            } catch (Exception e) {
+                continue;
+            }
+            // try obtaining a Control using the factory
+            Control control = factory.getControlInstance(c);
+            // if a Control is obtained successfully, return it
+            if (null != control) {
+                return control;
+            }
+        }
+
+        // all factories failed, return the input argument c
+        return c;
+    }
+
+    /*
+     * Use the context class loader or the system class loader to load the
+     * specified class, in a privileged manner.
+     */
+    private static Class classForName(final String className)
+        throws ClassNotFoundException {
+
+        Class cls =
+            (Class) AccessController.doPrivileged(new PrivilegedAction() {
+            public Object run() {
+                // try thread context class loader first
+                try {
+                    return Class.forName(
+                        className,
+                        true,
+                        Thread.currentThread().getContextClassLoader());
+                } catch (ClassNotFoundException e) {
+                	// Ignored
+                }
+                // try system class loader second
+                try {
+                    return Class.forName(
+                        className,
+                        true,
+                        ClassLoader.getSystemClassLoader());
+                } catch (ClassNotFoundException e1) {
+                	// Ignored
+                }
+                // return null, if fail to load class
+                return null;
+            }
+        });
+
+        if (cls == null) {
+            throw new ClassNotFoundException(
+                "class " + className + " not found"); //$NON-NLS-1$ //$NON-NLS-2$
+        }
+
+        return cls;
+
+    }
+
+}
+
+

Modified: incubator/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/javax/naming/ldap/InitialLdapContext.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/javax/naming/ldap/InitialLdapContext.java?rev=410833&r1=410832&r2=410833&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/javax/naming/ldap/InitialLdapContext.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/javax/naming/ldap/InitialLdapContext.java Thu Jun  1 04:00:26 2006
@@ -11,157 +11,157 @@
  * 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.ldap;
-
-import java.util.Hashtable;
-import javax.naming.directory.InitialDirContext;
-import javax.naming.NamingException;
-import javax.naming.NotContextException;
-
-/**
- * This is used as the starting context when the LDAPv3 extended functionality
- * provided by the <code>javax.naming.ldap</code> package is required.
- *
- * See <code>LdapContext</code> for a description of the Request and Response 
- * controls.
- * 
- * @see LdapContext
- * 
- */
-public class InitialLdapContext
-    extends InitialDirContext
-    implements LdapContext {
-
-    /*
-     * -------------------------------------------------------------------
-     * Constants
-     * -------------------------------------------------------------------
-     */
-
-    /*
-     * This is set to the environment property java.naming.ldap.version. 
-     */
-    private static final String LDAP_VERSION = "java.naming.ldap.version"; //$NON-NLS-1$
-
-    /*
-     * This is set to the environment property java.naming.ldap.control.connect.
-     */
-    private static final String CONNECT_CONTROL =
-        "java.naming.ldap.control.connect"; //$NON-NLS-1$
-
-    /*
-     * The version of this LDAP context implementaton. 
-     */
-    private static final String THIS_LDAP_VERSION = "3"; //$NON-NLS-1$
-
-    /*
-     * -------------------------------------------------------------------
-     * Constructors
-     * -------------------------------------------------------------------
-     */
-
-    /**
-     * Constructs an <code>InitialLdapContext</code> instance without using 
-     * any environment properties or connection controls.
-     * 
-     * @throws NamingException  If an error is encountered. 
-     */
-    public InitialLdapContext() throws NamingException {
-        this(null, null);
-    }
-
-    /**
-     * Constructs an <code>InitialLdapContext</code> instance using the supplied
-     * environment properties and connection controls.
-     * 
-     * @param h                 the environment properties which may be null
-     * @param cs                the connection controls which may be null
-     * @throws NamingException  If an error is encountered.
-     */
-    public InitialLdapContext(Hashtable h, Control[] cs)
-        throws NamingException {
-        super(true);
-
-        /* 
-         * Prepare the environment properties to be inherited by the 
-         * service provider.
-         */
-        Hashtable newEnvironment = null;
-        if (null == h) {
-            newEnvironment = new Hashtable();
-        } else {
-            newEnvironment = (Hashtable) h.clone();
-        }
-
-        // Set the environment property java.naming.ldap.control.connect
-        if (null != cs) {
-            Control[] cloneOfCs = new Control[cs.length];
-            System.arraycopy(cs, 0, cloneOfCs, 0, cs.length);
-            newEnvironment.put(CONNECT_CONTROL, cloneOfCs);
-        }
-
-        // Set the enviroment property java.naming.ldap.version to be 3
-        newEnvironment.put(LDAP_VERSION, THIS_LDAP_VERSION);
-
-        // Initialize the initial context
-        super.init(newEnvironment);
-    }
-
-    /*
-     * -------------------------------------------------------------------
-     * Methods
-     * -------------------------------------------------------------------
-     */
-
-    /*
-     * Gets the default initial context and verify that it's an instance of
-     * LdapContext.
-     */
-    private LdapContext getDefaultInitLdapContext() throws NamingException {
-        if (!(super.defaultInitCtx instanceof LdapContext)) {
-            throw new NotContextException("Expected an LdapContext object."); //$NON-NLS-1$
-        }
-        return (LdapContext) super.defaultInitCtx;
-    }
-
-    /*
-     * -------------------------------------------------------------------
-     * Methods of Interface LdapContext
-     * -------------------------------------------------------------------
-     */
-
-    public ExtendedResponse extendedOperation(ExtendedRequest e)
-        throws NamingException {
-        return getDefaultInitLdapContext().extendedOperation(e);
-    }
-
-    public LdapContext newInstance(Control[] ac) throws NamingException {
-        return getDefaultInitLdapContext().newInstance(ac);
-    }
-
-    public void reconnect(Control[] ac) throws NamingException {
-        getDefaultInitLdapContext().reconnect(ac);
-    }
-
-    public Control[] getConnectControls() throws NamingException {
-        return getDefaultInitLdapContext().getConnectControls();
-    }
-
-    public void setRequestControls(Control[] ac) throws NamingException {
-        getDefaultInitLdapContext().setRequestControls(ac);
-    }
-
-    public Control[] getRequestControls() throws NamingException {
-        return getDefaultInitLdapContext().getRequestControls();
-    }
-
-    public Control[] getResponseControls() throws NamingException {
-        return getDefaultInitLdapContext().getResponseControls();
-    }
-
-}
-
-
+ */
+
+
+package javax.naming.ldap;
+
+import java.util.Hashtable;
+import javax.naming.directory.InitialDirContext;
+import javax.naming.NamingException;
+import javax.naming.NotContextException;
+
+/**
+ * This is used as the starting context when the LDAPv3 extended functionality
+ * provided by the <code>javax.naming.ldap</code> package is required.
+ *
+ * See <code>LdapContext</code> for a description of the Request and Response 
+ * controls.
+ * 
+ * @see LdapContext
+ * 
+ */
+public class InitialLdapContext
+    extends InitialDirContext
+    implements LdapContext {
+
+    /*
+     * -------------------------------------------------------------------
+     * Constants
+     * -------------------------------------------------------------------
+     */
+
+    /*
+     * This is set to the environment property java.naming.ldap.version. 
+     */
+    private static final String LDAP_VERSION = "java.naming.ldap.version"; //$NON-NLS-1$
+
+    /*
+     * This is set to the environment property java.naming.ldap.control.connect.
+     */
+    private static final String CONNECT_CONTROL =
+        "java.naming.ldap.control.connect"; //$NON-NLS-1$
+
+    /*
+     * The version of this LDAP context implementaton. 
+     */
+    private static final String THIS_LDAP_VERSION = "3"; //$NON-NLS-1$
+
+    /*
+     * -------------------------------------------------------------------
+     * Constructors
+     * -------------------------------------------------------------------
+     */
+
+    /**
+     * Constructs an <code>InitialLdapContext</code> instance without using 
+     * any environment properties or connection controls.
+     * 
+     * @throws NamingException  If an error is encountered. 
+     */
+    public InitialLdapContext() throws NamingException {
+        this(null, null);
+    }
+
+    /**
+     * Constructs an <code>InitialLdapContext</code> instance using the supplied
+     * environment properties and connection controls.
+     * 
+     * @param h                 the environment properties which may be null
+     * @param cs                the connection controls which may be null
+     * @throws NamingException  If an error is encountered.
+     */
+    public InitialLdapContext(Hashtable<?, ?> h, Control[] cs)
+        throws NamingException {
+        super(true);
+
+        /* 
+         * Prepare the environment properties to be inherited by the 
+         * service provider.
+         */
+        Hashtable<Object,Object> newEnvironment = null;
+        if (null == h) {
+            newEnvironment = new Hashtable<Object,Object>();
+        } else {
+            newEnvironment = (Hashtable<Object,Object>) h.clone();
+        }
+
+        // Set the environment property java.naming.ldap.control.connect
+        if (null != cs) {
+            Control[] cloneOfCs = new Control[cs.length];
+            System.arraycopy(cs, 0, cloneOfCs, 0, cs.length);
+            newEnvironment.put(CONNECT_CONTROL, cloneOfCs);
+        }
+
+        // Set the enviroment property java.naming.ldap.version to be 3
+        newEnvironment.put(LDAP_VERSION, THIS_LDAP_VERSION);
+
+        // Initialize the initial context
+        super.init(newEnvironment);
+    }
+
+    /*
+     * -------------------------------------------------------------------
+     * Methods
+     * -------------------------------------------------------------------
+     */
+
+    /*
+     * Gets the default initial context and verify that it's an instance of
+     * LdapContext.
+     */
+    private LdapContext getDefaultInitLdapContext() throws NamingException {
+        if (!(super.defaultInitCtx instanceof LdapContext)) {
+            throw new NotContextException("Expected an LdapContext object."); //$NON-NLS-1$
+        }
+        return (LdapContext) super.defaultInitCtx;
+    }
+
+    /*
+     * -------------------------------------------------------------------
+     * Methods of Interface LdapContext
+     * -------------------------------------------------------------------
+     */
+
+    public ExtendedResponse extendedOperation(ExtendedRequest e)
+        throws NamingException {
+        return getDefaultInitLdapContext().extendedOperation(e);
+    }
+
+    public LdapContext newInstance(Control[] ac) throws NamingException {
+        return getDefaultInitLdapContext().newInstance(ac);
+    }
+
+    public void reconnect(Control[] ac) throws NamingException {
+        getDefaultInitLdapContext().reconnect(ac);
+    }
+
+    public Control[] getConnectControls() throws NamingException {
+        return getDefaultInitLdapContext().getConnectControls();
+    }
+
+    public void setRequestControls(Control[] ac) throws NamingException {
+        getDefaultInitLdapContext().setRequestControls(ac);
+    }
+
+    public Control[] getRequestControls() throws NamingException {
+        return getDefaultInitLdapContext().getRequestControls();
+    }
+
+    public Control[] getResponseControls() throws NamingException {
+        return getDefaultInitLdapContext().getResponseControls();
+    }
+
+}
+
+

Modified: incubator/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/javax/naming/ldap/LdapReferralException.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/javax/naming/ldap/LdapReferralException.java?rev=410833&r1=410832&r2=410833&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/javax/naming/ldap/LdapReferralException.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/jndi/src/main/java/javax/naming/ldap/LdapReferralException.java Thu Jun  1 04:00:26 2006
@@ -11,97 +11,97 @@
  * 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.ldap;
-
-import java.util.Hashtable;
-
-import javax.naming.Context;
-import javax.naming.NamingException;
-import javax.naming.ReferralException;
-
-/**
- * <code>LdapReferralException</code> is an abstract exception which extends
- * <code>ReferralException</code> to handle LDAPv3 request controls.
- * 
- */
-public abstract class LdapReferralException extends ReferralException {
-
-    /*
-     * -------------------------------------------------------------------
-     * Constants
-     * -------------------------------------------------------------------
-     */
-
-    /* 
-     * This constant is used during deserialization to check the J2SE version which
-     * created the serialized object.
-     */
-    static final long serialVersionUID = -1668992791764950804L; // J2SE 1.4.2
-
-    /*
-     * -------------------------------------------------------------------
-     * Constructors
-     * -------------------------------------------------------------------
-     */
-
-    /**
-     * Default constructor.
-     */
-    protected LdapReferralException() {
-    	super();
-    }
-
-    /**
-     * Constructs an LdapReferralException instance using the supplied text of
-     * the message
-     * @param s				the supplied text of the message, which may be null
-     */
-    protected LdapReferralException(String s) {
-        super(s);
-    }
-
-    /*
-     * -------------------------------------------------------------------
-     * Methods
-     * -------------------------------------------------------------------
-     */
-
-    /**
-     * Gets referal context without environment properties.
-     * 
-     * @return 				referral context
-     * @throws NamingException
-     * 						If cannot get referral context correctly.
-     */
-    public abstract Context getReferralContext() throws NamingException;
-
-    /**
-     * Gets referal context with environment properties.
-     * 
-     * @param h				environment properties			
-     * @return 				referral context
-     * @throws NamingException
-     * 						If cannot get referral context correctly.
-     */
-    public abstract Context getReferralContext(Hashtable h)
-        throws NamingException;
-
-    /**
-     * Gets referal context with environment properties and an array of LDAPv3
-     * controls.
-     * 
-     * @param h				environment properties
-     * @param cs			array of LDAPv3 controls
-     * @return 				referral context
-     * @throws NamingException
-     * 						If cannot get referral context correctly.
-     */
-    public abstract Context getReferralContext(Hashtable h, Control[] cs)
-        throws NamingException;
-
-}
-
-
+ */
+
+
+package javax.naming.ldap;
+
+import java.util.Hashtable;
+
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.naming.ReferralException;
+
+/**
+ * <code>LdapReferralException</code> is an abstract exception which extends
+ * <code>ReferralException</code> to handle LDAPv3 request controls.
+ * 
+ */
+public abstract class LdapReferralException extends ReferralException {
+
+    /*
+     * -------------------------------------------------------------------
+     * Constants
+     * -------------------------------------------------------------------
+     */
+
+    /* 
+     * This constant is used during deserialization to check the J2SE version which
+     * created the serialized object.
+     */
+    static final long serialVersionUID = -1668992791764950804L; // J2SE 1.4.2
+
+    /*
+     * -------------------------------------------------------------------
+     * Constructors
+     * -------------------------------------------------------------------
+     */
+
+    /**
+     * Default constructor.
+     */
+    protected LdapReferralException() {
+    	super();
+    }
+
+    /**
+     * Constructs an LdapReferralException instance using the supplied text of
+     * the message
+     * @param s				the supplied text of the message, which may be null
+     */
+    protected LdapReferralException(String s) {
+        super(s);
+    }
+
+    /*
+     * -------------------------------------------------------------------
+     * Methods
+     * -------------------------------------------------------------------
+     */
+
+    /**
+     * Gets referal context without environment properties.
+     * 
+     * @return 				referral context
+     * @throws NamingException
+     * 						If cannot get referral context correctly.
+     */
+    public abstract Context getReferralContext() throws NamingException;
+
+    /**
+     * Gets referal context with environment properties.
+     * 
+     * @param h				environment properties			
+     * @return 				referral context
+     * @throws NamingException
+     * 						If cannot get referral context correctly.
+     */
+    public abstract Context getReferralContext(Hashtable<?, ?> h)
+        throws NamingException;
+
+    /**
+     * Gets referal context with environment properties and an array of LDAPv3
+     * controls.
+     * 
+     * @param h				environment properties
+     * @param cs			array of LDAPv3 controls
+     * @return 				referral context
+     * @throws NamingException
+     * 						If cannot get referral context correctly.
+     */
+    public abstract Context getReferralContext(Hashtable<?, ?> h, Control[] cs)
+        throws NamingException;
+
+}
+
+