All Downloads are FREE. Search and download functionalities are using the official Maven repository.

bboss.org.jgroups.MergeView Maven / Gradle / Ivy

The newest version!
// $Id: MergeView.java,v 1.8 2007/03/12 10:51:46 belaban Exp $


package bboss.org.jgroups;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Vector;


/**
 * A view that is sent as a result of a merge.
 * Whenever a group splits into subgroups, e.g., due to a network partition, 
 * and later the subgroups merge back together, a MergeView instead of a View 
 * will be received by the application. The MergeView class is a subclass of 
 * View and contains as additional instance variable: the list of views that 
 * were merged. For example, if the group denoted by view V1:(p,q,r,s,t) 
 * splits into subgroups V2:(p,q,r) and V2:(s,t), the merged view might be 
 * V3:(p,q,r,s,t). In this case the MergeView would contain a list of 2 views: 
 * V2:(p,q,r) and V2:(s,t).
 */
public class MergeView extends View {
    protected Vector subgroups=null; // subgroups that merged into this single view (a list of Views)


    /**
     * Used by externalization
     */
    public MergeView() {
    }


    /**
     * Creates a new view
     *
     * @param vid       The view id of this view (can not be null)
     * @param members   Contains a list of all the members in the view, can be empty but not null.
     * @param subgroups A list of Views representing the former subgroups
     */
    public MergeView(ViewId vid, Vector
members, Vector subgroups) { super(vid, members); this.subgroups=subgroups; } /** * Creates a new view * * @param creator The creator of this view (can not be null) * @param id The lamport timestamp of this view * @param members Contains a list of all the members in the view, can be empty but not null. * @param subgroups A list of Views representing the former subgroups */ public MergeView(Address creator, long id, Vector
members, Vector subgroups) { super(creator, id, members); this.subgroups=subgroups; } public Vector getSubgroups() { return subgroups; } /** * creates a copy of this view * * @return a copy of this view */ public Object clone() { ViewId vid2=vid != null ? (ViewId)vid.clone() : null; Vector
members2=members != null ? (Vector
)members.clone() : null; Vector subgroups2=subgroups != null ? (Vector)subgroups.clone() : null; return new MergeView(vid2, members2, subgroups2); } public String toString() { StringBuilder sb=new StringBuilder(); sb.append("MergeView::").append(super.toString()).append(", subgroups=").append(subgroups); return sb.toString(); } public void writeExternal(ObjectOutput out) throws IOException { super.writeExternal(out); out.writeObject(subgroups); } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { super.readExternal(in); subgroups=(Vector)in.readObject(); } public void writeTo(DataOutputStream out) throws IOException { super.writeTo(out); // write subgroups int len=subgroups != null? subgroups.size() : 0; out.writeShort(len); if(len == 0) return; for(View v: subgroups) { if(v instanceof MergeView) out.writeBoolean(true); else out.writeBoolean(false); v.writeTo(out); } } public void readFrom(DataInputStream in) throws IOException, IllegalAccessException, InstantiationException { super.readFrom(in); short len=in.readShort(); if(len > 0) { View v; subgroups=new Vector(); for(int i=0; i < len; i++) { boolean is_merge_view=in.readBoolean(); v=is_merge_view? new MergeView() : new View(); v.readFrom(in); subgroups.add(v); } } } public int serializedSize() { int retval=super.serializedSize(); retval+=Global.SHORT_SIZE; // for size of subgroups vector if(subgroups == null) return retval; for(View v: subgroups) { retval+=Global.BYTE_SIZE; // boolean for View or MergeView retval+=v.serializedSize(); } return retval; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy