package me.prettyprint.cassandra.service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import me.prettyprint.cassandra.utils.Assert;
import me.prettyprint.hector.api.ddl.ColumnFamilyDefinition;
import me.prettyprint.hector.api.ddl.KeyspaceDefinition;
import org.apache.cassandra.thrift.CfDef;
import org.apache.cassandra.thrift.KsDef;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.commons.lang.math.NumberUtils;
public class ThriftKsDef implements KeyspaceDefinition {
private static final String REPLICATION_FACTOR = "replication_factor";
public static final String DEF_STRATEGY_CLASS = "org.apache.cassandra.locator.SimpleStrategy";
public static final String NETWORK_TOPOLOGY_STRATEGY = "org.apache.cassandra.locator.NetworkTopologyStrategy";
private final String name;
private String strategyClass;
private Map<String, String> strategyOptions = new HashMap<String, String>();
private final List<ColumnFamilyDefinition> cfDefs;
private boolean durableWrites = true;
public ThriftKsDef(KsDef k) {
Assert.notNull(k, "KsDef is null");
name = k.name;
strategyClass = k.strategy_class;
strategyOptions = k.strategy_options != null ? k.strategy_options : new HashMap<String, String>();
durableWrites = k.durable_writes;
setReplicationFactor(NumberUtils.toInt(strategyOptions.get(REPLICATION_FACTOR), 1));
cfDefs = ThriftCfDef.fromThriftList(k.cf_defs);
}
public ThriftKsDef(String keyspaceName, String strategyClass, int replicationFactor,
List<ColumnFamilyDefinition> cfDefs) {
this.name = keyspaceName;
this.strategyClass = strategyClass;
setReplicationFactor(replicationFactor);
this.cfDefs = cfDefs;
}
public ThriftKsDef(String keyspaceName) {
this.name = keyspaceName;
this.cfDefs = new ArrayList<ColumnFamilyDefinition>();
this.strategyClass = DEF_STRATEGY_CLASS;
setReplicationFactor(1);
}
public ThriftKsDef(KeyspaceDefinition keyspaceDefinition) {
name = keyspaceDefinition.getName();
strategyClass = keyspaceDefinition.getStrategyClass();
strategyOptions = keyspaceDefinition.getStrategyOptions();
setReplicationFactor(keyspaceDefinition.getReplicationFactor());
cfDefs = keyspaceDefinition.getCfDefs();
}
public static List<KeyspaceDefinition> fromThriftList(List<KsDef> ks) {
if (ks == null || ks.isEmpty()) {
return Collections.emptyList();
}
List<KeyspaceDefinition> l = new ArrayList<KeyspaceDefinition>(ks.size());
for (KsDef k: ks) {
l.add(new ThriftKsDef(k));
}
return l;
}
public void addCfDef(CfDef cfDef) {
cfDefs.add(new ThriftCfDef(cfDef));
}
public void addColumnFamilyDefinition(ColumnFamilyDefinition columnFamilyDefinition) {
cfDefs.add(new ThriftCfDef(columnFamilyDefinition));
}
@Override
public String getName() {
return name;
}
@Override
public String getStrategyClass() {
return strategyClass;
}
@Override
public Map<String, String> getStrategyOptions() {
return Collections.unmodifiableMap(strategyOptions);
}
@Override
public int getReplicationFactor() {
return NumberUtils.toInt(strategyOptions.get(REPLICATION_FACTOR), 1);
}
@Override
public List<ColumnFamilyDefinition> getCfDefs() {
return Collections.unmodifiableList(cfDefs);
}
public KsDef toThrift() {
KsDef def = new KsDef(name, strategyClass, ThriftCfDef.toThriftList(cfDefs));
def.setStrategy_options(strategyOptions);
def.setDurable_writes(durableWrites );
return def;
}
public void setStrategyClass(String strategyClass) {
this.strategyClass = strategyClass;
}
public void setStrategyOptions(Map<String, String> strategyOptions) {
this.strategyOptions = strategyOptions;
}
public void setReplicationFactor(int replicationFactor) {
if ( !StringUtils.equals(strategyClass, NETWORK_TOPOLOGY_STRATEGY) ) {
strategyOptions.put(REPLICATION_FACTOR,Integer.toString(replicationFactor));
}
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
public boolean isDurableWrites() {
return durableWrites;
}
public void setDurableWrites(boolean durableWrites) {
this.durableWrites = durableWrites;
}
}