package org.robotninjas.barge.state; import com.google.common.util.concurrent.ListenableFuture; import org.robotninjas.barge.RaftException; import org.robotninjas.barge.api.AppendEntries; import org.robotninjas.barge.api.AppendEntriesResponse; import org.robotninjas.barge.api.RequestVote; import org.robotninjas.barge.api.RequestVoteResponse; import javax.annotation.Nonnull; /** * Main interface to a Raft protocol instance. */ public interface Raft { public static enum StateType { START, FOLLOWER, CANDIDATE, LEADER, STOPPED } void addRaftProtocolListener(RaftProtocolListener protocolListener); ListenableFuture<StateType> init(); @Nonnull RequestVoteResponse requestVote(@Nonnull RequestVote request); @Nonnull AppendEntriesResponse appendEntries(@Nonnull AppendEntries request); @Nonnull ListenableFuture<Object> commitOperation(@Nonnull byte[] op) throws RaftException; void addTransitionListener(@Nonnull StateTransitionListener transitionListener); @Nonnull StateType type(); void stop(); }