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