package systems.composable.dropwizard.cassandra.loadbalancing; import com.datastax.driver.core.policies.DCAwareRoundRobinPolicy; import com.datastax.driver.core.policies.LoadBalancingPolicy; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeName; /** * A factory for configuring and building {@link com.datastax.driver.core.policies.DCAwareRoundRobinPolicy} instances. * <p/> * <b>Configuration Parameters:</b> * <table> * <tr> * <td>Name</td> * <td>Default</td> * <td>Description</td> * </tr> * <tr> * <td>localDC</td> * <td>No default.</td> * <td>The name of the local datacenter (as known by Cassandra).</td> * </tr> * <tr> * <td>usedHostsPerRemoteDC</td> * <td>No default. May only be specified when localDC is specified.</td> * <td>The number of host per remote datacenter that policies created by the returned factory should consider.</td> * </tr> * <tr> * <td>allowRemoteDCsForLocalConsistencyLevel</td> * <td>No default. May only be specified when localDC and usedHostsPerRemoteDC are specified.</td> * <td>Whether or not the policy may return remote host when building query plan for query having consitency LOCAL_ONE and LOCAL_QUORUM.</td> * </tr> * </table> */ @JsonTypeName("dcAwareRoundRobin") public class DCAwareRoundRobinPolicyFactory implements LoadBalancingPolicyFactory { private String localDC; private Integer usedHostsPerRemoteDC; private Boolean allowRemoteDCsForLocalConsistencyLevel; @JsonProperty public String getLocalDC() { return localDC; } @JsonProperty public void setLocalDC(String localDC) { this.localDC = localDC; } @JsonProperty public Integer getUsedHostsPerRemoteDC() { return usedHostsPerRemoteDC; } @JsonProperty public void setUsedHostsPerRemoteDC(Integer usedHostsPerRemoteDC) { this.usedHostsPerRemoteDC = usedHostsPerRemoteDC; } @JsonProperty public Boolean getAllowRemoteDCsForLocalConsistencyLevel() { return allowRemoteDCsForLocalConsistencyLevel; } @JsonProperty public void setAllowRemoteDCsForLocalConsistencyLevel(Boolean allowRemoteDCsForLocalConsistencyLevel) { this.allowRemoteDCsForLocalConsistencyLevel = allowRemoteDCsForLocalConsistencyLevel; } @Override public LoadBalancingPolicy build() { DCAwareRoundRobinPolicy.Builder builder = DCAwareRoundRobinPolicy.builder(); if (allowRemoteDCsForLocalConsistencyLevel == Boolean.TRUE) { builder.allowRemoteDCsForLocalConsistencyLevel(); } if (localDC != null) { builder.withLocalDc(localDC); } if (usedHostsPerRemoteDC != null) { builder.withUsedHostsPerRemoteDc(usedHostsPerRemoteDC); } return builder.build(); } }