diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/Command.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/Command.java index 56227bccd60..93b91e72606 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/Command.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/Command.java @@ -22,4 +22,11 @@ public interface Command { * @throws IOException if a problem occurs reading or writing */ void execute(String... parameters) throws IOException; + + /** + * Return the names of the settings used. + * + * @return string array of settings + */ + String[] usesSettings(); } diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/Console.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/Console.java index 13d327a6298..a2afae59490 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/Console.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/Console.java @@ -239,11 +239,11 @@ public void set(Boolean val) { register(new Create(consoleIO, STATE)); register(new Drop(consoleIO, STATE, close)); // handling data - register(new Verify(consoleIO)); - register(new Load(consoleIO, STATE)); + register(new Verify(consoleIO, settingMap)); + register(new Load(consoleIO, STATE, settingMap)); register(new Clear(consoleIO, STATE)); - register(new Export(consoleIO, STATE)); - register(new Convert(consoleIO, STATE)); + register(new Export(consoleIO, STATE, settingMap)); + register(new Convert(consoleIO, STATE, settingMap)); // parameters register(new SetParameters(consoleIO, STATE, settingMap)); } diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/Util.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/Util.java index b5167424f67..5ba77d6a63f 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/Util.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/Util.java @@ -13,6 +13,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Map; +import org.eclipse.rdf4j.console.setting.WorkDir; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; @@ -86,6 +87,32 @@ public static Path getPath(String file) { return path; } + /** + * Check if a string looks like a HTTP, HTTPS or file URI. + * + * @param str string + * @return true if + */ + public static boolean isHttpOrFile(String str) { + String lower = str.toLowerCase(); + return lower.startsWith("http://") || lower.startsWith("https://") || lower.startsWith("file://"); + } + + /** + * Get path from file string if it's absolute, or from working directory if the file is relative. + * + * @param workDir working dir + * @param file file name + * @return path normalized path + */ + public static Path getNormalizedPath(Path workDir, String file) { + Path path = Paths.get(file); + if (!path.isAbsolute() && (workDir != null)) { + path = workDir.resolve(file); + } + return path.normalize(); + } + /** * Get string representation for a value. If the value is an IRI and is part of a known namespace, the prefix will * be used to shorten it. diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/ConsoleCommand.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/ConsoleCommand.java index d7affff9f4d..d3487610387 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/ConsoleCommand.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/ConsoleCommand.java @@ -8,11 +8,13 @@ package org.eclipse.rdf4j.console.command; import java.io.IOException; +import java.util.Map; import org.eclipse.rdf4j.console.Help; import org.eclipse.rdf4j.console.Command; import org.eclipse.rdf4j.console.ConsoleIO; import org.eclipse.rdf4j.console.ConsoleState; +import org.eclipse.rdf4j.console.setting.ConsoleSetting; /** * Abstract command @@ -23,10 +25,12 @@ public abstract class ConsoleCommand implements Command, Help { final ConsoleIO consoleIO; final ConsoleState state; + final Map settings; + /** * Get console IO * - * @return + * @return console IO */ public ConsoleIO getConsoleIO() { return this.consoleIO; @@ -35,12 +39,21 @@ public ConsoleIO getConsoleIO() { /** * Get console state * - * @return + * @return console state */ public ConsoleState getConsoleState() { return this.state; } + /** + * Get console settings map + * + * @return map of console settings + */ + public Map getConsoleSettings() { + return this.settings; + } + /** * Get short description, small enough to fit on one console row * @@ -62,8 +75,8 @@ public String getHelpLong() { } @Override - public void execute(String... parameters) throws IOException { - throw new UnsupportedOperationException("Not supported yet."); + public String[] usesSettings() { + return new String[0]; } /** @@ -74,6 +87,7 @@ public void execute(String... parameters) throws IOException { public ConsoleCommand(ConsoleIO consoleIO) { this.consoleIO = consoleIO; this.state = null; + this.settings = null; } /** @@ -85,6 +99,24 @@ public ConsoleCommand(ConsoleIO consoleIO) { public ConsoleCommand(ConsoleIO consoleIO, ConsoleState state) { this.consoleIO = consoleIO; this.state = state; + this.settings = null; + } + + /** + * Constructor + * + * @param consoleIO console IO + * @param state console state + * @param settings console settings + */ + public ConsoleCommand(ConsoleIO consoleIO, ConsoleState state, Map settings) { + this.consoleIO = consoleIO; + this.state = state; + this.settings = settings; } + @Override + public void execute(String... parameters) throws IOException { + throw new UnsupportedOperationException("Not supported yet."); + } } 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 a1b38da6dda..89afecaba0b 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 @@ -12,11 +12,14 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Map; import java.util.Optional; import org.eclipse.rdf4j.console.ConsoleIO; import org.eclipse.rdf4j.console.ConsoleState; import org.eclipse.rdf4j.console.Util; +import org.eclipse.rdf4j.console.setting.ConsoleSetting; +import org.eclipse.rdf4j.console.setting.WorkDir; import org.eclipse.rdf4j.rio.RDFFormat; import org.eclipse.rdf4j.rio.RDFHandlerException; import org.eclipse.rdf4j.rio.RDFParseException; @@ -50,6 +53,22 @@ public String getHelpLong() { return PrintHelp.USAGE + "convert Converts a file from one RDF format to another\n"; } + @Override + public String[] usesSettings() { + return new String[] { WorkDir.NAME }; + } + + /** + * Constructor + * + * @param consoleIO + * @param state + * @param settings + */ + public Convert(ConsoleIO consoleIO, ConsoleState state, Map settings) { + super(consoleIO, state, settings); + } + @Override public void execute(String... tokens) { if (tokens.length < 3) { @@ -60,6 +79,15 @@ public void execute(String... tokens) { convert(tokens[1], tokens[2]); } + /** + * Get working dir setting. + * + * @return path of working dir + */ + private Path getWorkDir() { + return ((WorkDir) settings.get(WorkDir.NAME)).get(); + } + /** * Convert a file * @@ -125,14 +153,4 @@ private void convert(String fileFrom, String fileTo) { consoleIO.writeError("Failed to convert data: " + e.getMessage()); } } - - /** - * Constructor - * - * @param consoleIO - * @param state - */ - public Convert(ConsoleIO consoleIO, ConsoleState state) { - super(consoleIO, state); - } } diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Drop.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Drop.java index 313a406fc62..edd8ba3ad93 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Drop.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Drop.java @@ -8,6 +8,7 @@ package org.eclipse.rdf4j.console.command; import java.io.IOException; + import org.eclipse.rdf4j.console.ConsoleIO; import org.eclipse.rdf4j.console.ConsoleState; import org.eclipse.rdf4j.console.LockRemover; 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 aba9998e2ad..c02d40566bb 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 @@ -13,10 +13,13 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; +import java.util.Map; import org.eclipse.rdf4j.console.ConsoleIO; import org.eclipse.rdf4j.console.ConsoleState; import org.eclipse.rdf4j.console.Util; +import org.eclipse.rdf4j.console.setting.ConsoleSetting; +import org.eclipse.rdf4j.console.setting.WorkDir; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.repository.Repository; @@ -53,6 +56,22 @@ public String getHelpLong() { + "export (|null)... Exports the specified context(s) to a file\n"; } + @Override + public String[] usesSettings() { + return new String[] { WorkDir.NAME }; + } + + /** + * Constructor + * + * @param consoleIO + * @param state + * @param settings + */ + public Export(ConsoleIO consoleIO, ConsoleState state, Map settings) { + super(consoleIO, state, settings); + } + @Override public void execute(String... tokens) { Repository repository = state.getRepository(); @@ -78,6 +97,15 @@ public void execute(String... tokens) { export(repository, fileName, contexts); } + /** + * Get working dir setting. + * + * @return path of working dir + */ + private Path getWorkDir() { + return ((WorkDir) settings.get(WorkDir.NAME)).get(); + } + /** * Export to a file * @@ -124,14 +152,4 @@ private void export(Repository repository, String fileName, Resource... contexts consoleIO.writeError("Failed to export data: " + e.getMessage()); } } - - /** - * Constructor - * - * @param consoleIO - * @param state - */ - public Export(ConsoleIO consoleIO, ConsoleState state) { - super(consoleIO, state); - } } diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Load.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Load.java index 3cdcae15a31..a6dcf7c1c0e 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Load.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Load.java @@ -11,10 +11,15 @@ import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; +import java.nio.file.Path; +import java.util.Map; import org.eclipse.rdf4j.console.ConsoleIO; import org.eclipse.rdf4j.console.ConsoleState; import org.eclipse.rdf4j.console.LockRemover; +import org.eclipse.rdf4j.console.Util; +import org.eclipse.rdf4j.console.setting.ConsoleSetting; +import org.eclipse.rdf4j.console.setting.WorkDir; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.repository.Repository; @@ -54,14 +59,20 @@ public String getHelpLong() { + "Loads the specified data file into the current repository\n"; } + @Override + public String[] usesSettings() { + return new String[] { WorkDir.NAME }; + } + /** * Constructor * * @param consoleIO * @param state + * @param settings */ - public Load(ConsoleIO consoleIO, ConsoleState state) { - super(consoleIO, state); + public Load(ConsoleIO consoleIO, ConsoleState state, Map settings) { + super(consoleIO, state, settings); } @Override @@ -94,6 +105,15 @@ public void execute(final String... tokens) { } } + /** + * Get working dir setting. + * + * @return path of working dir + */ + private Path getWorkDir() { + return ((WorkDir) settings.get(WorkDir.NAME)).get(); + } + /** * Load data into a repository * @@ -106,13 +126,18 @@ private void load(Repository repository, String baseURI, String context, final S final String dataPath = tokens[1]; URL dataURL = null; File dataFile = null; - try { - dataURL = new URL(dataPath); - // dataPath is a URI - } catch (MalformedURLException e) { + + if (Util.isHttpOrFile(dataPath)) { + try { + dataURL = new URL(dataPath); + } catch (MalformedURLException e) { + + } + } else { // dataPath is a file - dataFile = new File(dataPath); + dataFile = Util.getNormalizedPath(getWorkDir(), dataPath).toFile(); } + try { addData(repository, baseURI, context, dataURL, dataFile); } catch (RepositoryReadOnlyException e) { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/PrintHelp.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/PrintHelp.java index 1ca777b456b..2e0ec43958c 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/PrintHelp.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/PrintHelp.java @@ -60,6 +60,13 @@ public void execute(String... parameters) { Help cmd = commands.get(target); if (cmd != null) { consoleIO.writeln(cmd.getHelpLong()); + if (cmd instanceof ConsoleCommand) { + String[] uses = ((ConsoleCommand) cmd).usesSettings(); + if (uses.length > 0) { + consoleIO.writeln(); + consoleIO.writeln("Uses settings: " + String.join(", ", uses)); + } + } } else { consoleIO.writeln("No additional info available for command " + target); } diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/QueryEvaluator.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/QueryEvaluator.java index 797bad0e9cb..08894f8d68b 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/QueryEvaluator.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/QueryEvaluator.java @@ -14,7 +14,6 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.Arrays; @@ -28,6 +27,7 @@ import java.util.regex.Pattern; import org.eclipse.rdf4j.common.io.UncloseableOutputStream; +import org.eclipse.rdf4j.console.Util; import org.eclipse.rdf4j.console.setting.ConsoleSetting; import org.eclipse.rdf4j.console.setting.ConsoleWidth; @@ -115,6 +115,13 @@ public QueryEvaluator(TupleAndGraphQueryEvaluator evaluator) { */ protected abstract void addQueryPrefixes(StringBuffer result, Collection namespaces); + @Override + public String[] usesSettings() { + return new String[] { ConsoleWidth.NAME, + Prefixes.NAME, QueryPrefix.NAME, ShowPrefix.NAME, + WorkDir.NAME }; + } + /** * Get console width setting. * @@ -199,10 +206,7 @@ private String readFile(String filename, String cset) throws IllegalArgumentExce } Charset charset = (cset == null || cset.isEmpty()) ? StandardCharsets.UTF_8 : Charset.forName(cset); - Path p = Paths.get(filename); - if (!p.isAbsolute()) { - p = getWorkDir().resolve(p); - } + Path p = Util.getNormalizedPath(getWorkDir(), filename); if (!p.toFile().canRead()) { throw new IOException("Cannot read file " + p); } @@ -228,11 +232,7 @@ private Path getPathForOutput(String filename) throws IllegalArgumentException, throw new IllegalArgumentException("Empty file name"); } - Path p = Paths.get(filename); - if (!p.isAbsolute()) { - p = getWorkDir().resolve(filename); - } - + Path p = Util.getNormalizedPath(getWorkDir(), filename); if (!p.toFile().exists() || consoleIO.askProceed("File " + p + " exists", false)) { return p; } 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 de4b00c9a87..90fbce86cf9 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 @@ -14,11 +14,14 @@ import java.net.URL; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.Map; import org.eclipse.rdf4j.IsolationLevels; import org.eclipse.rdf4j.console.ConsoleIO; import org.eclipse.rdf4j.console.VerificationListener; +import org.eclipse.rdf4j.console.setting.ConsoleSetting; +import org.eclipse.rdf4j.console.setting.WorkDir; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.vocabulary.RDF4J; @@ -71,13 +74,19 @@ public String getHelpLong() { + "Verifies the validity of the specified data file\n"; } + @Override + public String[] usesSettings() { + return new String[] { WorkDir.NAME }; + } + /** * Constructor * * @param consoleIO + * @param settings */ - public Verify(ConsoleIO consoleIO) { - super(consoleIO); + public Verify(ConsoleIO consoleIO, Map settings) { + super(consoleIO, null, settings); } @Override diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/WorkDir.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/WorkDir.java index 5c3c8eb7ff4..74cdf55d2b7 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/WorkDir.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/WorkDir.java @@ -26,7 +26,7 @@ public String getHelpLong() { /** * Constructor * - * Default dir is "." + * Default dir is system property user.dir (= current directory) */ public WorkDir() { super(Paths.get(System.getProperty("user.dir"))); diff --git a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/AbstractCommandTest.java b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/AbstractCommandTest.java index c81d00d0894..9294f179265 100644 --- a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/AbstractCommandTest.java +++ b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/AbstractCommandTest.java @@ -48,8 +48,6 @@ import org.eclipse.rdf4j.rio.helpers.StatementCollector; import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Rule; import org.junit.rules.TemporaryFolder; 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 937823408da..341b73a644a 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 @@ -41,7 +41,7 @@ public class ConvertTest extends AbstractCommandTest { @Before public void prepare() throws IOException, RDF4JException { when(mockConsoleIO.askProceed("File exists, continue ?", false)).thenReturn(Boolean.TRUE); - convert = new Convert(mockConsoleIO, mockConsoleState); + convert = new Convert(mockConsoleIO, mockConsoleState, defaultSettings); from = LOCATION.newFile("alien.ttl"); copyFromResource("convert/alien.ttl", from); 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 22d7f04ab4e..063b5c279d5 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 @@ -53,7 +53,7 @@ public void setUp() throws IOException, RDF4JException { when(mockConsoleState.getManager()).thenReturn(manager); when(mockConsoleState.getRepository()).thenReturn(manager.getRepository(MEMORY_MEMBER)); - export = new Export(mockConsoleIO, mockConsoleState); + export = new Export(mockConsoleIO, mockConsoleState, defaultSettings); } @After 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 de0be900ad1..22778768fcd 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 @@ -51,7 +51,7 @@ public void prepare() throws IOException, RDF4JException { io = new ConsoleIO(input, out, info); - cmd = new Verify(io); + cmd = new Verify(io, defaultSettings); } /**