17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package javax.naming.ldap;
27
28 import javax.naming.*;
29 import javax.naming.directory.*;
30
31 import java.util.Hashtable;
32
33 /**
34 * This class is the starting context for performing
35 * LDAPv3-style extended operations and controls.
36 *<p>
37 * See <tt>javax.naming.InitialContext</tt> and
38 * <tt>javax.naming.InitialDirContext</tt> for details on synchronization,
39 * and the policy for how an initial context is created.
40 *
41 * <h1>Request Controls</h1>
42 * When you create an initial context (<tt>InitialLdapContext</tt>),
43 * you can specify a list of request controls.
44 * These controls will be used as the request controls for any
45 * implicit LDAP "bind" operation performed by the context or contexts
46 * derived from the context. These are called <em>connection request controls</em>.
47 * Use <tt>getConnectControls()</tt> to get a context's connection request
48 * controls.
49 *<p>
50 * The request controls supplied to the initial context constructor
51 * are <em>not</em> used as the context request controls
52 * for subsequent context operations such as searches and lookups.
53 * Context request controls are set and updated by using
54 * <tt>setRequestControls()</tt>.
55 *<p>
56 * As shown, there can be two different sets of request controls
57 * associated with a context: connection request controls and context
58 * request controls.
59 * This is required for those applications needing to send critical
60 * controls that might not be applicable to both the context operation and
61 * any implicit LDAP "bind" operation.
62 * A typical user program would do the following:
63 *<blockquote><pre>
64 * InitialLdapContext lctx = new InitialLdapContext(env, critConnCtls);
65 * lctx.setRequestControls(critModCtls);
66 * lctx.modifyAttributes(name, mods);
67 * Controls[] respCtls = lctx.getResponseControls();
68 *</pre></blockquote>
69 * It specifies first the critical controls for creating the initial context
70 * (<tt>critConnCtls</tt>), and then sets the context's request controls
71 * (<tt>critModCtls</tt>) for the context operation. If for some reason
72 * <tt>lctx</tt> needs to reconnect to the server, it will use
73 * <tt>critConnCtls</tt>. See the <tt>LdapContext</tt> interface for
74 * more discussion about request controls.
75 *<p>
76 * Service provider implementors should read the "Service Provider" section
77 * in the <tt>LdapContext</tt> class description for implementation details.
78 *
79 * @author Rosanna Lee
80 * @author Scott Seligman
81 * @author Vincent Ryan
82 *
83 * @see LdapContext
84 * @see javax.naming.InitialContext
85 * @see javax.naming.directory.InitialDirContext
86 * @see javax.naming.spi.NamingManager#setInitialContextFactoryBuilder
87 * @since 1.3
88 */
89
90 public class InitialLdapContext extends InitialDirContext implements LdapContext {
91 private static final String
92 BIND_CONTROLS_PROPERTY = "java.naming.ldap.control.connect";
93
94 /**
95 * Constructs an initial context using no environment properties or
96 * connection request controls.
97 * Equivalent to <tt>new InitialLdapContext(null, null)</tt>.
98 *
99 * @throws NamingException if a naming exception is encountered
100 */
101 public InitialLdapContext() throws NamingException {
102 super(null);
103 }
104
105 /**
106 * Constructs an initial context
107 * using environment properties and connection request controls.
108 * See <tt>javax.naming.InitialContext</tt> for a discussion of
109 * environment properties.
110 *
111 * <p> This constructor will not modify its parameters or
112 * save references to them, but may save a clone or copy.
113 * Caller should not modify mutable keys and values in
114 * <tt>environment</tt> after it has been passed to the constructor.
115 *
116 * <p> <tt>connCtls</tt> is used as the underlying context instance's
117 * connection request controls. See the class description
118 * for details.
119 *
120 * @param environment
121 * environment used to create the initial DirContext.
122 * Null indicates an empty environment.
123 * @param connCtls
124 * connection request controls for the initial context.
125 * If null, no connection request controls are used.
126 *
127 * @throws NamingException if a naming exception is encountered
128 *
129 * @see #reconnect
130 * @see LdapContext#reconnect
131 */
132 @SuppressWarnings("unchecked")
133 public InitialLdapContext(Hashtable<?,?> environment,
134 Control[] connCtls)
135 throws NamingException {
136 super(true); // don't initialize yet
142
143 // Put connect controls into environment. Copy them first since
144 // caller owns the array.
145 if (connCtls != null) {
146 Control[] copy = new Control[connCtls.length];
147 System.arraycopy(connCtls, 0, copy, 0, connCtls.length);
148 env.put(BIND_CONTROLS_PROPERTY, copy);
149 }
150 // set version to LDAPv3
151 env.put("java.naming.ldap.version", "3");
152
153 // Initialize with updated environment
154 init(env);
155 }
156
157 /**
158 * Retrieves the initial LDAP context.
159 *
160 * @return The non-null cached initial context.
161 * @exception NotContextException If the initial context is not an
162 * instance of <tt>LdapContext</tt>.
163 * @exception NamingException If a naming exception was encountered.
164 */
165 private LdapContext getDefaultLdapInitCtx() throws NamingException{
166 Context answer = getDefaultInitCtx();
167
168 if (!(answer instanceof LdapContext)) {
169 if (answer == null) {
170 throw new NoInitialContextException();
171 } else {
172 throw new NotContextException(
173 "Not an instance of LdapContext");
174 }
175 }
176 return (LdapContext)answer;
177 }
178
179 // LdapContext methods
180 // Most Javadoc is deferred to the LdapContext interface.
181
182 public ExtendedResponse extendedOperation(ExtendedRequest request)
|
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package javax.naming.ldap;
27
28 import javax.naming.*;
29 import javax.naming.directory.*;
30
31 import java.util.Hashtable;
32
33 /**
34 * This class is the starting context for performing
35 * LDAPv3-style extended operations and controls.
36 *<p>
37 * See {@code javax.naming.InitialContext} and
38 * {@code javax.naming.InitialDirContext} for details on synchronization,
39 * and the policy for how an initial context is created.
40 *
41 * <h1>Request Controls</h1>
42 * When you create an initial context ({@code InitialLdapContext}),
43 * you can specify a list of request controls.
44 * These controls will be used as the request controls for any
45 * implicit LDAP "bind" operation performed by the context or contexts
46 * derived from the context. These are called <em>connection request controls</em>.
47 * Use {@code getConnectControls()} to get a context's connection request
48 * controls.
49 *<p>
50 * The request controls supplied to the initial context constructor
51 * are <em>not</em> used as the context request controls
52 * for subsequent context operations such as searches and lookups.
53 * Context request controls are set and updated by using
54 * {@code setRequestControls()}.
55 *<p>
56 * As shown, there can be two different sets of request controls
57 * associated with a context: connection request controls and context
58 * request controls.
59 * This is required for those applications needing to send critical
60 * controls that might not be applicable to both the context operation and
61 * any implicit LDAP "bind" operation.
62 * A typical user program would do the following:
63 *<blockquote><pre>
64 * InitialLdapContext lctx = new InitialLdapContext(env, critConnCtls);
65 * lctx.setRequestControls(critModCtls);
66 * lctx.modifyAttributes(name, mods);
67 * Controls[] respCtls = lctx.getResponseControls();
68 *</pre></blockquote>
69 * It specifies first the critical controls for creating the initial context
70 * ({@code critConnCtls}), and then sets the context's request controls
71 * ({@code critModCtls}) for the context operation. If for some reason
72 * {@code lctx} needs to reconnect to the server, it will use
73 * {@code critConnCtls}. See the {@code LdapContext} interface for
74 * more discussion about request controls.
75 *<p>
76 * Service provider implementors should read the "Service Provider" section
77 * in the {@code LdapContext} class description for implementation details.
78 *
79 * @author Rosanna Lee
80 * @author Scott Seligman
81 * @author Vincent Ryan
82 *
83 * @see LdapContext
84 * @see javax.naming.InitialContext
85 * @see javax.naming.directory.InitialDirContext
86 * @see javax.naming.spi.NamingManager#setInitialContextFactoryBuilder
87 * @since 1.3
88 */
89
90 public class InitialLdapContext extends InitialDirContext implements LdapContext {
91 private static final String
92 BIND_CONTROLS_PROPERTY = "java.naming.ldap.control.connect";
93
94 /**
95 * Constructs an initial context using no environment properties or
96 * connection request controls.
97 * Equivalent to {@code new InitialLdapContext(null, null)}.
98 *
99 * @throws NamingException if a naming exception is encountered
100 */
101 public InitialLdapContext() throws NamingException {
102 super(null);
103 }
104
105 /**
106 * Constructs an initial context
107 * using environment properties and connection request controls.
108 * See {@code javax.naming.InitialContext} for a discussion of
109 * environment properties.
110 *
111 * <p> This constructor will not modify its parameters or
112 * save references to them, but may save a clone or copy.
113 * Caller should not modify mutable keys and values in
114 * {@code environment} after it has been passed to the constructor.
115 *
116 * <p> {@code connCtls} is used as the underlying context instance's
117 * connection request controls. See the class description
118 * for details.
119 *
120 * @param environment
121 * environment used to create the initial DirContext.
122 * Null indicates an empty environment.
123 * @param connCtls
124 * connection request controls for the initial context.
125 * If null, no connection request controls are used.
126 *
127 * @throws NamingException if a naming exception is encountered
128 *
129 * @see #reconnect
130 * @see LdapContext#reconnect
131 */
132 @SuppressWarnings("unchecked")
133 public InitialLdapContext(Hashtable<?,?> environment,
134 Control[] connCtls)
135 throws NamingException {
136 super(true); // don't initialize yet
142
143 // Put connect controls into environment. Copy them first since
144 // caller owns the array.
145 if (connCtls != null) {
146 Control[] copy = new Control[connCtls.length];
147 System.arraycopy(connCtls, 0, copy, 0, connCtls.length);
148 env.put(BIND_CONTROLS_PROPERTY, copy);
149 }
150 // set version to LDAPv3
151 env.put("java.naming.ldap.version", "3");
152
153 // Initialize with updated environment
154 init(env);
155 }
156
157 /**
158 * Retrieves the initial LDAP context.
159 *
160 * @return The non-null cached initial context.
161 * @exception NotContextException If the initial context is not an
162 * instance of {@code LdapContext}.
163 * @exception NamingException If a naming exception was encountered.
164 */
165 private LdapContext getDefaultLdapInitCtx() throws NamingException{
166 Context answer = getDefaultInitCtx();
167
168 if (!(answer instanceof LdapContext)) {
169 if (answer == null) {
170 throw new NoInitialContextException();
171 } else {
172 throw new NotContextException(
173 "Not an instance of LdapContext");
174 }
175 }
176 return (LdapContext)answer;
177 }
178
179 // LdapContext methods
180 // Most Javadoc is deferred to the LdapContext interface.
181
182 public ExtendedResponse extendedOperation(ExtendedRequest request)
|