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/15 17:27:54 UTC

syncope git commit: Fixed SYNCOPE-592, messages improvement SYNCOPE-158

Repository: syncope
Updated Branches:
  refs/heads/master 405f21234 -> 2a99db9ce


Fixed SYNCOPE-592, messages improvement SYNCOPE-158


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

Branch: refs/heads/master
Commit: 2a99db9ce64bd9461fad9e1ac89bed7830b957dc
Parents: 405f212
Author: massi <ma...@tirasa.net>
Authored: Thu Oct 15 17:27:41 2015 +0200
Committer: massi <ma...@tirasa.net>
Committed: Thu Oct 15 17:27:41 2015 +0200

----------------------------------------------------------------------
 .../apache/syncope/client/cli/SyncopeAdm.java   |  38 +-
 .../client/cli/commands/AbstractCommand.java    |   9 +
 .../cli/commands/ConfigurationCommand.java      |   4 +-
 .../client/cli/commands/DomainCommand.java      |   4 +-
 .../client/cli/commands/HelpCommand.java        |   4 +-
 .../client/cli/commands/InfoCommand.java        |   4 +-
 .../client/cli/commands/LoggerCommand.java      |  34 +-
 .../cli/commands/NotificationCommand.java       |   9 +-
 .../client/cli/commands/PolicyCommand.java      |  18 +-
 .../client/cli/commands/ReportCommand.java      |  42 +-
 .../client/cli/commands/SchemaCommand.java      |  30 +-
 .../client/cli/commands/TaskCommand.java        | 583 +++++++++++++++++++
 .../syncope/client/cli/messages/Messages.java   |  30 +
 .../syncope/common/lib/types/TaskType.java      |   2 +-
 14 files changed, 690 insertions(+), 121 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/2a99db9c/client/cli/src/main/java/org/apache/syncope/client/cli/SyncopeAdm.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/SyncopeAdm.java b/client/cli/src/main/java/org/apache/syncope/client/cli/SyncopeAdm.java
index 3a66baa..d503498 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/SyncopeAdm.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/SyncopeAdm.java
@@ -20,6 +20,7 @@ package org.apache.syncope.client.cli;
 
 import org.apache.syncope.client.cli.commands.AbstractCommand;
 import org.apache.syncope.client.cli.messages.Messages;
+import org.apache.syncope.client.cli.util.CommandUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -27,20 +28,6 @@ public final class SyncopeAdm {
 
     private static final Logger LOG = LoggerFactory.getLogger(SyncopeAdm.class);
 
-    private static final String HELP_MESSAGE = "Usage: Main [options]\n"
-            + "  Options:\n"
-            + "    logger --help \n"
-            + "    config --help \n"
-            + "    notification --help \n"
-            + "    report --help \n"
-            + "    policy --help \n"
-            + "    entitlement --help \n"
-            + "    schema --help \n"
-            + "    install --help \n"
-            + "    info --help\n"
-            + "    domain --help\n"
-            + "    help\n";
-
     public static void main(final String[] args) {
         LOG.debug("Starting with args \n");
 
@@ -50,15 +37,34 @@ public final class SyncopeAdm {
             final AbstractCommand command = input.getCommand();
             command.execute(input);
         } catch (final IllegalAccessException | InstantiationException e) {
-            System.out.println(HELP_MESSAGE);
+            System.out.println(helpMessage());
         } catch (final IllegalArgumentException ex) {
             LOG.error("Error in main", ex);
             Messages.printMessage(ex.getMessage());
             if (!ex.getMessage().startsWith("It seems you")) {
-                System.out.println(HELP_MESSAGE);
+                System.out.println(helpMessage());
+            }
+        }
+
+    }
+
+    private static String helpMessage() {
+        final StringBuilder helpMessageBuilder = new StringBuilder("Usage: Main [options]\n");
+        helpMessageBuilder.append("  Options:\n");
+        try {
+            for (AbstractCommand command : CommandUtils.commands()) {
+                final String commandName = command.getClass().getAnnotation(Command.class).name();
+                helpMessageBuilder.append("    ").append(commandName);
+                if (!"help".equalsIgnoreCase(commandName)) {
+                    helpMessageBuilder.append(" --help");
+                }
+                helpMessageBuilder.append("\n");
             }
+        } catch (final IllegalAccessException | IllegalArgumentException | InstantiationException ex) {
+            Messages.printMessage(ex.getMessage());
         }
 
+        return helpMessageBuilder.toString();
     }
 
     private SyncopeAdm() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/2a99db9c/client/cli/src/main/java/org/apache/syncope/client/cli/commands/AbstractCommand.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/AbstractCommand.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/AbstractCommand.java
index 7f272fe..7cee202 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/AbstractCommand.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/AbstractCommand.java
@@ -35,4 +35,13 @@ public abstract class AbstractCommand {
     }
 
     public abstract String getHelpMessage();
+
+    protected static String[] fromEnumToArray(final Class<? extends Enum<?>> enumClass) {
+        final String[] types = new String[enumClass.getFields().length];
+        for (int i = 0; i < enumClass.getFields().length; i++) {
+            types[i] = enumClass.getFields()[i].getName();
+
+        }
+        return types;
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/2a99db9c/client/cli/src/main/java/org/apache/syncope/client/cli/commands/ConfigurationCommand.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/ConfigurationCommand.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/ConfigurationCommand.java
index 4b082ee..ee225d7 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/ConfigurationCommand.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/ConfigurationCommand.java
@@ -264,9 +264,7 @@ public class ConfigurationCommand extends AbstractCommand {
                 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);
+                Messages.printDefaultMessage(input.getOption(), HELP_MESSAGE);
                 break;
         }
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/2a99db9c/client/cli/src/main/java/org/apache/syncope/client/cli/commands/DomainCommand.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/DomainCommand.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/DomainCommand.java
index e733156..a2a0977 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/DomainCommand.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/DomainCommand.java
@@ -112,9 +112,7 @@ public class DomainCommand extends AbstractCommand {
                 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);
+                Messages.printDefaultMessage(input.getOption(), HELP_MESSAGE);
         }
 
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/2a99db9c/client/cli/src/main/java/org/apache/syncope/client/cli/commands/HelpCommand.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/HelpCommand.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/HelpCommand.java
index c4008eb..85b7d73 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/HelpCommand.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/HelpCommand.java
@@ -63,9 +63,7 @@ public class HelpCommand extends AbstractCommand {
                 }
                 break;
             default:
