📄 namingcontextimpl.java
字号:
} /** * Resolve a name in this NamingContext and return the object reference * bound to the name. If the name contains multiple (n) components, * the first component will be resolved in this NamingContext and the * remaining components resolved in the resulting NamingContext, provided * that the NamingContext bound to the first component of the name was * bound with bind_context(). * @param n a sequence of NameComponents which is the name to be resolved. * @return the object reference bound under the supplied name. * @exception org.omg.CosNaming.NamingContextPackage.NotFound A name with multiple * components was supplied, but the first component could not be * resolved. * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed * in resolving the n-1 components of the supplied name. * @exception org.omg.CosNaming.NamingContextPackage.InvalidName The supplied name * is invalid (i.e., has length less than 1). * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions. * @see doResolve */ public org.omg.CORBA.Object resolve(NameComponent[] n) throws org.omg.CosNaming.NamingContextPackage.NotFound, org.omg.CosNaming.NamingContextPackage.CannotProceed, org.omg.CosNaming.NamingContextPackage.InvalidName { if (debug) dprint("resolve " + nameToString(n)); // doResolve actually resolves NamingContextDataStore impl = (NamingContextDataStore)this; return doResolve(impl,n); } /** * Remove a binding from this NamingContext. If the name contains * multiple (n) components, the first n-1 components will be resolved * from this NamingContext and the final component unbound in * the resulting NamingContext. * @param n a sequence of NameComponents which is the name to be unbound. * @exception org.omg.CosNaming.NamingContextPackage.NotFound A name with multiple * components was supplied, but the first component could not be * resolved. * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed * in resolving the n-1 components of the supplied name. * @exception org.omg.CosNaming.NamingContextPackage.InvalidName The supplied name * is invalid (i.e., has length less than 1). * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions. * @see doUnbind */ public void unbind(NameComponent[] n) throws org.omg.CosNaming.NamingContextPackage.NotFound, org.omg.CosNaming.NamingContextPackage.CannotProceed, org.omg.CosNaming.NamingContextPackage.InvalidName { if (debug) dprint("unbind " + nameToString(n)); // doUnbind actually unbinds NamingContextDataStore impl = (NamingContextDataStore)this; doUnbind(impl,n); } /** * List the contents of this NamingContest. A sequence of bindings * is returned (a BindingList) containing up to the number of requested * bindings, and a BindingIterator object reference is returned for * iterating over the remaining bindings. * @param how_many The number of requested bindings in the BindingList. * @param bl The BindingList as an out parameter. * @param bi The BindingIterator as an out parameter. * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions. * @see BindingListHolder * @see BindingIteratorImpl */ public void list(int how_many, BindingListHolder bl, BindingIteratorHolder bi) { if (debug) dprint("list(" + how_many + ")"); // List actually generates the list NamingContextDataStore impl = (NamingContextDataStore)this; synchronized (impl) { impl.List(how_many,bl,bi); } if (debug && bl.value != null) dprint("list(" + how_many + ") -> bindings[" + bl.value.length + "] + iterator: " + bi.value); } /** * Create a NamingContext object and return its object reference. * @return an object reference for a new NamingContext object implemented * by this Name Server. * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions. */ public synchronized NamingContext new_context() { // Create actually creates a new naming context if (debug) dprint("new_context()"); NamingContextDataStore impl = (NamingContextDataStore)this; synchronized (impl) { return impl.NewContext(); } } /** * Create a new NamingContext, bind it in this Naming Context and return * its object reference. This is equivalent to using new_context() followed * by bind_context() with the supplied name and the object reference for * the newly created NamingContext. * @param n a sequence of NameComponents which is the name to be unbound. * @return an object reference for a new NamingContext object implemented * by this Name Server, bound to the supplied name. * @exception org.omg.CosNaming.NamingContextPackage.AlreadyBound An object is * already bound under the supplied name. * @exception org.omg.CosNaming.NamingContextPackage.NotFound A name with multiple * components was supplied, but the first component could not be * resolved. * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed * in resolving the n-1 components of the supplied name. * @exception org.omg.CosNaming.NamingContextPackage.InvalidName The supplied name * is invalid (i.e., has length less than 1). * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions. * @see new_context * @see bind_context */ public NamingContext bind_new_context(NameComponent[] n) throws org.omg.CosNaming.NamingContextPackage.NotFound, org.omg.CosNaming.NamingContextPackage.AlreadyBound, org.omg.CosNaming.NamingContextPackage.CannotProceed, org.omg.CosNaming.NamingContextPackage.InvalidName { NamingContext nc = null; NamingContext rnc = null; try { if (debug) dprint("bind_new_context " + nameToString(n)); // The obvious solution: nc = this.new_context(); this.bind_context(n,nc); rnc = nc; nc = null; } finally { try { if(nc != null) nc.destroy(); } catch (org.omg.CosNaming.NamingContextPackage.NotEmpty e) { } } return rnc; } /** * Destroy this NamingContext object. If this NamingContext contains * no bindings, the NamingContext is deleted. * @exception org.omg.CosNaming.NamingContextPackage.NotEmpty This NamingContext * is not empty (i.e., contains bindings). * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions. */ public void destroy() throws org.omg.CosNaming.NamingContextPackage.NotEmpty { if (debug) dprint("destroy "); NamingContextDataStore impl = (NamingContextDataStore)this; synchronized (impl) { if (impl.IsEmpty() == true) // The context is empty so it can be destroyed impl.Destroy(); else // This context is not empty! throw new org.omg.CosNaming.NamingContextPackage.NotEmpty(); } } /** * Implements all four flavors of binding. It uses Resolve() to * check if a binding already exists (for bind and bind_context), and * unbind() to ensure that a binding does not already exist. * If the length of the name is 1, then Bind() is called with * the name and the object to bind. Otherwise, the first component * of the name is resolved in this NamingContext and the appropriate * form of bind passed to the resulting NamingContext. * This method is static for maximal reuse - even for extended naming * context implementations where the recursive semantics still apply. * @param impl an implementation of NamingContextDataStore * @param n a sequence of NameComponents which is the name under which * the object will be bound. * @param obj the object reference to be bound. * @param rebind Replace an existing binding or not. * @param bt Type of binding (as object or as context). * @exception org.omg.CosNaming.NamingContextPackage.NotFound A name with multiple * components was supplied, but the first component could not be * resolved. * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed * in resolving the first component of the supplied name. * @exception org.omg.CosNaming.NamingContextPackage.InvalidName The supplied name * is invalid (i.e., has length less than 1). * @exception org.omg.CosNaming.NamingContextPackage.AlreadyBound An object is * already bound under the supplied name. * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions. * @see resolve * @see unbind * @see bind * @see bind_context * @see rebind * @see rebind_context */ private void doBind(NamingContextDataStore impl, NameComponent[] n, org.omg.CORBA.Object obj, boolean rebind, org.omg.CosNaming.BindingType bt) throws org.omg.CosNaming.NamingContextPackage.NotFound, org.omg.CosNaming.NamingContextPackage.CannotProceed, org.omg.CosNaming.NamingContextPackage.InvalidName, org.omg.CosNaming.NamingContextPackage.AlreadyBound { // Valid name? if (n.length < 1) throw new org.omg.CosNaming.NamingContextPackage.InvalidName(); // At bottom level? if (n.length == 1) { // The identifier must be set if( (n[0].id.length() == 0) && (n[0].kind.length() == 0) ) throw new org.omg.CosNaming.NamingContextPackage.InvalidName(); // Ensure synchronization of backend synchronized (impl) { // Yes: bind object in this context under the name BindingTypeHolder bth = new BindingTypeHolder(); if (rebind) { org.omg.CORBA.Object objRef = impl.Resolve( n[0], bth ); if( objRef != null ) { // Refer Naming Service Doc:00-11-01 section 2.2.3.4 // If there is an object already bound with the name // and the binding type is not ncontext a NotFound // Exception with a reason of not a context has to be // raised. // Fix for bug Id: 4384628 if ( bth.value.value() == BindingType.nobject.value() ) { if ( bt.value() == BindingType.ncontext.value() ) { throw new NotFound(NotFoundReason.not_context, n); } } else { // Previously a Context was bound and now trying to // bind Object. It is invalid. if ( bt.value() == BindingType.nobject.value() ) { throw new NotFound(NotFoundReason.not_object, n); } } impl.Unbind(n[0]); } } else { if (impl.Resolve(n[0],bth) != null) throw new org.omg.CosNaming.NamingContextPackage.AlreadyBound(); } // Now there are no other bindings under this name impl.Bind(n[0],obj,bt); } } else { // No: bind in a different context NamingContext context = resolveFirstAsContext(impl,n); // Compute tail NameComponent[] tail = new NameComponent[n.length - 1]; System.arraycopy(n,1,tail,0,n.length-1); // How should we propagate the bind switch (bt.value()) { case BindingType._nobject: { // Bind as object if (rebind) context.rebind(tail,obj); else context.bind(tail,obj); } break; case BindingType._ncontext: { // Narrow to a naming context using Java casts. It must work. NamingContext objContext = (NamingContext)obj; // Bind as context if (rebind) context.rebind_context(tail,objContext); else context.bind_context(tail,objContext); } break; default: // This should not happen throw updateWrapper.namingCtxBadBindingtype() ; } } } /** * Implements resolving names in this NamingContext. The first component * of the supplied name is resolved in this NamingContext by calling * Resolve(). If there are no more components in the name, the * resulting object reference is returned. Otherwise, the resulting object * reference must have been bound as a context and be narrowable to * a NamingContext. If this is the case, the remaining * components of the name is resolved in the resulting NamingContext. * This method is static for maximal reuse - even for extended naming * context implementations where the recursive semantics still apply. * @param impl an implementation of NamingContextDataStore * @param n a sequence of NameComponents which is the name to be resolved. * @return the object reference bound under the supplied name. * @exception org.omg.CosNaming.NamingContextPackage.NotFound A name with multiple * components was supplied, but the first component could not be * resolved. * @exception org.omg.CosNaming.NamingContextPackage.CannotProceed Could not proceed * in resolving the first component of the supplied name. * @exception org.omg.CosNaming.NamingContextPackage.InvalidName The supplied name * is invalid (i.e., has length less than 1). * @exception org.omg.CORBA.SystemException One of a fixed set of CORBA system exceptions. * @see resolve */ public static org.omg.CORBA.Object doResolve(NamingContextDataStore impl, NameComponent[] n)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -