You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by ma...@apache.org on 2015/10/14 15:11:02 UTC

[1/5] syncope git commit: Fixed SYNCOPE-584

Repository: syncope
Updated Branches:
  refs/heads/master 958919948 -> 7642af97c


Fixed SYNCOPE-584


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/87ad9977
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/87ad9977
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/87ad9977

Branch: refs/heads/master
Commit: 87ad997748fa7197584463e2aabcb7745f89f5b0
Parents: 9589199
Author: massi <ma...@tirasa.net>
Authored: Wed Oct 14 15:09:37 2015 +0200
Committer: massi <ma...@tirasa.net>
Committed: Wed Oct 14 15:09:37 2015 +0200

----------------------------------------------------------------------
 .../client/cli/commands/LoggerCommand.java      | 339 ++++++++++++-------
 1 file changed, 225 insertions(+), 114 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/87ad9977/client/cli/src/main/java/org/apache/syncope/client/cli/commands/LoggerCommand.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/LoggerCommand.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/LoggerCommand.java
index 469e68a..00f12b1 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/LoggerCommand.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/LoggerCommand.java
@@ -18,13 +18,12 @@
  */
 package org.apache.syncope.client.cli.commands;
 
-import com.beust.jcommander.DynamicParameter;
-import com.beust.jcommander.Parameter;
-import com.beust.jcommander.Parameters;
-import java.util.HashMap;
-import java.util.Map;
+import javax.xml.ws.WebServiceException;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.cli.Command;
+import org.apache.syncope.client.cli.Input;
 import org.apache.syncope.client.cli.SyncopeServices;
+import org.apache.syncope.client.cli.messages.UsageMessages;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.LoggerTO;
 import org.apache.syncope.common.lib.types.LoggerLevel;
