diff --git a/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManager.java b/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManager.java index 20a278f6177..3aa3a4c459d 100644 --- a/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManager.java +++ b/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManager.java @@ -261,8 +261,12 @@ public synchronized RepositoryConfig getRepositoryConfig(String id) { File dataDir = getRepositoryDir(id); if (new File(dataDir, CFG_FILE).exists()) { File configFile = new File(dataDir, CFG_FILE); - try (InputStream input = new FileInputStream(configFile)) { - Model model = Rio.parse(input, configFile.toURI().toString(), CONFIG_FORMAT); + try { + Model model; + // We read the input and close it so that it may be reopend by the migration process + try (InputStream input = new FileInputStream(configFile)) { + model = Rio.parse(input, configFile.toURI().toString(), CONFIG_FORMAT); + } Set repositoryIDs = RepositoryConfigUtil.getRepositoryIDs(model); if (repositoryIDs.isEmpty()) { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Convert.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Convert.java index 602cc55f132..28d1a27e723 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Convert.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Convert.java @@ -11,7 +11,7 @@ package org.eclipse.rdf4j.console.command; import java.io.BufferedInputStream; -import java.io.BufferedWriter; +import java.io.BufferedOutputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -132,7 +132,7 @@ private void convert(String fileFrom, String fileTo) { String baseURI = pathFrom.toUri().toString(); try (BufferedInputStream r = new BufferedInputStream(Files.newInputStream(pathFrom)); - BufferedWriter w = Files.newBufferedWriter(pathTo)) { + BufferedOutputStream w = new BufferedOutputStream(Files.newOutputStream(pathTo))) { RDFWriter writer = Rio.createWriter(fmtTo.get(), w); parser.setRDFHandler(writer); @@ -141,6 +141,8 @@ private void convert(String fileFrom, String fileTo) { parser.parse(r, baseURI); + w.flush(); + long diff = (System.nanoTime() - startTime) / 1_000_000; writeln("Data has been written to file (" + diff + " ms)"); } catch (IOException | RDFParseException | RDFHandlerException e) { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Export.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Export.java index ec3351e4e6d..6352ca6f7db 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Export.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Export.java @@ -10,9 +10,7 @@ *******************************************************************************/ package org.eclipse.rdf4j.console.command; -import java.io.IOException; -import java.io.Writer; -import java.nio.charset.StandardCharsets; +import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; @@ -127,8 +125,8 @@ private void export(Repository repository, String fileName, Resource... contexts } try (RepositoryConnection conn = repository.getConnection(); - Writer w = Files.newBufferedWriter(path, StandardCharsets.UTF_8, StandardOpenOption.CREATE, - StandardOpenOption.TRUNCATE_EXISTING)) { + BufferedOutputStream w = new BufferedOutputStream(Files.newOutputStream(path, StandardOpenOption.CREATE, + StandardOpenOption.TRUNCATE_EXISTING))) { RDFFormat fmt = Rio.getWriterFormatForFileName(fileName) .orElseThrow(() -> new UnsupportedRDFormatException("No RDF parser for " + fileName)); @@ -139,6 +137,8 @@ private void export(Repository repository, String fileName, Resource... contexts conn.export(writer, contexts); + w.flush(); + long diff = (System.nanoTime() - startTime) / 1_000_000; writeln("Data has been written to file (" + diff + " ms)"); } catch (IOException | UnsupportedRDFormatException e) { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Verify.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Verify.java index d94240d54d5..375e37a3da5 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Verify.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Verify.java @@ -10,9 +10,9 @@ *******************************************************************************/ package org.eclipse.rdf4j.console.command; +import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.Writer; import java.net.MalformedURLException; import java.net.URL; import java.nio.file.Files; @@ -186,7 +186,7 @@ private void shacl(String dataPath, String shaclPath, String reportFile) { writeln("Loading shapes from " + shaclPath); URL shaclURL = new URL(shaclPath); - RDFFormat format = Rio.getParserFormatForFileName(reportFile).orElse(RDFFormat.TURTLE); + RDFFormat format = Rio.getParserFormatForFileName(shaclPath).orElse(RDFFormat.TURTLE); try (SailRepositoryConnection conn = repo.getConnection()) { conn.begin(IsolationLevels.NONE, ShaclSail.TransactionSettings.ValidationApproach.Disabled); @@ -279,8 +279,9 @@ private void writeReport(Model model, String reportFile) { RDFFormat format = Rio.getParserFormatForFileName(reportFile).orElse(RDFFormat.TURTLE); - try (Writer w = Files.newBufferedWriter(Paths.get(reportFile))) { + try (BufferedOutputStream w = new BufferedOutputStream(Files.newOutputStream(Paths.get(reportFile)))) { Rio.write(model, w, format, cfg); + w.flush(); } catch (IOException ex) { writeError("Could not write report to " + reportFile, ex); } diff --git a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/ConvertTest.java b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/ConvertTest.java index cdd79de05d0..11ec5c80d84 100644 --- a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/ConvertTest.java +++ b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/ConvertTest.java @@ -66,6 +66,14 @@ public final void testConvert() { assertTrue(o != null, "Invalid JSON"); } + @Test + public final void testConvertToBinary() { + File binary = new File(locationFile, "alien.brf"); + cmd.execute("convert", from.getAbsolutePath(), binary.getAbsolutePath()); + + assertTrue(binary.length() > 0, "File is empty"); + } + @Test public final void testConvertWorkDir() { setWorkingDir(cmd); diff --git a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/ExportTest.java b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/ExportTest.java index 772f940c9a8..60dc8f05e23 100644 --- a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/ExportTest.java +++ b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/ExportTest.java @@ -68,6 +68,15 @@ public final void testExportAll() throws RepositoryException, IOException { nq.delete(); } + @Test + public final void testExportAllToBinary() throws RepositoryException { + File binary = new File(locationFile, "all.brf"); + cmd.execute("export", binary.getAbsolutePath()); + assertTrue(binary.length() > 0, "File is empty"); + + binary.delete(); + } + @Test public final void testExportWorkDir() throws RepositoryException, IOException { setWorkingDir(cmd); diff --git a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/VerifyTest.java b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/VerifyTest.java index 09e79f28d6e..f781db28f35 100644 --- a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/VerifyTest.java +++ b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/VerifyTest.java @@ -127,6 +127,44 @@ public final void testShaclValid() throws IOException { assertFalse(io.wasErrorWritten()); } + @Test + public final void testShaclInvalidFormat() throws IOException { + File report = new File(locationFile, "testShaclInvalid.nt"); + cmd.execute("verify", copyFromRes("ok.ttl"), copyFromRes("shacl_invalid.ttl"), report.toString()); + assertTrue(io.wasErrorWritten()); + assertTrue(Files.size(report.toPath()) > 0); + } + + @Test + public final void testShaclValidFormat() throws IOException { + File report = new File(locationFile, "testShaclValid.nt"); + assertTrue(report.createNewFile()); + cmd.execute("verify", copyFromRes("ok.ttl"), copyFromRes("shacl_valid.ttl"), report.toString()); + + verify(mockConsoleIO, never()).writeError(anyString()); + assertFalse(Files.size(report.toPath()) > 0); + assertFalse(io.wasErrorWritten()); + } + + @Test + public final void testShaclInvalidToBinary() throws IOException { + File report = new File(locationFile, "testShaclInvalid.brf"); + cmd.execute("verify", copyFromRes("ok.ttl"), copyFromRes("shacl_invalid.ttl"), report.toString()); + assertTrue(io.wasErrorWritten()); + assertTrue(Files.size(report.toPath()) > 0); + } + + @Test + public final void testShaclValidToBinary() throws IOException { + File report = new File(locationFile, "testShaclValid.brf"); + assertTrue(report.createNewFile()); + cmd.execute("verify", copyFromRes("ok.ttl"), copyFromRes("shacl_valid.ttl"), report.toString()); + + verify(mockConsoleIO, never()).writeError(anyString()); + assertFalse(Files.size(report.toPath()) > 0); + assertFalse(io.wasErrorWritten()); + } + @Test public final void testShaclValidWorkDir() throws IOException { setWorkingDir(cmd);