package org.handwerkszeug.riak.model; import static org.handwerkszeug.riak.util.Validation.notNull; import java.util.HashMap; import java.util.Map; import org.handwerkszeug.riak.nls.Messages; import org.handwerkszeug.riak.util.Validation; /** * @author taichi * @see <a * href="https://github.com/basho/riak-erlang-client/blob/master/include/riakc_pb.hrl">riakc_pb.hrl</a> * @see <a * href="https://github.com/basho/riak_kv/blob/master/src/riak_kv_wm_raw.erl">riak_kv_wm_raw.erl</a> */ public class Quorum { static final int Q_One = Integer.MAX_VALUE - 1; static final int Q_Quorum = Integer.MAX_VALUE - 2; static final int Q_All = Integer.MAX_VALUE - 3; static final int Q_Default = Integer.MAX_VALUE - 4; /** * all nodes must respond */ public static final Quorum One = new Quorum(Q_One, "one"); /** * (n_val/2) + 1 nodes must respond. */ public static final Quorum Quorum = new Quorum(Q_Quorum, "quorum"); /** * equivalent to 1 */ public static final Quorum All = new Quorum(Q_All, "all"); public static final Quorum Default = new Quorum(Q_Default, "default"); static final Map<String, Quorum> named = new HashMap<String, Quorum>(4); static { named.put(One.getString(), One); named.put(Quorum.getString(), Quorum); named.put(All.getString(), All); named.put(Default.getString(), Default); } final int quorum; final String string; Quorum(int quorum, String name) { this.quorum = quorum; this.string = name; } public int getInteger() { return this.quorum; } public String getString() { return this.string; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + quorum; result = prime * result + string.hashCode(); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; return equals((Quorum) obj); } public boolean equals(Quorum other) { return this.quorum == other.quorum && this.string.equals(other.string); } @Override public String toString() { return getString(); } public static Quorum of(int quorum) { switch (quorum) { case Q_One: return One; case Q_Quorum: return Quorum; case Q_All: return All; case Q_Default: return Default; default: break; } if (0 < quorum) { return new Quorum(quorum, String.valueOf(quorum)); } throw new IllegalArgumentException(String.format( Messages.IllegalQuorum, quorum)); } public static Quorum of(String quorum) { notNull(quorum, "quorum"); Quorum result = named.get(quorum); if (result == null && Validation.isPositiveNumber(quorum)) { return of(Integer.parseInt(quorum)); } return result; } public static boolean isNamed(Quorum quorum) { return quorum != null && named.containsKey(quorum.getString()); } }