コード例 #1
0
  /**
   * 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);
      }
    }
  }