mergeview.java

来自「JGRoups源码」· Java 代码 · 共 149 行

JAVA
149
字号
// $Id: MergeView.java,v 1.7 2006/09/09 13:21:55 belaban Exp $package org.jgroups;import java.io.*;import java.util.Iterator;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 {    /** Vector<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() {        StringBuffer sb=new StringBuffer();        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;        View v;        for(Iterator it=subgroups.iterator(); it.hasNext();) {            v=(View)it.next();            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;        View v;        for(Iterator it=subgroups.iterator(); it.hasNext();) {            v=(View)it.next();            retval+=Global.BYTE_SIZE; // boolean for View or MergeView            retval+=v.serializedSize();        }        return retval;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?