package com.lordofthejars.nosqlunit.neo4j.extension.springtemplate;
import java.io.InputStream;
import java.util.List;
import org.neo4j.graphdb.GraphDatabaseService;
import org.springframework.data.neo4j.config.JtaTransactionManagerFactoryBean;
import org.springframework.data.neo4j.support.Neo4jTemplate;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
import com.lordofthejars.nosqlunit.neo4j.Neo4jConnectionCallback;
import com.lordofthejars.nosqlunit.neo4j.Neo4jInsertionStrategy;
public class SpringTemplateInsertionStrategy implements Neo4jInsertionStrategy {
@Override
public void insert(Neo4jConnectionCallback connection, InputStream dataset) throws Throwable {
Neo4jTemplate neo4jTemplate = neo4jTemplate(connection);
List<Object> readValues = readObjects(dataset);
insertObjectsInTransaction(neo4jTemplate, readValues);
}
private void insertObjectsInTransaction(final Neo4jTemplate neo4jTemplate, final List<Object> readValues) {
TransactionTemplate transactionalTemplate = transactionalTemplate(neo4jTemplate.getGraphDatabaseService());
transactionalTemplate.execute(new TransactionCallback<Void>() {
@Override
public Void doInTransaction(TransactionStatus status) {
for (Object object : readValues) {
neo4jTemplate.save(object);
}
return null;
}
});
}
private List<Object> readObjects(InputStream dataset) {
DataParser dataParser = new DataParser();
List<Object> readValues = dataParser.readValues(dataset);
return readValues;
}
private TransactionTemplate transactionalTemplate(GraphDatabaseService graphDatabaseService) {
try {
JtaTransactionManagerFactoryBean jtaTransactionManagerFactoryBean = new JtaTransactionManagerFactoryBean(graphDatabaseService);
return new TransactionTemplate(jtaTransactionManagerFactoryBean.getObject());
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
private Neo4jTemplate neo4jTemplate(Neo4jConnectionCallback connection) {
GraphDatabaseService graphDatabaseService = connection.graphDatabaseService();
Neo4jTemplate neo4jTemplate = new Neo4jTemplate(graphDatabaseService);
return neo4jTemplate;
}
}