예제 #1
0
  /**
   * Resolves to penultimate context named by 'name'. Returns true if penultimate context has been
   * reached (i.e. name only has one atomic component left). Returns false otherwise, and sets
   * Continuation to parts of name not yet resolved.
   */
  protected boolean resolve_to_penultimate_context(Name name, Continuation cont)
      throws NamingException {
    String target = name.toString();

    if (debug > 0) System.out.println("RESOLVE TO PENULTIMATE" + target);

    StringHeadTail ht = c_parseComponent(target, cont);
    String tail = ht.getTail();
    String head = ht.getHead();
    if (head == null) {
      // something is wrong; no name at all
      InvalidNameException e = new InvalidNameException();
      throw cont.fillInException(e);
    }

    if (!isEmpty(tail)) {
      // more components; hence not at penultimate context yet
      try {
        Object headCtx = a_lookup(head, cont);
        if (headCtx != null) cont.setContinue(headCtx, head, this, tail);
        else if (cont.isContinue()) cont.appendRemainingComponent(tail);
      } catch (NamingException e) {
        e.appendRemainingComponent(tail);
        throw e;
      }
    } else {
      // already at penultimate context
      cont.setSuccess(); // clear
      return true;
    }
    return false;
  }
예제 #2
0
  /**
   * Resolve to context named by 'name'. Returns true if at named context (i.e. 'name' is empty
   * name). Returns false otherwise, and sets Continuation on parts of 'name' not yet resolved.
   */
  protected boolean resolve_to_context(Name name, Continuation cont) throws NamingException {
    String target = name.toString();

    StringHeadTail ht = c_parseComponent(target, cont);
    String tail = ht.getTail();
    String head = ht.getHead();

    if (debug > 0)
      System.out.println("RESOLVE TO CONTEXT(" + target + ") = {" + head + ", " + tail + "}");

    if (head == null) {
      // something is wrong; no name at all
      InvalidNameException e = new InvalidNameException();
      throw cont.fillInException(e);
    }
    if (!isEmpty(head)) {
      // if there is head is a non-empty name
      // this means more resolution to be done
      try {
        Object headCtx = a_lookup(head, cont);
        //              System.out.println("answer " + headCtx);
        if (headCtx != null) cont.setContinue(headCtx, head, this, (tail == null ? "" : tail));
        else if (cont.isContinue()) cont.appendRemainingComponent(tail);
      } catch (NamingException e) {
        e.appendRemainingComponent(tail);
        throw e;
      }
    } else {
      cont.setSuccess(); // clear
      return true;
    }
    return false;
  }
예제 #3
0
  /**
   * Resolves the nns for 'name' when the named context is acting as an intermediate context.
   *
   * <p>For a system that supports junctions, this would be equilvalent to a_lookup(name, cont);
   * because for junctions, an intermediate slash simply signifies a syntactic separator.
   *
   * <p>For a system that supports implicit nns, this would be equivalent to a_lookup_nns(name,
   * cont); because for implicit nns, a slash always signifies the implicit nns, regardless of
   * whether it is intermediate or trailing.
   *
   * <p>By default this method supports junctions, and also allows for an implicit nns to be
   * dynamically determined through the use of the "nns" reference (see a_processJunction_nns()).
   * Contexts that implement implicit nns directly should provide an appropriate override.
   */
  protected Object a_resolveIntermediate_nns(String name, Continuation cont)
      throws NamingException {
    try {
      final Object obj = a_lookup(name, cont);

      // Do not append "" to Continuation 'cont' even if set
      // because the intention is to ignore the nns

      //
      if (obj != null && getClass().isInstance(obj)) {
        // If "obj" is in the same type as this object, it must
        // not be a junction. Continue the lookup with "/".

        cont.setContinueNNS(obj, name, this);
        return null;

      } else if (obj != null && !(obj instanceof Context)) {
        // obj is not even a context, so try to find its nns
        // dynamically by constructing a Reference containing obj.
        RefAddr addr =
            new RefAddr("nns") {
              public Object getContent() {
                return obj;
              }

              private static final long serialVersionUID = -3399518522645918499L;
            };
        Reference ref = new Reference("java.lang.Object", addr);

        // Resolved name has trailing slash to indicate nns
        CompositeName resName = new CompositeName();
        resName.add(name);
        resName.add(""); // add trailing slash

        // Set continuation leave it to
        // PartialCompositeContext.getPCContext() to throw CPE.
        // Do not use setContinueNNS() because we've already
        // consumed "/" (i.e., moved it to resName).

        cont.setContinue(ref, resName, this);
        return null;

      } else {
        return obj;
      }

    } catch (NamingException e) {
      e.appendRemainingComponent(""); // add nns back
      throw e;
    }
  }
예제 #4
0
 /**
  * This function is used when implementing a naming system that supports junctions. For example,
  * when the a_bind_nns(name, newobj) method is invoked, that means the caller is attempting to
  * bind the object 'newobj' to the nns of 'name'. For context that supports junctions, 'name'
  * names a junction and is pointing to the root of another naming system, which in turn might have
  * an nns. This means that a_bind_nns() should first resolve 'name' and attempt to continue the
  * operation in the context named by 'name'. (i.e. bind to the nns of the context named by
  * 'name'). If name is already empty, then throw NameNotFoundException because this context by
  * default does not have any nns.
  */
 protected void a_processJunction_nns(String name, Continuation cont) throws NamingException {
   if (name.equals("")) {
     NameNotFoundException e = new NameNotFoundException();
     cont.setErrorNNS(this, name);
     throw cont.fillInException(e);
   }
   try {
     // lookup name to continue operation in nns
     Object target = a_lookup(name, cont);
     if (cont.isContinue()) cont.appendRemainingComponent(""); // add nns back
     else {
       cont.setContinueNNS(target, name, this);
     }
   } catch (NamingException e) {
     e.appendRemainingComponent(""); // add nns back
     throw e;
   }
 }
예제 #5
0
  /**
   * This function is similar to resolve_to_penultimate_context() except it should only be called by
   * the nns() functions. This function fixes any exception or continuations so that it will have
   * the proper nns name.
   */
  protected boolean resolve_to_penultimate_context_nns(Name name, Continuation cont)
      throws NamingException {
    try {
      if (debug > 0) System.out.println("RESOLVE TO PENULTIMATE NNS" + name.toString());
      boolean answer = resolve_to_penultimate_context(name, cont);

      // resolve_to_penultimate_context() only calls a_lookup().
      // Any continuation it sets is lacking the nns, so
      // we need to add it back
      if (cont.isContinue()) cont.appendRemainingComponent("");

      return answer;
    } catch (NamingException e) {
      // resolve_to_penultimate_context() only calls a_lookup().
      // Any exceptions it throws is lacking the nns, so
      // we need to add it back.
      e.appendRemainingComponent("");
      throw e;
    }
  }