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:09:14 UTC

syncope git commit: Fixed SYNCOPE-581

Repository: syncope
Updated Branches:
  refs/heads/master 4a28d6c83 -> 958919948


Fixed SYNCOPE-581


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

Branch: refs/heads/master
Commit: 9589199482b8823bb630bf901014f816f179475e
Parents: 4a28d6c
Author: massi <ma...@tirasa.net>
Authored: Wed Oct 14 15:08:49 2015 +0200
Committer: massi <ma...@tirasa.net>
Committed: Wed Oct 14 15:08:49 2015 +0200

----------------------------------------------------------------------
 .../client/cli/commands/AbstractCommand.java    |  10 +-
 .../cli/commands/ConfigurationCommand.java      | 412 ++++++++++++-------
 .../client/cli/messages/UsageMessages.java      |   2 +-
 3 files changed, 262 insertions(+), 162 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/95891994/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 a6753bf..b374e33 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
@@ -18,15 +18,9 @@
  */
 package org.apache.syncope.client.cli.commands;
 
-import com.beust.jcommander.Parameter;
+import org.apache.syncope.client.cli.Input;
 
 public abstract class AbstractCommand {
 
-    @Parameter(names = {"-h", "--help"})
-    protected boolean help = false;
-
-    @Parameter(names = {"-l", "--list"})
-    protected boolean list = false;
-
-    protected abstract void execute();
+    public abstract void execute(final Input input);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/95891994/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 70c532d..282e2d1 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
@@ -18,192 +18,298 @@
  */
 package org.apache.syncope.client.cli.commands;
 
-import com.beust.jcommander.DynamicParameter;
-import com.beust.jcommander.Parameter;
-import com.beust.jcommander.Parameters;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.SequenceInputStream;
-import java.util.HashMap;
-import java.util.Map;
 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.AttrTO;
 import org.apache.syncope.common.lib.to.ConfTO;
 import org.apache.syncope.common.rest.api.service.ConfigurationService;
-import org.apache.syncope.common.rest.api.service.SyncopeService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.SAXException;
 
-@Parameters(
-        commandNames = "config",
-        optionPrefixes = "-",
-        separators = "=",
-        commandDescription = "Apache Syncope configuration service")
+@Command(name = "configuration")
 public class ConfigurationCommand extends AbstractCommand {
 
     private static final Logger LOG = LoggerFactory.getLogger(ConfigurationCommand.class);
 
     private static final String EXPORT_FILE_NAME = "/content.xml";
 
-    private final String helpMessage = "Usage: config [options]\n"
+    private static final String HELP_MESSAGE = "Usage: config [options]\n"
             + "  Options:\n"
-            + "    -h, --help \n"
-            + "    -l, --list \n"
-            + "    -r, --read \n"
-            + "       Syntax: -r={CONF-NAME} \n"
-            + "    -u, --update \n"
-            + "       Syntax: {CONF-NAME}={CONF-VALUE} \n"
-            + "    -c, --create \n"
-            + "       Syntax: {CONF-NAME}={CONF-VALUE} \n"
-            + "    -d, --delete \n"
-            + "       Syntax: -d={CONF-NAME}"
-            + "    -v, --validators \n"
-            + "    -mt, --mail-templates \n"
-            + "    -e, --export \n"
-            + "       Syntax: -e={WHERE-DIR} \n";
-
-    @Parameter(names = { "-r", "--read" })
-    private String confNameToRead;
-
-    @DynamicParameter(names = { "-u", "--update" })
-    private final Map<String, String> updateConf = new HashMap<>();
-
-    @DynamicParameter(names = { "-c", "--create" })
-    private final Map<String, String> createConf = new HashMap<>();
-
-    @Parameter(names = { "-d", "--delete" })
-    private String confNameToDelete;
-
-    @Parameter(names = { "-v", "--validators" })
-    private boolean validators = false;
-
-    @Parameter(names = { "-mt", "--mail-templates" })
-    private boolean mailTemplates = false;
-
-    @Parameter(names = { "-e", "--export" })
-    private String export;
+            + "    --help \n"
+            + "    --list \n"
+            + "    --read \n"
+            + "       Syntax: --read {CONF-NAME} {CONF-NAME} [...] \n"
+            + "    --update \n"
+            + "       Syntax: --update {CONF-NAME}={CONF-VALUE} {CONF-NAME}={CONF-VALUE} [...]\n"
+            + "    --create \n"
+            + "       Syntax: --create {CONF-NAME}={CONF-VALUE} {CONF-NAME}={CONF-VALUE} [...]\n"
+            + "    --delete \n"
+            + "       Syntax: --delete {CONF-NAME} {CONF-NAME} [...]\n"
+            + "    --export \n"
+            + "       Syntax: --export {WHERE-DIR}";
 
     @Override
-    public void execute() {
-        final SyncopeService syncopeService = SyncopeServices.get(SyncopeService.class);
-        final ConfigurationService configurationService = SyncopeServices.get(ConfigurationService.class);
-
+    public void execute(final Input input) {
         LOG.debug("Logger service successfully created");
+        LOG.debug("Option: {}", input.getOption());
+        LOG.debug("Parameters:");
+        for (final String parameter : input.getParameters()) {
+            LOG.debug("   > " + parameter);
+        }
+
+        final String[] parameters = input.getParameters();
 
-        if (help) {
-            LOG.debug("- configuration help command");
-            System.out.println(helpMessage);
-        } else if (list) {
-            LOG.debug("- configuration list command");
-            try {
-                final ConfTO confTO = configurationService.list();
-                for (final AttrTO attrTO : confTO.getPlainAttrMap().values()) {
-                    System.out.println(" - Conf " + attrTO.getSchema() + " has value(s) " + attrTO.getValues()
-                            + " - readonly: " + attrTO.isReadonly());
+        if (StringUtils.isBlank(input.getOption())) {
+            input.setOption(Options.HELP.getOptionName());
+        }
+
+        final ConfigurationService configurationService = SyncopeServices.get(ConfigurationService.class);
+        switch (Options.fromName(input.getOption())) {
+            case LIST:
+                try {
+                    final ConfTO confTO = configurationService.list();
+                    System.out.println("\n - Configuration key: " + confTO.getKey());
+                    System.out.println("");
+                    System.out.println("Plain attributes");
+                    for (final AttrTO attrTO : confTO.getPlainAttrMap().values()) {
+                        System.out.println(" - Conf key: " + attrTO.getSchema());
+                        System.out.println("    - value(s): " + attrTO.getValues());
+                        System.out.println("    - readonly: " + attrTO.isReadonly());
+                    }
+                    System.out.println("");
+                    System.out.println("Derived attributes");
+                    for (final AttrTO attrTO : confTO.getDerAttrMap().values()) {
+                        System.out.println(" - Conf key: " + attrTO.getSchema());
+                        System.out.println("    - value(s): " + attrTO.getValues());
+                        System.out.println("    - readonly: " + attrTO.isReadonly());
+                    }
+                    System.out.println("");
+                    System.out.println("Virtual attributes");
+                    for (final AttrTO attrTO : confTO.getVirAttrMap().values()) {
+                        System.out.println(" - Conf key: " + attrTO.getSchema());
+                        System.out.println("    - value(s): " + attrTO.getValues());
+                        System.out.println("    - readonly: " + attrTO.isReadonly());
+                    }
+                    System.out.println("");
+                } catch (final Exception ex) {
+                    UsageMessages.printErrorMessage(ex.getMessage());
+                    break;
                 }
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (StringUtils.isNotBlank(confNameToRead)) {
-            LOG.debug("- configuration read {} command", confNameToRead);
-            try {
-                final AttrTO attrTO = configurationService.get(confNameToRead);
-                System.out.println(" - Conf " + attrTO.getSchema() + " has value(s) " + attrTO.getValues()
-                        + " - readonly: " + attrTO.isReadonly());
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (!updateConf.isEmpty()) {
-            LOG.debug("- configuration update command with params {}", updateConf);
-            try {
-                for (final Map.Entry<String, String> entrySet : updateConf.entrySet()) {
-                    final AttrTO attrTO = configurationService.get(entrySet.getKey());
-                    attrTO.getValues().clear();
-                    attrTO.getValues().add(entrySet.getValue());
-                    configurationService.set(attrTO);
-                    System.out.println(" - Conf " + attrTO.getSchema() + " has value(s) " + attrTO.getValues()
-                            + " - readonly: " + attrTO.isReadonly());
+                break;
+            case READ:
+                final String readErrorMessage = UsageMessages.optionCommandMessage(
+                        "configuration --read {CONF-NAME} {CONF-NAME} [...]");
+                if (parameters.length >= 1) {
+                    AttrTO attrTO;
+                    for (final String parameter : parameters) {
+                        try {
+                            attrTO = configurationService.get(parameter);
+                            System.out.println("\n - Conf key: " + attrTO.getSchema());
+                            System.out.println("    - value(s): " + attrTO.getValues());
+                            System.out.println("    - readonly: " + attrTO.isReadonly());
+                            System.out.println("");
+                        } catch (final SyncopeClientException | WebServiceException ex) {
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                UsageMessages.printErrorMessage("Configuration " + parameters[0] + " doesn't exist!");
+                            } else if (ex.getMessage().startsWith("DataIntegrityViolation")) {
+                                UsageMessages.printErrorMessage("You cannot delete configuration " + parameters[0]);
+                            } else {
+                                UsageMessages.printErrorMessage(ex.getMessage());
+                            }
+                            break;
+                        }
+                    }
+                } else {
+                    System.out.println(readErrorMessage);
                 }
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (!createConf.isEmpty()) {
-            LOG.debug("- configuration create command with params {}", createConf);
-            try {
-                for (final Map.Entry<String, String> entrySet : createConf.entrySet()) {
-                    final AttrTO attrTO = new AttrTO();
-                    attrTO.setSchema(entrySet.getKey());
-                    attrTO.getValues().add(entrySet.getValue());
-                    configurationService.set(attrTO);
-                    System.out.println(" - Conf " + attrTO.getSchema() + " created with value(s) " + attrTO.getValues()
-                            + " - readonly: " + attrTO.isReadonly());
+                break;
+            case UPDATE:
+                final String updateErrorMessage = UsageMessages.optionCommandMessage(
+                        "configuration --update {CONF-NAME}={CONF-VALUE} {CONF-NAME}={CONF-VALUE} [...]");
+                if (parameters.length >= 1) {
+                    Input.PairParameter pairParameter = null;
+                    AttrTO attrTO;
+                    for (final String parameter : parameters) {
+                        try {
+                            pairParameter = input.toPairParameter(parameter);
+                            attrTO = configurationService.get(pairParameter.getKey());
+                            attrTO.getValues().clear();
+                            attrTO.getValues().add(pairParameter.getValue());
+                            configurationService.set(attrTO);
+                            System.out.println("\n - Conf key " + attrTO.getSchema() + " updated. New value is:");
+                            System.out.println("    - value(s): " + attrTO.getValues());
+                            System.out.println("    - readonly: " + attrTO.isReadonly());
+                            System.out.println("");
+                        } catch (final IllegalArgumentException ex) {
+                            UsageMessages.printErrorMessage(ex.getMessage(), updateErrorMessage);
+                            break;
+                        } catch (final SyncopeClientException | WebServiceException ex) {
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                UsageMessages.printErrorMessage(
+                                        "Configuration " + pairParameter.getKey() + " doesn't exist!");
+                            } else if (ex.getMessage().startsWith("InvalidValues")) {
+                                UsageMessages.printErrorMessage(
+                                        pairParameter.getValue() + " is not a valid value for "
+                                        + pairParameter.getKey());
+                            } else if (ex.getMessage().startsWith("DataIntegrityViolation")) {
+                                UsageMessages.printErrorMessage("You cannot delete configuration " + parameters[0]);
+                            } else {
+                                UsageMessages.printErrorMessage(ex.getMessage());
+                            }
+                            break;
+                        }
+                    }
+                } else {
+                    System.out.println(updateErrorMessage);
                 }
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (StringUtils.isNotBlank(confNameToDelete)) {
-            try {
-                LOG.debug("- configuration delete {} command", confNameToDelete);
-                configurationService.delete(confNameToDelete);
-                System.out.println(" - Conf " + confNameToDelete + " deleted!");
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (validators) {
-            LOG.debug("- configuration validators command");
-            try {
-                System.out.println("Conf validator class: ");
-                for (final String validator : syncopeService.info().getValidators()) {
-                    System.out.println("  *** " + validator);
+                break;
+            case CREATE:
+                final String createErrorMessage = UsageMessages.optionCommandMessage(
+                        "configuration --create {CONF-NAME}={CONF-VALUE} {CONF-NAME}={CONF-VALUE} [...]");
+                if (parameters.length >= 1) {
+                    Input.PairParameter pairParameter = null;
+                    AttrTO attrTO;
+                    for (final String parameter : parameters) {
+                        try {
+                            pairParameter = input.toPairParameter(parameter);
+                            attrTO = new AttrTO();
+                            attrTO.setSchema(pairParameter.getKey());
+                            attrTO.getValues().add(pairParameter.getValue());
+                            configurationService.set(attrTO);
+                            System.out.println("\n - Conf key " + attrTO.getSchema() + " created. Value is:");
+                            System.out.println("    - value(s): " + attrTO.getValues());
+                            System.out.println("    - readonly: " + attrTO.isReadonly());
+                            System.out.println("");
+                        } catch (final IllegalArgumentException ex) {
+                            UsageMessages.printErrorMessage(ex.getMessage(), createErrorMessage);
+                            break;
+                        } catch (final SyncopeClientException | WebServiceException ex) {
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                UsageMessages.printErrorMessage(
+                                        "Configuration schema "
+                                        + pairParameter.getKey() + " doesn't exist! Create it before.");
+                            } else {
+                                UsageMessages.printErrorMessage(ex.getMessage());
+                            }
+                            break;
+                        }
+                    }
+                } else {
+                    System.out.println(createErrorMessage);
                 }
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (mailTemplates) {
-            LOG.debug("- configuration mailTemplates command");
-            try {
-                System.out.println("Conf mail template for:");
-                for (final String mailTemplate : syncopeService.info().getMailTemplates()) {
-                    System.out.println("  *** " + mailTemplate);
+                break;
+            case DELETE:
+                final String deleteErrorMessage = UsageMessages.optionCommandMessage(
+                        "configuration --delete {CONF-NAME} {CONF-NAME} [...]");
+                if (parameters.length >= 1) {
+                    for (final String parameter : parameters) {
+                        try {
+                            configurationService.delete(parameter);
+                            System.out.println("\n - Conf " + parameter + " deleted!\n");
+                        } catch (final SyncopeClientException | WebServiceException ex) {
+                            if (ex.getMessage().startsWith("NotFound")) {
+                                UsageMessages.printErrorMessage("Configuration " + parameter + " doesn't exist!");
+                            } else if (ex.getMessage().startsWith("DataIntegrityViolation")) {
+                                UsageMessages.printErrorMessage("You cannot delete configuration", parameter);
+                            } else {
+                                UsageMessages.printErrorMessage(ex.getMessage());
+                            }
+                            break;
+                        }
+                    }
+                } else {
+                    System.out.println(deleteErrorMessage);
                 }
-            } catch (final SyncopeClientException ex) {
-                System.out.println(" - Error: " + ex.getMessage());
-            }
-        } else if (StringUtils.isNotBlank(export)) {
-            LOG.debug("- configuration export command, directory where xml will be export: {}", export);
-
-            try {
-                XMLUtils.createXMLFile((SequenceInputStream) configurationService.export().getEntity(), export
-                        + EXPORT_FILE_NAME);
-                System.out.println(" - " + export + EXPORT_FILE_NAME + " successfully created");
-            } catch (final IOException ex) {
-                LOG.error("Error creating content.xml file in {} directory", export, ex);
-                System.out.println(" - Error creating " + export + EXPORT_FILE_NAME + " " + ex.getMessage());
-            } catch (final ParserConfigurationException ex) {
-                LOG.error("Error creating content.xml file in {} directory", export, ex);
-                System.out.println(" - Error creating " + export + EXPORT_FILE_NAME + " " + ex.getMessage());
-            } catch (final SAXException ex) {
-                LOG.error("Error creating content.xml file in {} directory", export, ex);
-                System.out.println(" - Error creating " + export + EXPORT_FILE_NAME + " " + ex.getMessage());
-            } catch (final TransformerConfigurationException ex) {
-                LOG.error("Error creating content.xml file in {} directory", export, ex);
-                System.out.println(" - Error creating " + export + EXPORT_FILE_NAME + " " + ex.getMessage());
-            } catch (final TransformerException ex) {
-                LOG.error("Error creating content.xml file in {} directory", export, ex);
-                System.out.println(" - Error creating " + export + EXPORT_FILE_NAME + " " + 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 EXPORT:
+                final String exportErrorMessage = UsageMessages.optionCommandMessage(
+                        "configuration --export {WHERE-DIR}");
+                if (parameters.length == 1) {
+                    try {
+                        XMLUtils.createXMLFile((SequenceInputStream) configurationService.export().getEntity(),
+                                parameters[0] + EXPORT_FILE_NAME);
+                        System.out.println(" - " + parameters[0] + EXPORT_FILE_NAME + " successfully created");
+                    } catch (final IOException ex) {
+                        UsageMessages.printErrorMessage(ex.getMessage());
+                    } catch (ParserConfigurationException | SAXException | TransformerConfigurationException ex) {
+                        LOG.error("Error creating content.xml file in {} directory", parameters[0], ex);
+                        UsageMessages.printErrorMessage(
+                                "Error creating " + parameters[0] + EXPORT_FILE_NAME + " " + ex.getMessage());
+                        break;
+                    } catch (final TransformerException ex) {
+                        LOG.error("Error creating content.xml file in {} directory", parameters[0], ex);
+                        if (ex.getCause() instanceof FileNotFoundException) {
+                            UsageMessages.printErrorMessage("Permission denied on " + parameters[0]);
+                        } else {
+                            UsageMessages.printErrorMessage(
+                                    "Error creating " + parameters[0] + EXPORT_FILE_NAME + " " + ex.getMessage());
+                        }
+                        break;
+                    } catch (final SyncopeClientException ex) {
+                        LOG.error("Error calling configuration service", ex);
+                        UsageMessages.printErrorMessage("Error calling configuration service " + ex.getMessage());
+                        break;
+                    }
+                } else {
+                    System.out.println(exportErrorMessage);
+                }
+                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);
+                break;
         }
     }
 
+    private enum Options {
+
+        HELP("--help"),
+        LIST("--list"),
+        READ("--read"),
+        UPDATE("--update"),
+        CREATE("--create"),
+        DELETE("--delete"),
+        EXPORT("--export");
+
+        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;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/95891994/client/cli/src/main/java/org/apache/syncope/client/cli/messages/UsageMessages.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/messages/UsageMessages.java b/client/cli/src/main/java/org/apache/syncope/client/cli/messages/UsageMessages.java
index 5661b60..0442897 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/messages/UsageMessages.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/messages/UsageMessages.java
@@ -22,7 +22,7 @@ public final class UsageMessages {
 
     private static final String OPTION_COMMAND_MESSAGE_TEMPLATE = "\n - Usage: %s\n";
 
-    public static final String optionCommandMessage(final String message) {
+    public static String optionCommandMessage(final String message) {
         return String.format(OPTION_COMMAND_MESSAGE_TEMPLATE, message);
     }