package org.openmuc.openiec61850.internal.cli; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; public class CliParser { private final String name; private final String description; private String selectedGroup = ""; private static final String HELP = "--help"; private static class ParameterGroup { private final String name; private final List parameters; public ParameterGroup(String name, List parameters) { this.name = name; this.parameters = parameters; } } private final List commandLineParameterGroups = new ArrayList<>(); public CliParser(String name, String description) { this.name = name; this.description = description; } public void addParameterGroup(String groupName, List parameters) { commandLineParameterGroups.add(new ParameterGroup(groupName.toLowerCase(), parameters)); } public void addParameters(List parameters) { commandLineParameterGroups.clear(); commandLineParameterGroups.add(new ParameterGroup("", parameters)); } public String getSelectedGroup() { return selectedGroup; } public void parseArguments(String[] args) throws CliParseException { if (args.length > 0 && HELP.equals(args[0])) { System.out.println(getUsageString()); System.exit(0); } List parameters = null; int i = 0; if (commandLineParameterGroups.get(0).name.isEmpty()) { parameters = commandLineParameterGroups.get(0).parameters; } else { if (args.length == 0) { throw new CliParseException("No parameters found."); } for (ParameterGroup parameterGroup : commandLineParameterGroups) { if (parameterGroup.name.equals(args[0].toLowerCase())) { selectedGroup = parameterGroup.name; parameters = parameterGroup.parameters; } } if (parameters == null) { throw new CliParseException("Group name " + args[0] + " is undefined."); } i++; } while (i < args.length) { boolean found = false; for (CliParameter option : parameters) { if (args[i].equals(option.getName())) { i += option.parse(args, i); found = true; break; } } if (!found) { throw new CliParseException("Unknown parameter found: " + args[i]); } } for (CliParameter option : parameters) { if (!option.isOptional() && !option.isSelected()) { throw new CliParseException("Parameter " + option.getName() + " is mandatory but was not selected."); } } } public String getUsageString() { StringBuilder sb = new StringBuilder(); sb.append("NAME\n\t").append(name).append(" - ").append(description).append("\n\nSYNOPSIS\n"); for (ParameterGroup parameterGroup : commandLineParameterGroups) { sb.append("\t").append(name).append(" ").append(parameterGroup.name); int characterColumn = name.length() + parameterGroup.name.length() + 1; for (CliParameter parameter : parameterGroup.parameters) { if ((characterColumn + parameter.appendSynopsis(new StringBuilder())) > 90) { characterColumn = 0; sb.append("\n\t "); } sb.append(' '); characterColumn += parameter.appendSynopsis(sb) + 1; } sb.append("\n"); } sb.append("\nOPTIONS\n"); Set parameters = new LinkedHashSet<>(); for (ParameterGroup parameterGroup : commandLineParameterGroups) { parameters.addAll(parameterGroup.parameters); } for (CliParameter parameter : parameters) { sb.append(' '); parameter.appendDescription(sb); sb.append("\n\n"); } sb.append("\t--help display this help and exit"); return sb.toString(); } }