From f99760d156cbcf5baa7f4b927c96d5e389f8532d Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Tue, 7 May 2019 10:06:40 +0100 Subject: [PATCH 1/3] Don't load resource file, instead use a stream for the bytes Add extra debug info if needed --- config/pom.xml | 2 +- .../com/quorum/tessera/config/ServerConfig.java | 2 -- .../tessera/data/migration/CmdLineExecutor.java | 1 - .../tessera/data/migration/H2DataExporter.java | 15 +++++++-------- .../com/quorum/tessera/data/migration/Main.java | 11 ++++++++++- .../data/migration/SqliteDataExporter.java | 16 ++++++---------- .../quorum/tessera/data/migration/MainTest.java | 6 ++++++ pom.xml | 1 - 8 files changed, 30 insertions(+), 24 deletions(-) diff --git a/config/pom.xml b/config/pom.xml index 5efcc6f098..80776b2612 100644 --- a/config/pom.xml +++ b/config/pom.xml @@ -68,7 +68,7 @@ org.apache.commons commons-lang3 - + diff --git a/config/src/main/java/com/quorum/tessera/config/ServerConfig.java b/config/src/main/java/com/quorum/tessera/config/ServerConfig.java index 687ed78a4d..2030f6eac7 100644 --- a/config/src/main/java/com/quorum/tessera/config/ServerConfig.java +++ b/config/src/main/java/com/quorum/tessera/config/ServerConfig.java @@ -159,6 +159,4 @@ public void setCrossDomainConfig(CrossDomainConfig crossDomainConfig) { this.crossDomainConfig = crossDomainConfig; } - - } diff --git a/data-migration/src/main/java/com/quorum/tessera/data/migration/CmdLineExecutor.java b/data-migration/src/main/java/com/quorum/tessera/data/migration/CmdLineExecutor.java index 837f25c978..9f3d8d5739 100644 --- a/data-migration/src/main/java/com/quorum/tessera/data/migration/CmdLineExecutor.java +++ b/data-migration/src/main/java/com/quorum/tessera/data/migration/CmdLineExecutor.java @@ -99,7 +99,6 @@ private Options createOptions() { .required() .build()); - options.addOption( Option.builder() .longOpt("exporttype") diff --git a/data-migration/src/main/java/com/quorum/tessera/data/migration/H2DataExporter.java b/data-migration/src/main/java/com/quorum/tessera/data/migration/H2DataExporter.java index de2409e0e9..5a4eb2f394 100644 --- a/data-migration/src/main/java/com/quorum/tessera/data/migration/H2DataExporter.java +++ b/data-migration/src/main/java/com/quorum/tessera/data/migration/H2DataExporter.java @@ -1,16 +1,15 @@ package com.quorum.tessera.data.migration; -import com.quorum.tessera.io.IOCallback; -import com.quorum.tessera.io.UriCallback; +import org.apache.commons.io.IOUtils; import java.io.IOException; -import java.net.URL; -import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.sql.SQLException; +import java.util.Arrays; import java.util.List; +import static java.nio.charset.StandardCharsets.UTF_8; + public class H2DataExporter implements DataExporter { private static final String INSERT_ROW = "INSERT INTO ENCRYPTED_TRANSACTION (HASH, ENCODED_PAYLOAD) VALUES (?, ?)"; @@ -25,9 +24,9 @@ public void export(final StoreLoader loader, final String connectionString = "jdbc:h2:" + output.toString(); - final URL sqlFile = getClass().getResource(CREATE_TABLE_RESOURCE); - final Path uri = UriCallback.execute(() -> Paths.get(sqlFile.toURI())); - final List createTableStatements = IOCallback.execute(() -> Files.readAllLines(uri)); + final byte[] data = IOUtils.resourceToByteArray(CREATE_TABLE_RESOURCE); + final String dataAsString = new String(data, UTF_8); + final List createTableStatements = Arrays.asList(dataAsString.split("\n")); final JdbcDataExporter jdbcDataExporter = new JdbcDataExporter(connectionString, INSERT_ROW, createTableStatements); diff --git a/data-migration/src/main/java/com/quorum/tessera/data/migration/Main.java b/data-migration/src/main/java/com/quorum/tessera/data/migration/Main.java index d3c57798ad..a0f592df77 100644 --- a/data-migration/src/main/java/com/quorum/tessera/data/migration/Main.java +++ b/data-migration/src/main/java/com/quorum/tessera/data/migration/Main.java @@ -1,5 +1,7 @@ package com.quorum.tessera.data.migration; +import java.util.Arrays; + public class Main { private Main() { @@ -12,7 +14,14 @@ public static void main(final String... args) { final int result = new CmdLineExecutor().execute(args); System.exit(result); } catch (final Exception ex) { - System.err.println(ex.getMessage()); + System.err.println("An error has occurred: " + ex.getMessage()); + + if (Arrays.asList(args).contains("debug")) { + System.err.println(); + System.err.println("Exception message: " + ex.getMessage()); + System.err.println("Exception class: " + ex.getClass()); + } + System.exit(1); } diff --git a/data-migration/src/main/java/com/quorum/tessera/data/migration/SqliteDataExporter.java b/data-migration/src/main/java/com/quorum/tessera/data/migration/SqliteDataExporter.java index b26229096d..74fc5023d4 100644 --- a/data-migration/src/main/java/com/quorum/tessera/data/migration/SqliteDataExporter.java +++ b/data-migration/src/main/java/com/quorum/tessera/data/migration/SqliteDataExporter.java @@ -1,17 +1,13 @@ package com.quorum.tessera.data.migration; -import com.quorum.tessera.io.IOCallback; -import com.quorum.tessera.io.UriCallback; import org.apache.commons.io.IOUtils; import java.io.IOException; import java.io.InputStream; -import java.net.URI; -import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.sql.*; -import java.util.List; + +import static java.nio.charset.StandardCharsets.UTF_8; public class SqliteDataExporter implements DataExporter { @@ -25,14 +21,14 @@ public void export(final StoreLoader loader, final String connectionString = "jdbc:sqlite:" + output.toString(); - final URI sqlFile = UriCallback.execute(() -> getClass().getResource("/ddls/sqlite-ddl.sql").toURI()); - - final List createTables = IOCallback.execute(() -> Files.readAllLines(Paths.get(sqlFile))); + final byte[] sqlData = IOUtils.resourceToByteArray("/ddls/sqlite-ddl.sql"); + final String dataAsString = new String(sqlData, UTF_8); + final String[] createTableStatements = dataAsString.split("\n"); try (Connection conn = DriverManager.getConnection(connectionString, username, password)) { try (Statement stmt = conn.createStatement()) { - for (final String createTable : createTables) { + for (final String createTable : createTableStatements) { stmt.executeUpdate(createTable); } } diff --git a/data-migration/src/test/java/com/quorum/tessera/data/migration/MainTest.java b/data-migration/src/test/java/com/quorum/tessera/data/migration/MainTest.java index e3970e523f..5c7bb607cb 100644 --- a/data-migration/src/test/java/com/quorum/tessera/data/migration/MainTest.java +++ b/data-migration/src/test/java/com/quorum/tessera/data/migration/MainTest.java @@ -21,4 +21,10 @@ public void doStuffAndBreak() { Main.main(); } + @Test + public void outputDebugInformationWithNullCause() { + expectedSystemExit.expectSystemExitWithStatus(1); + Main.main("debug"); + } + } diff --git a/pom.xml b/pom.xml index a0b843f3c0..30d4be2ad1 100644 --- a/pom.xml +++ b/pom.xml @@ -979,7 +979,6 @@ runtime - org.slf4j slf4j-api From 9346898a6f6ad7966412587b3cbe1db10dc7cd7a Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Tue, 7 May 2019 17:20:22 +0100 Subject: [PATCH 2/3] Don't rely on library to read the DDL --- .../tessera/data/migration/H2DataExporter.java | 17 +++++++++-------- .../data/migration/SqliteDataExporter.java | 15 ++++++++++++--- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/data-migration/src/main/java/com/quorum/tessera/data/migration/H2DataExporter.java b/data-migration/src/main/java/com/quorum/tessera/data/migration/H2DataExporter.java index 5a4eb2f394..43a26ea92f 100644 --- a/data-migration/src/main/java/com/quorum/tessera/data/migration/H2DataExporter.java +++ b/data-migration/src/main/java/com/quorum/tessera/data/migration/H2DataExporter.java @@ -1,14 +1,13 @@ package com.quorum.tessera.data.migration; -import org.apache.commons.io.IOUtils; - +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; import java.nio.file.Path; import java.sql.SQLException; -import java.util.Arrays; import java.util.List; - -import static java.nio.charset.StandardCharsets.UTF_8; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class H2DataExporter implements DataExporter { @@ -24,9 +23,11 @@ public void export(final StoreLoader loader, final String connectionString = "jdbc:h2:" + output.toString(); - final byte[] data = IOUtils.resourceToByteArray(CREATE_TABLE_RESOURCE); - final String dataAsString = new String(data, UTF_8); - final List createTableStatements = Arrays.asList(dataAsString.split("\n")); + final List createTableStatements = Stream.of(getClass().getResourceAsStream(CREATE_TABLE_RESOURCE)) + .map(InputStreamReader::new) + .map(BufferedReader::new) + .flatMap(BufferedReader::lines) + .collect(Collectors.toList()); final JdbcDataExporter jdbcDataExporter = new JdbcDataExporter(connectionString, INSERT_ROW, createTableStatements); diff --git a/data-migration/src/main/java/com/quorum/tessera/data/migration/SqliteDataExporter.java b/data-migration/src/main/java/com/quorum/tessera/data/migration/SqliteDataExporter.java index 74fc5023d4..aea2fe50a2 100644 --- a/data-migration/src/main/java/com/quorum/tessera/data/migration/SqliteDataExporter.java +++ b/data-migration/src/main/java/com/quorum/tessera/data/migration/SqliteDataExporter.java @@ -2,10 +2,15 @@ import org.apache.commons.io.IOUtils; +import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.nio.file.Path; import java.sql.*; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static java.nio.charset.StandardCharsets.UTF_8; @@ -13,6 +18,8 @@ public class SqliteDataExporter implements DataExporter { private static final String INSERT_ROW = "INSERT INTO ENCRYPTED_TRANSACTION (HASH, ENCODED_PAYLOAD) VALUES (?, ?)"; + private static final String CREATE_TABLE_RESOURCE = "/ddls/sqlite-ddl.sql"; + @Override public void export(final StoreLoader loader, final Path output, @@ -21,9 +28,11 @@ public void export(final StoreLoader loader, final String connectionString = "jdbc:sqlite:" + output.toString(); - final byte[] sqlData = IOUtils.resourceToByteArray("/ddls/sqlite-ddl.sql"); - final String dataAsString = new String(sqlData, UTF_8); - final String[] createTableStatements = dataAsString.split("\n"); + final List createTableStatements = Stream.of(getClass().getResourceAsStream(CREATE_TABLE_RESOURCE)) + .map(InputStreamReader::new) + .map(BufferedReader::new) + .flatMap(BufferedReader::lines) + .collect(Collectors.toList()); try (Connection conn = DriverManager.getConnection(connectionString, username, password)) { From 6650f71cd94effcb7e44bb0d5c5ef1461816735a Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Tue, 7 May 2019 17:32:29 +0100 Subject: [PATCH 3/3] Remove unused import --- .../com/quorum/tessera/data/migration/SqliteDataExporter.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/data-migration/src/main/java/com/quorum/tessera/data/migration/SqliteDataExporter.java b/data-migration/src/main/java/com/quorum/tessera/data/migration/SqliteDataExporter.java index aea2fe50a2..931236c9e3 100644 --- a/data-migration/src/main/java/com/quorum/tessera/data/migration/SqliteDataExporter.java +++ b/data-migration/src/main/java/com/quorum/tessera/data/migration/SqliteDataExporter.java @@ -12,8 +12,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static java.nio.charset.StandardCharsets.UTF_8; - public class SqliteDataExporter implements DataExporter { private static final String INSERT_ROW = "INSERT INTO ENCRYPTED_TRANSACTION (HASH, ENCODED_PAYLOAD) VALUES (?, ?)";