Ejemplo n.º 1
0
  /**
   * Returns the fork stack for fork_stack_id (if exitstent), or creates a new fork-stack from
   * protocols and adds it into the hashmap of fork-stack (key is fork_stack_id). Method init() will
   * be called on each protocol, from bottom to top.
   *
   * @param fork_stack_id The key under which the new fork-stack should be added to the fork-stacks
   *     hashmap
   * @param protocols A list of protocols from <em>bottom to top</em> to be inserted. They will be
   *     sandwiched between ForkProtocolStack (top) and ForkProtocol (bottom). The list can be empty
   *     (or null) in which case we won't create any protocols, but still have a separate fork-stack
   *     inserted.
   * @param initialize If false, the ref count 'inits' will not get incremented and init() won't be
   *     called. This is needed when creating a fork stack from an XML config inside of the FORK
   *     protocol. The protocols in the fork stack will only get initialized on the first
   *     ForkChannel creation
   * @return The new {@link ForkProtocolStack}, or the existing stack (if present)
   */
  public synchronized ProtocolStack createForkStack(
      String fork_stack_id, List<Protocol> protocols, boolean initialize) throws Exception {
    Protocol bottom;
    if ((bottom = get(fork_stack_id)) != null) {
      ForkProtocolStack retval = getForkStack(bottom);
      return initialize ? retval.incrInits() : retval;
    }

    List<Protocol> prots = new ArrayList<>();
    prots.add(
        bottom =
            new ForkProtocol(fork_stack_id)
                .setDownProtocol(this)); // add a ForkProtocol as bottom protocol
    if (protocols != null) prots.addAll(protocols);

    ForkProtocolStack fork_stack =
        (ForkProtocolStack)
            new ForkProtocolStack(getUnknownForkHandler(), prots, fork_stack_id)
                .setChannel(this.stack.getChannel());
    fork_stack.init();
    if (initialize) fork_stack.incrInits();
    fork_stacks.put(fork_stack_id, bottom);
    return fork_stack;
  }