-                System.out.println(input.getOption() + " is not a valid option.");
-                System.out.println("");
-                System.out.println(helpMessage("help", Options.toList()));
+                Messages.printDefaultMessage(input.getOption(), helpMessage("info", Options.toList()));
                 break;
         }
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/2a99db9c/client/cli/src/main/java/org/apache/syncope/client/cli/commands/InfoCommand.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/InfoCommand.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/InfoCommand.java
index e6e1378..07bb952 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/InfoCommand.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/InfoCommand.java
@@ -267,9 +267,7 @@ public class InfoCommand extends AbstractCommand {
                 System.out.println(helpMessage("info", Options.toList()));
                 break;
             default:
-                System.out.println(input.getOption() + " is not a valid option.");
-                System.out.println("");
-                System.out.println(helpMessage("info", Options.toList()));
+                Messages.printDefaultMessage(input.getOption(), helpMessage("info", Options.toList()));
                 break;
         }
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/2a99db9c/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 6a5cde6..6c11c6f 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
@@ -106,7 +106,7 @@ public class LoggerCommand extends AbstractCommand {
                 final String updateErrorMessage = "logger --update {LOG-NAME}={LOG-LEVEL} {LOG-NAME}={LOG-LEVEL} [...]";
 
                 if (parameters.length >= 1) {
-                    Input.PairParameter pairParameter = null;
+                    Input.PairParameter pairParameter;
                     for (final String parameter : parameters) {
                         try {
                             pairParameter = input.toPairParameter(parameter);
@@ -119,12 +119,8 @@ public class LoggerCommand extends AbstractCommand {
                             System.out.println("");
                         } catch (final WebServiceException | SyncopeClientException | IllegalArgumentException ex) {
                             if (ex.getMessage().startsWith("No enum constant org.apache.syncope.common.lib.types.")) {
-                                Messages.printMessage(ex.getMessage());
-                                System.out.println("Try with:");
-                                for (final LoggerLevel level : LoggerLevel.values()) {
-                                    System.out.println("  *** " + level.name());
-                                }
-                                System.out.println("");
+                                Messages.printTypeNotValidMessage(
+                                        "logger level", input.firstParameter(), fromEnumToArray(LoggerLevel.class));
                             } else if ("Parameter syntax error!".equalsIgnoreCase(ex.getMessage())) {
                                 Messages.printMessage(ex.getMessage(), updateErrorMessage);
                             } else if (ex.getMessage().startsWith("NotFound")) {
@@ -153,12 +149,8 @@ public class LoggerCommand extends AbstractCommand {
                             System.out.println("");
                         } catch (final WebServiceException | SyncopeClientException | IllegalArgumentException ex) {
                             if (ex.getMessage().startsWith("No enum constant org.apache.syncope.common.lib.types.")) {
-                                Messages.printMessage(ex.getMessage());
-                                System.out.println("Try with:");
-                                for (final LoggerLevel level : LoggerLevel.values()) {
-                                    System.out.println("  *** " + level.name());
-                                }
-                                System.out.println("");
+                                Messages.printTypeNotValidMessage(
+                                        "logger level", input.firstParameter(), fromEnumToArray(LoggerLevel.class));
                             } else {
                                 Messages.printMessage(ex.getMessage(), updateAllErrorMessage);
                             }
@@ -187,16 +179,8 @@ public class LoggerCommand extends AbstractCommand {
                             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.")) {
-                                Messages.printMessage(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())) {
-                                Messages.printMessage(ex.getMessage(), createErrorMessage);
-                            }
+                            Messages.printTypeNotValidMessage(
+                                    "logger level", input.firstParameter(), fromEnumToArray(LoggerLevel.class));
                             break;
                         }
                     }
@@ -228,9 +212,7 @@ public class LoggerCommand extends AbstractCommand {
                 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);
+                Messages.printDefaultMessage(input.getOption(), HELP_MESSAGE);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/2a99db9c/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 49cc2e2..194ee11 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
@@ -78,7 +78,7 @@ public class NotificationCommand extends AbstractCommand {
                         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");
+                            Messages.printIdNotNumberDeletedMessage("notification", parameter);
                         } catch (final WebServiceException | SyncopeClientException ex) {
                             if (ex.getMessage().startsWith("NotFound")) {
                                 Messages.printNofFoundMessage("Notification", parameter);
@@ -106,8 +106,7 @@ public class NotificationCommand extends AbstractCommand {
                                 Messages.printMessage(ex.getMessage());
                             }
                         } catch (final NumberFormatException ex) {
-                            Messages.printMessage(
-                                    "Error reading " + parameter + ". It isn't a valid notification id");
+                            Messages.printIdNotNumberDeletedMessage("notification", parameter);
                         }
                     }
                 } else {
@@ -118,9 +117,7 @@ public class NotificationCommand extends AbstractCommand {
                 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);
+                Messages.printDefaultMessage(input.getOption(), HELP_MESSAGE);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/2a99db9c/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 cd043ce..a69be18 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
@@ -77,12 +77,8 @@ public class PolicyCommand extends AbstractCommand {
                     } catch (final SyncopeClientException ex) {
                         Messages.printMessage(ex.getMessage());
                     } catch (final IllegalArgumentException ex) {
-                        Messages.printMessage(
-                                "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("");
+                        Messages.printTypeNotValidMessage(
+                                "policy", input.firstParameter(), fromEnumToArray(PolicyType.class));
                     }
                 } else {
                     Messages.printCommandOptionMessage(listPolicyErrorMessage);
@@ -96,8 +92,7 @@ public class PolicyCommand extends AbstractCommand {
                         try {
                             System.out.println(policyService.read(Long.valueOf(parameter)));
                         } catch (final NumberFormatException ex) {
-                            Messages.printMessage(
-                                    "Error reading " + parameter + ". It isn't a valid policy id");
+                            Messages.printIdNotNumberDeletedMessage("policy", parameter);
                         } catch (final WebServiceException | SyncopeClientException ex) {
                             if (ex.getMessage().startsWith("NotFound")) {
                                 Messages.printNofFoundMessage("Policy", parameter);
@@ -128,8 +123,7 @@ public class PolicyCommand extends AbstractCommand {
                                 Messages.printMessage(ex.getMessage());
                             }
                         } catch (final NumberFormatException ex) {
-                            Messages.printMessage(
-                                    "Error reading " + parameter + ". It isn't a valid policy id");
+                            Messages.printIdNotNumberDeletedMessage("policy", parameter);
                         }
                     }
                 } else {
@@ -140,9 +134,7 @@ public class PolicyCommand extends AbstractCommand {
                 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);
+                Messages.printDefaultMessage(input.getOption(), HELP_MESSAGE);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/2a99db9c/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 3d9770e..2178d22 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
@@ -109,14 +109,13 @@ public class ReportCommand extends AbstractCommand {
                 }
                 break;
             case READ:
-                final String readErrorMessage = "Usage: report --read {REPORT-ID} {REPORT-ID} [...]";
+                final String readErrorMessage = "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) {
-                            Messages.printMessage(
-                                    "Error reading " + parameter + ". It isn't a valid report id");
+                            Messages.printIdNotNumberDeletedMessage("report", parameter);
                         } catch (final WebServiceException | SyncopeClientException ex) {
                             if (ex.getMessage().startsWith("NotFound")) {
                                 Messages.printNofFoundMessage("Report", parameter);
@@ -130,9 +129,9 @@ public class ReportCommand extends AbstractCommand {
                 }
                 break;
             case DELETE:
-                final String deleteErrorMessage = "report --execute {REPORT-ID}";
+                final String deleteErrorMessage = "report --delete {REPORT-ID} {REPORT-ID} [...]";
 
-                if (parameters.length == 1) {
+                if (parameters.length >= 1) {
                     for (final String parameter : parameters) {
                         try {
                             reportService.delete(Long.valueOf(parameter));
@@ -146,8 +145,7 @@ public class ReportCommand extends AbstractCommand {
                                 Messages.printMessage(ex.getMessage());
                             }
                         } catch (final NumberFormatException ex) {
-                            Messages.printMessage(
-                                    "Error reading " + parameter + ". It isn't a valid report id");
+                            Messages.printIdNotNumberDeletedMessage("report", parameter);
                         }
                     }
                 } else {
@@ -155,7 +153,7 @@ public class ReportCommand extends AbstractCommand {
                 }
                 break;
             case EXECUTE:
-                final String executeErrorMessage = "Usage: report --execute {REPORT-ID}";
+                final String executeErrorMessage = "report --execute {REPORT-ID}";
 
                 if (parameters.length == 1) {
 
@@ -178,8 +176,7 @@ public class ReportCommand extends AbstractCommand {
                             Messages.printMessage(ex.getMessage());
                         }
                     } catch (final NumberFormatException ex) {
-                        Messages.printMessage(
-                                "Error reading " + parameters[0] + ". It isn't a valid report id");
+                        Messages.printIdNotNumberDeletedMessage("report", parameters[0]);
                     }
                 } else {
                     Messages.printCommandOptionMessage(executeErrorMessage);
@@ -205,8 +202,7 @@ public class ReportCommand extends AbstractCommand {
                                 Messages.printMessage(ex.getMessage());
                             }
                         } catch (final NumberFormatException ex) {
-                            Messages.printMessage(
-                                    "Error reading " + parameter + ". It isn't a valid report id");
+                            Messages.printIdNotNumberDeletedMessage("report", parameter);
                         }
                     }
                 } else {
@@ -232,7 +228,7 @@ public class ReportCommand extends AbstractCommand {
                                 System.out.println(ex.getMessage());
                             }
                         } catch (final NumberFormatException ex) {
-                            System.out.println("Error reading " + parameter + ". It isn't a valid report id");
+                            Messages.printIdNotNumberDeletedMessage("report", parameter);
                         }
                     }
                 } else {
@@ -241,7 +237,7 @@ public class ReportCommand extends AbstractCommand {
                 break;
             case EXPORT_EXECUTION_RESULT:
                 final String exportExecutionErrorMessage
-                        = "Usage: report --export-execution-result {EXECUTION-ID} {EXECUTION-ID} [...] {FORMAT}\n"
+                        = "report --export-execution-result {EXECUTION-ID} {EXECUTION-ID} [...] {FORMAT}\n"
                         + "          Format: CSV / HTML / PDF / XML / RTF";
 
                 if (parameters.length >= 2) {
@@ -281,19 +277,15 @@ public class ReportCommand extends AbstractCommand {
                                 System.out.println(ex.getMessage());
                             }
                         } catch (final NumberFormatException ex) {
-                            System.out.println("Error reading " + parameter + ". It isn't a valid report id");
+                            Messages.printIdNotNumberDeletedMessage("report", parameter);
                         } 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;
+                            Messages.printTypeNotValidMessage(
+                                    "format", input.firstParameter(),
+                                    fromEnumToArray(ReportExecExportFormat.class));
                         }
+                        break;
                     }
                 } else {
                     Messages.printCommandOptionMessage(exportExecutionErrorMessage);
@@ -303,9 +295,7 @@ public class ReportCommand extends AbstractCommand {
                 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);
+                Messages.printDefaultMessage(input.getOption(), HELP_MESSAGE);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/2a99db9c/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 28e66de..7cb9ca1 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
@@ -18,6 +18,8 @@
  */
 package org.apache.syncope.client.cli.commands;
 
+import static org.apache.syncope.client.cli.commands.AbstractCommand.fromEnumToArray;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -98,12 +100,8 @@ public class SchemaCommand extends AbstractCommand {
                     } catch (final SyncopeClientException ex) {
                         Messages.printMessage(ex.getMessage());
                     } catch (final IllegalArgumentException ex) {
-                        Messages.printMessage(
-                                input.firstParameter() + " isn't a valid schema type, try with:");
-                        for (final SchemaType type : SchemaType.values()) {
-                            System.out.println("  *** " + type.name());
-                        }
-                        System.out.println("");
+                        Messages.printTypeNotValidMessage(
+                                "schema", input.firstParameter(), fromEnumToArray(SchemaType.class));
                     }
                 } else {
                     Messages.printCommandOptionMessage(listErrorMessage);
@@ -217,12 +215,8 @@ public class SchemaCommand extends AbstractCommand {
                             Messages.printMessage(ex.getMessage());
                         }
                     } catch (final IllegalArgumentException ex) {
-                        Messages.printMessage(
-                                parameters[0] + " isn't a valid schema type, try with:");
-                        for (final SchemaType type : SchemaType.values()) {
-                            System.out.println("  *** " + type.name());
-                        }
-                        System.out.println("");
+                        Messages.printTypeNotValidMessage(
+                                "schema", input.firstParameter(), fromEnumToArray(SchemaType.class));
                     }
                 } else {
                     Messages.printCommandOptionMessage(readErrorMessage);
@@ -248,12 +242,8 @@ public class SchemaCommand extends AbstractCommand {
                             Messages.printMessage(ex.getMessage());
                         }
                     } catch (final IllegalArgumentException ex) {
-                        Messages.printMessage(
-                                parameters[0] + " isn't a valid schema type, try with:");
-                        for (final SchemaType type : SchemaType.values()) {
-                            System.out.println("  *** " + type.name());
-                        }
-                        System.out.println("");
+                        Messages.printTypeNotValidMessage(
+                                "schema", input.firstParameter(), fromEnumToArray(SchemaType.class));
                     }
                 } else {
                     Messages.printCommandOptionMessage(deleteErrorMessage);
@@ -263,9 +253,7 @@ public class SchemaCommand extends AbstractCommand {
                 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);
+                Messages.printDefaultMessage(input.getOption(), HELP_MESSAGE);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/2a99db9c/client/cli/src/main/java/org/apache/syncope/client/cli/commands/TaskCommand.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/TaskCommand.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/TaskCommand.java
new file mode 100644
index 0000000..9dcb795
--- /dev/null
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/TaskCommand.java
@@ -0,0 +1,583 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.cli.commands;
+
+import java.util.ArrayList;
+import java.util.List;
+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.Messages;
+import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.to.AbstractTaskTO;
+import org.apache.syncope.common.lib.to.AnyTO;
+import org.apache.syncope.common.lib.to.NotificationTaskTO;
+import org.apache.syncope.common.lib.to.PropagationTaskTO;
+import org.apache.syncope.common.lib.to.PushTaskTO;
+import org.apache.syncope.common.lib.to.SchedTaskTO;
+import org.apache.syncope.common.lib.to.SyncTaskTO;
+import org.apache.syncope.common.lib.to.TaskExecTO;
+import org.apache.syncope.common.lib.types.JobStatusType;
+import org.apache.syncope.common.lib.types.TaskType;
+import org.apache.syncope.common.rest.api.beans.TaskQuery;
+import org.apache.syncope.common.rest.api.service.TaskService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Command(name = "task")
+public class TaskCommand extends AbstractCommand {
+
+    private static final Logger LOG = LoggerFactory.getLogger(LoggerCommand.class);
+
+    private static final String HELP_MESSAGE = "Usage: task [options]\n"
+            + "  Options:\n"
+            + "    --help \n"
+            + "    --list-task \n"
+            + "       Syntax: --list-task {TASK-TYPE} \n"
+            + "          Task type: NOTIFICATION / PROPAGATION / PUSH / SCHEDULED / SYNCHRONIZATION\n"
+            + "    --list-running-jobs \n"
+            + "    --list-scheduled-jobs \n"
+            + "    --read \n"
+            + "       Syntax: --read {TASK-ID} {TASK-ID} [...]\n"
+            + "    --read-execution \n"
+            + "       Syntax: --read-execution {TASK-EXEC-ID} {TASK-EXEC-ID} [...]\n"
+            + "    --delete \n"
+            + "       Syntax: --delete {TASK-ID} {TASK-ID} [...]\n"
+            + "    --delete-execution \n"
+            + "       Syntax: --delete-execution {TASK-EXEC-ID} {TASK-EXEC-ID} [...]\n"
+            + "    --execute \n"
+            + "       Syntax: --execute {TASK-ID} {DRY-RUN}"
+            + "          Dry run: true / false";
+
+    @Override
+    public void execute(final Input input) {
+        LOG.debug("Option: {}", input.getOption());
+        LOG.debug("Parameters:");
+        for (final String parameter : input.getParameters()) {
+            LOG.debug("   > " + parameter);
+        }
+
+        final String[] parameters = input.getParameters();
+
+        if (StringUtils.isBlank(input.getOption())) {
+            input.setOption(Options.HELP.getOptionName());
+        }
+
+        final TaskService taskService = SyncopeServices.get(TaskService.class);
+        switch (Options.fromName(input.getOption())) {
+            case LIST_TASK:
+                final String listTaskErrorMessage = "task --list-task {TASK-TYPE}\n"
+                        + "   Task type: NOTIFICATION / PROPAGATION / PUSH / SCHEDULED / SYNCHRONIZATION";
+                if (parameters.length == 1) {
+                    try {
+                        final TaskType taskType = TaskType.valueOf(parameters[0]);
+                        for (final AbstractTaskTO taskTO : taskService.list(taskType, new TaskQuery()).getResult()) {
+                            switch (taskType) {
+                                case NOTIFICATION:
+                                    final NotificationTaskTO notificationTaskTO = (NotificationTaskTO) taskTO;
+                                    System.out.println("");
+                                    System.out.println(" - Notification task key: " + notificationTaskTO.getKey());
+                                    System.out.println("     executed: " + notificationTaskTO.isExecuted());
+                                    System.out.println("     sender: " + notificationTaskTO.getSender());
+                                    System.out.println("     subjetc: " + notificationTaskTO.getSubject());
+                                    System.out.println("     text body: " + notificationTaskTO.getTextBody());
+                                    System.out.println("     html body: " + notificationTaskTO.getHtmlBody());
+                                    System.out.println("     latest execution status: "
+                                            + notificationTaskTO.getLatestExecStatus());
+                                    System.out.println("     start date: " + notificationTaskTO.getStartDate());
+                                    System.out.println("     end date: " + notificationTaskTO.getEndDate());
+                                    System.out.println("     recipients: " + notificationTaskTO.getRecipients());
+                                    System.out.println("     trace level: " + notificationTaskTO.getTraceLevel());
+                                    for (final TaskExecTO taskExecTO : notificationTaskTO.getExecutions()) {
+                                        printTaskExecTO(taskExecTO);
+                                    }
+                                    System.out.println("");
+                                    break;
+                                case PROPAGATION:
+                                    final PropagationTaskTO propagationTaskTO = (PropagationTaskTO) taskTO;
+                                    System.out.println("");
+                                    System.out.println(" - Propagation task key: " + propagationTaskTO.getKey());
+                                    System.out.println("     resource: " + propagationTaskTO.getResource());
+                                    System.out.println("     any key: " + propagationTaskTO.getAnyKey());
+                                    System.out.println("     any type kind: " + propagationTaskTO.getAnyTypeKind());
+                                    System.out.println("     connector object key: "
+                                            + propagationTaskTO.getConnObjectKey());
+                                    System.out.println("     old connector object key: "
+                                            + propagationTaskTO.getOldConnObjectKey());
+                                    System.out.println("     latest execution status: "
+                                            + propagationTaskTO.getLatestExecStatus());
+                                    System.out.println("     class name: " + propagationTaskTO.getObjectClassName());
+                                    System.out.println("     xml attribute: " + propagationTaskTO.getXmlAttributes());
+                                    System.out.println("     start date: " + propagationTaskTO.getStartDate());
+                                    System.out.println("     end date: " + propagationTaskTO.getEndDate());
+                                    System.out.println("     operation: " + propagationTaskTO.getOperation());
+                                    for (final TaskExecTO taskExecTO : propagationTaskTO.getExecutions()) {
+                                        printTaskExecTO(taskExecTO);
+                                    }
+                                    System.out.println("");
+                                    break;
+                                case PUSH:
+                                    final PushTaskTO pushTaskTO = (PushTaskTO) taskTO;
+                                    System.out.println("");
+                                    System.out.println(" - Push task key: " + pushTaskTO.getKey());
+                                    System.out.println("     name: " + pushTaskTO.getName());
+                                    System.out.println("     resource: " + pushTaskTO.getResource());
+                                    System.out.println("     cron expression: " + pushTaskTO.getCronExpression());
+                                    System.out.println("     description: " + pushTaskTO.getDescription());
+                                    System.out.println("     is perform create: " + pushTaskTO.isPerformCreate());
+                                    System.out.println("     is perform delete: " + pushTaskTO.isPerformDelete());
+                                    System.out.println("     is perform update: " + pushTaskTO.isPerformUpdate());
+                                    System.out.println("     is sync status: " + pushTaskTO.isSyncStatus());
+                                    System.out.println("     start date: " + pushTaskTO.getStartDate());
+                                    System.out.println("     end date: " + pushTaskTO.getEndDate());
+                                    System.out.println("     last execution: " + pushTaskTO.getLastExec());
+                                    System.out.println("     next execution: " + pushTaskTO.getNextExec());
+                                    System.out.println("     latest execution status: "
+                                            + pushTaskTO.getLatestExecStatus());
+                                    System.out.println("     filters: " + pushTaskTO.getFilters());
+                                    System.out.println("     delegate class: " + pushTaskTO.getJobDelegateClassName());
+                                    System.out.println("     action class: " + pushTaskTO.getActionsClassNames());
+                                    System.out.println("     matching rule: " + pushTaskTO.getMatchingRule());
+                                    System.out.println("     not matching rule: " + pushTaskTO.getUnmatchingRule());
+                                    for (final TaskExecTO taskExecTO : pushTaskTO.getExecutions()) {
+                                        printTaskExecTO(taskExecTO);
+                                    }
+                                    System.out.println("");
+                                    break;
+                                case SCHEDULED:
+                                    final SchedTaskTO schedTaskTO = (SchedTaskTO) taskTO;
+                                    System.out.println("");
+                                    System.out.println(" - Scheduled task key: " + schedTaskTO.getKey());
+                                    System.out.println("     name: " + schedTaskTO.getName());
+                                    System.out.println("     cron expression: " + schedTaskTO.getCronExpression());
+                                    System.out.println("     description: " + schedTaskTO.getDescription());
+                                    System.out.println("     start date: " + schedTaskTO.getStartDate());
+                                    System.out.println("     end date: " + schedTaskTO.getEndDate());
+                                    System.out.println("     last execution: " + schedTaskTO.getLastExec());
+                                    System.out.println("     next execution: " + schedTaskTO.getNextExec());
+                                    System.out.println("     latest execution status: "
+                                            + schedTaskTO.getLatestExecStatus());
+                                    System.out.println("     job delegate class: "
+                                            + schedTaskTO.getJobDelegateClassName());
+                                    for (final TaskExecTO taskExecTO : schedTaskTO.getExecutions()) {
+                                        printTaskExecTO(taskExecTO);
+                                    }
+                                    System.out.println("");
+                                    break;
+                                case SYNCHRONIZATION:
+                                    final SyncTaskTO syncTaskTO = (SyncTaskTO) taskTO;
+                                    System.out.println("");
+                                    System.out.println(" - Sync task key: " + syncTaskTO.getKey());
+                                    System.out.println("     name: " + syncTaskTO.getName());
+                                    System.out.println("     resource: " + syncTaskTO.getResource());
+                                    System.out.println("     realm destination: " + syncTaskTO.getDestinationRealm());
+                                    System.out.println("     cron expression: " + syncTaskTO.getCronExpression());
+                                    System.out.println("     description: " + syncTaskTO.getDescription());
+                                    System.out.println("     is full reconciliation: "
+                                            + syncTaskTO.isFullReconciliation());
+                                    System.out.println("     is perform create: " + syncTaskTO.isPerformCreate());
+                                    System.out.println("     is perform delete: " + syncTaskTO.isPerformDelete());
+                                    System.out.println("     is perform update: " + syncTaskTO.isPerformUpdate());
+                                    System.out.println("     is sync status: " + syncTaskTO.isSyncStatus());
+                                    System.out.println("     templates:");
+                                    for (Map.Entry<String, AnyTO> entrySet : syncTaskTO.getTemplates().entrySet()) {
+                                        final String key = entrySet.getKey();
+                                        final AnyTO value = entrySet.getValue();
+                                        System.out.println("        " + key + " key: " + value.getKey()
+                                                + " of realm" + value.getRealm()
+                                                + " on resource " + value.getResources());
+
+                                    }
+                                    System.out.println("     start date: " + syncTaskTO.getStartDate());
+                                    System.out.println("     end date: " + syncTaskTO.getEndDate());
+                                    System.out.println("     next execution: " + syncTaskTO.getNextExec());
+                                    System.out.println("     last execution: " + syncTaskTO.getLastExec());
+                                    System.out.println("     latest execution status: "
+                                            + syncTaskTO.getLatestExecStatus());
+                                    System.out.println("     job delegate class: "
+                                            + syncTaskTO.getJobDelegateClassName());
+                                    System.out.println("     action class name: " + syncTaskTO.getActionsClassNames());
+                                    System.out.println("     matching rule: " + syncTaskTO.getMatchingRule());
+                                    System.out.println("     unmatching rule: " + syncTaskTO.getUnmatchingRule());
+                                    for (final TaskExecTO taskExecTO : syncTaskTO.getExecutions()) {
+                                        printTaskExecTO(taskExecTO);
+                                    }
+                                    System.out.println("");
+                                    break;
+                                default:
+                                    break;
+                            }
+                        }
+                    } catch (final SyncopeClientException ex) {
+                        Messages.printMessage(ex.getMessage());
+                    } catch (final IllegalArgumentException ex) {
+                        Messages.printTypeNotValidMessage("task", parameters[0], fromEnumToArray(TaskType.class));
+                    }
+                } else {
+                    Messages.printCommandOptionMessage(listTaskErrorMessage);
+                }
+                break;
+            case LIST_RUNNING_JOBS:
+                try {
+                    for (final TaskExecTO taskExecTO : taskService.listJobs(JobStatusType.RUNNING)) {
+                        printTaskExecTO(taskExecTO);
+                    }
+                } catch (final SyncopeClientException ex) {
+                    Messages.printMessage(ex.getMessage());
+                }
+                break;
+            case LIST_SCHEDULED_JOBS:
+                try {
+                    for (final TaskExecTO taskExecTO : taskService.listJobs(JobStatusType.SCHEDULED)) {
+                        printTaskExecTO(taskExecTO);
+                    }
+                } catch (final SyncopeClientException ex) {
+                    Messages.printMessage(ex.getMessage());
+                }
+                break;
+            case READ:
+                final String readErrorMessage = "task --read {TASK-ID} {TASK-ID} [...]";
+                if (parameters.length >= 1) {
+                    for (final String parameter : parameters) {
+                        try {
+                            final AbstractTaskTO taskTO = taskService.read(Long.valueOf(parameter));
+                            if (taskTO instanceof NotificationTaskTO) {
+                                final NotificationTaskTO notificationTaskTO = (NotificationTaskTO) taskTO;
+                                System.out.println("");
+                                System.out.println(" - Notification task key: " + notificationTaskTO.getKey());
+                                System.out.println("     executed: " + notificationTaskTO.isExecuted());
+                                System.out.println("     sender: " + notificationTaskTO.getSender());
+                                System.out.println("     subjetc: " + notificationTaskTO.getSubject());
+                                System.out.println("     text body: " + notificationTaskTO.getTextBody());
+                                System.out.println("     html body: " + notificationTaskTO.getHtmlBody());
+                                System.out.println("     latest execution status: "
+                                        + notificationTaskTO.getLatestExecStatus());
+                                System.out.println("     start date: " + notificationTaskTO.getStartDate());
+                                System.out.println("     end date: " + notificationTaskTO.getEndDate());
+                                System.out.println("     recipients: " + notificationTaskTO.getRecipients());
+                                System.out.println("     trace level: " + notificationTaskTO.getTraceLevel());
+                                for (final TaskExecTO taskExecTO : notificationTaskTO.getExecutions()) {
+                                    printTaskExecTO(taskExecTO);
+                                }
+                                System.out.println("");
+                            } else if (taskTO instanceof PropagationTaskTO) {
+                                final PropagationTaskTO propagationTaskTO = (PropagationTaskTO) taskTO;
+                                System.out.println("");
+                                System.out.println(" - Propagation task key: " + propagationTaskTO.getKey());
+                                System.out.println("     resource: " + propagationTaskTO.getResource());
+                                System.out.println("     any key: " + propagationTaskTO.getAnyKey());
+                                System.out.println("     any type kind: " + propagationTaskTO.getAnyTypeKind());
+                                System.out.println("     connector object key: "
+                                        + propagationTaskTO.getConnObjectKey());
+                                System.out.println("     old connector object key: "
+                                        + propagationTaskTO.getOldConnObjectKey());
+                                System.out.println("     latest execution status: "
+                                        + propagationTaskTO.getLatestExecStatus());
+                                System.out.println("     class name: " + propagationTaskTO.getObjectClassName());
+                                System.out.println("     xml attribute: " + propagationTaskTO.getXmlAttributes());
+                                System.out.println("     start date: " + propagationTaskTO.getStartDate());
+                                System.out.println("     end date: " + propagationTaskTO.getEndDate());
+                                System.out.println("     operation: " + propagationTaskTO.getOperation());
+                                for (final TaskExecTO taskExecTO : propagationTaskTO.getExecutions()) {
+                                    printTaskExecTO(taskExecTO);
+                                }
+                                System.out.println("");
+                            } else if (taskTO instanceof PushTaskTO) {
+                                final PushTaskTO pushTaskTO = (PushTaskTO) taskTO;
+                                System.out.println("");
+                                System.out.println(" - Push task key: " + pushTaskTO.getKey());
+                                System.out.println("     name: " + pushTaskTO.getName());
+                                System.out.println("     resource: " + pushTaskTO.getResource());
+                                System.out.println("     cron expression: " + pushTaskTO.getCronExpression());
+                                System.out.println("     description: " + pushTaskTO.getDescription());
+                                System.out.println("     is perform create: " + pushTaskTO.isPerformCreate());
+                                System.out.println("     is perform delete: " + pushTaskTO.isPerformDelete());
+                                System.out.println("     is perform update: " + pushTaskTO.isPerformUpdate());
+                                System.out.println("     is sync status: " + pushTaskTO.isSyncStatus());
+                                System.out.println("     start date: " + pushTaskTO.getStartDate());
+                                System.out.println("     end date: " + pushTaskTO.getEndDate());
+                                System.out.println("     last execution: " + pushTaskTO.getLastExec());
+                                System.out.println("     next execution: " + pushTaskTO.getNextExec());
+                                System.out.println("     latest execution status: "
+                                        + pushTaskTO.getLatestExecStatus());
+                                System.out.println("     filters: " + pushTaskTO.getFilters());
+                                System.out.println("     delegate class: " + pushTaskTO.getJobDelegateClassName());
+                                System.out.println("     action class: " + pushTaskTO.getActionsClassNames());
+                                System.out.println("     matching rule: " + pushTaskTO.getMatchingRule());
+                                System.out.println("     not matching rule: " + pushTaskTO.getUnmatchingRule());
+                                for (final TaskExecTO taskExecTO : pushTaskTO.getExecutions()) {
+                                    printTaskExecTO(taskExecTO);
+                                }
+                                System.out.println("");
+                            } else if (taskTO instanceof SchedTaskTO) {
+                                final SchedTaskTO schedTaskTO = (SchedTaskTO) taskTO;
+                                System.out.println("");
+                                System.out.println(" - Scheduled task key: " + schedTaskTO.getKey());
+                                System.out.println("     name: " + schedTaskTO.getName());
+                                System.out.println("     cron expression: " + schedTaskTO.getCronExpression());
+                                System.out.println("     description: " + schedTaskTO.getDescription());
+                                System.out.println("     start date: " + schedTaskTO.getStartDate());
+                                System.out.println("     end date: " + schedTaskTO.getEndDate());
+                                System.out.println("     last execution: " + schedTaskTO.getLastExec());
+                                System.out.println("     next execution: " + schedTaskTO.getNextExec());
+                                System.out.println("     latest execution status: "
+                                        + schedTaskTO.getLatestExecStatus());
+                                System.out.println("     job delegate class: "
+                                        + schedTaskTO.getJobDelegateClassName());
+                                for (final TaskExecTO taskExecTO : schedTaskTO.getExecutions()) {
+                                    printTaskExecTO(taskExecTO);
+                                }
+                                System.out.println("");
+                            } else if (taskTO instanceof SyncTaskTO) {
+                                final SyncTaskTO syncTaskTO = (SyncTaskTO) taskTO;
+                                System.out.println("");
+                                System.out.println(" - Sync task key: " + syncTaskTO.getKey());
+                                System.out.println("     name: " + syncTaskTO.getName());
+                                System.out.println("     resource: " + syncTaskTO.getResource());
+                                System.out.println("     realm destination: " + syncTaskTO.getDestinationRealm());
+                                System.out.println("     cron expression: " + syncTaskTO.getCronExpression());
+                                System.out.println("     description: " + syncTaskTO.getDescription());
+                                System.out.println("     is full reconciliation: "
+                                        + syncTaskTO.isFullReconciliation());
+                                System.out.println("     is perform create: " + syncTaskTO.isPerformCreate());
+                                System.out.println("     is perform delete: " + syncTaskTO.isPerformDelete());
+                                System.out.println("     is perform update: " + syncTaskTO.isPerformUpdate());
+                                System.out.println("     is sync status: " + syncTaskTO.isSyncStatus());
+                                System.out.println("     templates:");
+                                for (Map.Entry<String, AnyTO> entrySet : syncTaskTO.getTemplates().entrySet()) {
+                                    final String key = entrySet.getKey();
+                                    final AnyTO value = entrySet.getValue();
+                                    System.out.println("        " + key + "key : " + value.getKey()
+                                            + " of realm" + value.getRealm()
+                                            + " on resource " + value.getResources());
+
+                                }
+                                System.out.println("     start date: " + syncTaskTO.getStartDate());
+                                System.out.println("     end date: " + syncTaskTO.getEndDate());
+                                System.out.println("     next execution: " + syncTaskTO.getNextExec());
+                                System.out.println("     last execution: " + syncTaskTO.getLastExec());
+                                System.out.println("     latest execution status: "
+                                        + syncTaskTO.getLatestExecStatus());
+                                System.out.println("     job delegate class: "
+                                        + syncTaskTO.getJobDelegateClassName());
+                                System.out.println("     action class name: " + syncTaskTO.getActionsClassNames());
+                                System.out.println("     matching rule: " + syncTaskTO.getMatchingRule());
+                                System.out.println("     unmatching rule: " + syncTaskTO.getUnmatchingRule());
+                                for (final TaskExecTO taskExecTO : syncTaskTO.getExecutions()) {
+                                    printTaskExecTO(taskExecTO);
+                                }
+                                System.out.println("");
+                            }
+                        } catch (final NumberFormatException ex) {
+                            Messages.printIdNotNumberDeletedMessage("task", parameter);
+                        } catch (final SyncopeClientException | WebServiceException ex) {
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                Messages.printNofFoundMessage("Task", parameter);
+                            } else {
+                                Messages.printMessage("Error: " + ex.getMessage());
+                            }
+                            break;
+                        }
+                    }
+                } else {
+                    Messages.printCommandOptionMessage(readErrorMessage);
+                }
+                break;
+            case READ_EXECUTION:
+                final String readExecutionErrorMessage = "task --read-execution {TASK-ID} {TASK-ID} [...]";
+                if (parameters.length >= 1) {
+                    for (final String parameter : parameters) {
+                        try {
+                            final TaskExecTO taskExecTO = taskService.readExecution(Long.valueOf(parameter));
+                            printTaskExecTO(taskExecTO);
+                        } catch (final NumberFormatException ex) {
+                            Messages.printIdNotNumberDeletedMessage("task execution", parameter);
+                        } catch (final SyncopeClientException | WebServiceException ex) {
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                Messages.printNofFoundMessage("Task execution", parameter);
+                            } else {
+                                Messages.printMessage("Error: " + ex.getMessage());
+                            }
+                            break;
+                        }
+                    }
+                } else {
+                    Messages.printCommandOptionMessage(readExecutionErrorMessage);
+                }
+                break;
+            case DELETE:
+                final String deleteErrorMessage = "task --delete {TASK-ID} {TASK-ID} [...]";
+
+                if (parameters.length >= 1) {
+                    for (final String parameter : parameters) {
+                        try {
+                            taskService.delete(Long.valueOf(parameter));
+                            Messages.printDeletedMessage("Task", parameter);
+                        } catch (final WebServiceException | SyncopeClientException ex) {
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                Messages.printNofFoundMessage("Task", parameter);
+                            } else if (ex.getMessage().startsWith("DataIntegrityViolation")) {
+                                Messages.printMessage("You cannot delete task " + parameter);
+                            } else {
+                                Messages.printMessage(ex.getMessage());
+                            }
+                        } catch (final NumberFormatException ex) {
+                            Messages.printIdNotNumberDeletedMessage("task", parameter);
+                        }
+                    }
+                } else {
+                    Messages.printCommandOptionMessage(deleteErrorMessage);
+                }
+                break;
+            case DELETE_EXECUTION:
+                final String deleteExecutionErrorMessage = "task --delete-execution "
+                        + "{TASK-EXEC-ID} {TASK-EXEC-ID} [...]";
+
+                if (parameters.length >= 1) {
+                    for (final String parameter : parameters) {
+                        try {
+                            taskService.deleteExecution(Long.valueOf(parameter));
+                            Messages.printDeletedMessage("Task execution", parameter);
+                        } catch (final WebServiceException | SyncopeClientException ex) {
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                Messages.printNofFoundMessage("Task execution", parameter);
+                            } else if (ex.getMessage().startsWith("DataIntegrityViolation")) {
+                                Messages.printMessage("You cannot delete task execution" + parameter);
+                            } else {
+                                Messages.printMessage(ex.getMessage());
+                            }
+                        } catch (final NumberFormatException ex) {
+                            Messages.printIdNotNumberDeletedMessage("task execution", parameter);
+                        }
+                    }
+                } else {
+                    Messages.printCommandOptionMessage(deleteExecutionErrorMessage);
+                }
+                break;
+            case EXECUTE:
+                final String executeErrorMessage = "task --execute {TASK-ID} {DRY-RUN}\n"
+                        + "          Dry run: true / false";
+
+                if (parameters.length == 2) {
+
+                    try {
+                        final Long taskIdToExecute = Long.valueOf(parameters[0]);
+                        boolean dryRun;
+                        if ("false".equalsIgnoreCase(parameters[1])) {
+                            dryRun = false;
+                        } else if ("true".equalsIgnoreCase(parameters[1])) {
+                            dryRun = true;
+                        } else {
+                            Messages.printNotBooleanDeletedMessage("dry run", parameters[1]);
+                            break;
+                        }
+                        final TaskExecTO taskExecTO = taskService.execute(taskIdToExecute, dryRun);
+                        printTaskExecTO(taskExecTO);
+                    } catch (final WebServiceException | SyncopeClientException ex) {
+                        System.out.println("Error:");
+                        if (ex.getMessage().startsWith("NotFound")) {
+                            Messages.printNofFoundMessage("Task", parameters[0]);
+                        } else if (ex.getMessage().startsWith("DataIntegrityViolation")) {
+                            Messages.printMessage("You cannot delete task " + parameters[0]);
+                        } else {
+                            Messages.printMessage(ex.getMessage());
+                        }
+                    } catch (final NumberFormatException ex) {
+                        Messages.printIdNotNumberDeletedMessage("task", parameters[0]);
+                    }
+                } else {
+                    Messages.printCommandOptionMessage(executeErrorMessage);
+                }
+                break;
+            case HELP:
+                System.out.println(HELP_MESSAGE);
+                break;
+            default:
+                Messages.printDefaultMessage(input.getOption(), HELP_MESSAGE);
+        }
+
+    }
+
+    private void printTaskExecTO(final TaskExecTO taskExecTO) {
+        System.out.println("     EXECUTIONS: ");
+        System.out.println("     - task execution key: " + taskExecTO.getKey());
+        System.out.println("       task: " + taskExecTO.getTask());
+        System.out.println("       message: ");
+        System.out.println("       ###############     <BEGIN MESSAGE>     ###############");
+        System.out.println("       message: " + taskExecTO.getMessage());
+        System.out.println("       ###############     <END   MESSAGE>     ###############");
+        System.out.println("       status: " + taskExecTO.getStatus());
+        System.out.println("       start date: " + taskExecTO.getStartDate());
+        System.out.println("       end date: " + taskExecTO.getEndDate());
+        System.out.println("");
+    }
+
+    @Override
+    public String getHelpMessage() {
+        return HELP_MESSAGE;
+    }
+
+    private enum Options {
+
+        HELP("--help"),
+        LIST_TASK("--list-task"),
+        LIST_RUNNING_JOBS("--list-running-jobs"),
+        LIST_SCHEDULED_JOBS("--list-scheduled-jobs"),
+        READ("--read"),
+        READ_EXECUTION("--read-execution"),
+        DELETE("--delete"),
+        DELETE_EXECUTION("--delete-execution"),
+        EXECUTE("--execute");
+
+        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;
+        }
+
+        public static List<String> toList() {
+            final List<String> options = new ArrayList<>();
+            for (final Options value : values()) {
+                options.add(value.getOptionName());
+            }
+            return options;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/2a99db9c/client/cli/src/main/java/org/apache/syncope/client/cli/messages/Messages.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/messages/Messages.java b/client/cli/src/main/java/org/apache/syncope/client/cli/messages/Messages.java
index d1a9fdc..e2cb159 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/messages/Messages.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/messages/Messages.java
@@ -26,6 +26,16 @@ public final class Messages {
 
     private static final String DOESNT_EXIST_MESSAGE_TEMPLATE = "%s %s doesn't exist";
 
+    private static final String TYPE_NOT_VALID_MESSAGE_TEMPLATE = "%s isn't a valid %s type, try with: %s";
+
+    private static final String ID_NOT_NUMBER_MESSAGE_TEMPLATE = "Error reading %s. It isn't a valid %s "
+            + "id because it isn't a long value";
+
+    private static final String NOT_BOOLEAN_MESSAGE_TEMPLATE = "Error reading %s. It isn't a valid %s "
+            + "value because it isn't a boolean value";
+
+    private static final String DEFAULT_MESSAGE_TEMPLATE = "%s is not a valid option. \n\b %s";
+
     public static void printCommandOptionMessage(final String message) {
         System.out.println(String.format(OPTION_COMMAND_MESSAGE_TEMPLATE, message));
     }
@@ -46,6 +56,26 @@ public final class Messages {
         printMessage(String.format(DELETED_MESSAGE_TEMPLATE, what, key));
     }
 
+    public static void printIdNotNumberDeletedMessage(final String what, final String key) {
+        printMessage(String.format(ID_NOT_NUMBER_MESSAGE_TEMPLATE, key, what));
+    }
+    
+    public static void printNotBooleanDeletedMessage(final String what, final String key) {
+        printMessage(String.format(NOT_BOOLEAN_MESSAGE_TEMPLATE, key, what));
+    }
+
+    public static void printTypeNotValidMessage(final String what, final String key, final String[] types) {
+        final StringBuilder typesBuilder = new StringBuilder();
+        for (final String type : types) {
+            typesBuilder.append("\n     *** ").append(type);
+        }
+        printMessage(String.format(TYPE_NOT_VALID_MESSAGE_TEMPLATE, key, what, typesBuilder.toString()));
+    }
+
+    public static void printDefaultMessage(final String option, final String helpMessage) {
+        printMessage(String.format(DEFAULT_MESSAGE_TEMPLATE, option, helpMessage));
+    }
+
     private Messages() {
 
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/2a99db9c/common/lib/src/main/java/org/apache/syncope/common/lib/types/TaskType.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/types/TaskType.java b/common/lib/src/main/java/org/apache/syncope/common/lib/types/TaskType.java
index a20d0a7..a60a5af 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/types/TaskType.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/types/TaskType.java
@@ -29,7 +29,7 @@ public enum TaskType {
     SYNCHRONIZATION("sync"),
     PUSH("push");
 
-    private String name;
+    private final String name;
 
     private TaskType(final String name) {
         this.name = name;