package io.teknek.intravert.action.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.cassandra.config.CFMetaData;
import org.apache.cassandra.config.KSMetaData;
import org.apache.cassandra.config.Schema;
import org.apache.cassandra.exceptions.ConfigurationException;
import org.apache.cassandra.service.MigrationManager;
import org.apache.cassandra.thrift.KsDef;
import io.teknek.intravert.action.Action;
import io.teknek.intravert.model.Constants;
import io.teknek.intravert.model.Operation;
import io.teknek.intravert.model.Response;
import io.teknek.intravert.service.ApplicationContext;
import io.teknek.intravert.service.RequestContext;
public class CreateKeyspaceAction implements Action {
@Override
public void doAction(Operation operation, Response response, RequestContext request,
ApplicationContext application) {
String keyspace = (String) operation.getArguments().get("name");
int replication = (Integer) operation.getArguments().get("replication");
boolean ignoreIfNotExists = (Boolean) operation.getArguments().get("ignoreIfNotExists");
if (Schema.instance.getNonSystemTables().contains(keyspace)){
if (ignoreIfNotExists){
Map m = new HashMap();
m.put(Constants.STATUS, Constants.OK);
response.getResults().put(operation.getId(), Arrays.asList(m));
return;
} else {
throw new RuntimeException (keyspace +" already exists");
}
}
createKeyspace(keyspace, replication);
Map m = new HashMap();
m.put(Constants.STATUS, Constants.OK);
response.getResults().put(operation.getId(), Arrays.asList(m));
}
public static void createKeyspace(String name, int replication){
Collection<CFMetaData> cfDefs = new ArrayList<CFMetaData>(0);
KsDef def = new KsDef();
def.setName(name);
def.setStrategy_class("SimpleStrategy");
Map<String, String> strat = new HashMap<String, String>();
strat.put("replication_factor", Integer.toString(replication));
def.setStrategy_options(strat);
KSMetaData ksm = null;
try {
ksm = KSMetaData.fromThrift(def,
cfDefs.toArray(new CFMetaData[cfDefs.size()]));
MigrationManager.announceNewKeyspace(ksm);
} catch (ConfigurationException e) {
throw new RuntimeException(e);
}
}
}