Skip to content

Commit

Permalink
refs #3
Browse files Browse the repository at this point in the history
  • Loading branch information
rmpestano committed Aug 1, 2015
1 parent cc050d2 commit 7d552c9
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 58 deletions.
8 changes: 4 additions & 4 deletions core/src/main/java/com/github/dbunit/rules/DBUnitRule.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public final synchronized static DBUnitRule instance(String executorName, Connec
}

public final synchronized static DBUnitRule instance(ConnectionHolder connectionHolder) {
return instance(DataSetExecutor.DEFAULT_EXECUTOR_NAME,connectionHolder);
return instance(DataSetExecutor.DEFAULT_EXECUTOR_ID,connectionHolder);
}

public final synchronized static DBUnitRule instance(String executorName, ConnectionHolder connectionHolder) {
Expand All @@ -50,15 +50,15 @@ public Statement apply(final Statement statement, final FrameworkMethod framewor
final DataSetModel model = new DataSetModel().from(dataSet);
String datasetExecutorName = model.getExecutorName();
boolean executorNameIsProvided = datasetExecutorName != null && !"".equals(datasetExecutorName.trim());
if(executorNameIsProvided && !executor.getName().equals(datasetExecutorName)){
if(executorNameIsProvided && !executor.getId().equals(datasetExecutorName)){
return new Statement() {
@Override
public void evaluate() throws Throwable {
//intentional
}
};
} else if(executorNameIsProvided){
executor = DataSetExecutor.getExecutorByName(datasetExecutorName);
executor = DataSetExecutor.getExecutorById(datasetExecutorName);
}
executor.execute(model);

Expand All @@ -84,7 +84,7 @@ public void evaluate() throws Throwable {

private void init(String name, ConnectionHolder connectionHolder) {

DataSetExecutor instance = DataSetExecutor.getExecutorByName(name);
DataSetExecutor instance = DataSetExecutor.getExecutorById(name);
if(instance == null){
instance = DataSetExecutor.instance(name,connectionHolder);
DataSetExecutor.getExecutors().put(name,instance);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
*
* Use this option to work with multple database conncetions. Remember that each executor has its own connection.
*/
String executorName() default DataSetExecutor.DEFAULT_EXECUTOR_NAME;
String executorName() default DataSetExecutor.DEFAULT_EXECUTOR_ID;

SeedStrategy strategy() default SeedStrategy.CLEAN_INSERT;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,19 @@
import java.util.concurrent.ConcurrentHashMap;

/**
*
* Created by pestano on 26/07/15.
*/
public class DataSetExecutor {

public static final String DEFAULT_EXECUTOR_NAME = "default";
public static final String DEFAULT_EXECUTOR_ID = "default";

private static Map<String, DataSetExecutor> executors = new ConcurrentHashMap<>();
private static Map<String, DataSetExecutor> executors = new ConcurrentHashMap<>();

private DatabaseConnection databaseConnection;

private ConnectionHolder connectionHolder;

private String name;
private String id;

private static final Logger log = LoggerFactory.getLogger(DataSetExecutor.class);

Expand All @@ -49,43 +48,43 @@ public static DataSetExecutor instance(ConnectionHolder connectionHolder) {
throw new RuntimeException("Invalid connection");
}
//if no executor name is provided use default
return instance(DEFAULT_EXECUTOR_NAME, connectionHolder);
return instance(DEFAULT_EXECUTOR_ID, connectionHolder);
}

public static DataSetExecutor instance(String instanceName, ConnectionHolder connectionHolder) {
public static DataSetExecutor instance(String executorId, ConnectionHolder connectionHolder) {

if (connectionHolder == null) {
throw new RuntimeException("Invalid connection");
}
DataSetExecutor instance = executors.get(instanceName);
DataSetExecutor instance = executors.get(executorId);
if (instance == null) {
instance = new DataSetExecutor(instanceName, connectionHolder);
log.debug("creating executor instance " + instanceName);
executors.put(instanceName, instance);
instance = new DataSetExecutor(executorId, connectionHolder);
log.debug("creating executor instance " + executorId);
executors.put(executorId, instance);
}
return instance;
}

private DataSetExecutor(String executorName, ConnectionHolder connectionHolder) {
private DataSetExecutor(String executorId, ConnectionHolder connectionHolder) {
this.connectionHolder = connectionHolder;
this.name = executorName;
this.id = executorId;
}

public void execute(DataSetModel dataSetModel) {
if (dataSetModel != null && dataSetModel.getName() != null){
if (dataSetModel != null && dataSetModel.getName() != null) {
DatabaseOperation operation = dataSetModel.getSeedStrategy().getOperation();
String dataSetName = dataSetModel.getName();
IDataSet target = null;
try {
initDatabaseConnection();
if(dataSetModel.isDisableConstraints()){
if (dataSetModel.isDisableConstraints()) {
disableConstraints();
}
if(dataSetModel.getExecuteStatementsBefore() != null && dataSetModel.getExecuteStatementsBefore().length > 0){
if (dataSetModel.getExecuteStatementsBefore() != null && dataSetModel.getExecuteStatementsBefore().length > 0) {
executeStatements(dataSetModel.getExecuteStatementsBefore());
}
String extension = dataSetName.substring(dataSetName.lastIndexOf('.')+1).toLowerCase();
switch (extension){
String extension = dataSetName.substring(dataSetName.lastIndexOf('.') + 1).toLowerCase();
switch (extension) {
case "yml": {
target = new YamlDataSet(Thread.currentThread().getContextClassLoader().getResourceAsStream(dataSetName));
break;
Expand All @@ -110,15 +109,15 @@ public void execute(DataSetModel dataSetModel) {
log.error("Unsupported dataset extension" + extension);
}

if(target != null) {
if (target != null) {
target = performSequenceFiltering(dataSetModel, target);

target = performTableOrdering(dataSetModel, target);

target = performReplacements(target);

operation.execute(databaseConnection, target);
} else{
} else {
log.warn("DataSet not created" + dataSetName);
}

Expand All @@ -127,41 +126,41 @@ public void execute(DataSetModel dataSetModel) {
log.error("Could not create dataSet " + dataSetName, e);
}

} else{
} else {
log.error("No dataset name was provided");
}
}

private IDataSet performTableOrdering(DataSetModel dataSet, IDataSet target) throws AmbiguousTableNameException {
if(dataSet.getTableOrdering().length > 0){
if (dataSet.getTableOrdering().length > 0) {
target = new FilteredDataSet(new SequenceTableFilter(dataSet.getTableOrdering()), target);
}
return target;
}

private IDataSet performSequenceFiltering(DataSetModel dataSet, IDataSet target) throws DataSetException, SQLException {
if(dataSet.isUseSequenceFiltering()){
if (dataSet.isUseSequenceFiltering()) {
ITableFilter filteredTable = new DatabaseSequenceFilter(databaseConnection);
target = new FilteredDataSet(filteredTable,target);
target = new FilteredDataSet(filteredTable, target);
}
return target;
}

private void disableConstraints() throws SQLException{
private void disableConstraints() throws SQLException {

String driverName = connectionHolder.getConnection().getMetaData().getDriverName().toLowerCase();
boolean isH2 = driverName.contains("hsql");
if(isH2){
if (isH2) {
connectionHolder.getConnection().createStatement().execute("SET DATABASE REFERENTIAL INTEGRITY FALSE;");
}

boolean isMysql = driverName.contains("mysql");
if(isMysql){
if (isMysql) {
connectionHolder.getConnection().createStatement().execute(" SET FOREIGN_KEY_CHECKS=0;");
}

boolean isPostgres = driverName.contains("postgre");
if(isPostgres){
if (isPostgres) {
connectionHolder.getConnection().createStatement().execute("SET CONSTRAINTS ALL DEFERRED;");
}

Expand Down Expand Up @@ -191,8 +190,6 @@ private IDataSet performReplacements(IDataSet dataSet) {
}




private void initDatabaseConnection() throws DatabaseUnitException {
databaseConnection = new DatabaseConnection(connectionHolder.getConnection());
}
Expand All @@ -202,7 +199,7 @@ public void setConnectionHolder(ConnectionHolder connectionHolder) {
this.connectionHolder = connectionHolder;
}

public Connection getConnection(){
public Connection getConnection() {
return connectionHolder.getConnection();
}

Expand All @@ -213,19 +210,19 @@ public static Map<String, DataSetExecutor> getExecutors() {

@Override
public boolean equals(Object other) {
if(other instanceof DataSetExecutor == false){
if (other instanceof DataSetExecutor == false) {
return false;
}
DataSetExecutor otherExecutor = (DataSetExecutor) other;
if(databaseConnection == null || otherExecutor.databaseConnection == null){
if (databaseConnection == null || otherExecutor.databaseConnection == null) {
return false;
}
try {
if(databaseConnection.getConnection() == null || otherExecutor.databaseConnection.getConnection() == null){
if (databaseConnection.getConnection() == null || otherExecutor.databaseConnection.getConnection() == null) {
return false;
}

if(!databaseConnection.getConnection().getMetaData().getURL().equals(otherExecutor.databaseConnection.getConnection().getMetaData().getURL())){
if (!databaseConnection.getConnection().getMetaData().getURL().equals(otherExecutor.databaseConnection.getConnection().getMetaData().getURL())) {
return false;
}
} catch (Exception e) {
Expand All @@ -235,15 +232,15 @@ public boolean equals(Object other) {
return true;
}

public String getName() {
return name;
public String getId() {
return id;
}

public static DataSetExecutor getExecutorByName(String name) {
DataSetExecutor executor = executors.get(name);
if(executor == null){
LoggerFactory.getLogger(DataSetExecutor.class.getName()).warn("No executor found with name "+name+". Falling back to default executor");
executor = executors.get(DataSetExecutor.DEFAULT_EXECUTOR_NAME);
public static DataSetExecutor getExecutorById(String id) {
DataSetExecutor executor = executors.get(id);
if (executor == null) {
LoggerFactory.getLogger(DataSetExecutor.class.getName()).warn("No executor found with id " + id + ". Falling back to default executor");
executor = executors.get(DataSetExecutor.DEFAULT_EXECUTOR_ID);
}
return executor;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
public class DataSetModel {

private String name;
private String executorName = DataSetExecutor.DEFAULT_EXECUTOR_NAME;
private String executorName = DataSetExecutor.DEFAULT_EXECUTOR_ID;
private SeedStrategy seedStrategy = SeedStrategy.CLEAN_INSERT;
private boolean useSequenceFiltering = true;
private boolean disableConstraints = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public void shouldSeedDataSetDisablingContraints() {
for (DataSetExecutor executor : executors) {
DataSetModel dataSetModel = new DataSetModel("datasets/yml/users.yml").disableConstraints(true);
executor.execute(dataSetModel);
User user = (User) EntityManagerProvider.instance(executor.getName() + "-pu").em().createQuery("select u from User u where u.id = 1").getSingleResult();
User user = (User) EntityManagerProvider.instance(executor.getId() + "-pu").em().createQuery("select u from User u where u.id = 1").getSingleResult();
assertThat(user).isNotNull();
assertThat(user.getId()).isEqualTo(1);
}
Expand All @@ -67,7 +67,7 @@ public void shouldSeedDataSetDisablingContraintsViaStatement() {
for (DataSetExecutor executor : executors) {
DataSetModel dataSetModel = new DataSetModel("datasets/yml/users.yml").executeStatementsAfter(new String[]{"SET DATABASE REFERENTIAL INTEGRITY FALSE;"});
executor.execute(dataSetModel);
User user = (User) EntityManagerProvider.instance(executor.getName() + "-pu").em().createQuery("select u from User u where u.id = 1").getSingleResult();
User user = (User) EntityManagerProvider.instance(executor.getId() + "-pu").em().createQuery("select u from User u where u.id = 1").getSingleResult();
assertThat(user).isNotNull();
assertThat(user.getId()).isEqualTo(1);
}
Expand All @@ -82,7 +82,7 @@ public void shouldNotSeedDataSetWithoutSequenceFilter() {
useSequenceFiltering(false).
executeStatementsAfter(new String[] { "DELETE FROM User" });//needed because other tests creates users and as the dataset is not created in this test the CLEAN is not performed
executor.execute(dataSetModel);
List<User> users = EntityManagerProvider.instance(executor.getName() + "-pu").em().createQuery("select u from User u").getResultList();
List<User> users = EntityManagerProvider.instance(executor.getId() + "-pu").em().createQuery("select u from User u").getResultList();
assertThat(users).isEmpty();
}

Expand All @@ -96,7 +96,7 @@ public void shouldSeedDataSetUsingTableCreationOrder() {
executeStatementsBefore(new String[]{"DELETE FROM FOLLOWER","DELETE FROM TWEET","DELETE FROM USER"}).//needed because other tests created user dataset
useSequenceFiltering(false);
executor.execute(dataSetModel);
List<User> users = EntityManagerProvider.instance(executor.getName() + "-pu").em().createQuery("select u from User u").getResultList();
List<User> users = EntityManagerProvider.instance(executor.getId() + "-pu").em().createQuery("select u from User u").getResultList();
assertThat(users).hasSize(2);
}

Expand All @@ -108,7 +108,7 @@ public void shouldSeedUserDataSet() {
DataSetModel dataSetModel = new DataSetModel("datasets/yml/users.yml").
useSequenceFiltering(true);
executor.execute(dataSetModel);
User user = (User) EntityManagerProvider.instance(executor.getName() + "-pu").em().createQuery("select u from User u where u.id = 1").getSingleResult();
User user = (User) EntityManagerProvider.instance(executor.getId() + "-pu").em().createQuery("select u from User u where u.id = 1").getSingleResult();
assertThat(user).isNotNull();
assertThat(user.getId()).isEqualTo(1);
}
Expand All @@ -120,7 +120,7 @@ public void shouldLoadUserFollowers() {
for (DataSetExecutor executor : executors) {
DataSetModel dataSetModel = new DataSetModel("datasets/yml/users.yml");
executor.execute(dataSetModel);
User user = (User) EntityManagerProvider.instance(executor.getName() + "-pu").em().createQuery("select u from User u left join fetch u.followers where u.id = 1").getSingleResult();
User user = (User) EntityManagerProvider.instance(executor.getId() + "-pu").em().createQuery("select u from User u left join fetch u.followers where u.id = 1").getSingleResult();
assertThat(user).isNotNull();
assertThat(user.getId()).isEqualTo(1);
assertThat(user.getTweets()).hasSize(1);
Expand All @@ -137,7 +137,7 @@ public void shouldLoadUsersFromJsonDataset() {
for (DataSetExecutor executor : executors) {
DataSetModel dataSetModel = new DataSetModel("datasets/json/users.json");
executor.execute(dataSetModel);
User user = (User) EntityManagerProvider.instance(executor.getName() + "-pu").em().createQuery("select u from User u left join fetch u.followers where u.id = 1").getSingleResult();
User user = (User) EntityManagerProvider.instance(executor.getId() + "-pu").em().createQuery("select u from User u left join fetch u.followers where u.id = 1").getSingleResult();
assertThat(user).isNotNull();
assertThat(user.getId()).isEqualTo(1);
assertThat(user.getTweets()).hasSize(1);
Expand All @@ -154,7 +154,7 @@ public void shouldLoadUsersFromXmlDataset() {
for (DataSetExecutor executor : executors) {
DataSetModel dataSetModel = new DataSetModel("datasets/xml/users.xml");
executor.execute(dataSetModel);
User user = (User) EntityManagerProvider.instance(executor.getName() + "-pu").em().createQuery("select u from User u left join fetch u.followers where u.id = 1").getSingleResult();
User user = (User) EntityManagerProvider.instance(executor.getId() + "-pu").em().createQuery("select u from User u left join fetch u.followers where u.id = 1").getSingleResult();
assertThat(user).isNotNull();
assertThat(user.getId()).isEqualTo(1);
assertThat(user.getTweets()).hasSize(1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,35 @@
import javax.persistence.EntityManager;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

/**
* Created by pestano on 28/07/15.
*/
public class JPADataSetExecutor {

private EntityManager entityManager;
private DataSetExecutor executor;
private static JPADataSetExecutor instance;
private static Map<String,JPADataSetExecutor> executors = new HashMap<>();
private ConnectionHolder connection;
private DataSetExecutor executor;


public static JPADataSetExecutor instance(EntityManager entityManager){
return instance(null,entityManager);
}
public static JPADataSetExecutor instance(String executorId,EntityManager entityManager){
if(executorId == null){
executorId = DataSetExecutor.DEFAULT_EXECUTOR_ID;
}
JPADataSetExecutor instance = executors.get(executorId);
if(instance == null){
instance = new JPADataSetExecutor();
}
instance.setEntityManager(entityManager);
if(instance.executor == null){
try {
instance.executor = DataSetExecutor.instance(instance.getConnectionHolder());
instance.executor = DataSetExecutor.instance(executorId,instance.getConnectionHolder());
} catch (SQLException e) {
LoggerFactory.getLogger(JPADataSetExecutor.class).error("Could not create JPA connection", e);
}
Expand Down

0 comments on commit 7d552c9

Please sign in to comment.