Ejemplo n.º 1
0
  /**
   * Merges the view states contained in the given list into a single view. <br>
   * The view is the concatenation of the different views, according to the order provided by the
   * list itself. The version is the smallest all the versions.
   *
   * @param l A list conatining the view states to merge
   * @return the merged view state.
   * @throws AppiaGroupException See {@linkplain ViewState#ViewState(String, Group, ViewID,
   *     ViewID[], Endpt[], InetWithPort[])}
   * @throws NullPointerException See {@linkplain ViewState#ViewState(String, Group, ViewID,
   *     ViewID[], Endpt[], InetWithPort[])}
   */
  public static ViewState merge(List l) throws NullPointerException, AppiaGroupException {
    ListIterator iter = l.listIterator(l.size());
    int viewsize = 0;
    int prevsize = 0;
    while (iter.hasPrevious()) {
      ViewState aux = (ViewState) iter.previous();
      viewsize += aux.view.length;
      prevsize += aux.previous.length;
    }

    String v = null;
    Group g = null;
    ViewID vid = null;
    ViewID[] prevs = new ViewID[prevsize];
    Endpt[] endpts = new Endpt[viewsize];
    InetSocketAddress[] addrs = new InetSocketAddress[viewsize];
    int iprevs = 0, iendpts = 0, iaddrs = 0;

    while (iter.hasNext()) {
      ViewState aux = (ViewState) iter.next();
      if ((v == null) || (aux.version.compareTo(v) < 0)) v = aux.version;
      if (g == null) g = aux.group;
      if (vid == null) vid = aux.id;
      else if (aux.id.ltime > vid.ltime) vid.ltime = aux.id.ltime;
      System.arraycopy(aux.previous, 0, prevs, iprevs, aux.previous.length);
      iprevs += aux.previous.length;
      System.arraycopy(aux.view, 0, endpts, iendpts, aux.view.length);
      iendpts += aux.view.length;
      System.arraycopy(aux.addresses, 0, addrs, iaddrs, aux.addresses.length);
      iaddrs += aux.addresses.length;
    }

    return new ViewState(v, g, vid, prevs, endpts, addrs);
  }
Ejemplo n.º 2
0
  /**
   * Merges the given ViewState to the current ViewState.
   *
   * @param vs the ViewState to merge with the current one
   */
  public void merge(ViewState vs) {
    int size = view.length + vs.view.length;

    Endpt[] new_view = new Endpt[size];
    InetSocketAddress[] new_addrs = new InetSocketAddress[size];

    System.arraycopy(view, 0, new_view, 0, view.length);
    System.arraycopy(addresses, 0, new_addrs, 0, addresses.length);

    System.arraycopy(vs.view, 0, new_view, view.length, vs.view.length);
    System.arraycopy(vs.addresses, 0, new_addrs, addresses.length, vs.addresses.length);

    ViewID[] new_previous = new ViewID[previous.length + vs.previous.length];
    System.arraycopy(previous, 0, new_previous, 0, previous.length);
    System.arraycopy(vs.previous, 0, new_previous, previous.length, vs.previous.length);

    view = new_view;
    addresses = new_addrs;
    previous = new_previous;
    id.ltime = Math.max(id.ltime, vs.id.ltime);
  }