package org.hivedb.util.database.test;
import org.hivedb.Hive;
import org.hivedb.configuration.EntityHiveConfig;
import org.hivedb.hibernate.BaseDataAccessObjectFactory;
import org.hivedb.hibernate.ConfigurationReader;
import org.hivedb.hibernate.DataAccessObject;
import org.hivedb.meta.Node;
import org.hivedb.meta.PartitionDimension;
import org.hivedb.meta.Resource;
import org.hivedb.meta.SecondaryIndex;
import org.hivedb.meta.persistence.CachingDataSourceProvider;
import org.hivedb.util.HiveDestructor;
import org.hivedb.util.YamlHiveCreator;
import org.hivedb.util.database.HiveDbDialect;
import org.junit.After;
import org.junit.Before;
import javax.sql.DataSource;
import java.io.Serializable;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class HiveTest {
protected EntityHiveConfig config;
protected Hive hive;
protected ConfigurationReader configurationReader;
protected HiveDbDialect dialect;
protected String getHiveConfigurationFile() {
return getClass().isAnnotationPresent(Config.class) ?
String.format("src/test/resources/%s.cfg.yml", getClass().getAnnotation(Config.class).value()) :
String.format("src/test/resources/hive_%s.cfg.yml", getClass().getSimpleName());
}
protected void setup() {
// override if needed;
}
protected void teardown() {
// override if needed;
}
protected HiveDbDialect getDialect() {
// override if needed
return HiveDbDialect.H2;
}
@Before
public void beforeMethod() throws Exception {
dialect = getDialect();
hive = new YamlHiveCreator(dialect).load(getHiveConfigurationFile());
configurationReader = new ConfigurationReader(getMappedClasses());
configurationReader.install(hive);
config = getEntityHiveConfig();
setup();
}
@After
public void afterMethod() {
teardown();
new HiveDestructor().destroy(hive);
}
@SuppressWarnings("unchecked")
public DataAccessObject<? extends Object, ? extends Serializable> getDao(Class clazz) {
return new BaseDataAccessObjectFactory<Object, Serializable>(
getEntityHiveConfig(),
getMappedClasses(),
clazz,
getHive()).create();
}
public Hive getHive() {
return hive;
}
public EntityHiveConfig getEntityHiveConfig() {
return configurationReader.getHiveConfiguration();
}
@SuppressWarnings("unchecked")
protected Collection<Class<?>> getMappedClasses() {
return Arrays.asList(
getPartitionDimensionClass(),
WeatherReport.class,
WeatherEvent.class);
}
protected Class<?> getPartitionDimensionClass() {
return Continent.class;
}
protected String getHiveDatabaseName() {
//return "hive";
return H2TestCase.TEST_DB;
}
protected String getConnectString(String name) {
return String.format("jdbc:h2:mem:%s;LOCK_MODE=3", name);
}
protected DataSource getDataSource(String uri) {
return CachingDataSourceProvider.getInstance().getDataSource(uri);
}
protected Collection<String> getDatabaseNames() {
Collection<String> names = new ArrayList<String>();
names.add(hive.getPartitionDimension().getName());
for (Node node : hive.getNodes()) {
names.add(node.getName());
}
return names;
}
protected PartitionDimension createEmptyPartitionDimension() {
return new PartitionDimension(Hive.NEW_OBJECT_ID, getHive().getPartitionDimension().getName(), Types.INTEGER,
getConnectString(getHiveDatabaseName()), new ArrayList<Resource>());
}
protected Resource createResource() {
final Resource resource = new Resource("FOO", Types.INTEGER, false);
resource.setPartitionDimension(createEmptyPartitionDimension());
return resource;
}
protected SecondaryIndex createSecondaryIndex() {
SecondaryIndex index = new SecondaryIndex("FOO", java.sql.Types.VARCHAR);
index.setResource(createResource());
return index;
}
protected SecondaryIndex createSecondaryIndex(int id) {
SecondaryIndex index = new SecondaryIndex(id, "FOO", java.sql.Types.VARCHAR);
index.setResource(createResource());
return index;
}
protected Node createNode(String name) {
return new Node(0, name, name, "", HiveDbDialect.H2);
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Config {
String value();
}
}