/** * Implements resolving a NameComponent in this context and narrowing it to * CosNaming::NamingContext. It will throw appropriate exceptions if not found or not narrowable. * * @param impl an implementation of NamingContextDataStore * @param n a NameComponents which is the name to be found. * @exception org.omg.CosNaming.NamingContextPackage.NotFound 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.CORBA.SystemException One of a fixed set of CORBA system exceptions. * @see resolve */ protected static NamingContext resolveFirstAsContext( NamingContextDataStore impl, NameComponent[] n) throws org.omg.CosNaming.NamingContextPackage.NotFound { org.omg.CORBA.Object topRef = null; BindingTypeHolder bth = new BindingTypeHolder(); NamingContext context = null; synchronized (impl) { // Resolve first - must be resolveable topRef = impl.Resolve(n[0], bth); if (topRef == null) { // It was not bound throw new NotFound(NotFoundReason.missing_node, n); } } // Was it bound as a context? if (bth.value != BindingType.ncontext) { // It was not a context throw new NotFound(NotFoundReason.not_context, n); } // Narrow to a naming context try { context = NamingContextHelper.narrow(topRef); } catch (org.omg.CORBA.BAD_PARAM ex) { // It was not a context throw new NotFound(NotFoundReason.not_context, n); } // Hmm. must be ok return context; }
/** * 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) throws org.omg.CosNaming.NamingContextPackage.NotFound, org.omg.CosNaming.NamingContextPackage.CannotProceed, org.omg.CosNaming.NamingContextPackage.InvalidName { org.omg.CORBA.Object obj = null; BindingTypeHolder bth = new BindingTypeHolder(); // Length must be greater than 0 if (n.length < 1) throw new InvalidName(); // The identifier must be set if (n.length == 1) { synchronized (impl) { // Resolve first level in this context obj = impl.Resolve(n[0], bth); } if (obj == null) { // Object was not found throw new NotFound(NotFoundReason.missing_node, n); } return obj; } else { // n.length > 1 if ((n[1].id.length() == 0) && (n[1].kind.length() == 0)) { throw new InvalidName(); } NamingContext context = resolveFirstAsContext(impl, n); // Compute restOfName = name[1..length] NameComponent[] tail = new NameComponent[n.length - 1]; System.arraycopy(n, 1, tail, 0, n.length - 1); // Resolve rest of name in context try { // First try to resolve using the local call, this should work // most of the time unless there are federated naming contexts. Servant servant = impl.getNSPOA().reference_to_servant(context); return doResolve(((NamingContextDataStore) servant), tail); } catch (Exception e) { return context.resolve(tail); } } }
/** * 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 */ public static 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 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 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) // "Resistence is futile." [Borg pickup line] throw new 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 staticWrapper.namingCtxBadBindingtype(); } } }