package com.voxeo.moho.reg.impl.cassandra;
import java.io.IOException;
import java.nio.ByteBuffer;
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 me.prettyprint.cassandra.connection.HConnectionManager;
import me.prettyprint.cassandra.service.CassandraHostConfigurator;
import me.prettyprint.cassandra.testutils.EmbeddedServerHelper;
import org.apache.cassandra.config.CFMetaData;
import org.apache.cassandra.config.ColumnDefinition;
import org.apache.cassandra.config.ConfigurationException;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.config.KSMetaData;
import org.apache.cassandra.db.ColumnFamilyType;
import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.db.marshal.BytesType;
import org.apache.cassandra.db.marshal.CompositeType;
import org.apache.cassandra.db.marshal.IntegerType;
import org.apache.cassandra.db.marshal.LongType;
import org.apache.cassandra.db.marshal.TimeUUIDType;
import org.apache.cassandra.db.marshal.UTF8Type;
import org.apache.cassandra.locator.AbstractReplicationStrategy;
import org.apache.cassandra.locator.SimpleStrategy;
import org.apache.cassandra.thrift.IndexType;
import org.apache.thrift.transport.TTransportException;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Charsets;
/**
* Base class for test cases that need access to EmbeddedServerHelper
*
* @author Nate McCall (nate@vervewireless.com)
*
*/
public abstract class BaseEmbededServerSetupTest {
private static Logger log = LoggerFactory.getLogger(BaseEmbededServerSetupTest.class);
private static EmbeddedServerHelper embedded;
protected HConnectionManager connectionManager;
protected CassandraHostConfigurator cassandraHostConfigurator;
protected String clusterName = "TestCluster";
/**
* Set embedded cassandra up and spawn it in a new thread.
*
* @throws TTransportException
* @throws IOException
* @throws InterruptedException
*/
@BeforeClass
public static void setup() throws Exception {
log.info("in setup of BaseEmbedded.Test");
embedded = new EmbeddedServerHelper();
loadSchema();
embedded.setup();
}
protected static void loadSchema() {
try {
for (KSMetaData ksm : getSchemaDefinition()) {
for (CFMetaData cfm : ksm.cfMetaData().values())
CFMetaData.map(cfm);
DatabaseDescriptor.setTableDefinition(ksm, DatabaseDescriptor
.getDefsVersion());
}
} catch (ConfigurationException e) {
throw new RuntimeException(e);
}
}
protected static Collection<KSMetaData> getSchemaDefinition() {
List<KSMetaData> schema = new ArrayList<KSMetaData>();
// A whole bucket of shorthand
String ks1 = "Registrar";
Class<? extends AbstractReplicationStrategy> simple = SimpleStrategy.class;
Map<String, String> opts = new HashMap<String, String>();
opts.put("replication_factor", Integer.toString(1));
ColumnFamilyType st = ColumnFamilyType.Standard;
ColumnFamilyType su = ColumnFamilyType.Super;
AbstractType bytes = BytesType.instance;
List<AbstractType> subComparators = new ArrayList<AbstractType>();
subComparators.add(BytesType.instance);
subComparators.add(TimeUUIDType.instance);
subComparators.add(IntegerType.instance);
// Keyspace 1
schema.add(new KSMetaData(
ks1,
simple,
opts,
// Column Families
standardCFMD(ks1, "Bindings")));
return schema;
}
protected static CFMetaData compositeCFMD(String ksName, String cfName, AbstractType... types) {
try {
return new CFMetaData(ksName, cfName, ColumnFamilyType.Standard, CompositeType.getInstance(Arrays.asList(types)), null);
} catch (ConfigurationException e) {
}
return null;
}
protected static CFMetaData standardCFMD(String ksName, String cfName) {
return new CFMetaData(ksName, cfName, ColumnFamilyType.Standard,
BytesType.instance, null).keyCacheSize(0);
}
protected static CFMetaData superCFMD(String ksName, String cfName,
AbstractType subcc) {
return new CFMetaData(ksName, cfName, ColumnFamilyType.Super,
BytesType.instance, subcc).keyCacheSize(0);
}
protected static CFMetaData indexCFMD(String ksName, String cfName, final Boolean withIdxType)
{
return standardCFMD(ksName, cfName)
.columnMetadata(new HashMap<ByteBuffer, ColumnDefinition>()
{{
ByteBuffer cName = ByteBuffer.wrap("birthyear".getBytes(Charsets.UTF_8));
IndexType keys = withIdxType ? IndexType.KEYS : null;
put(cName, new ColumnDefinition(cName, LongType.instance, keys, null));
}});
}
protected static CFMetaData jdbcCFMD(String ksName, String cfName,
AbstractType comp) {
return new CFMetaData(ksName, cfName, ColumnFamilyType.Standard, comp, null)
.defaultValidator(comp);
}
protected static CFMetaData cqlTestCf(String ksName, String cfName,
AbstractType comp) {
return new CFMetaData(ksName, cfName, ColumnFamilyType.Standard, comp, null)
.keyValidator(UTF8Type.instance).columnMetadata(new HashMap<ByteBuffer, ColumnDefinition>()
{{
ByteBuffer cName = ByteBuffer.wrap("birthyear".getBytes(Charsets.UTF_8));
put(cName, new ColumnDefinition(cName, LongType.instance, null, null));
}});
}
@AfterClass
public static void teardown() throws Exception {
embedded.teardown();
embedded = null;
}
protected void setupClient() {
cassandraHostConfigurator = new CassandraHostConfigurator("127.0.0.1:9170");
connectionManager = new HConnectionManager(clusterName,cassandraHostConfigurator);
}
}