1 package info.globalcode.sql.dk;
4 import java.util.ArrayList;
5 import java.util.Collections;
6 import java.util.HashMap;
12 * @author Ing. František Kučera (frantovo.cz)
14 public class CLIParser {
16 public static final String TYPE_NAME_SEPARATOR = ":";
17 private final Map<String, Integer> types;
20 Map<String, Integer> m = new HashMap<>();
21 m.put("int", Types.INTEGER);
22 m.put("string", Types.VARCHAR);
23 m.put("boolean", Types.BOOLEAN);
27 types = Collections.unmodifiableMap(m);
30 public CLIOptions parseOptions(String[] args) throws CLIParserException {
31 CLIOptions options = new CLIOptions();
33 List<Integer> numberedTypes = new ArrayList<>();
34 Map<String, Integer> namedTypes = new HashMap<>();
36 for (int i = 0; i < args.length; i++) {
40 String typesString = fetchNext(args, ++i);
42 for (String oneType : typesString.split(",")) {
43 int sepatratorIndex = oneType.indexOf(TYPE_NAME_SEPARATOR);
44 if (sepatratorIndex == -1) {
45 numberedTypes.add(getType(oneType));
47 String namePart = oneType.substring(0, sepatratorIndex).trim();
48 String typePart = oneType.substring(sepatratorIndex + TYPE_NAME_SEPARATOR.length(), oneType.length());
49 namedTypes.put(namePart, getType(typePart));
53 case Tokens.NAME_PREFIX:
54 options.setNamePrefix(fetchNext(args, ++i));
57 options.setDatabaseName(fetchNext(args, ++i));
60 options.setSql(fetchNext(args, ++i));
61 options.setCommandType(CLIOptions.COMMAND_TYPE.QUERY);
63 case Tokens.SQL_UPDATE:
64 case Tokens.SQL_INSERT:
65 options.setSql(fetchNext(args, ++i));
66 options.setCommandType(CLIOptions.COMMAND_TYPE.UPDATE);
69 options.setBatch(true);
71 case Tokens.DATA: // --data is the last option
72 for (i++; i < args.length; i++) {
75 if (arg.startsWith(options.getNamePrefix())) { // Named parameters:
76 String paramName = arg.substring(options.getNamePrefix().length());
77 String paramValue = fetchNext(args, ++i);
78 options.addNamedParameter(new NamedParameter(paramName, paramValue, namedTypes.get(paramName)));
79 } else { // Numbered parameters:
81 if (numberedTypes.isEmpty()) {
82 parameter = new Parameter(arg, null);
84 int paramIndex = options.getNumberedParameters().size();
87 paramType = numberedTypes.get(paramIndex);
88 } catch (IndexOutOfBoundsException e) {
89 throw new CLIParserException("Missing type for parameter #" + paramIndex, e);
90 } catch (NullPointerException e) {
91 throw new CLIParserException("Invalid type definition for parameter #" + paramIndex, e);
93 parameter = new Parameter(arg, paramType);
95 options.addNumberedParameter(parameter);
99 case Tokens.FORMATTER:
100 options.setFormatterName(fetchNext(args, ++i));
102 case Tokens.INFO_HELP:
103 options.addShowInfo(CLIOptions.INFO_TYPE.HELP);
105 case Tokens.INFO_FORMATTERS:
106 options.addShowInfo(CLIOptions.INFO_TYPE.FORMATTERS);
108 case Tokens.INFO_LICENSE:
109 options.addShowInfo(CLIOptions.INFO_TYPE.LICENSE);
111 case Tokens.INFO_TYPES:
112 options.addShowInfo(CLIOptions.INFO_TYPE.TYPES);
114 case Tokens.INFO_VERSION:
115 options.addShowInfo(CLIOptions.INFO_TYPE.VERSION);
117 case Tokens.INFO_DATABASES:
118 options.addShowInfo(CLIOptions.INFO_TYPE.DATABASES);
120 case Tokens.INFO_CONNECTION:
121 options.addShowInfo(CLIOptions.INFO_TYPE.CONNECTION);
122 options.setDatabaseNameToTest(fetchNext(args, ++i));
125 throw new CLIParserException("Unknown option: " + arg);
131 private String fetchNext(String[] args, int index) throws CLIParserException {
132 if (index < args.length) {
135 throw new CLIParserException("Expecting value for option: " + args[index - 1]);
139 public static class Tokens {
141 public static final String DB = "--db";
142 public static final String SQL = "--sql";
143 public static final String SQL_UPDATE = "--sql-update";
144 public static final String SQL_INSERT = "--sql-insert";
145 public static final String BATCH = "--batch";
146 public static final String DATA = "--data";
147 public static final String NAME_PREFIX = "--name-prefix";
148 public static final String TYPES = "--types";
149 public static final String FORMATTER = "--formatter";
150 public static final String INFO_HELP = "--help";
151 public static final String INFO_VERSION = "--version";
152 public static final String INFO_LICENSE = "--license";
153 public static final String INFO_FORMATTERS = "--list-formatters";
154 public static final String INFO_TYPES = "--list-types";
155 public static final String INFO_DATABASES = "--list-databases";
156 public static final String INFO_CONNECTION = "--test-connection";
162 private int getType(String typeString) throws CLIParserException {
163 Integer type = types.get(typeString.trim());
165 throw new CLIParserException("Unsupported type: " + typeString);