/** Copyright (c) 2007-2013 Alysson Bessani, Eduardo Alchieri, Paulo Sousa, and the authors indicated in the @author tags Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package bftsmart.statemanagement; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import bftsmart.communication.SystemMessage; import bftsmart.reconfiguration.views.View; import bftsmart.tom.util.TOMUtil; /** * This class represents a message used in the state transfer protocol * * @author Joao Sousa */ public abstract class SMMessage extends SystemMessage { private ApplicationState state; // State log private View view; private int cid; // Consensus ID up to which the sender needs to be updated private int type; // Message type private int regency; // Current regency private int leader; // Current leader public final boolean TRIGGER_SM_LOCALLY; // indicates that the replica should // initiate the SM protocol locally /** * Constructs a SMMessage * @param sender Process Id of the sender * @param cid Consensus ID up to which the sender needs to be updated * @param type Message type * @param replica Replica that should send the state * @param state State log */ protected SMMessage(int sender, int cid, int type, ApplicationState state, View view, int regency, int leader) { super(sender); this.state = state; this.view = view; this.cid = cid; this.type = type; this.sender = sender; this.regency = regency; this.leader = leader; if (type == TOMUtil.TRIGGER_SM_LOCALLY && sender == -1) this.TRIGGER_SM_LOCALLY = true; else this.TRIGGER_SM_LOCALLY = false; } protected SMMessage() { this.TRIGGER_SM_LOCALLY = false; } /** * Retrieves the state log * @return The state Log */ public ApplicationState getState() { return state; } /** * Retrieves the state log * @return The state Log */ public View getView() { return view; } /** * Retrieves the type of the message * @return The type of the message */ public int getType() { return type; } /** * Retrieves the consensus ID up to which the sender needs to be updated * @return The consensus ID up to which the sender needs to be updated */ public int getCID() { return cid; } /** * Retrieves the regency that the replica had when sending the state * @return The regency that the replica had when sending the state */ public int getRegency() { return regency; } /** * Retrieves the leader that the replica had when sending the state * @return The leader that the replica had when sending the state */ public int getLeader() { return leader; } @Override public void writeExternal(ObjectOutput out) throws IOException{ super.writeExternal(out); out.writeInt(sender); out.writeInt(cid); out.writeInt(type); out.writeInt(regency); out.writeInt(leader); out.writeObject(state); out.writeObject(view); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException{ super.readExternal(in); sender = in.readInt(); cid = in.readInt(); type = in.readInt(); regency = in.readInt(); leader = in.readInt(); state = (ApplicationState) in.readObject(); view = (View) in.readObject(); } }