package refit.replica.order;

import refit.config.REFITConfig;
import refit.replica.REFITReplicaGroups;


public abstract class REFITOrderProtocol {

	protected static final boolean[] NO_REPLICA = new boolean[REFITConfig.TOTAL_NR_OF_REPLICAS];
	protected static final boolean[] ALL_REPLICAS = REFITReplicaGroups.getAllReplicas();


	// ####################
	// # ABSTRACT METHODS #
	// ####################

	public abstract REFITOrderProtocolInstance createInstance(REFITOrderStageSlot slot);

	public abstract REFITOrderProtocolTransitionInstance createTransitionInstance(REFITOrderStageSlot slot);

	// ###################
	// # DEFAULT METHODS #
	// ###################

	public boolean[] getActiveOrderRecipients(int groupID) {
		// currently active order replicas
		return REFITOrderGroups.getGroupByID(groupID);
	}

	public boolean[] getAllOrderRecipients(int groupID) {
		// full set of order replicas
		return REFITOrderGroups.getGroupByID(groupID);
	}

	public boolean[] getUpdateRecipients() {
		return NO_REPLICA;
	}

	public boolean[] getCheckpointRecipients() {
		return ALL_REPLICAS;
	}

	public boolean useLightweightCheckpoints() {
		return false;
	}


	// ##################
	// # HELPER METHODS #
	// ##################

	public boolean hasCheckpointRecipients() {
		boolean[] recipients = getCheckpointRecipients();
		for (boolean recipient : recipients) {
			if (recipient) return true;
		}
		return false;
	}

	public boolean hasUpdateRecipients() {
		boolean[] recipients = getUpdateRecipients();
		for (boolean recipient : recipients) {
			if (recipient) return true;
		}
		return false;
	}

}