From 0a6fd79a0211f0c0a8e7d553603717f3e9a6d0e9 Mon Sep 17 00:00:00 2001 From: Rakesh Kumar Date: Fri, 17 Feb 2017 22:38:03 -0800 Subject: [PATCH] Update cli tool to allow schema directory - This updates allow cli tool to accept directory which contains multiple jsonschema file. It recursively look into files and validate their syntax Example command: java -jar json-schema-validator-2.2.6-lib.jar --syntax --directory issue: #216 --- .../github/fge/jsonschema/main/cli/Main.java | 56 +++++++++++++++++-- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/github/fge/jsonschema/main/cli/Main.java b/src/main/java/com/github/fge/jsonschema/main/cli/Main.java index 4a9e2b37f..62672ed9a 100644 --- a/src/main/java/com/github/fge/jsonschema/main/cli/Main.java +++ b/src/main/java/com/github/fge/jsonschema/main/cli/Main.java @@ -38,13 +38,18 @@ import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedList; import java.util.List; +import java.util.Queue; import static com.github.fge.jsonschema.main.cli.RetCode.*; public final class Main { + private static final String DIRECTORY = "directory"; + private static final HelpFormatter HELP = new CustomHelpFormatter(); private static final ObjectMapper MAPPER = JacksonUtils.newMapper(); @@ -63,6 +68,9 @@ public static void main(final String... args) "no output; exit with the relevant return code (see below)"); parser.accepts("syntax", "check the syntax of schema(s) given as argument(s)"); + parser.accepts(DIRECTORY, + "directory which contains the schema files. If this parameter is provided then you don't need to provide files in argument list") + .withRequiredArg(); parser.accepts("fakeroot", "pretend that the current directory is absolute URI \"uri\"") .withRequiredArg(); @@ -70,10 +78,11 @@ public static void main(final String... args) final OptionSet optionSet; final boolean isSyntax; - final int requiredArgs; + int requiredArgs; Reporter reporter = Reporters.DEFAULT; String fakeRoot = null; + String schemaDirectoryPath = null; try { optionSet = parser.parse(args); @@ -100,13 +109,19 @@ public static void main(final String... args) if (optionSet.has("fakeroot")) fakeRoot = (String) optionSet.valueOf("fakeroot"); + if (optionSet.has(DIRECTORY)) + schemaDirectoryPath = (String) optionSet.valueOf(DIRECTORY); + isSyntax = optionSet.has("syntax"); requiredArgs = isSyntax ? 1 : 2; + // If directory argument is present then there is no other argument expected + requiredArgs = optionSet.has(DIRECTORY) ? 0 : requiredArgs; + @SuppressWarnings("unchecked") final List arguments = (List) optionSet.nonOptionArguments(); - + if (arguments.size() < requiredArgs) { System.err.println("missing arguments"); parser.printHelpOn(System.err); @@ -114,8 +129,23 @@ public static void main(final String... args) } final List files = Lists.newArrayList(); - for (final String target: arguments) - files.add(new File(target).getCanonicalFile()); + + if (schemaDirectoryPath != null) { + + File directory = new File(schemaDirectoryPath); + if(!directory.isDirectory()) { + System.err.println(String.format("Given directory path(%s) is not a directory", + schemaDirectoryPath)); + parser.printHelpOn(System.err); + System.exit(CMD_ERROR.get()); + } else { + files.addAll(getFilesFromGivenDirectory(directory)); + } + + } else { + for (final String target: arguments) + files.add(new File(target).getCanonicalFile()); + } if (optionSet.has("brief")) reporter = Reporters.BRIEF; @@ -143,6 +173,24 @@ else if (optionSet.has("quiet")) { syntaxValidator = factory.getSyntaxValidator(); } + private static List getFilesFromGivenDirectory(File directory) + throws IOException { + List files = new ArrayList(); + Queue queue = new LinkedList(); + queue.offer(directory); + while(!queue.isEmpty()) { + File tempDirectory = queue.poll(); + for(File entry : tempDirectory.listFiles()) { + if(entry.isFile()) { + files.add(entry.getCanonicalFile()); + } else { + queue.offer(entry); + } + } + } + return files; + } + private void proceed(final Reporter reporter, final List files, final boolean isSyntax) throws IOException, ProcessingException