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