/** * 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); }
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { // public String version; int len = in.readInt(); byte[] bytes = new byte[len]; in.read(bytes); version = new String(bytes); // public Group group; group = new Group(); group.readExternal(in); // public ViewID id; id = new ViewID(); id.readExternal(in); // public ViewID[] previous; len = in.readInt(); previous = new ViewID[len]; for (int i = 0; i < len; i++) { previous[i] = new ViewID(); previous[i].readExternal(in); } // public Endpt[] view; len = in.readInt(); view = new Endpt[len]; for (int i = 0; i < len; i++) view[i].readExternal(in); // public InetWithPort[] addresses; len = in.readInt(); int addrLen = 0; addresses = new InetSocketAddress[len]; for (int i = 0; i < len; i++) { addrLen = in.readInt(); bytes = new byte[addrLen]; in.read(bytes); addresses[i] = new InetSocketAddress(InetAddress.getByAddress(bytes), in.readInt()); } }
/** * Removes the indicated members from the current ViewState. <br> * The members whose index is at true in the remove array, are removed from the ViewState. * * @param remove the members to remove */ public void remove(boolean[] remove) { if (remove.length != view.length) throw new IllegalArgumentException("different sizes"); int i, j, size; size = 0; for (i = 0; i < remove.length; i++) { if (!remove[i]) size++; } Endpt[] new_view = new Endpt[size]; InetSocketAddress[] new_addrs = new InetSocketAddress[size]; j = 0; for (i = 0; i < remove.length; i++) { if (!remove[i]) { new_view[j] = view[i]; new_addrs[j] = addresses[i]; j++; } } view = new_view; addresses = new_addrs; if (new_view.length > 0) id.coord = new_view[0]; }
public static void push(ViewState vs, Message message) { ArrayOptimized.pushArrayInetWithPort(vs.addresses, message); ArrayOptimized.pushArrayEndpt(vs.view, message); ArrayOptimized.pushArrayViewID(vs.previous, message); ViewID.push(vs.id, message); Group.push(vs.group, message); message.pushString(vs.version); }
/** * Creates the next ViewState. <br> * The new ViewState mantains the same {@link org.continuent.appia.protocols.group.ViewState#view * view} and {@link org.continuent.appia.protocols.group.ViewState#addresses addresses}. <br> * The ViewID is generated using the <i>ViewID.next(...)</i> method. * * @param coord the Endpoint id of the coordinator of the new ViewState * @return the next ViewState */ public ViewState next(Endpt coord) throws NullPointerException, AppiaGroupException { if (coord == null) throw new NullPointerException("coord"); ViewID new_id = id.next(coord); ViewID[] new_previous = {id}; return new ViewState(version, group, new_id, new_previous, view, addresses); }
public static ViewState pop(Message message) { try { return new ViewState( message.popString(), Group.pop(message), ViewID.pop(message), ArrayOptimized.popArrayViewID(message), ArrayOptimized.popArrayEndpt(message), ArrayOptimized.popArrayInetWithPort(message)); } catch (AppiaGroupException ex) { throw new MessageException("Error poping view state.", ex); } }
/** * Creates a {@link java.lang.String String} representation of the <i>view</i>. * * @return the {@link java.lang.String String} representation */ public String toString() { String s = ""; int i; s = "\nversion: " + version + "\ngroup: " + group.toString() + "\nid: " + id.toString(); s = s + "\nprevious: ["; for (i = 0; i < previous.length; i++) s = s + previous[i].toString() + ","; s = s + "]\nview: ["; for (i = 0; i < view.length; i++) s = s + view[i].toString() + ","; s = s + "]\naddresses: ["; for (i = 0; i < addresses.length; i++) s = s + addresses[i].toString() + ","; s = s + "]\n"; return s; }
public static ViewState peek(Message message) { try { ViewState vs = new ViewState( message.popString(), Group.pop(message), ViewID.pop(message), ArrayOptimized.popArrayViewID(message), ArrayOptimized.popArrayEndpt(message), ArrayOptimized.popArrayInetWithPort(message)); ViewState.push(vs, message); return vs; } catch (AppiaGroupException ex) { throw new MessageException("Error peeking view state from message.", ex); } }
/** * 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); }
public void writeExternal(ObjectOutput out) throws IOException { // public String version; byte[] bytes = version.getBytes(); out.writeInt(bytes.length); out.write(bytes); // public Group group; group.writeExternal(out); // public ViewID id; id.writeExternal(out); // public ViewID[] previous; out.writeInt(previous.length); for (int i = 0; i < previous.length; i++) previous[i].writeExternal(out); // public Endpt[] view; out.writeInt(view.length); for (int i = 0; i < view.length; i++) view[i].writeExternal(out); // public InetWithPort[] addresses; out.writeInt(addresses.length); for (int i = 0; i < addresses.length; i++) { bytes = addresses[i].getAddress().getAddress(); out.writeInt(bytes.length); out.write(bytes); out.writeInt(addresses[i].getPort()); } }