diff --git a/community/command-line/src/main/java/org/neo4j/commandline/admin/AdminCommand.java b/community/command-line/src/main/java/org/neo4j/commandline/admin/AdminCommand.java index 1d2545f4d5c50..a3fcef35582b5 100644 --- a/community/command-line/src/main/java/org/neo4j/commandline/admin/AdminCommand.java +++ b/community/command-line/src/main/java/org/neo4j/commandline/admin/AdminCommand.java @@ -20,6 +20,8 @@ package org.neo4j.commandline.admin; import java.nio.file.Path; +import java.util.Arrays; +import java.util.List; import java.util.Set; import org.neo4j.commandline.arguments.Arguments; @@ -62,7 +64,16 @@ public String name() /** * @return The arguments this command accepts. */ - public abstract Arguments arguments(); + public abstract Arguments allArguments(); + + /** + * + * @return A list of possibly mutually-exclusive argument sets for this command. + */ + public List possibleArguments() + { + return Arrays.asList( allArguments() ); + } /** * @return A single-line summary for the command. Should be 70 characters or less. diff --git a/community/command-line/src/main/java/org/neo4j/commandline/admin/HelpCommand.java b/community/command-line/src/main/java/org/neo4j/commandline/admin/HelpCommand.java index cef53cd20c8ba..79e1eec8e5eba 100644 --- a/community/command-line/src/main/java/org/neo4j/commandline/admin/HelpCommand.java +++ b/community/command-line/src/main/java/org/neo4j/commandline/admin/HelpCommand.java @@ -40,7 +40,7 @@ public Provider( Usage usage ) } @Override - public Arguments arguments() + public Arguments allArguments() { return new Arguments().withOptionalPositionalArgument( 0, "command" ); } diff --git a/community/command-line/src/main/java/org/neo4j/commandline/admin/Usage.java b/community/command-line/src/main/java/org/neo4j/commandline/admin/Usage.java index db6f3196c9e6d..534c2a595cea6 100644 --- a/community/command-line/src/main/java/org/neo4j/commandline/admin/Usage.java +++ b/community/command-line/src/main/java/org/neo4j/commandline/admin/Usage.java @@ -82,13 +82,16 @@ public void printIndentedSummary( Consumer output ) public void printDetailed( Consumer output ) { - Arguments arguments = command.arguments(); + for (Arguments arguments: command.possibleArguments()) + { + //Arguments arguments = command.arguments(); - String left = format( "usage: %s %s", scriptName, command.name() ); + String left = format( "usage: %s %s", scriptName, command.name() ); - output.accept( Arguments.rightColumnFormatted( left, arguments.usage(), left.length() + 1 ) ); + output.accept( Arguments.rightColumnFormatted( left, arguments.usage(), left.length() + 1 ) ); + } output.accept( "" ); - output.accept( arguments.description( command.description() ) ); + output.accept( command.allArguments().description( command.description() ) ); } } } diff --git a/community/command-line/src/main/java/org/neo4j/commandline/arguments/Arguments.java b/community/command-line/src/main/java/org/neo4j/commandline/arguments/Arguments.java index ffb8ee443c21d..0d61bdb5f41ba 100644 --- a/community/command-line/src/main/java/org/neo4j/commandline/arguments/Arguments.java +++ b/community/command-line/src/main/java/org/neo4j/commandline/arguments/Arguments.java @@ -120,8 +120,9 @@ public String description( String text ) wrappedText = String.join( "\n\n", wrappedText, "options:" ); //noinspection OptionalGetWithoutIsPresent handled by if-statement above - final int alignLength = namedArgs.values().stream().map( NamedArgument::alignmentLength ).reduce( 0, - Integer::max ); + final int alignLength = namedArgs.values().stream() + .map( a -> a.optionsListing().length() ) + .reduce( 0, Integer::max ); return String.join( "\n", wrappedText, namedArgs.values().stream() @@ -131,7 +132,7 @@ public String description( String text ) public String formatArgumentDescription( final int longestAlignmentLength, final NamedArgument argument ) { - final String left = String.format( " --%s=<%s>", argument.name(), argument.exampleValue() ); + final String left = String.format( " %s", argument.optionsListing() ); final String right; if ( argument instanceof OptionalNamedArg ) { diff --git a/community/command-line/src/main/java/org/neo4j/commandline/arguments/MandatoryNamedArg.java b/community/command-line/src/main/java/org/neo4j/commandline/arguments/MandatoryNamedArg.java index 4df886771fdf4..18e36f187cddb 100644 --- a/community/command-line/src/main/java/org/neo4j/commandline/arguments/MandatoryNamedArg.java +++ b/community/command-line/src/main/java/org/neo4j/commandline/arguments/MandatoryNamedArg.java @@ -39,10 +39,9 @@ public MandatoryNamedArg( String name, String exampleValue, String description ) } @Override - public int alignmentLength() + public String optionsListing() { - // length of "--NAME=" - return 5 + name.length() + exampleValue.length(); + return usage(); } @Override diff --git a/community/command-line/src/main/java/org/neo4j/commandline/arguments/NamedArgument.java b/community/command-line/src/main/java/org/neo4j/commandline/arguments/NamedArgument.java index 78fc902a60533..bdc8f075c37b5 100644 --- a/community/command-line/src/main/java/org/neo4j/commandline/arguments/NamedArgument.java +++ b/community/command-line/src/main/java/org/neo4j/commandline/arguments/NamedArgument.java @@ -21,15 +21,33 @@ public interface NamedArgument { - int alignmentLength(); + /** + * Represents the option in the options list. + */ + String optionsListing(); + /** + * Represents the option in the usage string. + */ String usage(); + /** + * An explanation of the option in the options list. + */ String description(); + /** + * Name of the option as in '--name=' + */ String name(); + /** + * Example value listed in usage between brackets like '--name=' + */ String exampleValue(); + /** + * Parses the option (or possible default value) out of program arguments. + */ String parse( String... args ); } diff --git a/community/command-line/src/main/java/org/neo4j/commandline/arguments/OptionalNamedArg.java b/community/command-line/src/main/java/org/neo4j/commandline/arguments/OptionalNamedArg.java index b1353e86a5d76..5cbc1c1d02d39 100644 --- a/community/command-line/src/main/java/org/neo4j/commandline/arguments/OptionalNamedArg.java +++ b/community/command-line/src/main/java/org/neo4j/commandline/arguments/OptionalNamedArg.java @@ -19,8 +19,6 @@ */ package org.neo4j.commandline.arguments; -import org.apache.commons.lang3.text.WordUtils; - import org.neo4j.helpers.Args; import static org.neo4j.kernel.impl.util.Converters.identity; @@ -53,16 +51,15 @@ public OptionalNamedArg( String name, String[] allowedValues, String defaultValu } @Override - public int alignmentLength() + public String optionsListing() { - // length of "--NAME=" - return 5 + name.length() + exampleValue.length(); + return String.format( "--%s=<%s>", name, exampleValue ); } @Override public String usage() { - return WordUtils.wrap( String.format( "[--%s=<%s>]", name, exampleValue ), 60 ); + return String.format( "[--%s=<%s>]", name, exampleValue ); } @Override diff --git a/community/command-line/src/main/java/org/neo4j/commandline/arguments/PositionalArgument.java b/community/command-line/src/main/java/org/neo4j/commandline/arguments/PositionalArgument.java index 9e7a5ab4c8769..4ca33f6744faf 100644 --- a/community/command-line/src/main/java/org/neo4j/commandline/arguments/PositionalArgument.java +++ b/community/command-line/src/main/java/org/neo4j/commandline/arguments/PositionalArgument.java @@ -21,7 +21,13 @@ public interface PositionalArgument { + /** + * Index of the argument in arguments listing. + */ int position(); + /** + * Represents the option in the usage string. + */ String usage(); } diff --git a/community/command-line/src/test/java/org/neo4j/commandline/admin/AdminToolTest.java b/community/command-line/src/test/java/org/neo4j/commandline/admin/AdminToolTest.java index 7aed5ee7bece5..2e3a98f1351ac 100644 --- a/community/command-line/src/test/java/org/neo4j/commandline/admin/AdminToolTest.java +++ b/community/command-line/src/test/java/org/neo4j/commandline/admin/AdminToolTest.java @@ -245,7 +245,7 @@ private CannedLocator cannedCommand( final String name, AdminCommand command ) return new CannedLocator( new AdminCommand.Provider( name ) { @Override - public Arguments arguments() + public Arguments allArguments() { return Arguments.NO_ARGS; } @@ -293,7 +293,7 @@ protected NullCommandProvider() } @Override - public Arguments arguments() + public Arguments allArguments() { return Arguments.NO_ARGS; } diff --git a/community/command-line/src/test/java/org/neo4j/commandline/admin/HelpCommandTest.java b/community/command-line/src/test/java/org/neo4j/commandline/admin/HelpCommandTest.java index 9a4f0c3c74ba2..da192065c0ea7 100644 --- a/community/command-line/src/test/java/org/neo4j/commandline/admin/HelpCommandTest.java +++ b/community/command-line/src/test/java/org/neo4j/commandline/admin/HelpCommandTest.java @@ -107,7 +107,9 @@ public void showsArgumentsAndDescriptionForSpecifiedCommand() throws Exception AdminCommand.Provider commandProvider = mock( AdminCommand.Provider.class ); when( commandProvider.name() ).thenReturn( "foobar" ); //when( commandProvider.arguments() ).thenReturn( Optional.of( "--baz --qux" ) ); - when( commandProvider.arguments() ).thenReturn( new Arguments().withDatabase() ); + Arguments arguments = new Arguments().withDatabase(); + when( commandProvider.allArguments() ).thenReturn( arguments ); + when( commandProvider.possibleArguments() ).thenReturn( Collections.singletonList( arguments ) ); when( commandProvider.description() ).thenReturn( "This is a description of the foobar command." ); when( commandLocator.findProvider( "foobar" ) ).thenReturn( commandProvider ); diff --git a/community/command-line/src/test/java/org/neo4j/commandline/admin/UsageTest.java b/community/command-line/src/test/java/org/neo4j/commandline/admin/UsageTest.java index cb34ccd7cff18..cbc3c37edafca 100644 --- a/community/command-line/src/test/java/org/neo4j/commandline/admin/UsageTest.java +++ b/community/command-line/src/test/java/org/neo4j/commandline/admin/UsageTest.java @@ -79,7 +79,7 @@ public StubProvider( String name, String summary ) } @Override - public Arguments arguments() + public Arguments allArguments() { return Arguments.NO_ARGS; } diff --git a/community/command-line/src/test/java/org/neo4j/commandline/arguments/OptionalBooleanArgTest.java b/community/command-line/src/test/java/org/neo4j/commandline/arguments/OptionalBooleanArgTest.java index 2d9a4d37675e0..d83744961febc 100644 --- a/community/command-line/src/test/java/org/neo4j/commandline/arguments/OptionalBooleanArgTest.java +++ b/community/command-line/src/test/java/org/neo4j/commandline/arguments/OptionalBooleanArgTest.java @@ -1,3 +1,22 @@ +/* + * Copyright (c) 2002-2016 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.neo4j.commandline.arguments; import org.junit.Test; diff --git a/community/consistency-check/src/main/java/org/neo4j/consistency/CheckConsistencyCommand.java b/community/consistency-check/src/main/java/org/neo4j/consistency/CheckConsistencyCommand.java index 014b06328180a..45db3c0ae7f42 100644 --- a/community/consistency-check/src/main/java/org/neo4j/consistency/CheckConsistencyCommand.java +++ b/community/consistency-check/src/main/java/org/neo4j/consistency/CheckConsistencyCommand.java @@ -71,7 +71,7 @@ public Provider() } @Override - public Arguments arguments() + public Arguments allArguments() { return arguments; } diff --git a/community/dbms/src/main/java/org/neo4j/commandline/dbms/DumpCommand.java b/community/dbms/src/main/java/org/neo4j/commandline/dbms/DumpCommand.java index fb6905568d7ef..55ed0afb4353c 100644 --- a/community/dbms/src/main/java/org/neo4j/commandline/dbms/DumpCommand.java +++ b/community/dbms/src/main/java/org/neo4j/commandline/dbms/DumpCommand.java @@ -64,7 +64,7 @@ public Provider() } @Override - public Arguments arguments() + public Arguments allArguments() { return arguments; } diff --git a/community/dbms/src/main/java/org/neo4j/commandline/dbms/ImportCommand.java b/community/dbms/src/main/java/org/neo4j/commandline/dbms/ImportCommand.java index 318809ce56c5e..d4d39084f0454 100644 --- a/community/dbms/src/main/java/org/neo4j/commandline/dbms/ImportCommand.java +++ b/community/dbms/src/main/java/org/neo4j/commandline/dbms/ImportCommand.java @@ -32,6 +32,7 @@ import org.neo4j.commandline.admin.IncorrectUsage; import org.neo4j.commandline.admin.OutsideWorld; import org.neo4j.commandline.arguments.Arguments; +import org.neo4j.commandline.arguments.MandatoryNamedArg; import org.neo4j.commandline.arguments.OptionalNamedArg; import org.neo4j.dbms.DatabaseManagementSystemSettings; import org.neo4j.graphdb.factory.GraphDatabaseSettings; @@ -45,15 +46,61 @@ public class ImportCommand implements AdminCommand { public static final String DEFAULT_REPORT_FILE_NAME = "import.report"; private static final String[] allowedModes = {"database", "csv"}; - private static final Arguments arguments = new Arguments() + private static final Arguments databaseArguments = new Arguments() + .withArgument( new MandatoryNamedArg( "mode", "database", "Import a pre-3.0 installation." ) { + @Override + public String usage() + { + return String.format( "--%s=%s", name(), exampleValue() ); + } + } ) + .withDatabase() + .withAdditionalConfig() + .withArgument( new OptionalNamedArg( "from", "source-directory", "", + "The location of the pre-3.0 database (e.g. /data/graph.db)." ) ); + private static final Arguments csvArguments = new Arguments() + .withArgument( new OptionalNamedArg( "mode", "csv", "csv", "Import a collection of CSV files." ) { + @Override + public String usage() + { + return String.format( "[--%s=%s]", name(), exampleValue() ); + } + } ) + .withDatabase() + .withAdditionalConfig() + .withArgument( new OptionalNamedArg( "report-file", "filename", DEFAULT_REPORT_FILE_NAME, + "File in which to store the report of the csv-import." ) ) + .withArgument( new OptionalNamedArg( "nodes[:Label1:Label2]", "\"file1,file2,...\"", "", + "Node CSV header and data. Multiple files will be logically seen as " + + "one big file from the perspective of the importer. The first line " + + "must contain the header. Multiple data sources like these can be " + + "specified in one import, where each data source has its own header. " + + "Note that file groups must be enclosed in quotation marks." ) ) + .withArgument( new OptionalNamedArg( "relationships[:RELATIONSHIP_TYPE]", "\"file1,file2,...\"", "", + "Relationship CSV header and data. Multiple files will be logically " + + "seen as one big file from the perspective of the importer. The first " + + "line must contain the header. Multiple data sources like these can be " + + "specified in one import, where each data source has its own header. " + + "Note that file groups must be enclosed in quotation marks." ) ) + .withArgument( new OptionalNamedArg( "id-type", new String[]{"STRING", "INTEGER", "ACTUAL"}, + "STRING", "Each node must provide a unique id. This is used to find the correct " + + "nodes when creating relationships. Possible values are " + + "STRING: arbitrary strings for identifying nodes, " + + "INTEGER: arbitrary integer values for identifying nodes, " + + "ACTUAL: (advanced) actual node ids. " + + "For more information on id handling, please see the Neo4j Manual: " + + "http://neo4j.com/docs/operations-manual/current/deployment/#import-tool" ) ) + .withArgument( new OptionalNamedArg( "input-encoding", "character-set", "UTF-8", + "Character set that input data is encoded in." ) ); + private static final Arguments allArguments = new Arguments() .withDatabase() .withAdditionalConfig() .withArgument( new OptionalNamedArg( "mode", allowedModes, "csv", "Import a collection of CSV files or a pre-3.0 installation." ) ) .withArgument( new OptionalNamedArg( "from", "source-directory", "", "The location of the pre-3.0 database (e.g. /data/graph.db)." ) ) - .withArgument( new OptionalNamedArg( "report-file", "filename", ImportCommand.DEFAULT_REPORT_FILE_NAME, - "File in which to store the report of the import." ) ) + .withArgument( new OptionalNamedArg( "report-file", "filename", DEFAULT_REPORT_FILE_NAME, + "File in which to store the report of the csv-import." ) ) .withArgument( new OptionalNamedArg( "nodes[:Label1:Label2]", "\"file1,file2,...\"", "", "Node CSV header and data. Multiple files will be logically seen as " + "one big file from the perspective of the importer. The first line " + @@ -85,9 +132,15 @@ public Provider() } @Override - public Arguments arguments() + public Arguments allArguments() + { + return allArguments; + } + + @Override + public List possibleArguments() { - return arguments; + return Arrays.asList( csvArguments, databaseArguments ); } @Override @@ -137,9 +190,9 @@ public void execute( String[] args ) throws IncorrectUsage, CommandFailed try { - mode = arguments.parse("mode", args); - database = arguments.parse( "database", args ); - additionalConfigFile = arguments.parseOptionalPath( "additional-config", args ); + mode = allArguments.parse("mode", args); + database = allArguments.parse( "database", args ); + additionalConfigFile = allArguments.parseOptionalPath( "additional-config", args ); } catch ( IllegalArgumentException e ) { diff --git a/community/dbms/src/main/java/org/neo4j/commandline/dbms/LoadCommand.java b/community/dbms/src/main/java/org/neo4j/commandline/dbms/LoadCommand.java index 0f27d3fdade77..568da17c8d745 100644 --- a/community/dbms/src/main/java/org/neo4j/commandline/dbms/LoadCommand.java +++ b/community/dbms/src/main/java/org/neo4j/commandline/dbms/LoadCommand.java @@ -66,7 +66,7 @@ public Provider() } @Override - public Arguments arguments() + public Arguments allArguments() { return arguments; } diff --git a/community/dbms/src/test/java/org/neo4j/commandline/dbms/ImportCommandTest.java b/community/dbms/src/test/java/org/neo4j/commandline/dbms/ImportCommandTest.java index 42ef49bae38ef..ab3f7c34f8f42 100644 --- a/community/dbms/src/test/java/org/neo4j/commandline/dbms/ImportCommandTest.java +++ b/community/dbms/src/test/java/org/neo4j/commandline/dbms/ImportCommandTest.java @@ -141,14 +141,16 @@ public void shouldPrintNiceHelp() throws Throwable Consumer out = mock( Consumer.class ); usage.printUsageForCommand( new ImportCommand.Provider(), out ); - verify( out ).accept( "usage: neo4j-admin import [--database=]\n" + + verify( out ).accept( "usage: neo4j-admin import [--mode=csv] [--database=]\n" + " [--additional-config=]\n" + - " [--mode=] [--from=]\n" + " [--report-file=]\n" + " [--nodes[:Label1:Label2]=<\"file1,file2,...\">]\n" + " [--relationships[:RELATIONSHIP_TYPE]=<\"file1,file2,...\">]\n" + " [--id-type=]\n" + " [--input-encoding=]" ); + verify( out ).accept( "usage: neo4j-admin import --mode=database [--database=]\n" + + " [--additional-config=]\n" + + " [--from=]" ); verify( out ).accept( "" ); verify( out ).accept( "Import a collection of CSV files with --mode=csv (default), or a database from a\n" + "pre-3.0 installation with --mode=database.\n" + @@ -165,7 +167,8 @@ public void shouldPrintNiceHelp() throws Throwable " The location of the pre-3.0 database (e.g. /data/graph.db).\n" + " [default:]\n" + " --report-file=\n" + - " File in which to store the report of the import. [default:import.report]\n" + + " File in which to store the report of the csv-import.\n" + + " [default:import.report]\n" + " --nodes[:Label1:Label2]=<\"file1,file2,...\">\n" + " Node CSV header and data. Multiple files will be logically seen as one\n" + " big file from the perspective of the importer. The first line must\n" + diff --git a/community/dbms/src/test/java/org/neo4j/commandline/dbms/LoadCommandTest.java b/community/dbms/src/test/java/org/neo4j/commandline/dbms/LoadCommandTest.java index 991de3eb84ce3..6b8d5dc84a59c 100644 --- a/community/dbms/src/test/java/org/neo4j/commandline/dbms/LoadCommandTest.java +++ b/community/dbms/src/test/java/org/neo4j/commandline/dbms/LoadCommandTest.java @@ -296,7 +296,7 @@ public void shouldPrintNiceHelp() throws Throwable usage.printUsageForCommand( new LoadCommand.Provider(), out ); verify( out ).accept( "usage: neo4j-admin load --from= [--database=]\n" + - " [--force=]" ); + " [--force[=]]" ); verify( out ).accept( "" ); verify( out ).accept( "Load a database from an archive. must be an archive created with\n" + "the dump command. is the name of the database to create. Existing\n" + diff --git a/community/security/src/main/java/org/neo4j/commandline/admin/security/SetDefaultAdminCommand.java b/community/security/src/main/java/org/neo4j/commandline/admin/security/SetDefaultAdminCommand.java index a4aca45f7edf9..4a084e1676c30 100644 --- a/community/security/src/main/java/org/neo4j/commandline/admin/security/SetDefaultAdminCommand.java +++ b/community/security/src/main/java/org/neo4j/commandline/admin/security/SetDefaultAdminCommand.java @@ -58,7 +58,7 @@ public Provider() } @Override - public Arguments arguments() + public Arguments allArguments() { return arguments; } diff --git a/community/security/src/main/java/org/neo4j/commandline/admin/security/SetInitialPasswordCommand.java b/community/security/src/main/java/org/neo4j/commandline/admin/security/SetInitialPasswordCommand.java index c3e65891fe056..a5b4f3ab5125d 100644 --- a/community/security/src/main/java/org/neo4j/commandline/admin/security/SetInitialPasswordCommand.java +++ b/community/security/src/main/java/org/neo4j/commandline/admin/security/SetInitialPasswordCommand.java @@ -59,7 +59,7 @@ public Provider() } @Override - public Arguments arguments() + public Arguments allArguments() { return arguments; } diff --git a/enterprise/backup/src/main/java/org/neo4j/backup/OnlineBackupCommand.java b/enterprise/backup/src/main/java/org/neo4j/backup/OnlineBackupCommand.java index 3704623be1055..b14c7c5ab3dde 100644 --- a/enterprise/backup/src/main/java/org/neo4j/backup/OnlineBackupCommand.java +++ b/enterprise/backup/src/main/java/org/neo4j/backup/OnlineBackupCommand.java @@ -71,7 +71,7 @@ public Provider() } @Override - public Arguments arguments() + public Arguments allArguments() { return arguments; } diff --git a/enterprise/backup/src/main/java/org/neo4j/restore/RestoreDatabaseCli.java b/enterprise/backup/src/main/java/org/neo4j/restore/RestoreDatabaseCli.java index de74c3df5d6b5..00b3903081326 100644 --- a/enterprise/backup/src/main/java/org/neo4j/restore/RestoreDatabaseCli.java +++ b/enterprise/backup/src/main/java/org/neo4j/restore/RestoreDatabaseCli.java @@ -114,7 +114,7 @@ public Provider() } @Override - public Arguments arguments() + public Arguments allArguments() { return arguments; } diff --git a/enterprise/causal-clustering/src/main/java/org/neo4j/commandline/dbms/UnbindFromClusterCommand.java b/enterprise/causal-clustering/src/main/java/org/neo4j/commandline/dbms/UnbindFromClusterCommand.java index de891cb58d0c7..8aef3af5b4265 100644 --- a/enterprise/causal-clustering/src/main/java/org/neo4j/commandline/dbms/UnbindFromClusterCommand.java +++ b/enterprise/causal-clustering/src/main/java/org/neo4j/commandline/dbms/UnbindFromClusterCommand.java @@ -139,7 +139,7 @@ public Provider() } @Override - public Arguments arguments() + public Arguments allArguments() { return arguments; }