Skip to content

Commit

Permalink
refs #20
Browse files Browse the repository at this point in the history
support multiple scripts engines
  • Loading branch information
rmpestano committed Apr 28, 2016
1 parent bdc0123 commit 2fc0625
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 87 deletions.
6 changes: 6 additions & 0 deletions core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.6</version>
<scope>test</scope>
</dependency>

</dependencies>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import java.io.*;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
Expand All @@ -12,10 +11,9 @@
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;

import com.github.dbunit.rules.api.dataset.*;
import com.github.dbunit.rules.replacer.JSReplacer;
import com.github.dbunit.rules.replacer.ScriptReplacer;
import org.dbunit.DatabaseUnitException;
import org.dbunit.database.AmbiguousTableNameException;
import org.dbunit.database.DatabaseConnection;
Expand Down Expand Up @@ -231,7 +229,7 @@ public void executeStatements(String[] statements) {

private IDataSet performReplacements(IDataSet dataSet) {
IDataSet replace = DateTimeReplacer.replace(dataSet);
replace = JSReplacer.replace(replace);
replace = ScriptReplacer.replace(replace);
return replace;
}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package com.github.dbunit.rules.replacer;

import org.dbunit.dataset.*;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ScriptReplacer {

private static ScriptReplacer instance;

private static Logger log = Logger.getLogger(ScriptReplacer.class.getName());

private Map<String, ScriptEngine> engines;
private ScriptEngineManager manager;

private ScriptReplacer() {
engines = new HashMap<>();
manager = new ScriptEngineManager();
}

public static IDataSet replace(IDataSet dataset) {
if (instance == null) {
instance = new ScriptReplacer();
}
ReplacementDataSet replacementDataSet = new ReplacementDataSet(dataset);
try {
instance.replaceScripts(replacementDataSet);
} catch (DataSetException e) {
log.log(Level.WARNING, "Could not replace dataset: " + dataset, e);
}
return replacementDataSet;
}

private void replaceScripts(ReplacementDataSet dataSet) throws DataSetException {
ITableIterator iterator = dataSet.iterator();
while (iterator.next()) {
ITable table = iterator.getTable();
for (Column column : table.getTableMetaData().getColumns()) {
for (int i = 0; i < table.getRowCount(); i++) {
String value = table.getValue(i, column.getColumnName()).toString();
if (value.contains(":")) {
ScriptEngine engine = getScriptEngine(value);
Object scriptResult = getScriptResult(value, engine);
if (scriptResult != null) {
dataSet.addReplacementObject(value, scriptResult);
} else {
throw new RuntimeException(String.format("Could not perform script replacement for table '%s', column '%s'.", table.getTableMetaData().getTableName(), column.getColumnName()));
}
}
}
}
}
}

private ScriptEngine getScriptEngine(String value) {
String engineName = value.substring(0, value.indexOf(":"));
if (engines.get(engineName) != null) {
return engines.get(engineName);
} else {
ScriptEngine engine = manager.getEngineByName(engineName);
if (engine != null) {
engines.put(engineName, engine);
}
return engine;
}

}

private Object getScriptResult(String script, ScriptEngine engine) {
/* format is 'js:script to execute', ex:
- id: "2"
date: "js:var date=new Date(); date.toString();"
date: "groovy:new Date()"*/
String scriptToExecute = script.substring(script.indexOf(":")+1);
try {
return engine.eval(scriptToExecute);
} catch (Exception e) {
log.log(Level.WARNING, "Could not perform replacement for script: " + script, e);
return null;
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
/**
* Created by pestano on 15/02/16.
*/
public class JavascriptReplacementsIt {
public class ScriptReplacementsIt {

Calendar now;

Expand Down Expand Up @@ -46,5 +46,14 @@ public void shouldReplaceLikesUsingJavaScriptInDataset() {
assertThat(tweet.getLikes()).isEqualTo(50);
}

@Test
@DataSet(value = "datasets/yml/groovy-with-date-replacements.yml",disableConstraints = true, executorId = "scripts-it")
public void shouldReplaceDateUsingGroovyInDataset() {
Tweet tweet = (Tweet) emProvider.em().createQuery("select t from Tweet t where t.id = '1'").getSingleResult();
assertThat(tweet).isNotNull();
assertThat(tweet.getDate().get(Calendar.DAY_OF_MONTH)).isEqualTo(now.get(Calendar.DAY_OF_MONTH));
assertThat(tweet.getDate().get(Calendar.HOUR_OF_DAY)).isEqualTo(now.get(Calendar.HOUR_OF_DAY));
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
tweet:
- id: "1"
content: "dbunit rules!"
date: "groovy:new Date()"
user_id: 1

0 comments on commit 2fc0625

Please sign in to comment.