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