package com.jivesoftware.os.amza.api.partition;
import com.google.common.base.Preconditions;
import com.jivesoftware.os.amza.api.ring.RingMember;
import com.jivesoftware.os.aquarium.LivelyEndState;
import com.jivesoftware.os.aquarium.State;
import com.jivesoftware.os.aquarium.Waterline;
/**
* @author jonathan.colt
*/
public class VersionedAquarium {
private final VersionedPartitionName versionedPartitionName;
private final AquariumTransactor aquariumTransactor;
public VersionedAquarium(VersionedPartitionName versionedPartitionName,
AquariumTransactor aquariumTransactor) {
this.versionedPartitionName = Preconditions.checkNotNull(versionedPartitionName, "VersionedPartitionName cannot be null");
Preconditions.checkArgument(versionedPartitionName.getPartitionName().isSystemPartition() || aquariumTransactor != null,
"Non system partitions require an AquariumTransactor");
this.aquariumTransactor = aquariumTransactor;
}
public VersionedPartitionName getVersionedPartitionName() {
return versionedPartitionName;
}
public LivelyEndState getLivelyEndState() throws Exception {
if (versionedPartitionName.getPartitionName().isSystemPartition()) {
return LivelyEndState.ALWAYS_ONLINE;
}
return aquariumTransactor.getLivelyEndState(versionedPartitionName);
}
public boolean isLivelyEndState(RingMember ringMember) throws Exception {
if (versionedPartitionName.getPartitionName().isSystemPartition()) {
return true;
}
return aquariumTransactor.isLivelyEndState(versionedPartitionName, ringMember);
}
public LivelyEndState awaitOnline(long timeoutMillis) throws Exception {
if (versionedPartitionName.getPartitionName().isSystemPartition()) {
return LivelyEndState.ALWAYS_ONLINE;
}
return aquariumTransactor.awaitOnline(versionedPartitionName, timeoutMillis);
}
public Waterline getLeader() throws Exception {
if (versionedPartitionName.getPartitionName().isSystemPartition()) {
return null;
}
return aquariumTransactor.getLeader(versionedPartitionName);
}
public void wipeTheGlass() throws Exception {
if (versionedPartitionName.getPartitionName().isSystemPartition()) {
return;
}
aquariumTransactor.wipeTheGlass(versionedPartitionName);
}
public boolean suggestState(State state) throws Exception {
if (versionedPartitionName.getPartitionName().isSystemPartition()) {
return false;
}
return aquariumTransactor.suggestState(versionedPartitionName, state);
}
public void tookFully(RingMember fromMember, long leadershipToken) throws Exception {
if (versionedPartitionName.getPartitionName().isSystemPartition()) {
return;
}
aquariumTransactor.tookFully(versionedPartitionName, fromMember, leadershipToken);
}
public boolean isColdstart() throws Exception {
if (versionedPartitionName.getPartitionName().isSystemPartition()) {
return false;
}
return aquariumTransactor.isColdstart(versionedPartitionName);
}
public boolean isMemberInState(RingMember ringMember, State state) throws Exception {
if (versionedPartitionName.getPartitionName().isSystemPartition()) {
return state == State.follower;
}
return aquariumTransactor.isMemberInState(versionedPartitionName, ringMember, state);
}
public void delete() throws Exception {
if (versionedPartitionName.getPartitionName().isSystemPartition()) {
return;
}
aquariumTransactor.delete(versionedPartitionName);
}
@Override
public boolean equals(Object obj) {
throw new UnsupportedOperationException("Stop that");
}
@Override
public int hashCode() {
throw new UnsupportedOperationException("Stop that");
}
@Override
public String toString() {
return "VersionedState{" + "versionedPartitionName=" + versionedPartitionName + '}';
}
}