@@ -33,135 +32,247 @@ import org.apache.syncope.common.rest.api.service.LoggerService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Parameters(
-        commandNames = "logger",
-        optionPrefixes = "-",
-        separators = "=",
-        commandDescription = "Apache Syncope logger service")
+@Command(name = "logger")
 public class LoggerCommand extends AbstractCommand {
 
     private static final Logger LOG = LoggerFactory.getLogger(LoggerCommand.class);
 
-    private final String helpMessage = "Usage: logger [options]\n"
+    private static final String HELP_MESSAGE = "Usage: logger [options]\n"
             + "  Options:\n"
-            + "    -h, --help \n"
-            + "    -l, --list \n"
-            + "    -r, --read \n"
-            + "       Syntax: -r={LOG-NAME} \n"
-            + "    -u, --update \n"
-            + "       Syntax: {LOG-NAME}={LOG-LEVEL} \n"
-            + "    -ua, --update-all \n"
-            + "       Syntax: -ua={LOG-LEVEL} \n"
-            + "    -c, --create \n"
-            + "       Syntax: {LOG-NAME}={LOG-LEVEL} \n"
-            + "    -d, --delete \n"
-            + "       Syntax: -d={LOG-NAME}";
-
-    @Parameter(names = { "-r", "--read" })
-    private String logNameToRead;
-
-    @DynamicParameter(names = { "-u", "--update" })
-    private final Map<String, String> updateLogs = new HashMap<String, String>();
-
-    @Parameter(names = { "-ua", "--update-all" })
-    private String logLevel;
-
-    @DynamicParameter(names = { "-c", "--create" })
-    private final Map<String, String> createLogs = new HashMap<String, String>();
-
-    @Parameter(names = { "-d", "--delete" })
-    private String logNameToDelete;
+            + "    --help \n"
+            + "    --list \n"
+            + "    --read \n"
+            + "       Syntax: --read {LOG-NAME} {LOG-NAME} [...]\n"
+            + "    --update \n"
+            + "       Syntax: --update {LOG-NAME}={LOG-LEVEL} {LOG-NAME}={LOG-LEVEL} [...]\n"
+            + "    --update-all \n"
+            + "       Syntax: --update-all {LOG-LEVEL} \n"
+            + "    --create \n"
+            + "       Syntax: --create {LOG-NAME}={LOG-LEVEL} {LOG-NAME}={LOG-LEVEL} [...]\n"
+            + "    --delete \n"
+            + "       Syntax: --delete {LOG-NAME} {LOG-NAME} [...]";
 
     @Override
-    public void execute() {
-        final LoggerService loggerService = SyncopeServices.get(LoggerService.class);
+    public void execute(final Input input) {
+        LOG.debug("Option: {}", input.getOption());
+        LOG.debug("Parameters:");
+        for (final String parameter : input.getParameters()) {
+            LOG.debug("   > " + parameter);
+        }
 
-        LOG.debug("Logger service successfully created");
+        final String[] parameters = input.getParameters();
 
-        if (help) {
-            LOG.debug("- logger help command");
-            System.out.println(helpMessage);
-        } else if (list) {
-            LOG.debug("- logger list command");
-            try {
-                for (final LoggerTO loggerTO : loggerService.list(LoggerType.LOG)) {
-                    System.out.println(" - " + loggerTO.getKey() + " -> " + loggerTO.getLevel());
-                }
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (StringUtils.isNotBlank(logNameToRead)) {
-            LOG.debug("- logger read {} command", logNameToRead);
-            try {
-                final LoggerTO loggerTO = loggerService.read(LoggerType.LOG, logNameToRead);
-                System.out.println(" - Logger " + loggerTO.getKey() + " with level -> " + loggerTO.getLevel());
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (!updateLogs.isEmpty()) {
-            LOG.debug("- logger update command with params {}", updateLogs);
+        if (StringUtils.isBlank(input.getOption())) {
+            input.setOption(Options.HELP.getOptionName());
+        }
 
-            for (final Map.Entry<String, String> log : updateLogs.entrySet()) {
-                final LoggerTO loggerTO = loggerService.read(LoggerType.LOG, log.getKey());
+        final LoggerService loggerService = SyncopeServices.get(LoggerService.class);
+        switch (Options.fromName(input.getOption())) {
+            case LIST:
                 try {
-                    loggerTO.setLevel(LoggerLevel.valueOf(log.getValue()));
-                    loggerService.update(LoggerType.LOG, loggerTO);
-                    System.out.println(" - Logger " + loggerTO.getKey() + " new level -> " + loggerTO.getLevel());
+                    System.out.println("\n");
+                    for (final LoggerTO loggerTO : loggerService.list(LoggerType.LOG)) {
+                        System.out.println(" - " + loggerTO.getKey() + " -> " + loggerTO.getLevel());
+                        System.out.println("");
+                    }
                 } catch (final SyncopeClientException ex) {
-                    System.out.println(" - Error: " + ex.getMessage());
-                } catch (final IllegalArgumentException ex) {
-                    System.out.println(" - Error: " + log.getValue() + " isn't a valid logger level, try with:");
-                    for (final LoggerLevel level : LoggerLevel.values()) {
-                        System.out.println("  *** " + level.name());
+                    UsageMessages.printErrorMessage("Error: " + ex.getMessage());
+                }
+                break;
+            case READ:
+                final String readErrorMessage = UsageMessages.optionCommandMessage(
+                        "logger --read {LOG-NAME} {LOG-NAME} [...]");
+                if (parameters.length >= 1) {
+                    for (final String parameter : parameters) {
+                        try {
+                            final LoggerTO loggerTO = loggerService.read(LoggerType.LOG, parameter);
+                            System.out.println("\n - Logger");
+                            System.out.println("   - key: " + loggerTO.getKey());
+                            System.out.println("   - level: " + loggerTO.getLevel());
+                            System.out.println("");
+                        } catch (final SyncopeClientException | WebServiceException ex) {
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                UsageMessages.printErrorMessage(
+                                        "Logger " + parameter + " doesn't exist!");
+                            } else {
+                                UsageMessages.printErrorMessage("Error: " + ex.getMessage());
+                            }
+                        }
                     }
+                } else {
+                    System.out.println(readErrorMessage);
                 }
-            }
-        } else if (StringUtils.isNotBlank(logLevel)) {
-            LOG.debug("- logger update all command with level {}", logLevel);
-            for (final LoggerTO loggerTO : loggerService.list(LoggerType.LOG)) {
-                try {
-                    loggerTO.setLevel(LoggerLevel.valueOf(logLevel));
-                    loggerService.update(LoggerType.LOG, loggerTO);
-                    System.out.println(" - Logger " + loggerTO.getKey() + " new level -> " + loggerTO.getLevel());
-                } catch (final SyncopeClientException ex) {
-                    System.out.println(" - Error: " + ex.getMessage());
-                } catch (final IllegalArgumentException ex) {
-                    System.out.println(" - Error: " + loggerTO.getLevel() + " isn't a valid logger level, try with:");
-                    for (final LoggerLevel level : LoggerLevel.values()) {
-                        System.out.println("  *** " + level.name());
+                break;
+            case UPDATE:
+                final String updateErrorMessage = UsageMessages.optionCommandMessage(
+                        "logger --update {LOG-NAME}={LOG-LEVEL} {LOG-NAME}={LOG-LEVEL} [...]");
+
+                if (parameters.length >= 1) {
+                    Input.PairParameter pairParameter = null;
+                    for (final String parameter : parameters) {
+                        try {
+                            pairParameter = input.toPairParameter(parameter);
+                            final LoggerTO loggerTO = loggerService.read(LoggerType.LOG, pairParameter.getKey());
+                            loggerTO.setLevel(LoggerLevel.valueOf(pairParameter.getValue()));
+                            loggerService.update(LoggerType.LOG, loggerTO);
+                            System.out.
+                                    println("\n - Logger " + loggerTO.getKey() + " updated");
+                            System.out.println("   - new level: " + loggerTO.getLevel());
+                            System.out.println("");
+                        } catch (final WebServiceException | SyncopeClientException | IllegalArgumentException ex) {
+                            if (ex.getMessage().startsWith("No enum constant org.apache.syncope.common.lib.types.")) {
+                                UsageMessages.printErrorMessage(ex.getMessage());
+                                System.out.println("Try with:");
+                                for (final LoggerLevel level : LoggerLevel.values()) {
+                                    System.out.println("  *** " + level.name());
+                                }
+                                System.out.println("");
+                            } else if ("Parameter syntax error!".equalsIgnoreCase(ex.getMessage())) {
+                                UsageMessages.printErrorMessage(ex.getMessage(), updateErrorMessage);
+                            } else if (ex.getMessage().startsWith("NotFound")) {
+                                UsageMessages.printErrorMessage(
+                                        "Logger " + pairParameter.getKey() + " doesn't exists!");
+                            } else {
+                                UsageMessages.printErrorMessage(ex.getMessage(), updateErrorMessage);
+                            }
+                            break;
+                        }
                     }
+                } else {
+                    System.out.println(updateErrorMessage);
                 }
-            }
-        } else if (!createLogs.isEmpty()) {
-            LOG.debug("- logger create command with params {}", createLogs);
+                break;
+            case UPDATE_ALL:
+                final String updateAllErrorMessage = UsageMessages.optionCommandMessage(
+                        "logger --update-all {LOG-LEVEL}");
 
-            for (final Map.Entry<String, String> entrySet : createLogs.entrySet()) {
-                final LoggerTO loggerTO = new LoggerTO();
-                try {
-                    loggerTO.setKey(entrySet.getKey());
-                    loggerTO.setLevel(LoggerLevel.valueOf(entrySet.getValue()));
-                    loggerService.update(LoggerType.LOG, loggerTO);
-                    System.out.println(" - Logger " + loggerTO.getKey() + " created with level -> " + loggerTO.
-                            getLevel());
-                } catch (final SyncopeClientException ex) {
-                    System.out.println(" - Error: " + ex.getMessage());
-                } catch (final IllegalArgumentException ex) {
-                    System.out.println(" - Error: " + loggerTO.getLevel() + " isn't a valid logger level, try with:");
-                    for (final LoggerLevel level : LoggerLevel.values()) {
-                        System.out.println("  *** " + level.name());
+                if (parameters.length == 1) {
+                    for (final LoggerTO loggerTO : loggerService.list(LoggerType.LOG)) {
+                        try {
+                            loggerTO.setLevel(LoggerLevel.valueOf(parameters[0]));
+                            loggerService.update(LoggerType.LOG, loggerTO);
+                            System.out.
+                                    println("\n - Logger " + loggerTO.getKey() + " updated");
+                            System.out.println("   - new level: " + loggerTO.getLevel());
+                            System.out.println("");
+                        } catch (final WebServiceException | SyncopeClientException | IllegalArgumentException ex) {
+                            if (ex.getMessage().startsWith("No enum constant org.apache.syncope.common.lib.types.")) {
+                                UsageMessages.printErrorMessage(ex.getMessage());
+                                System.out.println("Try with:");
+                                for (final LoggerLevel level : LoggerLevel.values()) {
+                                    System.out.println("  *** " + level.name());
+                                }
+                                System.out.println("");
+                            } else {
+                                UsageMessages.printErrorMessage(ex.getMessage(), updateAllErrorMessage);
+                            }
+                            break;
+                        }
                     }
+                } else {
+                    System.out.println(updateAllErrorMessage);
+                }
+                break;
+            case CREATE:
+                final String createErrorMessage = UsageMessages.optionCommandMessage(
+                        "logger --create {LOG-NAME}={LOG-LEVEL} {LOG-NAME}={LOG-LEVEL} [...]");
+
+                if (parameters.length >= 1) {
+                    Input.PairParameter pairParameter;
+                    LoggerTO loggerTO;
+                    for (final String parameter : parameters) {
+                        loggerTO = new LoggerTO();
+                        try {
+                            pairParameter = input.toPairParameter(parameter);
+                            loggerTO.setKey(pairParameter.getKey());
+                            loggerTO.setLevel(LoggerLevel.valueOf(pairParameter.getValue()));
+                            loggerService.update(LoggerType.LOG, loggerTO);
+                            System.out.
+                                    println("\n - Logger " + loggerTO.getKey() + " updated");
+                            System.out.println("   - level: " + loggerTO.getLevel());
+                            System.out.println("");
+                        } catch (final WebServiceException | SyncopeClientException | IllegalArgumentException ex) {
+                            if (ex.getMessage().startsWith("No enum constant org.apache.syncope.common.lib.types.")) {
+                                UsageMessages.printErrorMessage(ex.getMessage());
+                                System.out.println("Try with:");
+                                for (final LoggerLevel level : LoggerLevel.values()) {
+                                    System.out.println("  *** " + level.name());
+                                }
+                                System.out.println("");
+                            } else if ("Parameter syntax error!".equalsIgnoreCase(ex.getMessage())) {
+                                UsageMessages.printErrorMessage(ex.getMessage(), createErrorMessage);
+                            }
+                            break;
+                        }
+                    }
+                } else {
+                    System.out.println(createErrorMessage);
+                }
+                break;
+            case DELETE:
+                final String deleteErrorMessage = UsageMessages.optionCommandMessage(
+                        "logger --delete {LOG-NAME} {LOG-NAME} [...]");
+
+                if (parameters.length >= 1) {
+                    for (final String parameter : parameters) {
+                        try {
+                            loggerService.delete(LoggerType.LOG, parameter);
+                            System.out.println("\n - Logger " + parameter + " deleted!\n");
+                        } catch (final WebServiceException | SyncopeClientException ex) {
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                UsageMessages.printErrorMessage(
+                                        "Logger " + parameter + " doesn't exists!");
+                            } else {
+                                UsageMessages.printErrorMessage(ex.getMessage());
+                            }
+                        }
+                    }
+                } else {
+                    System.out.println(deleteErrorMessage);
+                }
+                break;
+            case HELP:
+                System.out.println(HELP_MESSAGE);
+                break;
+            default:
+                System.out.println(input.getOption() + " is not a valid option.");
+                System.out.println("");
+                System.out.println(HELP_MESSAGE);
+        }
+    }
+
+    private enum Options {
+
+        HELP("--help"),
+        LIST("--list"),
+        READ("--read"),
+        UPDATE("--update"),
+        UPDATE_ALL("--update-all"),
+        CREATE("--create"),
+        DELETE("--delete");
+
+        private final String optionName;
+
+        private Options(final String optionName) {
+            this.optionName = optionName;
+        }
+
+        public String getOptionName() {
+            return optionName;
+        }
+
+        public boolean equalsOptionName(final String otherName) {
+            return (otherName == null) ? false : optionName.equals(otherName);
+        }
+
+        public static Options fromName(final String name) {
+            Options optionToReturn = HELP;
+            for (final Options option : Options.values()) {
+                if (option.equalsOptionName(name)) {
+                    optionToReturn = option;
                 }
             }
-        } else if (StringUtils.isNotBlank(logNameToDelete)) {
-            try {
-                LOG.debug("- logger delete {} command", logNameToDelete);
-                loggerService.delete(LoggerType.LOG, logNameToDelete);
-                System.out.println(" - Logger " + logNameToDelete + " deleted!");
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else {
-            System.out.println(helpMessage);
+            return optionToReturn;
         }
     }
 


[2/5] syncope git commit: Fixed SYNCOPE-585

Posted by ma...@apache.org.
Fixed SYNCOPE-585


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/237f90f1
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/237f90f1
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/237f90f1

Branch: refs/heads/master
Commit: 237f90f12a852497afef707d74aea864e0cc5e91
Parents: 87ad997
Author: massi <ma...@tirasa.net>
Authored: Wed Oct 14 15:10:01 2015 +0200
Committer: massi <ma...@tirasa.net>
Committed: Wed Oct 14 15:10:01 2015 +0200

----------------------------------------------------------------------
 .../cli/commands/NotificationCommand.java       | 163 +++++++++++++------
 1 file changed, 115 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/237f90f1/client/cli/src/main/java/org/apache/syncope/client/cli/commands/NotificationCommand.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/NotificationCommand.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/NotificationCommand.java
index 473ebdc..9028617 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/NotificationCommand.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/NotificationCommand.java
@@ -18,74 +18,141 @@
  */
 package org.apache.syncope.client.cli.commands;
 
-import com.beust.jcommander.Parameter;
-import com.beust.jcommander.Parameters;
+import javax.xml.ws.WebServiceException;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.cli.Command;
+import org.apache.syncope.client.cli.Input;
 import org.apache.syncope.client.cli.SyncopeServices;
+import org.apache.syncope.client.cli.messages.UsageMessages;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.NotificationTO;
 import org.apache.syncope.common.rest.api.service.NotificationService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Parameters(
-        commandNames = "notification",
-        optionPrefixes = "-",
-        separators = "=",
-        commandDescription = "Apache Syncope notification service")
+@Command(name = "notification")
 public class NotificationCommand extends AbstractCommand {
 
     private static final Logger LOG = LoggerFactory.getLogger(NotificationCommand.class);
 
-    private final String helpMessage = "Usage: notification [options]\n"
+    private static final String HELP_MESSAGE = "Usage: notification [options]\n"
             + "  Options:\n"
-            + "    -h, --help \n"
-            + "    -l, --list \n"
-            + "    -r, --read \n"
-            + "       Syntax: -r={NOTIFICATION-ID} \n"
-            + "    -d, --delete \n"
-            + "       Syntax: -d={NOTIFICATION-ID}";
+            + "    --help \n"
+            + "    --list \n"
+            + "    --read \n"
+            + "       Syntax: --read {NOTIFICATION-ID} \n"
+            + "    --delete \n"
+            + "       Syntax: --delete {NOTIFICATION-ID}";
 
-    @Parameter(names = { "-r", "--read" })
-    private Long notificationIdToRead = -1L;
+    @Override
+    public void execute(final Input input) {
+        LOG.debug("Option: {}", input.getOption());
+        LOG.debug("Parameters:");
+        for (final String parameter : input.getParameters()) {
+            LOG.debug("   > " + parameter);
+        }
 
-    @Parameter(names = { "-d", "--delete" })
-    private Long notificationIdToDelete = -1L;
+        final String[] parameters = input.getParameters();
+
+        if (StringUtils.isBlank(input.getOption())) {
+            input.setOption(Options.HELP.getOptionName());
+        }
 
-    @Override
-    public void execute() {
         final NotificationService notificationService = SyncopeServices.get(NotificationService.class);
+        switch (Options.fromName(input.getOption())) {
+            case LIST:
+                try {
+                    for (final NotificationTO notificationTO : notificationService.list()) {
+                        System.out.println(notificationTO);
+                    }
+                } catch (final SyncopeClientException ex) {
+                    UsageMessages.printErrorMessage(ex.getMessage());
+                }
+                break;
+            case READ:
+                final String readErrorMessage = UsageMessages.optionCommandMessage(
+                        "notification --read {NOTIFICATION-ID} {NOTIFICATION-ID} [...]");
+                if (parameters.length >= 1) {
+                    for (final String parameter : parameters) {
+                        try {
+                            System.out.println(notificationService.read(Long.valueOf(parameter)));
+                        } catch (final NumberFormatException ex) {
+                            System.out.println("Error reading " + parameter + ". It isn't a valid notification id");
+                        } catch (final WebServiceException | SyncopeClientException ex) {
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                UsageMessages.printErrorMessage("Notification " + parameter + " doesn't exists!");
+                            } else {
+                                UsageMessages.printErrorMessage(ex.getMessage());
+                            }
+                        }
+                    }
+                } else {
+                    System.out.println(readErrorMessage);
+                }
+                break;
+            case DELETE:
+                final String deleteErrorMessage = UsageMessages.optionCommandMessage(
+                        "notification --delete {NOTIFICATION-ID} {NOTIFICATION-ID} [...]");
+
+                if (parameters.length >= 1) {
+                    for (final String parameter : parameters) {
+                        try {
+                            notificationService.delete(Long.valueOf(parameter));
+                            System.out.println("\n - Notification " + parameter + " deleted!\n");
+                        } catch (final WebServiceException | SyncopeClientException ex) {
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                UsageMessages.printErrorMessage("Notification " + parameter + " doesn't exists!");
+                            } else {
+                                UsageMessages.printErrorMessage(ex.getMessage());
+                            }
+                        } catch (final NumberFormatException ex) {
+                            UsageMessages.printErrorMessage(
+                                    "Error reading " + parameter + ". It isn't a valid notification id");
+                        }
+                    }
+                } else {
+                    System.out.println(deleteErrorMessage);
+                }
+                break;
+            case HELP:
+                System.out.println(HELP_MESSAGE);
+                break;
+            default:
+                System.out.println(input.getOption() + " is not a valid option.");
+                System.out.println("");
+                System.out.println(HELP_MESSAGE);
+        }
+    }
 
-        LOG.debug("Notification service successfully created");
+    private enum Options {
 
-        if (help) {
-            LOG.debug("- notification help command");
-            System.out.println(helpMessage);
-        } else if (list) {
-            LOG.debug("- notification list command");
-            try {
-                for (final NotificationTO notificationTO : notificationService.list()) {
-                    System.out.println(notificationTO);
+        HELP("--help"),
+        LIST("--list"),
+        READ("--read"),
+        DELETE("--delete");
+
+        private final String optionName;
+
+        private Options(final String optionName) {
+            this.optionName = optionName;
+        }
+
+        public String getOptionName() {
+            return optionName;
+        }
+
+        public boolean equalsOptionName(final String otherName) {
+            return (otherName == null) ? false : optionName.equals(otherName);
+        }
+
+        public static Options fromName(final String name) {
+            Options optionToReturn = HELP;
+            for (final Options option : Options.values()) {
+                if (option.equalsOptionName(name)) {
+                    optionToReturn = option;
                 }
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (notificationIdToRead > -1L) {
-            LOG.debug("- notification read {} command", notificationIdToRead);
-            try {
-                System.out.println(notificationService.read(notificationIdToRead));
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (notificationIdToDelete > -1L) {
-            try {
-                LOG.debug("- notification delete {} command", notificationIdToDelete);
-                notificationService.delete(notificationIdToDelete);
-                System.out.println(" - Notification " + notificationIdToDelete + " deleted!");
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
             }
-        } else {
-            System.out.println(helpMessage);
+            return optionToReturn;
         }
     }
 


[3/5] syncope git commit: Fixed SYNCOPE-586

Posted by ma...@apache.org.
Fixed SYNCOPE-586


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/1483986e
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/1483986e
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/1483986e

Branch: refs/heads/master
Commit: 1483986e37ba33d62be19f8fc3370cd5b79a0d34
Parents: 237f90f
Author: massi <ma...@tirasa.net>
Authored: Wed Oct 14 15:10:16 2015 +0200
Committer: massi <ma...@tirasa.net>
Committed: Wed Oct 14 15:10:16 2015 +0200

----------------------------------------------------------------------
 .../client/cli/commands/PolicyCommand.java      | 193 +++++++++++++------
 1 file changed, 134 insertions(+), 59 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/1483986e/client/cli/src/main/java/org/apache/syncope/client/cli/commands/PolicyCommand.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/PolicyCommand.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/PolicyCommand.java
index ae34f53..d17419f 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/PolicyCommand.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/PolicyCommand.java
@@ -18,10 +18,12 @@
  */
 package org.apache.syncope.client.cli.commands;
 
-import com.beust.jcommander.Parameter;
-import com.beust.jcommander.Parameters;
+import javax.xml.ws.WebServiceException;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.cli.Command;
+import org.apache.syncope.client.cli.Input;
 import org.apache.syncope.client.cli.SyncopeServices;
+import org.apache.syncope.client.cli.messages.UsageMessages;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.policy.AbstractPolicyTO;
 import org.apache.syncope.common.lib.types.PolicyType;
@@ -29,76 +31,149 @@ import org.apache.syncope.common.rest.api.service.PolicyService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Parameters(
-        commandNames = "policy",
-        optionPrefixes = "-",
-        separators = "=",
-        commandDescription = "Apache Syncope policy service")
+@Command(name = "policy")
 public class PolicyCommand extends AbstractCommand {
 
     private static final Logger LOG = LoggerFactory.getLogger(PolicyCommand.class);
 
-    private final String helpMessage = "Usage: policy [options]\n"
+    private static final String HELP_MESSAGE = "Usage: policy [options]\n"
             + "  Options:\n"
-            + "    -h, --help \n"
-            + "    -l, --list \n"
-            + "    -ll, --list-policy \n"
-            + "       Syntax: -ll={POLICY-TYPE} \n"
-            + "    -r, --read \n"
-            + "       Syntax: -r={POLICY-ID} \n"
-            + "    -d, --delete \n"
-            + "       Syntax: -d={POLICY-ID}";
+            + "    --help \n"
+            + "    --list-policy \n"
+            + "       Syntax: --list-policy {POLICY-TYPE} \n"
+            + "          Policy type: ACCOUNT / PASSWORD / SYNC / PUSH\n"
+            + "    --read \n"
+            + "       Syntax: --read {POLICY-ID} {POLICY-ID} [...]\n"
+            + "    --delete \n"
+            + "       Syntax: --delete {POLICY-ID} {POLICY-ID} [...]";
 
-    @Parameter(names = { "-ll", "--list-policy" })
-    private String policyType;
+    @Override
+    public void execute(final Input input) {
+        LOG.debug("Option: {}", input.getOption());
+        LOG.debug("Parameters:");
+        for (final String parameter : input.getParameters()) {
+            LOG.debug("   > " + parameter);
+        }
 
-    @Parameter(names = { "-r", "--read" })
-    private Long policyIdToRead = -1L;
+        final String[] parameters = input.getParameters();
 
-    @Parameter(names = { "-d", "--delete" })
-    private Long policyIdToDelete = -1L;
+        if (StringUtils.isBlank(input.getOption())) {
+            input.setOption(Options.HELP.getOptionName());
+        }
 
-    @Override
-    public void execute() {
         final PolicyService policyService = SyncopeServices.get(PolicyService.class);
-        LOG.debug("Policy service successfully created");
-
-        if (help) {
-            LOG.debug("- policy help command");
-            System.out.println(helpMessage);
-        } else if (list) {
-            // do nothing for the moment...
-        } else if (StringUtils.isNotBlank(policyType)) {
-            LOG.debug("- policy list command for type {}", policyType);
-            try {
-                for (final AbstractPolicyTO policyTO : policyService.list(PolicyType.valueOf(policyType))) {
-                    System.out.println(policyTO);
+        switch (Options.fromName(input.getOption())) {
+            case LIST_POLICY:
+                final String listPolicyErrorMessage = UsageMessages.optionCommandMessage(
+                        "Usage: policy --list-policy {POLICY-TYPE}\n"
+                        + "   Policy type: ACCOUNT / PASSWORD / SYNC / PUSH");
+                if (parameters.length == 1) {
+                    try {
+                        for (final AbstractPolicyTO policyTO : policyService.list(PolicyType.valueOf(parameters[0]))) {
+                            System.out.println(policyTO);
+                        }
+                    } catch (final SyncopeClientException ex) {
+                        UsageMessages.printErrorMessage(ex.getMessage());
+                    } catch (final IllegalArgumentException ex) {
+                        UsageMessages.printErrorMessage(
+                                "Error: " + parameters[0] + " isn't a valid policy type, try with:");
+                        for (final PolicyType type : PolicyType.values()) {
+                            System.out.println("  *** " + type.name());
+                        }
+                        System.out.println("");
+                    }
+                } else {
+                    System.out.println(listPolicyErrorMessage);
                 }
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            } catch (final IllegalArgumentException ex) {
-                System.out.println(" - Error: " + policyType + " isn't a valid policy type, try with:");
-                for (final PolicyType type : PolicyType.values()) {
-                    System.out.println("  *** " + type.name());
+                break;
+            case READ:
+                final String readErrorMessage = UsageMessages.optionCommandMessage(
+                        "Usage: policy --read {POLICY-ID} {POLICY-ID} [...]");
+                if (parameters.length >= 1) {
+                    for (final String parameter : parameters) {
+                        try {
+                            System.out.println(policyService.read(Long.valueOf(parameter)));
+                        } catch (final NumberFormatException ex) {
+                            UsageMessages.printErrorMessage(
+                                    "Error reading " + parameter + ". It isn't a valid policy id");
+                        } catch (final WebServiceException | SyncopeClientException ex) {
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                UsageMessages.printErrorMessage("Policy " + parameter + " doesn't exists!");
+                            } else {
+                                UsageMessages.printErrorMessage(ex.getMessage());
+                            }
+                        }
+                    }
+                } else {
+                    System.out.println(readErrorMessage);
+                }
+                break;
+            case DELETE:
+                final String deleteErrorMessage = UsageMessages.optionCommandMessage(
+                        "Usage: policy --delete {POLICY-ID} {POLICY-ID} [...]");
+
+                if (parameters.length >= 1) {
+                    for (final String parameter : parameters) {
+                        try {
+                            policyService.delete(Long.valueOf(parameter));
+                            System.out.println(" - Policy " + parameter + " deleted!");
+                        } catch (final WebServiceException | SyncopeClientException ex) {
+                            System.out.println("Error:");
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                UsageMessages.printErrorMessage("Policy " + parameter + " doesn't exists!");
+                            } else if (ex.getMessage().startsWith("DataIntegrityViolation")) {
+                                UsageMessages.printErrorMessage("You cannot delete policy " + parameter);
+                            } else {
+                                UsageMessages.printErrorMessage(ex.getMessage());
+                            }
+                        } catch (final NumberFormatException ex) {
+                            UsageMessages.printErrorMessage(
+                                    "Error reading " + parameter + ". It isn't a valid policy id");
+                        }
+                    }
+                } else {
+                    System.out.println(deleteErrorMessage);
+                }
+                break;
+            case HELP:
+                System.out.println(HELP_MESSAGE);
+                break;
+            default:
+                System.out.println(input.getOption() + " is not a valid option.");
+                System.out.println("");
+                System.out.println(HELP_MESSAGE);
+        }
+    }
+
+    private enum Options {
+
+        HELP("--help"),
+        LIST_POLICY("--list-policy"),
+        READ("--read"),
+        DELETE("--delete");
+
+        private final String optionName;
+
+        private Options(final String optionName) {
+            this.optionName = optionName;
+        }
+
+        public String getOptionName() {
+            return optionName;
+        }
+
+        public boolean equalsOptionName(final String otherName) {
+            return (otherName == null) ? false : optionName.equals(otherName);
+        }
+
+        public static Options fromName(final String name) {
+            Options optionToReturn = HELP;
+            for (final Options option : Options.values()) {
+                if (option.equalsOptionName(name)) {
+                    optionToReturn = option;
                 }
             }
-        } else if (policyIdToRead > -1L) {
-            LOG.debug("- policy read {} command", policyIdToRead);
-            try {
-                System.out.println(policyService.read(policyIdToRead));
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (policyIdToDelete > -1L) {
-            try {
-                LOG.debug("- policy delete {} command", policyIdToDelete);
-                policyService.delete(policyIdToDelete);
-                System.out.println(" - Report " + policyIdToDelete + " deleted!");
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else {
-            System.out.println(helpMessage);
+            return optionToReturn;
         }
     }
 


[5/5] syncope git commit: Fixed SYNCOPE-590

Posted by ma...@apache.org.
Fixed SYNCOPE-590


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/7642af97
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/7642af97
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/7642af97

Branch: refs/heads/master
Commit: 7642af97ccdfbd1086be7d1bcea5510235237ebf
Parents: a61c801
Author: massi <ma...@tirasa.net>
Authored: Wed Oct 14 15:10:45 2015 +0200
Committer: massi <ma...@tirasa.net>
Committed: Wed Oct 14 15:10:45 2015 +0200

----------------------------------------------------------------------
 .../client/cli/commands/SchemaCommand.java      | 94 ++++++++++++++++----
 1 file changed, 77 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/7642af97/client/cli/src/main/java/org/apache/syncope/client/cli/commands/SchemaCommand.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/SchemaCommand.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/SchemaCommand.java
index 3671cf0..3c182c7 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/SchemaCommand.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/SchemaCommand.java
@@ -24,6 +24,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.cli.Command;
 import org.apache.syncope.client.cli.Input;
 import org.apache.syncope.client.cli.SyncopeServices;
+import org.apache.syncope.client.cli.messages.UsageMessages;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AbstractSchemaTO;
 import org.apache.syncope.common.lib.to.DerSchemaTO;
@@ -43,6 +44,9 @@ public class SchemaCommand extends AbstractCommand {
             + "  Options:\n"
             + "    --help \n"
             + "    --list-all\n"
+            + "    --list-plain\n"
+            + "    --list-derived\n"
+            + "    --list-virtual\n"
             + "    --list {SCHEMA-TYPE}\n"
             + "       Schema type: PLAIN / DERIVED / VIRTUAL";
 
@@ -63,11 +67,13 @@ public class SchemaCommand extends AbstractCommand {
         final SchemaService schemaService = SyncopeServices.get(SchemaService.class);
         switch (Options.fromName(input.getOption())) {
             case LIST:
-                final String listErrorMessage = "Usage: schema --list {SCHEMA-TYPE}\n"
-                        + "   Schema type: PLAIN / DERIVED / VIRTUAL";
+                final String listErrorMessage = UsageMessages.optionCommandMessage(
+                        "schema --list {SCHEMA-TYPE}\n"
+                        + "   Schema type: PLAIN / DERIVED / VIRTUAL");
                 if (parameters.length == 1) {
                     try {
                         final SchemaType schemaType = SchemaType.valueOf(input.firstParameter());
+                        System.out.println("");
                         for (final AbstractSchemaTO schemaTO : schemaService.list(schemaType)) {
                             switch (schemaType) {
                                 case PLAIN:
@@ -87,14 +93,16 @@ public class SchemaCommand extends AbstractCommand {
                                     break;
                             }
                         }
+                        System.out.println("");
                     } catch (final SyncopeClientException ex) {
-                        System.out.println(" - Error: " + ex.getMessage());
+                        UsageMessages.printErrorMessage(ex.getMessage());
                     } catch (final IllegalArgumentException ex) {
-                        System.out.println(" - Error: " + input.firstParameter()
-                                + " isn't a valid schema type, try with:");
+                        UsageMessages.printErrorMessage(
+                                input.firstParameter() + " isn't a valid schema type, try with:");
                         for (final SchemaType type : SchemaType.values()) {
                             System.out.println("  *** " + type.name());
                         }
+                        System.out.println("");
                     }
                 } else {
                     System.out.println(listErrorMessage);
@@ -103,23 +111,64 @@ public class SchemaCommand extends AbstractCommand {
             case LIST_ALL:
                 try {
                     for (final SchemaType value : SchemaType.values()) {
-                        System.out.println("Schemas for " + value);
+                        System.out.println("");
+                        System.out.println(value + " schemas");
                         for (final AbstractSchemaTO schemaTO : schemaService.list(value)) {
                             System.out.println("   - Name: " + schemaTO.getKey() + " type: "
                                     + schemaTO.getAnyTypeClass());
                         }
+                        System.out.println("");
                     }
                 } catch (final SyncopeClientException | WebServiceException ex) {
-                    System.out.println(" - Error: " + ex.getMessage());
+                    UsageMessages.printErrorMessage(ex.getMessage());
+                }
+                break;
+            case LIST_PLAIN:
+                try {
+                    System.out.println("");
+                    for (final AbstractSchemaTO schemaTO : schemaService.list(SchemaType.PLAIN)) {
+                        System.out.println(" - Schema key: " + ((PlainSchemaTO) schemaTO).getKey());
+                        System.out.println("      type: " + ((PlainSchemaTO) schemaTO).getType());
+                        System.out.println("      is mandatory: "
+                                + ((PlainSchemaTO) schemaTO).getMandatoryCondition());
+                    }
+                    System.out.println("");
+                } catch (final SyncopeClientException | WebServiceException ex) {
+                    UsageMessages.printErrorMessage(ex.getMessage());
+                }
+                break;
+            case LIST_DERIVED:
+                try {
+                    System.out.println("");
+                    for (final AbstractSchemaTO schemaTO : schemaService.list(SchemaType.DERIVED)) {
+                        System.out.println(" - Schema key: " + ((DerSchemaTO) schemaTO).getKey());
+                        System.out.println("      expression: " + ((DerSchemaTO) schemaTO).getExpression());
+                    }
+                    System.out.println("");
+                } catch (final SyncopeClientException | WebServiceException ex) {
+                    UsageMessages.printErrorMessage(ex.getMessage());
+                }
+                break;
+            case LIST_VIRTUAL:
+                try {
+                    System.out.println("");
+                    for (final AbstractSchemaTO schemaTO : schemaService.list(SchemaType.VIRTUAL)) {
+                        System.out.println(" - Schema key: " + ((VirSchemaTO) schemaTO).getKey());
+                    }
+                    System.out.println("");
+                } catch (final SyncopeClientException | WebServiceException ex) {
+                    UsageMessages.printErrorMessage(ex.getMessage());
                 }
                 break;
             case READ:
-                final String readErrorMessage = "Usage: schema --read {SCHEMA-TYPE} {SCHEMA-KEY}\n"
-                        + "   Schema type: PLAIN / DERIVED / VIRTUAL";
+                final String readErrorMessage = UsageMessages.optionCommandMessage(
+                        "schema --read {SCHEMA-TYPE} {SCHEMA-KEY}\n"
+                        + "   Schema type: PLAIN / DERIVED / VIRTUAL");
                 if (parameters.length >= 2) {
                     parameters = Arrays.copyOfRange(parameters, 1, parameters.length);
                     try {
                         final SchemaType schemaType = SchemaType.valueOf(input.firstParameter());
+                        System.out.println("");
                         for (final String parameter : parameters) {
                             final AbstractSchemaTO schemaTO = schemaService.read(schemaType, parameter);
                             switch (schemaType) {
@@ -159,20 +208,24 @@ public class SchemaCommand extends AbstractCommand {
                                 default:
                                     break;
                             }
+                            System.out.println("");
                         }
                     } catch (final SyncopeClientException | WebServiceException ex) {
                         if (ex.getMessage().startsWith("NotFound")) {
-                            System.out.println(" - Schema " + parameters[0] + " doesn't exists!");
+                            UsageMessages.printErrorMessage(
+                                    "Schema " + parameters[0] + " doesn't exists!");
                         } else if (ex.getMessage().startsWith("DataIntegrityViolation")) {
-                            System.out.println(" - You cannot delete schema " + parameters[0]);
+                            UsageMessages.printErrorMessage("You cannot delete schema " + parameters[0]);
                         } else {
-                            System.out.println(ex.getMessage());
+                            UsageMessages.printErrorMessage(ex.getMessage());
                         }
                     } catch (final IllegalArgumentException ex) {
-                        System.out.println(" - Error: " + parameters[0] + " isn't a valid schema type, try with:");
+                        UsageMessages.printErrorMessage(
+                                parameters[0] + " isn't a valid schema type, try with:");
                         for (final SchemaType type : SchemaType.values()) {
                             System.out.println("  *** " + type.name());
                         }
+                        System.out.println("");
                     }
                 } else {
                     System.out.println(readErrorMessage);
@@ -190,17 +243,21 @@ public class SchemaCommand extends AbstractCommand {
                         }
                     } catch (final SyncopeClientException | WebServiceException ex) {
                         if (ex.getMessage().startsWith("NotFound")) {
-                            System.out.println(" - Schema " + parameters[0] + " doesn't exists!");
+                            UsageMessages.printErrorMessage(
+                                    "Schema " + parameters[0] + " doesn't exists!");
                         } else if (ex.getMessage().startsWith("DataIntegrityViolation")) {
-                            System.out.println(" - You cannot delete schema " + parameters[0]);
+                            UsageMessages.printErrorMessage(
+                                    "You cannot delete schema " + parameters[0]);
                         } else {
-                            System.out.println(ex.getMessage());
+                            UsageMessages.printErrorMessage(ex.getMessage());
                         }
                     } catch (final IllegalArgumentException ex) {
-                        System.out.println(" - Error: " + parameters[0] + " isn't a valid schema type, try with:");
+                        UsageMessages.printErrorMessage(
+                                parameters[0] + " isn't a valid schema type, try with:");
                         for (final SchemaType type : SchemaType.values()) {
                             System.out.println("  *** " + type.name());
                         }
+                        System.out.println("");
                     }
                 } else {
                     System.out.println(deleteErrorMessage);
@@ -221,6 +278,9 @@ public class SchemaCommand extends AbstractCommand {
         HELP("--help"),
         LIST("--list"),
         LIST_ALL("--list-all"),
+        LIST_PLAIN("--list-plain"),
+        LIST_DERIVED("--list-derived"),
+        LIST_VIRTUAL("--list-virtual"),
         READ("--read"),
         DELETE("--delete");
 


[4/5] syncope git commit: Fixed SYNCOPE-587

Posted by ma...@apache.org.
Fixed SYNCOPE-587


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/a61c801b
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/a61c801b
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/a61c801b

Branch: refs/heads/master
Commit: a61c801b00b854390b170a964b919de7f98ce2b8
Parents: 1483986
Author: massi <ma...@tirasa.net>
Authored: Wed Oct 14 15:10:29 2015 +0200
Committer: massi <ma...@tirasa.net>
Committed: Wed Oct 14 15:10:29 2015 +0200

----------------------------------------------------------------------
 .../client/cli/commands/ReportCommand.java      | 438 +++++++++++++------
 1 file changed, 308 insertions(+), 130 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/a61c801b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/ReportCommand.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/ReportCommand.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/ReportCommand.java
index def8f50..ffa8ecd 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/ReportCommand.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/ReportCommand.java
@@ -18,162 +18,340 @@
  */
 package org.apache.syncope.client.cli.commands;
 
-import com.beust.jcommander.Parameter;
-import com.beust.jcommander.Parameters;
 import java.io.IOException;
 import java.io.SequenceInputStream;
+import java.util.Arrays;
 import java.util.List;
 import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerConfigurationException;
 import javax.xml.transform.TransformerException;
+import javax.xml.ws.WebServiceException;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.cli.Command;
+import org.apache.syncope.client.cli.Input;
 import org.apache.syncope.client.cli.SyncopeServices;
+import org.apache.syncope.client.cli.messages.UsageMessages;
 import org.apache.syncope.client.cli.util.XMLUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.ReportExecTO;
 import org.apache.syncope.common.lib.to.ReportTO;
+import org.apache.syncope.common.lib.types.JobStatusType;
 import org.apache.syncope.common.lib.types.ReportExecExportFormat;
 import org.apache.syncope.common.rest.api.service.ReportService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.SAXException;
 
-@Parameters(
-        commandNames = "report",
-        optionPrefixes = "-",
-        separators = "=",
-        commandDescription = "Apache Syncope report service")
+@Command(name = "report")
 public class ReportCommand extends AbstractCommand {
 
     private static final Logger LOG = LoggerFactory.getLogger(ReportCommand.class);
 
-    private final String helpMessage = "Usage: report [options]\n"
+    private static final String HELP_MESSAGE = "Usage: report [options]\n"
             + "  Options:\n"
-            + "    -h, --help \n"
-            + "    -l, --list \n"
-            + "    -r, --read \n"
-            + "       Syntax: -r={POLICY-ID} \n"
-            + "    -d, --delete \n"
-            + "       Syntax: -d={POLICY-ID} \n"
-            + "    -e, --execute \n"
-            + "       Syntax: -e={POLICY-ID} \n"
-            + "    -re, --read-executecution \n"
-            + "       Syntax: -re={EXECUTION-ID} \n"
-            + "    -de, --delete-executecution \n"
-            + "       Syntax: -de={EXECUTION-ID} \n"
-            + "    -eer, --export-executecution-result \n"
-            + "       Syntax: -eer={EXECUTION-ID} \n"
-            + "    -rc, --reportlet-class";
-
-    @Parameter(names = { "-r", "--read" })
-    private Long reportIdToRead = -1L;
-
-    @Parameter(names = { "-d", "--delete" })
-    private Long reportIdToDelete = -1L;
-
-    @Parameter(names = { "-e", "--execute" })
-    private Long reportIdToExecute = -1L;
-
-    @Parameter(names = { "-re", "--read-execution" })
-    private Long executionIdToRead = -1L;
-
-    @Parameter(names = { "-de", "--delete-execution" })
-    private Long executionIdToDelete = -1L;
-
-    @Parameter(names = { "-eer", "--export-execution-result" })
-    private Long exportId = -1L;
+            + "    --help \n"
+            + "    --list \n"
+            + "    --read \n"
+            + "       Syntax: --read {REPORT-ID} {REPORT-ID} [...] \n"
+            + "    --delete \n"
+            + "       Syntax: --delete {REPORT-ID} {REPORT-ID} [...]\n"
+            + "    --execute \n"
+            + "       Syntax: --execute {REPORT-ID} \n"
+            + "    --read-execution \n"
+            + "       Syntax: --read-execution {EXECUTION-ID} {EXECUTION-ID} [...]\n"
+            + "    --delete-execution \n"
+            + "       Syntax: --delete-execution {EXECUTION-ID} {EXECUTION-ID} [...]\n"
+            + "    --export-execution-result \n"
+            + "       Syntax: --export-execution-result {EXECUTION-ID} {EXECUTION-ID} [...] {FORMAT}\n"
+            + "          Format: CSV / HTML / PDF / XML / RTF"
+            + "    --reportlet-class";
 
     @Override
-    public void execute() {
+    public void execute(final Input input) {
+        LOG.debug("Option: {}", input.getOption());
+        LOG.debug("Parameters:");
+        for (final String parameter : input.getParameters()) {
+            LOG.debug("   > " + parameter);
+        }
+
+        String[] parameters = input.getParameters();
+
+        if (StringUtils.isBlank(input.getOption())) {
+            input.setOption(Options.HELP.getOptionName());
+        }
+
         final ReportService reportService = SyncopeServices.get(ReportService.class);
-        LOG.debug("Report service successfully created");
-
-        if (help) {
-            LOG.debug("- report help command");
-            System.out.println(helpMessage);
-        } else if (list) {
-            LOG.debug("- report list command");
-            try {
-                for (ReportTO reportTO : reportService.list()) {
-                    System.out.println(reportTO);
+        switch (Options.fromName(input.getOption())) {
+            case LIST:
+                try {
+                    for (final ReportTO reportTO : reportService.list()) {
+                        System.out.println(reportTO);
+                    }
+                } catch (final SyncopeClientException ex) {
+                    UsageMessages.printErrorMessage(ex.getMessage());
                 }
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (reportIdToRead > -1L) {
-            LOG.debug("- report read {} command", reportIdToRead);
-            try {
-                System.out.println(reportService.read(reportIdToRead));
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (reportIdToDelete > -1L) {
-            try {
-                LOG.debug("- report delete {} command", reportIdToDelete);
-                reportService.delete(reportIdToDelete);
-                System.out.println(" - Report " + reportIdToDelete + " deleted!");
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (reportIdToExecute > -1L) {
-            try {
-                LOG.debug("- report execute {} command", reportIdToExecute);
-                reportService.execute(reportIdToExecute);
-                final List<ReportExecTO> executionList = reportService.read(reportIdToExecute).getExecutions();
-                final ReportExecTO lastExecution = executionList.get(executionList.size() - 1);
-                System.out.println(" - Report execution id: " + lastExecution.getKey());
-                System.out.println(" - Report execution status: " + lastExecution.getStatus());
-                System.out.println(" - Report execution start date: " + lastExecution.getStartDate());
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (executionIdToRead > -1L) {
-            try {
-                LOG.debug("- report execution read {} command", executionIdToRead);
-                ReportExecTO reportExecTO = reportService.readExecution(executionIdToRead);
-                System.out.println(" - Report execution id: " + reportExecTO.getKey());
-                System.out.println(" - Report execution status: " + reportExecTO.getStatus());
-                System.out.println(" - Report execution start date: " + reportExecTO.getStartDate());
-                System.out.println(" - Report execution end date: " + reportExecTO.getEndDate());
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (executionIdToDelete > -1L) {
-            try {
-                LOG.debug("- report execution delete {} command", executionIdToDelete);
-                reportService.deleteExecution(executionIdToDelete);
-                System.out.println(" - Report execution " + executionIdToDelete + "successfyllt deleted!");
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (exportId > -1L) {
-            LOG.debug("- report export command for report: {}", exportId);
-
-            try {
-                XMLUtils.createXMLFile((SequenceInputStream) reportService.exportExecutionResult(exportId,
-                        ReportExecExportFormat.XML).getEntity(), "export_" + exportId + ".xml");
-                System.out.println(" - " + "export_" + exportId + " successfully created");
-            } catch (final IOException ex) {
-                LOG.error("Error creating xml file", ex);
-                System.out.println(" - Error creating " + "export_" + exportId + " " + ex.getMessage());
-            } catch (final ParserConfigurationException ex) {
-                LOG.error("Error creating xml file", ex);
-                System.out.println(" - Error creating " + "export_" + exportId + " " + ex.getMessage());
-            } catch (final SAXException ex) {
-                LOG.error("Error creating xml file", ex);
-                System.out.println(" - Error creating " + "export_" + exportId + " " + ex.getMessage());
-            } catch (final TransformerConfigurationException ex) {
-                LOG.error("Error creating xml file", ex);
-                System.out.println(" - Error creating " + "export_" + exportId + " " + ex.getMessage());
-            } catch (final TransformerException ex) {
-                LOG.error("Error creating xml file", ex);
-                System.out.println(" - Error creating export_" + exportId + " " + ex.getMessage());
-            } catch (final SyncopeClientException ex) {
-                LOG.error("Error calling configuration service", ex);
-                System.out.println(" - Error calling configuration service " + ex.getMessage());
-            }
-        } else {
-            System.out.println(helpMessage);
+                break;
+            case LIST_JOBS:
+                try {
+                    for (final JobStatusType jobStatusType : JobStatusType.values()) {
+                        System.out.println("Report execution for " + jobStatusType);
+                        final List<ReportExecTO> reportExecTOs = reportService.listJobs(jobStatusType);
+                        for (final ReportExecTO reportExecTO : reportExecTOs) {
+                            System.out.println(" - Report execution id: " + reportExecTO.getKey());
+                            System.out.println(" - Report execution status: " + reportExecTO.getStatus());
+                            System.out.println(" - Report execution start date: " + reportExecTO.getStartDate());
+                            System.out.println(" - Report execution end date: " + reportExecTO.getEndDate());
+                            System.out.println();
+                        }
+                    }
+                } catch (final SyncopeClientException ex) {
+                    UsageMessages.printErrorMessage(ex.getMessage());
+                }
+                break;
+            case READ:
+                final String readErrorMessage = UsageMessages.optionCommandMessage(
+                        "Usage: report --read {REPORT-ID} {REPORT-ID} [...]");
+                if (parameters.length >= 1) {
+                    for (final String parameter : parameters) {
+                        try {
+                            System.out.println(reportService.read(Long.valueOf(parameter)));
+                        } catch (final NumberFormatException ex) {
+                            UsageMessages.printErrorMessage(
+                                    "Error reading " + parameter + ". It isn't a valid report id");
+                        } catch (final WebServiceException | SyncopeClientException ex) {
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                UsageMessages.printErrorMessage("Report " + parameter + " doesn't exists!");
+                            } else {
+                                UsageMessages.printErrorMessage(ex.getMessage());
+                            }
+                        }
+                    }
+                } else {
+                    System.out.println(readErrorMessage);
+                }
+                break;
+            case DELETE:
+                final String deleteErrorMessage = UsageMessages.optionCommandMessage(
+                        "Usage: report --execute {REPORT-ID}");
+
+                if (parameters.length == 1) {
+                    for (final String parameter : parameters) {
+                        try {
+                            reportService.delete(Long.valueOf(parameter));
+                            System.out.println(" - Report " + parameter + " deleted!");
+                        } catch (final WebServiceException | SyncopeClientException ex) {
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                UsageMessages.printErrorMessage("Report " + parameter + " doesn't exists!");
+                            } else if (ex.getMessage().startsWith("DataIntegrityViolation")) {
+                                UsageMessages.printErrorMessage("You cannot delete report " + parameter);
+                            } else {
+                                UsageMessages.printErrorMessage(ex.getMessage());
+                            }
+                        } catch (final NumberFormatException ex) {
+                            UsageMessages.printErrorMessage(
+                                    "Error reading " + parameter + ". It isn't a valid report id");
+                        }
+                    }
+                } else {
+                    System.out.println(deleteErrorMessage);
+                }
+                break;
+            case EXECUTE:
+                final String executeErrorMessage = UsageMessages.optionCommandMessage(
+                        "Usage: report --execute {REPORT-ID}");
+
+                if (parameters.length == 1) {
+
+                    try {
+                        final Long reportIdToExecute = Long.valueOf(parameters[0]);
+                        reportService.execute(reportIdToExecute);
+                        final List<ReportExecTO> executionList
+                                = reportService.read(reportIdToExecute).getExecutions();
+                        final ReportExecTO lastExecution = executionList.get(executionList.size() - 1);
+                        System.out.println(" - Report execution id: " + lastExecution.getKey());
+                        System.out.println(" - Report execution status: " + lastExecution.getStatus());
+                        System.out.println(" - Report execution start date: " + lastExecution.getStartDate());
+                    } catch (final WebServiceException | SyncopeClientException ex) {
+                        System.out.println("Error:");
+                        if (ex.getMessage().startsWith("NotFound")) {
+                            UsageMessages.printErrorMessage("Report " + parameters[0] + " doesn't exists!");
+                        } else if (ex.getMessage().startsWith("DataIntegrityViolation")) {
+                            UsageMessages.printErrorMessage("You cannot delete report " + parameters[0]);
+                        } else {
+                            UsageMessages.printErrorMessage(ex.getMessage());
+                        }
+                    } catch (final NumberFormatException ex) {
+                        UsageMessages.printErrorMessage(
+                                "Error reading " + parameters[0] + ". It isn't a valid report id");
+                    }
+                } else {
+                    System.out.println(executeErrorMessage);
+                }
+                break;
+            case READ_EXECUTION:
+                final String readExecutionErrorMessage = UsageMessages.optionCommandMessage(
+                        "Usage: report --read-execution {EXECUTION-ID} {EXECUTION-ID} [...]");
+
+                if (parameters.length >= 1) {
+                    for (final String parameter : parameters) {
+
+                        try {
+                            ReportExecTO reportExecTO = reportService.readExecution(Long.valueOf(parameter));
+                            System.out.println(" - Report execution id: " + reportExecTO.getKey());
+                            System.out.println(" - Report execution status: " + reportExecTO.getStatus());
+                            System.out.println(" - Report execution start date: " + reportExecTO.getStartDate());
+                            System.out.println(" - Report execution end date: " + reportExecTO.getEndDate());
+                        } catch (final WebServiceException | SyncopeClientException ex) {
+                            System.out.println("Error:");
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                UsageMessages.printErrorMessage(" - Report " + parameter + " doesn't exists!");
+                            } else if (ex.getMessage().startsWith("DataIntegrityViolation")) {
+                                UsageMessages.printErrorMessage("You cannot delete report " + parameter);
+                            } else {
+                                UsageMessages.printErrorMessage(ex.getMessage());
+                            }
+                        } catch (final NumberFormatException ex) {
+                            UsageMessages.printErrorMessage(
+                                    "Error reading " + parameter + ". It isn't a valid report id");
+                        }
+                    }
+                } else {
+                    System.out.println(readExecutionErrorMessage);
+                }
+                break;
+            case DELETE_EXECUTION:
+                final String deleteExecutionErrorMessage = UsageMessages.optionCommandMessage(
+                        "Usage: report --delete-execution {EXECUTION-ID} {EXECUTION-ID} [...]");
+
+                if (parameters.length >= 1) {
+                    for (final String parameter : parameters) {
+
+                        try {
+                            reportService.deleteExecution(Long.valueOf(parameter));
+                            System.out.println(" - Report execution " + parameter + "successfully deleted!");
+                        } catch (final WebServiceException | SyncopeClientException ex) {
+                            System.out.println("Error:");
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                System.out.println(" - Report " + parameter + " doesn't exists!");
+                            } else if (ex.getMessage().startsWith("DataIntegrityViolation")) {
+                                System.out.println(" - You cannot delete report " + parameter);
+                            } else {
+                                System.out.println(ex.getMessage());
+                            }
+                        } catch (final NumberFormatException ex) {
+                            System.out.println("Error reading " + parameter + ". It isn't a valid report id");
+                        }
+                    }
+                } else {
+                    System.out.println(deleteExecutionErrorMessage);
+                }
+                break;
+            case EXPORT_EXECUTION_RESULT:
+                final String exportExecutionErrorMessage = UsageMessages.optionCommandMessage(
+                        "Usage: report --export-execution-result {EXECUTION-ID} {EXECUTION-ID} [...] {FORMAT}\n"
+                        + "          Format: CSV / HTML / PDF / XML / RTF");
+
+                if (parameters.length >= 2) {
+                    parameters = Arrays.copyOf(parameters, parameters.length - 1);
+                    for (final String parameter : parameters) {
+                        try {
+                            final ReportExecExportFormat format = ReportExecExportFormat.valueOf(input.lastParameter());
+                            final Long exportId = Long.valueOf(parameter);
+                            final SequenceInputStream report = (SequenceInputStream) reportService.
+                                    exportExecutionResult(exportId, format).getEntity();
+                            switch (format) {
+                                case XML:
+                                    final String xmlFinalName = "export_" + exportId + ".xml";
+                                    XMLUtils.createXMLFile(report, xmlFinalName);
+                                    UsageMessages.printErrorMessage(xmlFinalName + " successfully created");
+                                    break;
+                                case CSV:
+                                    UsageMessages.printErrorMessage(format + " doesn't supported");
+                                    break;
+                                case PDF:
+                                    UsageMessages.printErrorMessage(format + " doesn't supported");
+                                    break;
+                                case HTML:
+                                    UsageMessages.printErrorMessage(format + " doesn't supported");
+                                    break;
+                                case RTF:
+                                    UsageMessages.printErrorMessage(format + " doesn't supported");
+                                    break;
+                                default:
+                                    UsageMessages.printErrorMessage(format + " doesn't supported");
+                                    break;
+                            }
+                        } catch (final WebServiceException | SyncopeClientException ex) {
+                            System.out.println("Error:");
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                UsageMessages.printErrorMessage("Report " + parameter + " doesn't exists!");
+                            } else if (ex.getMessage().startsWith("DataIntegrityViolation")) {
+                                System.out.println(" - You cannot delete report " + parameter);
+                            } else {
+                                System.out.println(ex.getMessage());
+                            }
+                        } catch (final NumberFormatException ex) {
+                            System.out.println("Error reading " + parameter + ". It isn't a valid report id");
+                        } catch (IOException | ParserConfigurationException | SAXException | TransformerException e) {
+                            System.out.println(" - Error creating " + "export_" + parameter + " " + e.getMessage());
+                        } catch (final IllegalArgumentException ex) {
+                            if (ex.getMessage().startsWith("No enum constant org.apache.syncope.common.lib.types.")) {
+                                System.out.println(" - Error: " + input.lastParameter()
+                                        + " isn't a valid policy type, try with:");
+                                for (final ReportExecExportFormat type : ReportExecExportFormat.values()) {
+                                    System.out.println("  *** " + type.name());
+                                }
+                            }
+                            break;
+                        }
+                    }
+                } else {
+                    System.out.println(exportExecutionErrorMessage);
+                }
+                break;
+            case HELP:
+                System.out.println(HELP_MESSAGE);
+                break;
+            default:
+                System.out.println(input.getOption() + " is not a valid option.");
+                System.out.println("");
+                System.out.println(HELP_MESSAGE);
         }
     }
 
+    private enum Options {
+
+        HELP("--help"),
+        LIST("--list"),
+        LIST_JOBS("--list-jobs"),
+        READ("--read"),
+        DELETE("--delete"),
+        EXECUTE("--execute"),
+        READ_EXECUTION("--read-execution"),
+        DELETE_EXECUTION("--delete-execution"),
+        EXPORT_EXECUTION_RESULT("--export-execution-result");
+
+        private final String optionName;
+
+        private Options(final String optionName) {
+            this.optionName = optionName;
+        }
+
+        public String getOptionName() {
+            return optionName;
+        }
+
+        public boolean equalsOptionName(final String otherName) {
+            return (otherName == null) ? false : optionName.equals(otherName);
+        }
+
+        public static Options fromName(final String name) {
+            Options optionToReturn = HELP;
+            for (final Options option : Options.values()) {
+                if (option.equalsOptionName(name)) {
+                    optionToReturn = option;
+                }
+            }
+            return optionToReturn;
+        }
+    }
 }