package lsr.paxos.recovery; import java.io.IOException; import java.util.ArrayList; import java.util.List; import lsr.paxos.core.Paxos; /** * Represents the algorithm responsible for recovering the paxos from crash. */ public abstract class RecoveryAlgorithm { private List<RecoveryListener> listeners = new ArrayList<RecoveryListener>(); /** * Adds a new listener called after recovery is finished. * * @param listener - the listener to add */ public void addRecoveryListener(RecoveryListener listener) { listeners.add(listener); } /** * Removes a previously registered listener. This listener will not be * notified about finished recovery. * * @param listener - the listener to unregister */ public void removeRecoveryListener(RecoveryListener listener) { listeners.remove(listener); } /** * Notifies all registered recovery listeners that the recovery has been * finished. */ protected void fireRecoveryFinished() { for (RecoveryListener listener : listeners) { listener.recoveryFinished(); } } /** * Returns recovered paxos protocol. This method can be called before the * recovery is finished. * * @return recovered paxos */ public abstract Paxos getPaxos(); /** * Starts the recovery algorithm. * * @throws IOException if some I/O error occurs */ public abstract void start() throws IOException; }