/** * 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); } } }