1/*
2 * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
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
26package com.sun.jndi.toolkit.ctx;
27
28import javax.naming.*;
29import javax.naming.directory.*;
30
31/**
32 * Direct subclasses of AtomicDirContext must provide implementations for
33 * the abstract a_ DirContext methods, and override the a_ Context methods
34 * (which are no longer abstract because they have been overriden by
35 * PartialCompositeDirContext with dummy implementations).
36 *
37 * If the subclass implements the notion of implicit nns,
38 * it must override the a_*_nns DirContext and Context methods as well.
39 *
40 * @author Rosanna Lee
41 *
42 */
43
44public abstract class AtomicDirContext extends ComponentDirContext {
45
46    protected AtomicDirContext() {
47        _contextType = _ATOMIC;
48    }
49
50// ------ Abstract methods whose implementations come from subclass
51
52    protected abstract Attributes a_getAttributes(String name, String[] attrIds,
53                                                    Continuation cont)
54        throws NamingException;
55
56    protected abstract void a_modifyAttributes(String name, int mod_op,
57                                               Attributes attrs,
58                                               Continuation cont)
59        throws NamingException;
60
61    protected abstract void a_modifyAttributes(String name,
62                                               ModificationItem[] mods,
63                                               Continuation cont)
64        throws NamingException;
65
66    protected abstract void a_bind(String name, Object obj,
67                                   Attributes attrs,
68                                   Continuation cont)
69        throws NamingException;
70
71    protected abstract void a_rebind(String name, Object obj,
72                                     Attributes attrs,
73                                     Continuation cont)
74        throws NamingException;
75
76    protected abstract DirContext a_createSubcontext(String name,
77                                                    Attributes attrs,
78                                                    Continuation cont)
79        throws NamingException;
80
81    protected abstract NamingEnumeration<SearchResult> a_search(
82                                                  Attributes matchingAttributes,
83                                                  String[] attributesToReturn,
84                                                  Continuation cont)
85        throws NamingException;
86
87    protected abstract NamingEnumeration<SearchResult> a_search(
88                                                  String name,
89                                                  String filterExpr,
90                                                  Object[] filterArgs,
91                                                  SearchControls cons,
92                                                  Continuation cont)
93        throws NamingException;
94
95    protected abstract NamingEnumeration<SearchResult> a_search(
96                                                  String name,
97                                                  String filter,
98                                                  SearchControls cons,
99                                                  Continuation cont)
100        throws NamingException;
101
102    protected abstract DirContext a_getSchema(Continuation cont)
103        throws NamingException;
104
105    protected abstract DirContext a_getSchemaClassDefinition(Continuation cont)
106        throws NamingException;
107
108// ------ Methods that need to be overridden by subclass
109
110    //  default implementations of a_*_nns methods
111
112    // The following methods are called when the DirContext methods
113    // are invoked with a name that has a trailing slash.
114    // For naming systems that support implicit nns,
115    // the trailing slash signifies the implicit nns.
116    // For such naming systems, override these a_*_nns methods.
117    //
118    // For naming systems that support junctions (explicit nns),
119    // the trailing slash is meaningless because a junction does not
120    // have an implicit nns.  The default implementation here
121    // throws a NameNotFoundException for such names.
122    // If a context wants to accept a trailing slash as having
123    // the same meaning as the same name without a trailing slash,
124    // then it should override these a_*_nns methods.
125
126    protected Attributes a_getAttributes_nns(String name,
127                                               String[] attrIds,
128                                               Continuation cont)
129        throws NamingException  {
130            a_processJunction_nns(name, cont);
131            return null;
132        }
133
134    protected void a_modifyAttributes_nns(String name, int mod_op,
135                                          Attributes attrs,
136                                          Continuation cont)
137        throws NamingException {
138            a_processJunction_nns(name, cont);
139        }
140
141    protected void a_modifyAttributes_nns(String name,
142                                          ModificationItem[] mods,
143                                          Continuation cont)
144        throws NamingException {
145            a_processJunction_nns(name, cont);
146        }
147
148    protected void a_bind_nns(String name, Object obj,
149                              Attributes attrs,
150                              Continuation cont)
151        throws NamingException  {
152            a_processJunction_nns(name, cont);
153        }
154
155    protected void a_rebind_nns(String name, Object obj,
156                                Attributes attrs,
157                                Continuation cont)
158        throws NamingException  {
159            a_processJunction_nns(name, cont);
160        }
161
162    protected DirContext a_createSubcontext_nns(String name,
163                                               Attributes attrs,
164                                               Continuation cont)
165        throws NamingException  {
166            a_processJunction_nns(name, cont);
167            return null;
168        }
169
170    protected NamingEnumeration<SearchResult> a_search_nns(
171                                             Attributes matchingAttributes,
172                                             String[] attributesToReturn,
173                                             Continuation cont)
174        throws NamingException {
175            a_processJunction_nns(cont);
176            return null;
177        }
178
179    protected NamingEnumeration<SearchResult> a_search_nns(String name,
180                                                           String filterExpr,
181                                                           Object[] filterArgs,
182                                                           SearchControls cons,
183                                                           Continuation cont)
184        throws NamingException {
185            a_processJunction_nns(name, cont);
186            return null;
187        }
188
189    protected NamingEnumeration<SearchResult> a_search_nns(String name,
190                                                           String filter,
191                                                           SearchControls cons,
192                                                           Continuation cont)
193        throws NamingException  {
194            a_processJunction_nns(name, cont);
195            return null;
196        }
197
198    protected DirContext a_getSchema_nns(Continuation cont) throws NamingException {
199        a_processJunction_nns(cont);
200        return null;
201    }
202
203    protected DirContext a_getSchemaDefinition_nns(Continuation cont)
204        throws NamingException {
205            a_processJunction_nns(cont);
206            return null;
207        }
208
209// ------- implementations of c_ DirContext methods using corresponding
210// ------- a_ and a_*_nns methods
211
212    protected Attributes c_getAttributes(Name name, String[] attrIds,
213                                           Continuation cont)
214        throws NamingException  {
215            if (resolve_to_penultimate_context(name, cont))
216                return a_getAttributes(name.toString(), attrIds, cont);
217            return null;
218        }
219
220    protected void c_modifyAttributes(Name name, int mod_op,
221                                      Attributes attrs, Continuation cont)
222        throws NamingException {
223            if (resolve_to_penultimate_context(name, cont))
224                a_modifyAttributes(name.toString(), mod_op, attrs, cont);
225        }
226
227    protected void c_modifyAttributes(Name name, ModificationItem[] mods,
228                                      Continuation cont)
229        throws NamingException {
230            if (resolve_to_penultimate_context(name, cont))
231                a_modifyAttributes(name.toString(), mods, cont);
232        }
233
234    protected void c_bind(Name name, Object obj,
235                          Attributes attrs, Continuation cont)
236        throws NamingException  {
237            if (resolve_to_penultimate_context(name, cont))
238                a_bind(name.toString(), obj, attrs, cont);
239        }
240
241    protected void c_rebind(Name name, Object obj,
242                            Attributes attrs, Continuation cont)
243        throws NamingException  {
244            if (resolve_to_penultimate_context(name, cont))
245                a_rebind(name.toString(), obj, attrs, cont);
246        }
247
248    protected DirContext c_createSubcontext(Name name,
249                                           Attributes attrs,
250                                           Continuation cont)
251        throws NamingException  {
252            if (resolve_to_penultimate_context(name, cont))
253                return a_createSubcontext(name.toString(),
254                                          attrs, cont);
255            return null;
256        }
257
258    protected NamingEnumeration<SearchResult> c_search(Name name,
259                                         Attributes matchingAttributes,
260                                         String[] attributesToReturn,
261                                         Continuation cont)
262        throws NamingException  {
263            if (resolve_to_context(name, cont))
264                return a_search(matchingAttributes, attributesToReturn, cont);
265            return null;
266        }
267
268    protected NamingEnumeration<SearchResult> c_search(Name name,
269                                                       String filter,
270                                                       SearchControls cons,
271                                                       Continuation cont)
272        throws NamingException {
273            if (resolve_to_penultimate_context(name, cont))
274                return a_search(name.toString(), filter, cons, cont);
275            return null;
276        }
277
278    protected NamingEnumeration<SearchResult> c_search(Name name,
279                                                       String filterExpr,
280                                                       Object[] filterArgs,
281                                                       SearchControls cons,
282                                                       Continuation cont)
283        throws NamingException  {
284            if (resolve_to_penultimate_context(name, cont))
285                return a_search(name.toString(), filterExpr, filterArgs, cons, cont);
286            return null;
287        }
288
289    protected DirContext c_getSchema(Name name, Continuation cont)
290        throws NamingException  {
291            if (resolve_to_context(name, cont))
292                return a_getSchema(cont);
293            return null;
294        }
295
296    protected DirContext c_getSchemaClassDefinition(Name name, Continuation cont)
297        throws NamingException  {
298            if (resolve_to_context(name, cont))
299                return a_getSchemaClassDefinition(cont);
300            return null;
301        }
302
303    /* equivalent to methods in DirContext interface for nns */
304
305    protected Attributes c_getAttributes_nns(Name name, String[] attrIds,
306                                           Continuation cont)
307        throws NamingException  {
308            if (resolve_to_penultimate_context_nns(name, cont))
309                return a_getAttributes_nns(name.toString(), attrIds, cont);
310            return null;
311        }
312
313    protected void c_modifyAttributes_nns(Name name, int mod_op,
314                                          Attributes attrs, Continuation cont)
315        throws NamingException {
316            if (resolve_to_penultimate_context_nns(name, cont))
317                a_modifyAttributes_nns(name.toString(), mod_op, attrs, cont);
318        }
319
320    protected void c_modifyAttributes_nns(Name name, ModificationItem[] mods,
321                                      Continuation cont)
322        throws NamingException {
323            if (resolve_to_penultimate_context_nns(name, cont))
324                a_modifyAttributes_nns(name.toString(), mods, cont);
325        }
326
327    protected void c_bind_nns(Name name, Object obj,
328                              Attributes attrs, Continuation cont)
329        throws NamingException  {
330            if (resolve_to_penultimate_context_nns(name, cont))
331                a_bind_nns(name.toString(), obj, attrs, cont);
332        }
333
334    protected void c_rebind_nns(Name name, Object obj,
335                                Attributes attrs, Continuation cont)
336        throws NamingException  {
337            if (resolve_to_penultimate_context_nns(name, cont))
338                a_rebind_nns(name.toString(), obj, attrs, cont);
339        }
340
341    protected DirContext c_createSubcontext_nns(Name name,
342                                               Attributes attrs,
343                                               Continuation cont)
344        throws NamingException  {
345            if (resolve_to_penultimate_context_nns(name, cont))
346                return a_createSubcontext_nns(name.toString(), attrs, cont);
347            return null;
348        }
349
350    protected NamingEnumeration<SearchResult> c_search_nns(
351                                         Name name,
352                                         Attributes matchingAttributes,
353                                         String[] attributesToReturn,
354                                         Continuation cont)
355        throws NamingException  {
356            resolve_to_nns_and_continue(name, cont);
357            return null;
358        }
359
360    protected NamingEnumeration<SearchResult> c_search_nns(Name name,
361                                                           String filter,
362                                                           SearchControls cons,
363                                                           Continuation cont)
364        throws NamingException {
365            if (resolve_to_penultimate_context_nns(name, cont))
366                return a_search_nns(name.toString(), filter, cons, cont);
367            return null;
368        }
369
370    protected NamingEnumeration<SearchResult> c_search_nns(Name name,
371                                                           String filterExpr,
372                                                           Object[] filterArgs,
373                                                           SearchControls cons,
374                                                           Continuation cont)
375        throws NamingException  {
376            if (resolve_to_penultimate_context_nns(name, cont))
377                return a_search_nns(name.toString(), filterExpr, filterArgs,
378                                    cons, cont);
379            return null;
380        }
381
382    protected DirContext c_getSchema_nns(Name name, Continuation cont)
383        throws NamingException  {
384            resolve_to_nns_and_continue(name, cont);
385            return null;
386        }
387
388    protected DirContext c_getSchemaClassDefinition_nns(Name name, Continuation cont)
389        throws NamingException  {
390            resolve_to_nns_and_continue(name, cont);
391            return null;
392        }
393}
394