package br.com.geraldoferraz.testyourquery.runner;
import java.sql.Connection;
import java.sql.SQLException;
import javax.persistence.EntityManager;
import org.junit.runners.model.FrameworkMethod;
import br.com.geraldoferraz.testyourquery.annotations.MassPreparer;
import br.com.geraldoferraz.testyourquery.config.Configuration;
import br.com.geraldoferraz.testyourquery.config.ConfigurationFactory;
import br.com.geraldoferraz.testyourquery.file.ScriptLoader;
import br.com.geraldoferraz.testyourquery.util.ScriptRunner;
import br.com.geraldoferraz.testyourquery.util.database.ConnectionManager;
import br.com.geraldoferraz.testyourquery.util.reflection.ClassReflector;
public class RunnerSessionPerTest implements Runner {
private ConnectionManager connectionManager;
private ConnectionFactory connectionFactory;
private EntityManagerConnectionInjector injector;
private Configuration configuration;
private ClassReflector clazzReflector;
public RunnerSessionPerTest(ClassReflector clazzReflector, Configuration configuration) throws Exception {
this.clazzReflector = clazzReflector;
this.configuration = configuration;
inistializeConnectionManager();
initializeConnectionFactory();
initializeInjector();
}
private void inistializeConnectionManager() throws Exception {
connectionManager = new ConnectionManager(configuration.getEntityManagerProvider());
}
private void initializeConnectionFactory() {
connectionFactory = new ConnectionFactory() {
public EntityManager getEntityManager() {
return connectionManager.getNewEntityManager();
}
public Connection getConnection() {
return connectionManager.getNewConnection();
}
};
}
private void initializeInjector() throws Exception {
injector = new EntityManagerConnectionInjector(clazzReflector, connectionFactory);
}
public RunnerSessionPerTest(ClassReflector classRelector) throws Exception {
this(classRelector, new ConfigurationFactory().build());
}
public void beforeRunTest(FrameworkMethod method) {
connectionManager.clearData();
MassPreparer massPreparer = method.getAnnotation(MassPreparer.class);
if(massPreparer != null){
Class<? extends ScriptRunner> scriptRunnerClass = massPreparer.value();
if(scriptRunnerClass != null){
try {
ScriptRunner scriptRunner = scriptRunnerClass.newInstance();
scriptRunner.run(connectionFactory.getEntityManager());
} catch (Exception e) {
e.printStackTrace();
}
}
}
try {
runScriptIfAny(configuration);
} catch (Exception e) {
}
}
private void runScriptIfAny(Configuration configuration) throws SQLException, Exception {
if (configuration.getScript() != null && !(configuration.getScript().length() == 0)) {
connectionManager.executeScript(new ScriptLoader(configuration.getScript()).load());
}
}
public void afterRunTest() {
connectionManager.freeMemorySpace();
}
public Object createTestObject() {
try {
Object testObject = clazzReflector.createInstance();
injector.injectOn(testObject);
return testObject;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}