From c27872de9482236f2bc2040446c59b1cec09bc2d Mon Sep 17 00:00:00 2001 From: Emmanuel Bigeon Date: Mon, 5 Dec 2016 19:21:11 -0500 Subject: [PATCH] Added parameters parsing exception rather than boolean Signed-off-by: Emmanuel Bigeon --- .../fr/bigeon/gclc/ConsoleApplication.java | 4 +- .../gclc/command/CommandParameters.java | 12 +- .../gclc/command/ParametrizedCommand.java | 8 +- .../gclc/command/CommandParametersTest.java | 173 ++++++++++++------ 4 files changed, 136 insertions(+), 61 deletions(-) diff --git a/gclc/src/main/java/fr/bigeon/gclc/ConsoleApplication.java b/gclc/src/main/java/fr/bigeon/gclc/ConsoleApplication.java index 638e5cd..0c00335 100644 --- a/gclc/src/main/java/fr/bigeon/gclc/ConsoleApplication.java +++ b/gclc/src/main/java/fr/bigeon/gclc/ConsoleApplication.java @@ -148,7 +148,7 @@ public class ConsoleApplication implements ICommandProvider { args = GCLCConstants.splitCommand(cmd); } catch (CommandParsingException e1) { manager.println("Command line cannot be parsed"); //$NON-NLS-1$ - LOGGER.log(Level.INFO, "Invalid user command " + cmd, e1); //$NON-NLS-1$ + LOGGER.log(Level.FINE, "Invalid user command " + cmd, e1); //$NON-NLS-1$ return; } if (!args.isEmpty()) { @@ -156,7 +156,7 @@ public class ConsoleApplication implements ICommandProvider { executeSub(args.get(0), Arrays.copyOfRange( args.toArray(new String[0]), 1, args.size())); } catch (final CommandRunException e) { - LOGGER.log(Level.WARNING, "Command failed: " + cmd, e); //$NON-NLS-1$ + LOGGER.log(Level.FINE, "Command failed: " + cmd, e); //$NON-NLS-1$ manager.println(Messages .getString("ConsoleApplication.cmd.failed", cmd)); //$NON-NLS-1$ manager.println(e.getLocalizedMessage()); diff --git a/gclc/src/main/java/fr/bigeon/gclc/command/CommandParameters.java b/gclc/src/main/java/fr/bigeon/gclc/command/CommandParameters.java index d30f3d2..f2b9cec 100644 --- a/gclc/src/main/java/fr/bigeon/gclc/command/CommandParameters.java +++ b/gclc/src/main/java/fr/bigeon/gclc/command/CommandParameters.java @@ -45,6 +45,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import fr.bigeon.gclc.exception.CommandParsingException; + /**

* An object representing a collection of parameters. It is used for defaulting * values. @@ -98,8 +100,8 @@ public class CommandParameters { } /** @param args the arguments to parse - * @return if the arguments were parsed */ - public boolean parseArgs(String... args) { + * @throws CommandParsingException if the arguments parsing failed */ + public void parseArgs(String... args) throws CommandParsingException { int i = 0; while (i < args.length) { String next = null; @@ -108,11 +110,11 @@ public class CommandParameters { } int p = parseArg(args[i], next); if (p == 0) { - return false; + throw new CommandParsingException( + "Invalid parameter " + args[i]); } i += p; } - return true; } @@ -126,7 +128,7 @@ public class CommandParameters { * @return the number of element read */ private int parseArg(String arg, String next) { if (!arg.startsWith("-")) { //$NON-NLS-1$ - return 1; + return strict ? 0 : 1; } String name = arg.substring(1); if (booleanArguments.containsKey(name)) { diff --git a/gclc/src/main/java/fr/bigeon/gclc/command/ParametrizedCommand.java b/gclc/src/main/java/fr/bigeon/gclc/command/ParametrizedCommand.java index 4312dd1..2e96de7 100644 --- a/gclc/src/main/java/fr/bigeon/gclc/command/ParametrizedCommand.java +++ b/gclc/src/main/java/fr/bigeon/gclc/command/ParametrizedCommand.java @@ -48,6 +48,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import fr.bigeon.gclc.exception.CommandParsingException; import fr.bigeon.gclc.exception.CommandRunException; import fr.bigeon.gclc.exception.CommandRunExceptionType; import fr.bigeon.gclc.exception.InvalidParameterException; @@ -165,10 +166,11 @@ public abstract class ParametrizedCommand extends Command { public final void execute(String... args) throws CommandRunException { final CommandParameters parameters = new CommandParameters( boolParams, stringParams.keySet(), strict); - if (!parameters.parseArgs(args)) { - // the parameters could not be correctly parsed + try { + parameters.parseArgs(args); + } catch (CommandParsingException e) { throw new CommandRunException(CommandRunExceptionType.USAGE, - "Unable to read arguments", this); //$NON-NLS-1$ + "Unable to read arguments", e, this); //$NON-NLS-1$ } final List toProvide = new ArrayList<>(); for (final Entry string : params.entrySet()) { diff --git a/gclc/src/test/java/fr/bigeon/gclc/command/CommandParametersTest.java b/gclc/src/test/java/fr/bigeon/gclc/command/CommandParametersTest.java index b60602d..4b08f11 100644 --- a/gclc/src/test/java/fr/bigeon/gclc/command/CommandParametersTest.java +++ b/gclc/src/test/java/fr/bigeon/gclc/command/CommandParametersTest.java @@ -40,45 +40,54 @@ package fr.bigeon.gclc.command; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.util.HashSet; import java.util.Set; import org.junit.Test; -/** - *

+import fr.bigeon.gclc.exception.CommandParsingException; + +/**

* TODO * - * @author Emmanuel Bigeon - * - */ + * @author Emmanuel Bigeon */ @SuppressWarnings({"static-method", "nls"}) public class CommandParametersTest { - /** - * Test method for {@link fr.bigeon.gclc.command.CommandParameters#CommandParameters(java.util.Set, java.util.Set, boolean)}. - */ + /** Test method for + * {@link fr.bigeon.gclc.command.CommandParameters#CommandParameters(java.util.Set, java.util.Set, boolean)}. */ @Test - public final void testCommandParameters(){ + public final void testCommandParameters() { Set strings = new HashSet<>(); Set bools = new HashSet<>(); CommandParameters parameters = new CommandParameters(bools, strings, true); - assertFalse(parameters.parseArgs("-ungivenFlag")); + try { + parameters.parseArgs("-ungivenFlag"); + fail("parse of unknown in strict should fail"); + } catch (CommandParsingException e) { + assertNotNull(e); + } parameters = new CommandParameters(bools, strings, false); - assertTrue(parameters.parseArgs("-ungivenFlag")); + try { + parameters.parseArgs("-ungivenFlag"); + } catch (CommandParsingException e) { + fail("parse of unknown in non strict should suceed"); + assertNull(e); + } } - /** - * Test method for {@link fr.bigeon.gclc.command.CommandParameters#get(java.lang.String)}. - */ + /** Test method for + * {@link fr.bigeon.gclc.command.CommandParameters#get(java.lang.String)}. */ @Test - public final void testGet(){ + public final void testGet() { Set strings = new HashSet<>(); Set bools = new HashSet<>(); @@ -91,24 +100,35 @@ public class CommandParametersTest { assertNull(parameters.get("ungiven")); assertNull(parameters.get("str")); - parameters.parseArgs("-ungiven", "val"); + try { + parameters.parseArgs("-ungiven", "val"); + } catch (CommandParsingException e) { + assertNotNull(e); + } assertNull(parameters.get("ungiven")); assertNull(parameters.get("str")); - parameters.parseArgs("-str", "val"); + try { + parameters.parseArgs("-str", "val"); + } catch (CommandParsingException e) { + assertNull(e); + } assertNull(parameters.get("ungiven")); assertEquals("val", parameters.get("str")); - parameters.parseArgs("-ungiven"); + try { + parameters.parseArgs("-ungiven"); + } catch (CommandParsingException e) { + assertNotNull(e); + } assertNull(parameters.get("ungiven")); assertEquals("val", parameters.get("str")); } - /** - * Test method for {@link fr.bigeon.gclc.command.CommandParameters#getAdditionals()}. - */ + /** Test method for + * {@link fr.bigeon.gclc.command.CommandParameters#getAdditionals()}. */ @Test - public final void testGetAdditionals(){ + public final void testGetAdditionals() { Set strings = new HashSet<>(); Set bools = new HashSet<>(); @@ -118,27 +138,42 @@ public class CommandParametersTest { CommandParameters parameters = new CommandParameters(bools, strings, true); - parameters.parseArgs("-boolFlag"); + try { + parameters.parseArgs("-boolFlag"); + } catch (CommandParsingException e) { + assertNull(e); + } assertTrue(parameters.getAdditionals().isEmpty()); - parameters.parseArgs("-ungiven"); + try { + parameters.parseArgs("-ungiven"); + } catch (CommandParsingException e) { + assertNotNull(e); + } assertTrue(parameters.getAdditionals().isEmpty()); parameters = new CommandParameters(bools, strings, false); - parameters.parseArgs("-boolFlag"); + try { + parameters.parseArgs("-boolFlag"); + } catch (CommandParsingException e) { + assertNull(e); + } assertTrue(parameters.getAdditionals().isEmpty()); - parameters.parseArgs("-ungiven"); + try { + parameters.parseArgs("-ungiven"); + } catch (CommandParsingException e) { + assertNotNull(e); + } assertTrue(parameters.getAdditionals().contains("ungiven")); assertEquals(1, parameters.getAdditionals().size()); } - /** - * Test method for {@link fr.bigeon.gclc.command.CommandParameters#getBool(java.lang.String)}. - */ + /** Test method for + * {@link fr.bigeon.gclc.command.CommandParameters#getBool(java.lang.String)}. */ @Test - public final void testGetBool(){ + public final void testGetBool() { Set strings = new HashSet<>(); Set bools = new HashSet<>(); @@ -151,11 +186,20 @@ public class CommandParametersTest { assertFalse(parameters.getBool("ungiven")); assertFalse(parameters.getBool("boolFlag")); - parameters.parseArgs("-boolFlag"); + try { + parameters.parseArgs("-boolFlag"); + } catch (CommandParsingException e) { + assertNull(e); + } assertTrue(parameters.getBool("boolFlag")); assertFalse(parameters.getBool("ungiven")); - parameters.parseArgs("-ungiven"); + try { + parameters.parseArgs("-ungiven"); + fail("unknown parameter should fail"); + } catch (CommandParsingException e) { + assertNotNull(e); + } assertFalse(parameters.getBool("ungiven")); assertTrue(parameters.getBool("boolFlag")); @@ -164,20 +208,27 @@ public class CommandParametersTest { assertFalse(parameters.getBool("ungiven")); assertFalse(parameters.getBool("boolFlag")); - parameters.parseArgs("-boolFlag"); + try { + parameters.parseArgs("-boolFlag"); + } catch (CommandParsingException e) { + assertNull(e); + } assertTrue(parameters.getBool("boolFlag")); assertFalse(parameters.getBool("ungiven")); - parameters.parseArgs("-ungiven"); + try { + parameters.parseArgs("-ungiven"); + } catch (CommandParsingException e) { + assertNull(e); + } assertFalse(parameters.getBool("ungiven")); assertTrue(parameters.getBool("boolFlag")); } - /** - * Test method for {@link fr.bigeon.gclc.command.CommandParameters#parseArgs(java.lang.String[])}. - */ + /** Test method for + * {@link fr.bigeon.gclc.command.CommandParameters#parseArgs(java.lang.String[])}. */ @Test - public final void testParseArgs(){ + public final void testParseArgs() { Set strings = new HashSet<>(); Set bools = new HashSet<>(); @@ -187,19 +238,40 @@ public class CommandParametersTest { CommandParameters parameters = new CommandParameters(bools, strings, true); - assertFalse(parameters.parseArgs("-ungivenFlag")); - assertFalse(parameters.parseArgs("-str")); - assertTrue(parameters.parseArgs("-boolFlag")); - assertTrue(parameters.parseArgs("-str", "-boolFlag")); - assertTrue(parameters.parseArgs("-boolFlag", "-str", "val")); + try { + parameters.parseArgs("-ungivenFlag"); + fail("unknown argument should fail in strict"); + } catch (CommandParsingException e) { + assertNotNull(e); + } + try { + parameters.parseArgs("-str"); + fail("missing string argument value should fail"); + } catch (CommandParsingException e) { + assertNotNull(e); + } + try { + parameters.parseArgs("-boolFlag"); + } catch (CommandParsingException e) { + assertNull(e); + } + try { + parameters.parseArgs("-str", "-boolFlag"); + } catch (CommandParsingException e) { + assertNull(e); + } + try { + parameters.parseArgs("-boolFlag", "-str", "val"); + } catch (CommandParsingException e) { + assertNull(e); + } } - /** - * Test method for {@link fr.bigeon.gclc.command.CommandParameters#set(java.lang.String, boolean)}. - */ + /** Test method for + * {@link fr.bigeon.gclc.command.CommandParameters#set(java.lang.String, boolean)}. */ @Test - public final void testSetStringBoolean(){ + public final void testSetStringBoolean() { Set strings = new HashSet<>(); Set bools = new HashSet<>(); @@ -234,11 +306,10 @@ public class CommandParametersTest { assertTrue(parameters.getBool("boolFlag")); } - /** - * Test method for {@link fr.bigeon.gclc.command.CommandParameters#set(java.lang.String, java.lang.String)}. - */ + /** Test method for + * {@link fr.bigeon.gclc.command.CommandParameters#set(java.lang.String, java.lang.String)}. */ @Test - public final void testSetStringString(){ + public final void testSetStringString() { Set strings = new HashSet<>(); Set bools = new HashSet<>();