package org.openlca.core;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.openlca.core.database.BaseDao;
import org.openlca.core.database.IDatabase;
import org.openlca.core.database.NativeSql;
import org.openlca.core.database.derby.DerbyDatabase;
import org.openlca.core.math.IMatrixSolver;
import org.openlca.core.math.JavaSolver;
import org.openlca.core.model.CategorizedEntity;
public class Tests {
private static final boolean USE_FILE_BASED_DB = false;
private static IDatabase db;
public static IMatrixSolver getDefaultSolver() {
return new JavaSolver();
}
public static void emptyCache() {
if (db != null) {
db.getEntityFactory().getCache().evictAll();
}
}
public static IDatabase getDb() {
if (db == null) {
if (USE_FILE_BASED_DB)
db = initFileBasedDb();
else
db = DerbyDatabase.createInMemory();
}
return db;
}
private static IDatabase initFileBasedDb() {
String tmpDirPath = System.getProperty("java.io.tmpdir");
String dbName = "olca_test_db_1.4";
File tmpDir = new File(tmpDirPath);
File folder = new File(tmpDir, dbName);
return new DerbyDatabase(folder);
}
public static <T extends CategorizedEntity> T insert(T e) {
if (e == null)
return null;
return dao(e).insert(e);
}
public static <T extends CategorizedEntity> T update(T e) {
if (e == null)
return null;
return dao(e).update(e);
}
public static <T extends CategorizedEntity> void delete(T e) {
if (e == null)
return;
dao(e).delete(e);
}
@SuppressWarnings("unchecked")
public static <T> BaseDao<T> dao(T entity) {
return (BaseDao<T>) new BaseDao<>(entity.getClass(), getDb());
}
public static void clearDb() {
try {
IDatabase db = getDb();
List<String> tables = new ArrayList<>();
// type = T means user table
String sql = "SELECT TABLENAME FROM SYS.SYSTABLES WHERE TABLETYPE = 'T'";
NativeSql.on(db).query(sql, r -> {
tables.add(r.getString(1));
return true;
});
for (String table : tables) {
if (table.equalsIgnoreCase("SEQUENCE"))
continue;
if (table.equalsIgnoreCase("OPENLCA_VERSION"))
continue;
NativeSql.on(db).runUpdate("DELETE FROM " + table);
}
NativeSql.on(db).runUpdate("UPDATE SEQUENCE SET SEQ_COUNT = 0");
db.getEntityFactory().getCache().evictAll();
} catch (Exception e) {
throw new RuntimeException("failed to clear database", e);
}
}
}