1 /*
   2  * Copyright (c) 1999, 2003, 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 
  26 package com.sun.corba.se.impl.naming.pcosnaming;
  27 
  28 
  29 import org.omg.CORBA.Object;
  30 import org.omg.CORBA.SystemException;
  31 import org.omg.CORBA.BAD_PARAM;
  32 import org.omg.CORBA.CompletionStatus;
  33 import org.omg.CORBA.Policy;
  34 import org.omg.PortableServer.POA;
  35 import org.omg.PortableServer.LifespanPolicyValue;
  36 import org.omg.PortableServer.RequestProcessingPolicyValue;
  37 import org.omg.PortableServer.IdAssignmentPolicyValue;
  38 import org.omg.PortableServer.ServantRetentionPolicyValue;
  39 
  40 import org.omg.CosNaming.*;
  41 import org.omg.CosNaming.NamingContextPackage.*;
  42 import org.omg.CosNaming.NamingContextExtPackage.*;
  43 
  44 import com.sun.corba.se.impl.naming.cosnaming.NamingContextDataStore;
  45 import com.sun.corba.se.impl.naming.cosnaming.NamingUtils;
  46 
  47 import com.sun.corba.se.impl.naming.namingutil.INSURLHandler;
  48 
  49 import com.sun.corba.se.spi.orb.ORB;
  50 import com.sun.corba.se.spi.logging.CORBALogDomains;
  51 
  52 import com.sun.corba.se.impl.orbutil.ORBConstants;
  53 import com.sun.corba.se.impl.logging.NamingSystemException;
  54 
  55 import java.io.Serializable;
  56 import java.util.Hashtable;
  57 
  58 /**
  59  * Class NamingContextImpl implements the org.omg.CosNaming::NamingContext and
  60  * NamingContextExt interface.
  61  * <p>
  62  * The operations bind(), rebind(), bind_context() and rebind_context()
  63  * are all really implemented by doBind(). resolve() is really implemented
  64  * by doResolve(), unbind() by doUnbind(). list(), new_context() and
  65  * destroy() uses the NamingContextDataStore interface directly. All the
  66  * doX() methods are public static.
  67  * They synchronize on the NamingContextDataStore object.
  68  * <p>
  69  * None of the methods here are Synchronized because These methods will be
  70  * invoked from Super class's doBind( ), doResolve( ) which are already
  71  * Synchronized.
  72  */
  73 
  74 
  75 public class NamingContextImpl
  76     extends NamingContextExtPOA
  77     implements NamingContextDataStore, Serializable
  78 {
  79 
  80     // The ORB is required to do string_to_object() operations
  81     // All the references are stored in the files in the form of IOR strings
  82     private transient ORB orb;
  83 
  84     // The ObjectKey will be in the format NC<Index> which uniquely identifies
  85     // The NamingContext internaly
  86     private final String objKey;
  87 
  88     // Hash table contains all the entries in the NamingContexts. The
  89     // CORBA.Object references will be stored in the form of IOR strings
  90     // and the Child Naming Contexts will have it's key as the entry in the
  91     // table. This table is written into File everytime an update is made
  92     // on this context.
  93     private final Hashtable theHashtable = new Hashtable( );
  94 
  95     // The NameServiceHandle is required to get the ObjectId from the
  96     // NamingContext's references. These references are created using
  97     // POA in the NameService.
  98     private transient NameService theNameServiceHandle;
  99 
 100     // ServantManager is the single point of contact to Read, Write and
 101     // Update the NamingContextFile
 102     private transient ServantManagerImpl theServantManagerImplHandle;
 103 
 104     // All the INS (Interoperable Naming Service) methods are defined in this class
 105     // All the calls to INS will be delegated to this class.
 106     private transient com.sun.corba.se.impl.naming.cosnaming.InterOperableNamingImpl insImpl;
 107 
 108     private transient NamingSystemException readWrapper ;
 109 
 110     private transient NamingSystemException updateWrapper ;
 111 
 112     private static POA biPOA = null;
 113 
 114     /**
 115      * Create a naming context servant.
 116      * Runs the super constructor.
 117      * @param orb an ORB object.
 118      * @param objKey as String
 119      * @param TheNameService as NameService
 120      * @param TheServantManagerImpl as ServantManagerImpl
 121      * @exception java.lang.Exception a Java exception.
 122      */
 123 
 124     public NamingContextImpl(ORB orb, String objKey,
 125         NameService theNameService, ServantManagerImpl theServantManagerImpl  )
 126         throws Exception
 127     {
 128         super();
 129 
 130         this.orb = orb;
 131         readWrapper = NamingSystemException.get( orb,
 132             CORBALogDomains.NAMING_READ ) ;
 133         updateWrapper = NamingSystemException.get( orb,
 134             CORBALogDomains.NAMING_UPDATE ) ;
 135 
 136         debug = true ; // orb.namingDebugFlag ;
 137         this.objKey = objKey;
 138         theNameServiceHandle = theNameService;
 139         theServantManagerImplHandle = theServantManagerImpl;
 140         insImpl =
 141             new com.sun.corba.se.impl.naming.cosnaming.InterOperableNamingImpl();
 142     }
 143 
 144     com.sun.corba.se.impl.naming.cosnaming.InterOperableNamingImpl getINSImpl( )
 145     {
 146         if( insImpl == null )
 147         {
 148             // insImpl will be null if the NamingContext graph is rebuilt from
 149             // the persistence store.
 150             insImpl =
 151                 new com.sun.corba.se.impl.naming.cosnaming.InterOperableNamingImpl();
 152         }
 153         return insImpl;
 154     }
 155 
 156 
 157     public void setRootNameService( NameService theNameService ) {
 158         theNameServiceHandle = theNameService;
 159     }
 160 
 161     public void setORB( ORB theOrb ) {
 162         orb = theOrb;
 163     }
 164 
 165     public void setServantManagerImpl(
 166                 ServantManagerImpl theServantManagerImpl )
 167     {
 168         theServantManagerImplHandle = theServantManagerImpl;
 169     }
 170 
 171     public POA getNSPOA( ) {
 172         return theNameServiceHandle.getNSPOA( );
 173     }
 174 
 175 
 176 
 177 
 178    /**
 179    * Bind an object under a name in this NamingContext. If the name
 180    * contains multiple (n) components, n-1 will be resolved in this
 181    * NamingContext and the object bound in resulting NamingContext.
 182    * An exception is thrown if a binding with the supplied name already
 183    * exists. If the
 184    * object to be bound is a NamingContext it will not participate in
 185    * a recursive resolve.
 186    * @param n a sequence of NameComponents which is the name under which
 187    * the object will be bound.
 188    * @param obj the object reference to be bound.
 189    * @exception org.omg.CosNaming.NamingContextPackage.NotFound A name with multiple
 190    * components was supplied, but the first component could not be
 191    * resolved.
 192    * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed
 193    * in resolving the n-1 components of the supplied name.
 194    * @exception org.omg.CosNaming.NamingContextPackage.InvalidName The supplied name
 195    * is invalid (i.e., has length less than 1).
 196    * @exception org.omg.CosNaming.NamingContextPackage.AlreadyBound The supplied name
 197    * is already bound.
 198    * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
 199    * @see doBind
 200    */
 201    public void bind(NameComponent[] n, org.omg.CORBA.Object obj)
 202         throws org.omg.CosNaming.NamingContextPackage.NotFound,
 203                org.omg.CosNaming.NamingContextPackage.CannotProceed,
 204                org.omg.CosNaming.NamingContextPackage.InvalidName,
 205                org.omg.CosNaming.NamingContextPackage.AlreadyBound
 206     {
 207         if( obj == null ) {
 208             throw updateWrapper.objectIsNull() ;
 209         }
 210 
 211         if (debug)
 212             dprint("bind " + nameToString(n) + " to " + obj);
 213         // doBind implements all four flavors of binding
 214         NamingContextDataStore impl = (NamingContextDataStore)this;
 215         doBind(impl,n,obj,false,BindingType.nobject);
 216     }
 217 
 218    /**
 219    * Bind a NamingContext under a name in this NamingContext. If the name
 220    * contains multiple (n) components, n-1 will be resolved in this
 221    * NamingContext and the object bound in resulting NamingContext.
 222    * An exception is thrown if a binding with the supplied name already
 223    * exists. The NamingContext will participate in recursive resolving.
 224    * @param n a sequence of NameComponents which is the name under which
 225    * the object will be bound.
 226    * @param obj the NamingContect object reference to be bound.
 227    * @exception org.omg.CosNaming.NamingContextPackage.NotFound A name with multiple
 228    * components was supplied, but the first component could not be
 229    * resolved.
 230    * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed
 231    * in resolving the n-1 components of the supplied name.
 232    * @exception org.omg.CosNaming.NamingContextPackage.InvalidName The supplied name
 233    * is invalid (i.e., has length less than 1).
 234    * @exception org.omg.CosNaming.NamingContextPackage.AlreadyBound An object is
 235    * already bound under the supplied name.
 236    * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
 237    * @see doBind
 238    */
 239    public void bind_context(NameComponent[] n, NamingContext nc)
 240         throws org.omg.CosNaming.NamingContextPackage.NotFound,
 241                org.omg.CosNaming.NamingContextPackage.CannotProceed,
 242                org.omg.CosNaming.NamingContextPackage.InvalidName,
 243                org.omg.CosNaming.NamingContextPackage.AlreadyBound
 244     {
 245         if( nc == null ) {
 246             throw updateWrapper.objectIsNull() ;
 247         }
 248         // doBind implements all four flavors of binding
 249         NamingContextDataStore impl = (NamingContextDataStore)this;
 250         doBind(impl,n,nc,false,BindingType.ncontext);
 251     }
 252 
 253  /**
 254    * Bind an object under a name in this NamingContext. If the name
 255    * contains multiple (n) components, n-1 will be resolved in this
 256    * NamingContext and the object bound in resulting NamingContext.
 257    * If a binding under the supplied name already exists it will be
 258    * unbound first. If the
 259    * object to be bound is a NamingContext it will not participate in
 260    * a recursive resolve.
 261    * @param n a sequence of NameComponents which is the name under which
 262    * the object will be bound.
 263    * @param obj the object reference to be bound.
 264    * @exception org.omg.CosNaming.NamingContextPackage.NotFound A name with multiple
 265    * components was supplied, but the first component could not be
 266    * resolved.
 267    * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed
 268    * in resolving the n-1 components of the supplied name.
 269    * @exception org.omg.CosNaming.NamingContextPackage.InvalidName The supplied name
 270    * is invalid (i.e., has length less than 1).
 271    * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
 272    * @see doBind
 273    */
 274    public  void rebind(NameComponent[] n, org.omg.CORBA.Object obj)
 275         throws       org.omg.CosNaming.NamingContextPackage.NotFound,
 276                      org.omg.CosNaming.NamingContextPackage.CannotProceed,
 277                      org.omg.CosNaming.NamingContextPackage.InvalidName
 278     {
 279         if( obj == null )
 280         {
 281             throw updateWrapper.objectIsNull() ;
 282         }
 283         try {
 284             if (debug)
 285                 dprint("rebind " + nameToString(n) + " to " + obj);
 286             // doBind implements all four flavors of binding
 287             NamingContextDataStore impl = (NamingContextDataStore)this;
 288             doBind(impl,n,obj,true,BindingType.nobject);
 289         } catch (org.omg.CosNaming.NamingContextPackage.AlreadyBound ex) {
 290             // This should not happen
 291             throw updateWrapper.namingCtxRebindAlreadyBound( ex ) ;
 292         }
 293     }
 294 
 295    /**
 296    * Bind a NamingContext under a name in this NamingContext. If the name
 297    * contains multiple (n) components, the first n-1 components will be
 298    * resolved in this
 299    * NamingContext and the object bound in resulting NamingContext.
 300    * If a binding under the supplied name already exists it will be
 301    * unbound first. The NamingContext will participate in recursive resolving.
 302    * @param n a sequence of NameComponents which is the name under which
 303    * the object will be bound.
 304    * @param obj the object reference to be bound.
 305    * @exception org.omg.CosNaming.NamingContextPackage.NotFound A name with multiple
 306    * components was supplied, but the first component could not be
 307    * resolved.
 308    * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed
 309    * in resolving the n-1 components of the supplied name.
 310    * @exception org.omg.CosNaming.NamingContextPackage.InvalidName The supplied name
 311    * is invalid (i.e., has length less than 1).
 312    * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
 313    * @see doBind
 314    */
 315    public  void rebind_context(NameComponent[] n, NamingContext nc)
 316         throws org.omg.CosNaming.NamingContextPackage.NotFound,
 317                org.omg.CosNaming.NamingContextPackage.CannotProceed,
 318                org.omg.CosNaming.NamingContextPackage.InvalidName
 319     {
 320         try {
 321             if (debug)
 322                 dprint("rebind_context " + nameToString(n) + " to " + nc);
 323             // doBind implements all four flavors of binding
 324             NamingContextDataStore impl = (NamingContextDataStore)this;
 325             doBind(impl,n,nc,true,BindingType.ncontext);
 326         } catch (org.omg.CosNaming.NamingContextPackage.AlreadyBound ex) {
 327             // This should not happen
 328             throw updateWrapper.namingCtxRebindAlreadyBound( ex ) ;
 329         }
 330     }
 331 
 332    /**
 333    * Resolve a name in this NamingContext and return the object reference
 334    * bound to the name. If the name contains multiple (n) components,
 335    * the first component will be resolved in this NamingContext and the
 336    * remaining components resolved in the resulting NamingContext, provided
 337    * that the NamingContext bound to the first component of the name was
 338    * bound with bind_context().
 339    * @param n a sequence of NameComponents which is the name to be resolved.
 340    * @return the object reference bound under the supplied name.
 341    * @exception org.omg.CosNaming.NamingContextPackage.NotFound A name with multiple
 342    * components was supplied, but the first component could not be
 343    * resolved.
 344    * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed
 345    * in resolving the n-1 components of the supplied name.
 346    * @exception org.omg.CosNaming.NamingContextPackage.InvalidName The supplied name
 347    * is invalid (i.e., has length less than 1).
 348    * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
 349    * @see doResolve
 350    */
 351    public  org.omg.CORBA.Object resolve(NameComponent[] n)
 352         throws org.omg.CosNaming.NamingContextPackage.NotFound,
 353                org.omg.CosNaming.NamingContextPackage.CannotProceed,
 354                org.omg.CosNaming.NamingContextPackage.InvalidName
 355     {
 356         if (debug)
 357             dprint("resolve " + nameToString(n));
 358         // doResolve actually resolves
 359         NamingContextDataStore impl = (NamingContextDataStore)this;
 360         return doResolve(impl,n);
 361     }
 362 
 363    /**
 364    * Remove a binding from this NamingContext. If the name contains
 365    * multiple (n) components, the first n-1 components will be resolved
 366    * from this NamingContext and the final component unbound in
 367    * the resulting NamingContext.
 368    * @param n a sequence of NameComponents which is the name to be unbound.
 369    * @exception org.omg.CosNaming.NamingContextPackage.NotFound A name with multiple
 370    * components was supplied, but the first component could not be
 371    * resolved.
 372    * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed
 373    * in resolving the n-1 components of the supplied name.
 374    * @exception org.omg.CosNaming.NamingContextPackage.InvalidName The supplied name
 375    * is invalid (i.e., has length less than 1).
 376    * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
 377    * @see doUnbind
 378    */
 379    public  void unbind(NameComponent[] n)
 380         throws org.omg.CosNaming.NamingContextPackage.NotFound,
 381                org.omg.CosNaming.NamingContextPackage.CannotProceed,
 382                org.omg.CosNaming.NamingContextPackage.InvalidName
 383     {
 384         if (debug)
 385             dprint("unbind " + nameToString(n));
 386         // doUnbind actually unbinds
 387         NamingContextDataStore impl = (NamingContextDataStore)this;
 388         doUnbind(impl,n);
 389     }
 390 
 391    /**
 392    * List the contents of this NamingContest. A sequence of bindings
 393    * is returned (a BindingList) containing up to the number of requested
 394    * bindings, and a BindingIterator object reference is returned for
 395    * iterating over the remaining bindings.
 396    * @param how_many The number of requested bindings in the BindingList.
 397    * @param bl The BindingList as an out parameter.
 398    * @param bi The BindingIterator as an out parameter.
 399    * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
 400    * @see BindingListHolder
 401    * @see BindingIteratorImpl
 402    */
 403     public  void list(int how_many, BindingListHolder bl, BindingIteratorHolder bi)
 404     {
 405         if (debug)
 406             dprint("list(" + how_many + ")");
 407         // List actually generates the list
 408         NamingContextDataStore impl = (NamingContextDataStore)this;
 409         synchronized (impl) {
 410             impl.List(how_many,bl,bi);
 411         }
 412         if (debug && bl.value != null)
 413             dprint("list(" + how_many + ") -> bindings[" + bl.value.length +
 414                    "] + iterator: " + bi.value);
 415     }
 416 
 417 
 418    /**
 419    * Create a NamingContext object and return its object reference.
 420    * @return an object reference for a new NamingContext object implemented
 421    * by this Name Server.
 422    * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
 423    */
 424     public synchronized NamingContext new_context()
 425     {
 426         // Create actually creates a new naming context
 427         if (debug)
 428             dprint("new_context()");
 429         NamingContextDataStore impl = (NamingContextDataStore)this;
 430         synchronized (impl) {
 431             return impl.NewContext();
 432         }
 433     }
 434 
 435 
 436    /**
 437    * Create a new NamingContext, bind it in this Naming Context and return
 438    * its object reference. This is equivalent to using new_context() followed
 439    * by bind_context() with the supplied name and the object reference for
 440    * the newly created NamingContext.
 441    * @param n a sequence of NameComponents which is the name to be unbound.
 442    * @return an object reference for a new NamingContext object implemented
 443    * by this Name Server, bound to the supplied name.
 444    * @exception org.omg.CosNaming.NamingContextPackage.AlreadyBound An object is
 445    * already bound under the supplied name.
 446    * @exception org.omg.CosNaming.NamingContextPackage.NotFound A name with multiple
 447    * components was supplied, but the first component could not be
 448    * resolved.
 449    * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed
 450    * in resolving the n-1 components of the supplied name.
 451    * @exception org.omg.CosNaming.NamingContextPackage.InvalidName The supplied name
 452    * is invalid (i.e., has length less than 1).
 453    * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
 454    * @see new_context
 455    * @see bind_context
 456    */
 457     public  NamingContext bind_new_context(NameComponent[] n)
 458         throws org.omg.CosNaming.NamingContextPackage.NotFound,
 459                org.omg.CosNaming.NamingContextPackage.AlreadyBound,
 460                org.omg.CosNaming.NamingContextPackage.CannotProceed,
 461                org.omg.CosNaming.NamingContextPackage.InvalidName
 462     {
 463         NamingContext nc = null;
 464         NamingContext rnc = null;
 465         try {
 466             if (debug)
 467                 dprint("bind_new_context " + nameToString(n));
 468             // The obvious solution:
 469             nc = this.new_context();
 470             this.bind_context(n,nc);
 471             rnc = nc;
 472             nc = null;
 473         } finally {
 474             try {
 475                 if(nc != null)
 476                     nc.destroy();
 477             } catch (org.omg.CosNaming.NamingContextPackage.NotEmpty e) {
 478             }
 479         }
 480         return rnc;
 481     }
 482 
 483     /**
 484    * Destroy this NamingContext object. If this NamingContext contains
 485    * no bindings, the NamingContext is deleted.
 486    * @exception org.omg.CosNaming.NamingContextPackage.NotEmpty This NamingContext
 487    * is not empty (i.e., contains bindings).
 488    * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
 489    */
 490     public  void destroy()
 491         throws org.omg.CosNaming.NamingContextPackage.NotEmpty
 492     {
 493         if (debug)
 494             dprint("destroy ");
 495         NamingContextDataStore impl = (NamingContextDataStore)this;
 496         synchronized (impl) {
 497             if (impl.IsEmpty() == true)
 498                 // The context is empty so it can be destroyed
 499                 impl.Destroy();
 500             else
 501                 // This context is not empty!
 502                 throw new org.omg.CosNaming.NamingContextPackage.NotEmpty();
 503         }
 504     }
 505 
 506       /**
 507    * Implements all four flavors of binding. It uses Resolve() to
 508    * check if a binding already exists (for bind and bind_context), and
 509    * unbind() to ensure that a binding does not already exist.
 510    * If the length of the name is 1, then Bind() is called with
 511    * the name and the object to bind. Otherwise, the first component
 512    * of the name is resolved in this NamingContext and the appropriate
 513    * form of bind passed to the resulting NamingContext.
 514    * This method is static for maximal reuse - even for extended naming
 515    * context implementations where the recursive semantics still apply.
 516    * @param impl an implementation of NamingContextDataStore
 517    * @param n a sequence of NameComponents which is the name under which
 518    * the object will be bound.
 519    * @param obj the object reference to be bound.
 520    * @param rebind Replace an existing binding or not.
 521    * @param bt Type of binding (as object or as context).
 522    * @exception org.omg.CosNaming.NamingContextPackage.NotFound A name with multiple
 523    * components was supplied, but the first component could not be
 524    * resolved.
 525    * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed
 526    * in resolving the first component of the supplied name.
 527    * @exception org.omg.CosNaming.NamingContextPackage.InvalidName The supplied name
 528    * is invalid (i.e., has length less than 1).
 529    * @exception org.omg.CosNaming.NamingContextPackage.AlreadyBound An object is
 530    * already bound under the supplied name.
 531    * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
 532    * @see resolve
 533    * @see unbind
 534    * @see bind
 535    * @see bind_context
 536    * @see rebind
 537    * @see rebind_context
 538    */
 539     private void doBind(NamingContextDataStore impl,
 540                               NameComponent[] n,
 541                               org.omg.CORBA.Object obj,
 542                               boolean rebind,
 543                               org.omg.CosNaming.BindingType bt)
 544         throws org.omg.CosNaming.NamingContextPackage.NotFound,
 545                org.omg.CosNaming.NamingContextPackage.CannotProceed,
 546                org.omg.CosNaming.NamingContextPackage.InvalidName,
 547                org.omg.CosNaming.NamingContextPackage.AlreadyBound
 548     {
 549         // Valid name?
 550         if (n.length < 1)
 551             throw new org.omg.CosNaming.NamingContextPackage.InvalidName();
 552 
 553     // At bottom level?
 554         if (n.length == 1) {
 555             // The identifier must be set
 556             if( (n[0].id.length() == 0) && (n[0].kind.length() == 0) )
 557                 throw new org.omg.CosNaming.NamingContextPackage.InvalidName();
 558 
 559             // Ensure synchronization of backend
 560             synchronized (impl) {
 561                 // Yes: bind object in this context under the name
 562                 BindingTypeHolder bth = new BindingTypeHolder();
 563                 if (rebind) {
 564                     org.omg.CORBA.Object objRef = impl.Resolve( n[0], bth );
 565                     if( objRef != null ) {
 566                         // Refer Naming Service Doc:00-11-01 section 2.2.3.4
 567                         // If there is an object already bound with the name
 568                         // and the binding type is not ncontext a NotFound
 569                         // Exception with a reason of not a context has to be
 570                         // raised.
 571                         // Fix for bug Id: 4384628
 572                         if ( bth.value.value() == BindingType.nobject.value() ) {
 573                             if ( bt.value() == BindingType.ncontext.value() ) {
 574                                 throw new NotFound(NotFoundReason.not_context, n);
 575                             }
 576                         } else {
 577                             // Previously a Context was bound and now trying to
 578                             // bind Object. It is invalid.
 579                             if ( bt.value() == BindingType.nobject.value() ) {
 580                                 throw new NotFound(NotFoundReason.not_object, n);
 581                             }
 582                         }
 583                         impl.Unbind(n[0]);
 584                     }
 585                 } else {
 586                     if (impl.Resolve(n[0],bth) != null)
 587                         throw new org.omg.CosNaming.NamingContextPackage.AlreadyBound();
 588                 }
 589 
 590                 // Now there are no other bindings under this name
 591                 impl.Bind(n[0],obj,bt);
 592             }
 593         } else {
 594             // No: bind in a different context
 595             NamingContext context = resolveFirstAsContext(impl,n);
 596 
 597             // Compute tail
 598             NameComponent[] tail = new NameComponent[n.length - 1];
 599             System.arraycopy(n,1,tail,0,n.length-1);
 600 
 601       // How should we propagate the bind
 602             switch (bt.value()) {
 603             case BindingType._nobject:
 604                 {
 605                     // Bind as object
 606                     if (rebind)
 607                         context.rebind(tail,obj);
 608                     else
 609                         context.bind(tail,obj);
 610                 }
 611                 break;
 612             case BindingType._ncontext:
 613                 {
 614                     // Narrow to a naming context using Java casts. It must work.
 615                     NamingContext objContext = (NamingContext)obj;
 616                     // Bind as context
 617                     if (rebind)
 618                         context.rebind_context(tail,objContext);
 619                     else
 620                         context.bind_context(tail,objContext);
 621                 }
 622                 break;
 623             default:
 624                 // This should not happen
 625                 throw updateWrapper.namingCtxBadBindingtype() ;
 626             }
 627         }
 628     }
 629 
 630 
 631    /**
 632    * Implements resolving names in this NamingContext. The first component
 633    * of the supplied name is resolved in this NamingContext by calling
 634    * Resolve(). If there are no more components in the name, the
 635    * resulting object reference is returned. Otherwise, the resulting object
 636    * reference must have been bound as a context and be narrowable to
 637    * a NamingContext. If this is the case, the remaining
 638    * components of the name is resolved in the resulting NamingContext.
 639    * This method is static for maximal reuse - even for extended naming
 640    * context implementations where the recursive semantics still apply.
 641    * @param impl an implementation of NamingContextDataStore
 642    * @param n a sequence of NameComponents which is the name to be resolved.
 643    * @return the object reference bound under the supplied name.
 644    * @exception org.omg.CosNaming.NamingContextPackage.NotFound A name with multiple
 645    * components was supplied, but the first component could not be
 646    * resolved.
 647    * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed
 648    * in resolving the first component of the supplied name.
 649    * @exception org.omg.CosNaming.NamingContextPackage.InvalidName The supplied name
 650    * is invalid (i.e., has length less than 1).
 651    * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
 652    * @see resolve
 653    */
 654     public static org.omg.CORBA.Object doResolve(NamingContextDataStore impl,
 655                                                  NameComponent[] n)
 656         throws org.omg.CosNaming.NamingContextPackage.NotFound,
 657                org.omg.CosNaming.NamingContextPackage.CannotProceed,
 658                org.omg.CosNaming.NamingContextPackage.InvalidName
 659     {
 660         org.omg.CORBA.Object obj = null;
 661         BindingTypeHolder bth = new BindingTypeHolder();
 662 
 663         // Length must be greater than 0
 664         if (n.length < 1)
 665             throw new org.omg.CosNaming.NamingContextPackage.InvalidName();
 666 
 667         // The identifier must be set
 668         if (n.length == 1) {
 669             synchronized (impl) {
 670                 // Resolve first level in this context
 671                 obj = impl.Resolve(n[0],bth);
 672             }
 673             if (obj == null) {
 674                 // Object was not found
 675                 throw new org.omg.CosNaming.NamingContextPackage.NotFound(NotFoundReason.missing_node,n);
 676             }
 677             return obj;
 678         } else {
 679             // n.length > 1
 680             if ( (n[1].id.length() == 0) && (n[1].kind.length() == 0 ) )
 681                 throw new org.omg.CosNaming.NamingContextPackage.InvalidName();
 682 
 683             NamingContext context = resolveFirstAsContext(impl,n);
 684 
 685             // Compute restOfName = name[1..length]
 686             NameComponent[] tail = new NameComponent[n.length -1];
 687             System.arraycopy(n,1,tail,0,n.length-1);
 688 
 689             // Resolve rest of name in context
 690             return context.resolve(tail);
 691         }
 692     }
 693 
 694     /**
 695    * Implements unbinding bound names in this NamingContext. If the
 696    * name contains only one component, the name is unbound in this
 697    * NamingContext using Unbind(). Otherwise, the first component
 698    * of the name is resolved in this NamingContext and
 699    * unbind passed to the resulting NamingContext.
 700    * This method is static for maximal reuse - even for extended naming
 701    * context implementations where the recursive semantics still apply.
 702    * @param impl an implementation of NamingContextDataStore
 703    * @param n a sequence of NameComponents which is the name to be unbound.
 704    * @exception org.omg.CosNaming.NamingContextPackage.NotFound A name with multiple
 705    * components was supplied, but the first component could not be
 706    * resolved.
 707    * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed
 708    * in resolving the n-1 components of the supplied name.
 709    * @exception org.omg.CosNaming.NamingContextPackage.InvalidName The supplied name
 710    * is invalid (i.e., has length less than 1).
 711    * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
 712    * @see resolve
 713    */
 714     public static void doUnbind(NamingContextDataStore impl,
 715                                 NameComponent[] n)
 716         throws org.omg.CosNaming.NamingContextPackage.NotFound,
 717                org.omg.CosNaming.NamingContextPackage.CannotProceed,
 718                org.omg.CosNaming.NamingContextPackage.InvalidName
 719     {
 720         // Name valid?
 721         if (n.length < 1)
 722             throw new org.omg.CosNaming.NamingContextPackage.InvalidName();
 723 
 724         // Unbind here?
 725         if (n.length == 1) {
 726             // The identifier must be set
 727             if ( (n[0].id.length() == 0) && (n[0].kind.length() == 0 ) )
 728                 throw new org.omg.CosNaming.NamingContextPackage.InvalidName();
 729 
 730             org.omg.CORBA.Object objRef = null;
 731             synchronized (impl) {
 732                 // Yes: unbind in this context
 733                 objRef = impl.Unbind(n[0]);
 734             }
 735 
 736             if (objRef == null)
 737                 // It was not bound
 738                 throw new org.omg.CosNaming.NamingContextPackage.NotFound(NotFoundReason.missing_node,n);
 739             // Done
 740             return;
 741         } else {
 742             // No: unbind in a different context
 743 
 744       // Resolve first  - must be resolveable
 745             NamingContext context = resolveFirstAsContext(impl,n);
 746 
 747             // Compute tail
 748             NameComponent[] tail = new NameComponent[n.length - 1];
 749             System.arraycopy(n,1,tail,0,n.length-1);
 750 
 751       // Propagate unbind to this context
 752             context.unbind(tail);
 753         }
 754     }
 755 
 756      /**
 757    * Implements resolving a NameComponent in this context and
 758    * narrowing it to CosNaming::NamingContext. It will throw appropriate
 759    * exceptions if not found or not narrowable.
 760    * @param impl an implementation of NamingContextDataStore
 761    * @param n a NameComponents which is the name to be found.
 762    * @exception org.omg.CosNaming.NamingContextPackage.NotFound The
 763    * first component could not be resolved.
 764    * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed
 765    * in resolving the first component of the supplied name.
 766    * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
 767    * @see resolve
 768    */
 769     protected static NamingContext resolveFirstAsContext(NamingContextDataStore impl,
 770                                                          NameComponent[] n)
 771         throws org.omg.CosNaming.NamingContextPackage.NotFound {
 772         org.omg.CORBA.Object topRef = null;
 773         BindingTypeHolder bth = new BindingTypeHolder();
 774         NamingContext context = null;
 775 
 776         synchronized (impl) {
 777             // Resolve first  - must be resolveable
 778             topRef = impl.Resolve(n[0],bth);
 779             if (topRef == null) {
 780                 // It was not bound
 781                 throw new org.omg.CosNaming.NamingContextPackage.NotFound(NotFoundReason.missing_node,n);
 782             }
 783         }
 784 
 785         // Was it bound as a context?
 786         if (bth.value != BindingType.ncontext) {
 787             // It was not a context
 788             throw new org.omg.CosNaming.NamingContextPackage.NotFound(NotFoundReason.not_context,n);
 789         }
 790 
 791         // Narrow to a naming context
 792         try {
 793             context = NamingContextHelper.narrow(topRef);
 794         } catch (org.omg.CORBA.BAD_PARAM ex) {
 795             // It was not a context
 796             throw new org.omg.CosNaming.NamingContextPackage.NotFound(NotFoundReason.not_context,n);
 797         }
 798 
 799         // Hmm. must be ok
 800         return context;
 801     }
 802 
 803     public static String nameToString(NameComponent[] name)
 804     {
 805         StringBuffer s = new StringBuffer("{");
 806         if (name != null || name.length > 0) {
 807             for (int i=0;i<name.length;i++) {
 808                 if (i>0)
 809                     s.append(",");
 810                 s.append("[").
 811                     append(name[i].id).
 812                     append(",").
 813                     append(name[i].kind).
 814                     append("]");
 815             }
 816         }
 817         s.append("}");
 818         return s.toString();
 819     }
 820 
 821     // Debugging aids.
 822     private static boolean debug ;
 823 
 824     private static void dprint(String msg) {
 825         NamingUtils.dprint("NamingContextImpl("  +
 826                            Thread.currentThread().getName() + " at " +
 827                            System.currentTimeMillis() +
 828                            " ems): " + msg);
 829     }
 830 
 831 
 832     /**
 833     * Implements all flavors of binding( bind and bindcontext)
 834     * This method will be called from the superclass's doBind( ) method
 835     * which takes care of all the conditions before calling this method.
 836     * i.e., It checks whether the Name is already Bounded, Then in the
 837     * case of rebind it calls Unbind first.
 838     * This method does one level binding only, To have n-level binding
 839     * with compound names, doBind( ) calls this method recursively.
 840     * @param n a sequence of NameComponents which is the name under which
 841     * the object will be bound.
 842     * @param obj the object reference to be bound.
 843     * @param bt Type of binding (as object or as context).
 844     * @exception org.omg.CosNaming.NamingContextPackage.NotFound  raised
 845     * if the NameComoponent list is invalid
 846     * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed
 847     * Could not proceed in resolving the Name from the given NameComponent
 848     * @exception org.omg.CosNaming.NamingContextPackage.AlreadyBound An object
 849     * is already bound under the supplied name.
 850     * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA
 851     * system exceptions
 852     * @see Resolve
 853     * @see Unbind
 854     */
 855     public void Bind(NameComponent n, org.omg.CORBA.Object obj, BindingType bt)
 856     {
 857         if( obj == null ) {
 858             // Raise a Valid Exception and Return
 859             return;
 860         }
 861 
 862         InternalBindingKey key = new InternalBindingKey(n);
 863         InternalBindingValue value;
 864 
 865         try {
 866             if( bt.value() == BindingType._nobject ) {
 867                 // If the BindingType is an ObjectRef then Stringify this ref and
 868                 // Store it in InternalBindingValue instance. This is required
 869                 // because the Object References has to be stored in file
 870                 value = new InternalBindingValue(bt, orb.object_to_string(obj) );
 871                 value.setObjectRef( obj );
 872             } else {
 873                 // If the BindingType is a NamingContext then get it's object key
 874                 // from the NameService and store it in the Internal Binding Value instance
 875                 String theNCKey = theNameServiceHandle.getObjectKey( obj );
 876                 value = new InternalBindingValue( bt, theNCKey );
 877                 value.setObjectRef( obj );
 878             }
 879 
 880             InternalBindingValue oldValue =
 881                 (InternalBindingValue)this.theHashtable.put(key,value);
 882 
 883             if( oldValue != null) {
 884                 // There was an entry with this name in the Hashtable and hence throw CTX_ALREADY_BOUND
 885                 // exception
 886                 throw updateWrapper.namingCtxRebindAlreadyBound() ;
 887             } else {
 888                 try {
 889                     // Everything went smooth so update the NamingContext file with the
 890                     // latest Hashtable image
 891                     theServantManagerImplHandle.updateContext( objKey, this );
 892                 } catch( Exception e ) {
 893                     // Something went wrong while updating the context
 894                     // so speak the error
 895                     throw updateWrapper.bindUpdateContextFailed( e ) ;
 896                 }
 897             }
 898         } catch( Exception e ) {
 899             // Something went wrong while Binding the Object Reference
 900             // Speak the error again.
 901             throw updateWrapper.bindFailure( e ) ;
 902         }
 903     }
 904 
 905     /**
 906     * This method resolves the NamingContext or Object Reference for one level
 907     * The doResolve( ) method calls Resolve( ) recursively to resolve n level
 908     * Names.
 909     * @param n a sequence of NameComponents which is the name to be resolved.
 910     * @param bt Type of binding (as object or as context).
 911     * @return the object reference bound under the supplied name.
 912     * @exception org.omg.CosNaming.NamingContextPackage.NotFound Neither a NamingContext
 913     * or a Corba Object reference not found under this Name
 914     * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed
 915     * in resolving the the supplied name.
 916     * @exception org.omg.CosNaming.NamingContextPackage.InvalidName The supplied name
 917     * is invalid (i.e., has length less than 1).
 918     * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
 919     * @see Bind
 920     */
 921     public Object Resolve(NameComponent n, BindingTypeHolder bth)
 922         throws SystemException
 923     {
 924         if( ( n.id.length() == 0 ) &&( n.kind.length() == 0 ) ) {
 925             // If the NameComponent list has no entry then it means the current
 926             // context was requested
 927             bth.value = BindingType.ncontext;
 928             return theNameServiceHandle.getObjectReferenceFromKey(
 929                 this.objKey );
 930         }
 931 
 932         InternalBindingKey key = new InternalBindingKey(n);
 933         InternalBindingValue value =
 934             (InternalBindingValue) this.theHashtable.get(key);
 935 
 936         if( value == null ) {
 937             // No entry was found for the given name and hence return NULL
 938             // NamingContextDataStore throws appropriate exception if
 939             // required.
 940             return null;
 941         }
 942 
 943         Object theObjectFromStringifiedReference = null;
 944         bth.value = value.theBindingType;
 945 
 946         try {
 947             // Check whether the entry found in the Hashtable starts with NC
 948             // Which means it's a name context. So get the NamingContext reference
 949             // from ServantManager, which would either return from the cache or
 950             // read it from the File.
 951             if( value.strObjectRef.startsWith( "NC" ) ) {
 952                 bth.value = BindingType.ncontext;
 953                 return theNameServiceHandle.getObjectReferenceFromKey( value.strObjectRef );
 954             } else {
 955                 // Else, It is a Object Reference. Check whether Object Reference
 956                 // can be obtained directly, If not then convert the stringified
 957                 // reference to object and return.
 958                 theObjectFromStringifiedReference = value.getObjectRef( );
 959 
 960                 if (theObjectFromStringifiedReference == null ) {
 961                     try {
 962                         theObjectFromStringifiedReference =
 963                         orb.string_to_object( value.strObjectRef );
 964                         value.setObjectRef( theObjectFromStringifiedReference );
 965                     } catch( Exception e ) {
 966                         throw readWrapper.resolveConversionFailure(
 967                             CompletionStatus.COMPLETED_MAYBE, e );
 968                     }
 969                 }
 970             }
 971         } catch ( Exception e ) {
 972             throw readWrapper.resolveFailure(
 973                 CompletionStatus.COMPLETED_MAYBE, e );
 974         }
 975 
 976         return theObjectFromStringifiedReference;
 977     }
 978 
 979    /**
 980    * This method Unbinds the NamingContext or Object Reference for one level
 981    * The doUnbind( ) method from superclass calls Unbind() to recursively
 982    * Unbind using compound Names.
 983    * @param n a sequence of NameComponents which is the name to be resolved.
 984    * @return the object reference bound under the supplied name.
 985    * @exception org.omg.CosNaming.NamingContextPackage.NotFound Neither a NamingContext
 986    * or a Corba Object reference not found under this Name
 987    * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed
 988    * in resolving the the supplied name.
 989    * @exception org.omg.CosNaming.NamingContextPackage.InvalidName The supplied name
 990    * is invalid (i.e., has length less than 1).
 991    * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
 992    * @see Bind
 993    */
 994 
 995     public Object Unbind(NameComponent n) throws SystemException
 996     {
 997         try {
 998             InternalBindingKey key = new InternalBindingKey(n);
 999             InternalBindingValue value = null;
1000 
1001             try {
1002                 value = (InternalBindingValue) this.theHashtable.remove(key);
1003             } catch( Exception e ) {
1004                 // Ignore the exception in Hashtable.remove
1005             }
1006 
1007             theServantManagerImplHandle.updateContext( objKey, this );
1008 
1009             if( value == null ) {
1010                 return null;
1011             }
1012 
1013             if( value.strObjectRef.startsWith( "NC" ) ) {
1014                 theServantManagerImplHandle.readInContext( value.strObjectRef );
1015                 Object theObjectFromStringfiedReference =
1016                 theNameServiceHandle.getObjectReferenceFromKey( value.strObjectRef );
1017                 return theObjectFromStringfiedReference;
1018             } else {
1019                 Object theObjectFromStringifiedReference = value.getObjectRef( );
1020 
1021                 if( theObjectFromStringifiedReference == null ) {
1022                     theObjectFromStringifiedReference =
1023                     orb.string_to_object( value.strObjectRef );
1024                 }
1025 
1026                 return theObjectFromStringifiedReference;
1027             }
1028         } catch( Exception e ) {
1029             throw updateWrapper.unbindFailure( CompletionStatus.COMPLETED_MAYBE, e );
1030         }
1031     }
1032 
1033    /**
1034    * List the contents of this NamingContext. It creates a new
1035    * PersistentBindingIterator object and passes it a clone of the
1036    * hash table and an orb object. It then uses the
1037    * newly created object to return the required number of bindings.
1038    * @param how_many The number of requested bindings in the BindingList.
1039    * @param bl The BindingList as an out parameter.
1040    * @param bi The BindingIterator as an out parameter.
1041    * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
1042    */
1043 
1044     public void List(int how_many, BindingListHolder bl,
1045                      BindingIteratorHolder bi) throws SystemException
1046     {
1047         if( biPOA == null ) {
1048             createbiPOA( );
1049         }
1050         try {
1051             PersistentBindingIterator bindingIterator =
1052                 new PersistentBindingIterator(this.orb,
1053                 (Hashtable)this.theHashtable.clone(), biPOA);
1054             // Have it set the binding list
1055             bindingIterator.list(how_many,bl);
1056 
1057             byte[] objectId = biPOA.activate_object( bindingIterator );
1058             org.omg.CORBA.Object obj = biPOA.id_to_reference( objectId );
1059 
1060             // Get the object reference for the binding iterator servant
1061             org.omg.CosNaming.BindingIterator bindingRef =
1062                 org.omg.CosNaming.BindingIteratorHelper.narrow( obj );
1063 
1064             bi.value = bindingRef;
1065         } catch (org.omg.CORBA.SystemException e) {
1066             throw e;
1067         } catch( Exception e ) {
1068             throw readWrapper.transNcListGotExc( e ) ;
1069         }
1070     }
1071 
1072     private synchronized void createbiPOA( ) {
1073         if( biPOA != null ) {
1074             return;
1075         }
1076         try {
1077             POA rootPOA = (POA) orb.resolve_initial_references(
1078                 ORBConstants.ROOT_POA_NAME );
1079             rootPOA.the_POAManager().activate( );
1080 
1081             int i = 0;
1082             Policy[] poaPolicy = new Policy[3];
1083             poaPolicy[i++] = rootPOA.create_lifespan_policy(
1084                 LifespanPolicyValue.TRANSIENT);
1085             poaPolicy[i++] = rootPOA.create_id_assignment_policy(
1086                 IdAssignmentPolicyValue.SYSTEM_ID);
1087             poaPolicy[i++] = rootPOA.create_servant_retention_policy(
1088                 ServantRetentionPolicyValue.RETAIN);
1089             biPOA = rootPOA.create_POA("BindingIteratorPOA", null, poaPolicy );
1090             biPOA.the_POAManager().activate( );
1091         } catch( Exception e ) {
1092             throw readWrapper.namingCtxBindingIteratorCreate( e ) ;
1093         }
1094     }
1095 
1096 
1097    /**
1098    * Create a NamingContext object and return its object reference.
1099    * @return an object reference for a new NamingContext object implemented
1100    * by this Name Server.
1101    * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions.
1102    */
1103     public NamingContext NewContext() throws SystemException
1104     {
1105         try {
1106             return  theNameServiceHandle.NewContext( );
1107         } catch( org.omg.CORBA.SystemException e ) {
1108             throw e;
1109         } catch( Exception e ) {
1110             throw updateWrapper.transNcNewctxGotExc( e ) ;
1111         }
1112      }
1113 
1114 
1115    /**
1116    * Destroys the NamingContext.
1117    */
1118     public void Destroy() throws SystemException
1119     {
1120         // XXX note that orb.disconnect is illegal here, since the
1121         // POA is used.  However, there may be some associated state
1122         // that needs to be cleaned up in ServerManagerImpl which we will
1123         // look into further at another time.
1124         /*
1125         // XXX This needs to be replaced by cleaning up the
1126         // file that backs up the naming context.  No explicit
1127         // action is necessary at the POA level, since this is
1128         // created with the non-retain policy.
1129         /*
1130         try { orb.disconnect(
1131             theNameServiceHandle.getObjectReferenceFromKey( this.objKey ) );
1132         } catch( org.omg.CORBA.SystemException e ) {
1133             throw e;
1134         } catch( Exception e ) {
1135             throw updateWrapper.transNcDestroyGotEx( e ) ;
1136         }
1137         */
1138     }
1139 
1140     /**
1141     * This operation creates a stringified name from the array of Name
1142     * components.
1143     * @param n Name of the object <p>
1144     * @exception org.omg.CosNaming.NamingContextExtPackage.InvalidName
1145     * Indicates the name does not identify a binding.<p>
1146     *
1147     */
1148     public String to_string(org.omg.CosNaming.NameComponent[] n)
1149          throws org.omg.CosNaming.NamingContextPackage.InvalidName
1150     {
1151         // Name valid?
1152         if ( (n == null ) || (n.length == 0) )
1153         {
1154                 throw new org.omg.CosNaming.NamingContextPackage.InvalidName();
1155         }
1156 
1157         String theStringifiedName = getINSImpl().convertToString( n );
1158 
1159         if( theStringifiedName == null )
1160         {
1161                 throw new org.omg.CosNaming.NamingContextPackage.InvalidName();
1162         }
1163 
1164         return theStringifiedName;
1165     }
1166 
1167     /**
1168     * This operation  converts a Stringified Name into an  equivalent array
1169     * of Name Components.
1170     * @param sn Stringified Name of the object <p>
1171     * @exception org.omg.CosNaming.NamingContextExtPackage.InvalidName
1172     * Indicates the name does not identify a binding.<p>
1173     *
1174     */
1175     public org.omg.CosNaming.NameComponent[] to_name(String sn)
1176          throws org.omg.CosNaming.NamingContextPackage.InvalidName
1177     {
1178         // Name valid?
1179         if  ( (sn == null ) || (sn.length() == 0) )
1180         {
1181                 throw new org.omg.CosNaming.NamingContextPackage.InvalidName();
1182         }
1183         org.omg.CosNaming.NameComponent[] theNameComponents =
1184                 getINSImpl().convertToNameComponent( sn );
1185         if( ( theNameComponents == null ) || (theNameComponents.length == 0 ) )
1186         {
1187                 throw new org.omg.CosNaming.NamingContextPackage.InvalidName();
1188         }
1189         for( int i = 0; i < theNameComponents.length; i++ ) {
1190             // If there is a name component whose id and kind null or
1191             // zero length string, then an invalid name exception needs to be
1192             // raised.
1193             if ( ( ( theNameComponents[i].id  == null )
1194                  ||( theNameComponents[i].id.length() == 0 ) )
1195                &&( ( theNameComponents[i].kind == null )
1196                  ||( theNameComponents[i].kind.length() == 0 ) ) ) {
1197                 throw new InvalidName();
1198             }
1199         }
1200         return theNameComponents;
1201     }
1202 
1203     /**
1204     * This operation creates a URL based "iiopname://" format name
1205     * from the Stringified Name of the object.
1206     * @param addr internet based address of the host machine where
1207     * Name Service is running <p>
1208     * @param sn Stringified Name of the object <p>
1209     * @exception org.omg.CosNaming.NamingContextExtPackage.InvalidName
1210     * Indicates the name does not identify a binding.<p>
1211     * @exception org.omg.CosNaming.NamingContextPackage.InvalidAddress
1212     * Indicates the internet based address of the host machine is
1213     * incorrect <p>
1214     *
1215     */
1216 
1217     public String to_url(String addr, String sn)
1218         throws org.omg.CosNaming.NamingContextExtPackage.InvalidAddress,
1219                org.omg.CosNaming.NamingContextPackage.InvalidName
1220     {
1221         // Name valid?
1222         if  ( (sn == null ) || (sn.length() == 0) )
1223         {
1224                 throw new org.omg.CosNaming.NamingContextPackage.InvalidName();
1225         }
1226         if( addr == null )
1227         {
1228                 throw new org.omg.CosNaming.NamingContextExtPackage.InvalidAddress();
1229         }
1230         String urlBasedAddress = null;
1231         try {
1232             urlBasedAddress = getINSImpl().createURLBasedAddress( addr, sn );
1233         } catch (Exception e ) {
1234             urlBasedAddress = null;
1235         }
1236         // Extra check to see that corba name url created is valid as per
1237         // INS spec grammer.
1238         try {
1239             INSURLHandler.getINSURLHandler().parseURL( urlBasedAddress );
1240         } catch( BAD_PARAM e ) {
1241             throw new
1242                 org.omg.CosNaming.NamingContextExtPackage.InvalidAddress();
1243         }
1244         return urlBasedAddress;
1245     }
1246 
1247     /**
1248      * This operation resolves the Stringified name into the object
1249      * reference.
1250      * @param sn Stringified Name of the object <p>
1251      * @exception org.omg.CosNaming.NamingContextPackage.NotFound
1252      * Indicates there is no object reference for the given name. <p>
1253      * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed
1254      * Indicates that the given compound name is incorrect <p>
1255      * @exception org.omg.CosNaming.NamingContextExtPackage.InvalidName
1256      * Indicates the name does not identify a binding.<p>
1257      *
1258      */
1259     public org.omg.CORBA.Object resolve_str(String sn)
1260         throws org.omg.CosNaming.NamingContextPackage.NotFound,
1261                org.omg.CosNaming.NamingContextPackage.CannotProceed,
1262                org.omg.CosNaming.NamingContextPackage.InvalidName
1263     {
1264         org.omg.CORBA.Object theObject = null;
1265         // Name valid?
1266         if  ( (sn == null ) || (sn.length() == 0) )
1267         {
1268                 throw new org.omg.CosNaming.NamingContextPackage.InvalidName();
1269         }
1270         org.omg.CosNaming.NameComponent[] theNameComponents =
1271                 getINSImpl().convertToNameComponent( sn );
1272         if( ( theNameComponents == null ) || (theNameComponents.length == 0 ) )
1273         {
1274                 throw new org.omg.CosNaming.NamingContextPackage.InvalidName();
1275         }
1276         theObject = resolve( theNameComponents );
1277         return theObject;
1278     }
1279 
1280    /**
1281    * This is a Debugging Method
1282    */
1283     public boolean IsEmpty()
1284     {
1285         return this.theHashtable.isEmpty();
1286     }
1287 
1288    /**
1289    * This is a Debugging Method
1290    */
1291     public void printSize( )
1292     {
1293         System.out.println( "Hashtable Size = " + theHashtable.size( ) );
1294         java.util.Enumeration e = theHashtable.keys( );
1295         for( ; e.hasMoreElements(); )
1296         {
1297               InternalBindingValue thevalue =
1298                         (InternalBindingValue) this.theHashtable.get(e.nextElement());
1299                 if( thevalue != null )
1300                 {
1301                         System.out.println( "value = " + thevalue.strObjectRef);
1302                 }
1303         }
1304     }
1305 
1306 }