package de.uniba.dsg.bpmnspector.cli; import de.uniba.dsg.bpmnspector.ReportOption; import de.uniba.dsg.bpmnspector.ValidationOption; import org.apache.commons.cli.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; public class BPMNspectorCli { public static final Logger LOGGER = LoggerFactory .getLogger(BPMNspectorCli.class.getSimpleName()); public static final String HELP = "help"; public static final String DEBUG = "debug"; public static final String CHECKS = "checks"; public static final String OPEN = "open"; public static final String CHECK_ALL = "ALL"; private final Map<String, String> checkOptions; private final Map<String, String> reportOptions; public BPMNspectorCli() { checkOptions = createCheckOptions(); reportOptions = createReportOptions(); } private Options createCliOptions() { Option debug = Option.builder("d").desc("run BPMNspector in debug mode") .longOpt(DEBUG) .build(); StringBuilder reportDescBuilder = new StringBuilder(400) .append("defines which report type should be generated.\nAllowed values:\n"); for(Map.Entry entry : reportOptions.entrySet()) { reportDescBuilder.append(entry.getKey()).append(" - ") .append(entry.getValue()).append('\n'); } Option reportFormat = Option.builder("r").desc(reportDescBuilder.toString()) .hasArg() .argName("ALL | XML | HTML | NONE") .build(); StringBuilder checksDescBuilder = new StringBuilder(400) .append("defines which checks should be performed.\nAllowed values:\n"); for(Map.Entry entry : checkOptions.entrySet()) { checksDescBuilder.append(entry.getKey()).append(" - ") .append(entry.getValue()).append('\n'); } Option checks = Option.builder("c").desc(checksDescBuilder.toString()) .hasArg() .argName("[opt1[,opt2]...") .longOpt(CHECKS) .build(); Option help = new Option("h", HELP, false, "prints this usage information"); Option open = new Option("o", OPEN, false, "open the report file upon completion"); Options options = new Options(); options.addOption(debug); options.addOption(help); options.addOption(reportFormat); options.addOption(open); options.addOption(checks); return options; } public void printUsageInformation() { HelpFormatter formatter = new HelpFormatter(); String example = "\nExamples:\n" +"\t\tBPMNspector myfile.bpmn\n" +"\t\tBPMNspector c:\\absolute\\path\\to\\folder -c REF -d\n" +"\t\tBPMNspector c:\\absolute\\path\\to\\file.bpmn -o -r HTML"; formatter.printHelp("BPMNspector <file or directory>", "Options:", createCliOptions(), "", true); System.out.println(example); } public CliParameter parse(String[] args) throws CliException { CommandLineParser parser = new DefaultParser(); try { CommandLine cl = parser.parse(createCliOptions(), args); if(cl.hasOption(HELP)) { return new CliParameter() {}; } else { if(cl.getArgs().length==0) { //NOPMD throw new CliException("Invalid usage: No arguments detected. It is only possible to check one file or directory at the same time."); } else if(cl.getArgs().length==1) {//NOPMD ReportOption reportOption = validateAndCreateReportOption(cl.getOptionValue("r", "HTML")); List<ValidationOption> validationOptions = validateAndCreateValidationOptions(cl.getOptionValue(CHECKS, CHECK_ALL)); return new CliParameter() { @Override public boolean isDebug() { return cl.hasOption(DEBUG); } @Override public List<ValidationOption> getValidationOptions() { return validationOptions; } @Override public String getPath() { return cl.getArgs()[0]; } @Override public ReportOption getReportOption() { return reportOption; } @Override public boolean isOpenReport() { return cl.hasOption(OPEN); } @Override public boolean showHelpOnly() { return false; } }; } else { throw new CliException("Invalid usage: Too much arguments detected. It is only possible to check one file or directory at the same time."); } } } catch (ParseException e) { throw new CliException("Invalid Usage: "+e.getMessage(), e); } } private List<ValidationOption> validateAndCreateValidationOptions(String checkArgs) throws ParseException { List<String> argsAsList = new ArrayList<>(); Collections.addAll(argsAsList, checkArgs.split(",")); List<ValidationOption> options = new ArrayList<>(); if(argsAsList.contains(CHECK_ALL)) { Collections.addAll(options, ValidationOption.values()); } else { for (String str : argsAsList) { try { options.add(ValidationOption.valueOf(str)); } catch (IllegalArgumentException iae) { throw new ParseException( "Validation option "+str+" is not valid."); } } } return options; } private ReportOption validateAndCreateReportOption(String reportOptionString) throws ParseException { try { return ReportOption.valueOf(reportOptionString); } catch (IllegalArgumentException iae) { throw new ParseException( "Report option "+reportOptionString+" is not valid."); } } private Map<String, String> createCheckOptions() { Map<String, String> checkOptions = new HashMap<>(); for(ValidationOption option : ValidationOption.values()) { checkOptions.put(option.toString(), option.getDescription()); } checkOptions.put("ALL", "performs all checks (default)"); return checkOptions; } private Map<String, String> createReportOptions() { Map<String, String> reportOptions = new HashMap<>(); for(ReportOption option : ReportOption.values()) { reportOptions.put(option.toString(), option.getDescription()); } return reportOptions; } }