TSK-967: Refactor new module taskana-data

This commit is contained in:
Benjamin Eckstein 2019-12-05 17:05:55 +01:00 committed by Mustapha Zorgati
parent 5acfbc9c5b
commit ab5d16d624
7 changed files with 157 additions and 88 deletions

View File

@ -14,22 +14,20 @@
</parent>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${version.mybatis}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${version.slf4j}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${version.log4j}</version>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>${version.slf4j}</version>
<scope>test</scope>
</dependency>
<dependency>

View File

@ -6,6 +6,7 @@ import java.io.PrintWriter;
import java.io.StringReader;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@ -27,68 +28,96 @@ import org.slf4j.LoggerFactory;
public class SampleDataGenerator {
private static final Logger LOGGER = LoggerFactory.getLogger(SampleDataGenerator.class);
private static final String SQL = "/sql";
private static final String TEST_DATA = "/sample-data";
private static final String CLEAR = SQL + TEST_DATA + "/clear-db.sql";
private static final String CLEAR_HISTORY_EVENTS = SQL + TEST_DATA + "/clear-history-events.sql";
private static final String TASK = SQL + TEST_DATA + "/task.sql";
private static final String WORKBASKET = SQL + TEST_DATA + "/workbasket.sql";
private static final String DISTRIBUTION_TARGETS = SQL + TEST_DATA + "/distribution-targets.sql";
private static final String WORKBASKET_ACCESS_LIST = SQL + TEST_DATA + "/workbasket-access-list.sql";
private static final String CLASSIFICATION = SQL + TEST_DATA + "/classification.sql";
private static final String OBJECT_REFERENCE = SQL + TEST_DATA + "/object-reference.sql";
private static final String ATTACHMENT = SQL + TEST_DATA + "/attachment.sql";
private static final String HISTORY_EVENT = SQL + TEST_DATA + "/history-event.sql";
private static final String CHECK_HISTORY_EVENT_EXIST = SQL + TEST_DATA + "/check-history-event-exist.sql";
private static final String RELATIVE_DATE_REGEX = "RELATIVE_DATE\\((-?\\d+)\\)";
private static final Pattern RELATIVE_DATE_PATTERN = Pattern.compile(RELATIVE_DATE_REGEX);
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
private static final String SQL_SAMPLE_DATA = "/sql/sample-data";
private DataSource dataSource;
private ScriptRunner runner;
private static final String CLEAR = SQL_SAMPLE_DATA + "/clear-db.sql";
private static final String CLEAR_HISTORY_EVENTS = SQL_SAMPLE_DATA + "/clear-history-events.sql";
private static final String TASK = SQL_SAMPLE_DATA + "/task.sql";
private static final String WORKBASKET = SQL_SAMPLE_DATA + "/workbasket.sql";
private static final String DISTRIBUTION_TARGETS = SQL_SAMPLE_DATA + "/distribution-targets.sql";
private static final String WORKBASKET_ACCESS_LIST = SQL_SAMPLE_DATA + "/workbasket-access-list.sql";
private static final String CLASSIFICATION = SQL_SAMPLE_DATA + "/classification.sql";
private static final String OBJECT_REFERENCE = SQL_SAMPLE_DATA + "/object-reference.sql";
private static final String ATTACHMENT = SQL_SAMPLE_DATA + "/attachment.sql";
private static final String HISTORY_EVENT = SQL_SAMPLE_DATA + "/history-event.sql";
private static final String CHECK_HISTORY_EVENT_EXIST = SQL_SAMPLE_DATA + "/check-history-event-exist.sql";
public SampleDataGenerator(DataSource dataSource) throws SQLException {
if (LOGGER.isTraceEnabled()) {
LOGGER.trace(dataSource.getConnection().getMetaData().toString());
}
this.dataSource = dataSource;
static final String RELATIVE_DATE_REGEX = "RELATIVE_DATE\\((-?\\d+)\\)";
static final Pattern RELATIVE_DATE_PATTERN = Pattern.compile(RELATIVE_DATE_REGEX);
static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
runner = new ScriptRunner(dataSource.getConnection());
private final DataSource dataSource;
private final LocalDateTime now;
public SampleDataGenerator(DataSource dataSource) {
this(dataSource, LocalDateTime.now());
}
public void generateSampleData(String schemaName) {
StringWriter outWriter = new StringWriter();
PrintWriter logWriter = new PrintWriter(outWriter);
public SampleDataGenerator(DataSource dataSource, LocalDateTime now) {
this.dataSource = dataSource;
this.now = now;
}
StringWriter errorWriter = new StringWriter();
PrintWriter errorLogWriter = new PrintWriter(errorWriter);
try {
runner.runScript(
selectSchemaScript(dataSource.getConnection().getMetaData().getDatabaseProductName(), schemaName));
runner.setStopOnError(false);
runner.runScript(getScriptBufferedStream(CLEAR));
} catch (Exception e) {
LOGGER.error("caught Exception {}", e);
public void generateSampleData(String schemaName) throws SQLException {
try (Connection connection = dataSource.getConnection()) {
if (LOGGER.isTraceEnabled()) {
LOGGER.trace(connection.getMetaData().toString());
}
StringWriter outWriter = new StringWriter();
StringWriter errorWriter = new StringWriter();
ScriptRunner runner = getScriptRunner(schemaName, connection, outWriter, errorWriter);
Stream<String> scriptsList = getDefaultScripts();
try {
runner.runScript(getScriptBufferedStream(CHECK_HISTORY_EVENT_EXIST));
runner.runScript(getScriptBufferedStream(CLEAR_HISTORY_EVENTS));
scriptsList = Stream.concat(scriptsList, Stream.of(HISTORY_EVENT));
} catch (Exception e) {
LOGGER.error("The HISTORY_EVENTS table is not created");
}
executeScripts(runner, scriptsList);
runner.closeConnection();
if (LOGGER.isTraceEnabled()) {
LOGGER.trace(outWriter.toString());
String trimmedErrorString = errorWriter.toString().trim();
if (!trimmedErrorString.isEmpty()) {
LOGGER.error(trimmedErrorString);
}
}
}
}
runner.setStopOnError(true);
runner.setLogWriter(logWriter);
runner.setErrorLogWriter(errorLogWriter);
LocalDateTime now = LocalDateTime.now();
getScriptList()
private void executeScripts(ScriptRunner runner, Stream<String> scriptsList) {
scriptsList
.map(s -> SampleDataGenerator.parseAndReplace(now, s))
.map(StringReader::new)
.map(BufferedReader::new)
.forEachOrdered(runner::runScript);
}
runner.closeConnection();
private ScriptRunner getScriptRunner(String schemaName, Connection connection, StringWriter outWriter,
StringWriter errorWriter) throws SQLException {
LOGGER.trace(outWriter.toString());
if (!errorWriter.toString().trim().isEmpty()) {
LOGGER.error(errorWriter.toString());
}
PrintWriter logWriter = new PrintWriter(outWriter);
PrintWriter errorLogWriter = new PrintWriter(errorWriter);
ScriptRunner runner = new ScriptRunner(connection);
String databaseProductName = connection.getMetaData().getDatabaseProductName();
runner.runScript(selectSchemaScript(databaseProductName, schemaName));
runner.setStopOnError(false);
runner.runScript(getScriptBufferedStream(CLEAR));
runner.setStopOnError(true);
runner.setLogWriter(logWriter);
runner.setErrorLogWriter(errorLogWriter);
return runner;
}
/**
@ -105,12 +134,13 @@ public class SampleDataGenerator {
* sql statement which may contain the above declared custom function.
* @return sql statement with the given function resolved, if the 'sql' parameter contained any.
*/
private static String replaceRelativeTimeFunction(LocalDateTime now, String sql) {
static String replaceRelativeTimeFunction(LocalDateTime now, String sql) {
Matcher m = RELATIVE_DATE_PATTERN.matcher(sql);
StringBuffer sb = new StringBuffer(sql.length());
while (m.find()) {
m.appendReplacement(sb,
"'" + now.plusDays(Long.parseLong(m.group(1))).format(DATE_TIME_FORMATTER) + "'");
long days = Long.parseLong(m.group(1));
String daysAsStringDate = "'" + now.plusDays(days).format(DATE_TIME_FORMATTER) + "'";
m.appendReplacement(sb, daysAsStringDate);
}
m.appendTail(sb);
return sb.toString();
@ -122,23 +152,6 @@ public class SampleDataGenerator {
: "SET SCHEMA " + schemaName + ";");
}
/**
* Create a array with the necessary script.
* @return a array with the corresponding scripts files
*/
private Stream<String> getScriptList() {
Stream<String> scriptsList = getDefaultScripts();
try {
runner.runScript(getScriptBufferedStream(CHECK_HISTORY_EVENT_EXIST));
runner.runScript(getScriptBufferedStream(CLEAR_HISTORY_EVENTS));
return Stream.concat(scriptsList, Stream.of(HISTORY_EVENT));
} catch (Exception e) {
LOGGER.error("The HISTORY_EVENTS table is not created");
}
return scriptsList;
}
private static String parseAndReplace(LocalDateTime now, String script) {
return replaceRelativeTimeFunction(now,
getScriptBufferedStream(script).lines().collect(Collectors.joining(System.lineSeparator())));

View File

@ -1,5 +1,11 @@
package pro.taskana.sampledata;
import static org.hamcrest.MatcherAssert.assertThat;
import java.time.LocalDateTime;
import java.util.regex.Matcher;
import org.hamcrest.CoreMatchers;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@ -25,4 +31,54 @@ class SampleDataGeneratorTest {
.forEach(Assertions::assertNotNull);
}
@Test
void replaceRelativeTimeFunctionSameDate() {
LocalDateTime now = LocalDateTime.now();
String dateFormatted = now.format(SampleDataGenerator.DATE_TIME_FORMATTER);
String sqlStringReplaced = SampleDataGenerator.replaceRelativeTimeFunction(now,
"... RELATIVE_DATE(0) ...");
assertThat(sqlStringReplaced, CoreMatchers.containsString(dateFormatted));
}
@Test
void testDateRegex() {
Assertions.assertTrue(SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("RELATIVE_DATE(123)").matches());
Assertions.assertTrue(SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("... RELATIVE_DATE(5) ...").find());
Assertions.assertTrue(SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("... RELATIVE_DATE(0) ...").find());
Assertions.assertTrue(SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("... RELATIVE_DATE(-123) ...").find());
Assertions.assertFalse(SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("... RELATIVE_DATE() ...").find());
Assertions.assertFalse(
SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("... RELATIVE_DATE(ABCDE) ...").find());
Assertions.assertFalse(SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("... RELATIVE_NO(5) ...").find());
Assertions.assertFalse(SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("...").find());
}
@Test
void testDateRegexExtractGroup() {
Matcher matcher = SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("RELATIVE_DATE(123)");
Assertions.assertTrue(matcher.find());
Assertions.assertEquals("123", matcher.group(1));
}
@Test
void replaceRelativeTimeFunctionPosDate() {
LocalDateTime now = LocalDateTime.now();
String dateFormatted = now.plusDays(5).format(SampleDataGenerator.DATE_TIME_FORMATTER);
String sqlStringReplaced = SampleDataGenerator.replaceRelativeTimeFunction(now,
"... RELATIVE_DATE(5) ...");
assertThat(sqlStringReplaced, CoreMatchers.containsString(dateFormatted));
}
@Test
void replaceRelativeTimeFunctionNegDate() {
LocalDateTime now = LocalDateTime.now();
String dateFormatted = now.plusDays(-10).format(SampleDataGenerator.DATE_TIME_FORMATTER);
String sqlStringReplaced = SampleDataGenerator.replaceRelativeTimeFunction(now,
"... RELATIVE_DATE(-10) ...");
assertThat(sqlStringReplaced, CoreMatchers.containsString(dateFormatted));
}
}

View File

@ -57,13 +57,13 @@ public class ExampleRestApplication {
@Bean
@DependsOn("getTaskanaEngine") // generate sample data after schema was inserted
public SampleDataGenerator generateSampleData(DataSource dataSource) throws SQLException {
public SampleDataGenerator generateSampleData(DataSource dataSource) {
sampleDataGenerator = new SampleDataGenerator(dataSource);
return sampleDataGenerator;
}
@PostConstruct
private void init() {
private void init() throws SQLException {
if (!ldapClient.useLdap()) {
AccessIdController.setLdapCache(ldapCacheTest);
}

View File

@ -57,13 +57,13 @@ public class ExampleRestApplication {
@Bean
@DependsOn("getTaskanaEngine") // generate sample data after schema was inserted
public SampleDataGenerator generateSampleData(DataSource dataSource) throws SQLException {
public SampleDataGenerator generateSampleData(DataSource dataSource) {
sampleDataGenerator = new SampleDataGenerator(dataSource);
return sampleDataGenerator;
}
@PostConstruct
private void init() {
private void init() throws SQLException {
if (!ldapClient.useLdap()) {
AccessIdController.setLdapCache(ldapCacheTest);
}

View File

@ -1,5 +1,14 @@
package pro.taskana;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.Properties;
import javax.annotation.PostConstruct;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -16,6 +25,7 @@ import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.PlatformTransactionManager;
import pro.taskana.jobs.TransactionalJobsConfiguration;
import pro.taskana.ldap.LdapCacheTestImpl;
import pro.taskana.ldap.LdapClient;
@ -25,14 +35,6 @@ import pro.taskana.rest.RestConfiguration;
import pro.taskana.rest.WebMvcConfig;
import pro.taskana.sampledata.SampleDataGenerator;
import javax.annotation.PostConstruct;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.Properties;
/**
* Example Application showing the implementation of taskana-rest-spring for jboss application server.
*/
@ -96,13 +98,13 @@ public class TaskanaWildFlyApplication extends SpringBootServletInitializer {
@Bean
@DependsOn("getTaskanaEngine") // generate sample data after schema was inserted
public SampleDataGenerator generateSampleData(DataSource dataSource) throws SQLException {
public SampleDataGenerator generateSampleData(DataSource dataSource) {
sampleDataGenerator = new SampleDataGenerator(dataSource);
return sampleDataGenerator;
}
@PostConstruct
private void init() {
private void init() throws SQLException {
if (!ldapClient.useLdap()) {
AccessIdController.setLdapCache(ldapCacheTest);
}

View File

@ -63,13 +63,13 @@ public class ExampleDocumentationApp {
@Bean
@DependsOn("getTaskanaEngine") // generate sample data after schema was inserted
public SampleDataGenerator generateSampleData(DataSource dataSource) throws SQLException {
public SampleDataGenerator generateSampleData(DataSource dataSource) {
sampleDataGenerator = new SampleDataGenerator(dataSource);
return sampleDataGenerator;
}
@PostConstruct
private void init() {
private void init() throws SQLException {
AccessIdController.setLdapCache(new LdapCacheTestImpl());
sampleDataGenerator.generateSampleData(schemaName);
}