import com.hazelcast.cluster.ClusterState;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.map.IMap;

public class ClusterPassiveState {

    public static void main(String[] args) {
        HazelcastInstance instance1 = Hazelcast.newHazelcastInstance();
        HazelcastInstance instance2 = Hazelcast.newHazelcastInstance();

        System.out.println("Instance-1 Cluster State: " + instance1.getCluster().getClusterState());
        System.out.println("Instance-2 Cluster State: " + instance2.getCluster().getClusterState());

        IMap<Object, Object> map = instance2.getMap("test-map");
        // initialize partition assignments before taking cluster to the PASSIVE state
        map.size();

        instance2.getCluster().changeClusterState(ClusterState.PASSIVE);
        System.out.println("Instance-1 Cluster State: " + instance1.getCluster().getClusterState());
        System.out.println("Instance-2 Cluster State: " + instance2.getCluster().getClusterState());

        // shutdown 1st instance and start it back
        // it should re-join to the 2nd node
        instance1.shutdown();
        instance1 = Hazelcast.newHazelcastInstance();

        System.out.println("Instance-1 Members: " + instance1.getCluster().getMembers());
        System.out.println("Instance-2 Members: " + instance2.getCluster().getMembers());
        System.out.println("Instance-1 Cluster State: " + instance1.getCluster().getClusterState());
        System.out.println("Instance-2 Cluster State: " + instance2.getCluster().getClusterState());

        // readonly operations are allowed
        System.out.println("map.get() = " + map.get("key"));
        System.out.println("map.containsKey() = " + map.containsKey("key"));

        // non-readonly operations are NOT allowed
        try {
            map.put("key", "value");
        } catch (IllegalStateException e) {
            System.err.println("Cannot put! Cluster is in PASSIVE state! -> " + e);
        }

        Hazelcast.shutdownAll();
    }
}
