java/sql-dk/src/info/globalcode/sql/dk/CLIParser.java
branchv_0
changeset 5 26223eb63851
parent 4 f5c3350f3d78
child 8 4507cb9a0cf1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/java/sql-dk/src/info/globalcode/sql/dk/CLIParser.java	Sun Dec 15 22:44:11 2013 +0100
@@ -0,0 +1,122 @@
+package info.globalcode.sql.dk;
+
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * @author Ing. František Kučera (frantovo.cz)
+ */
+public class CLIParser {
+
+	public static final String TYPE_NAME_SEPARATOR = ":";
+	private final Map<String, Integer> types;
+
+	public CLIParser() {
+		Map<String, Integer> m = new HashMap<>();
+		m.put("int", Types.INTEGER);
+		m.put("string", Types.VARCHAR);
+		m.put("boolean", Types.BOOLEAN);
+		/**
+		 * TODO: more types
+		 */
+		types = Collections.unmodifiableMap(m);
+	}
+
+	public CLIOptions parseOptions(String[] args) {
+		CLIOptions options = new CLIOptions();
+
+		List<Integer> numberedTypes = new ArrayList<>();
+		Map<String, Integer> namedTypes = new HashMap<>();
+
+		for (int i = 0; i < args.length; i++) {
+			String arg = args[i];
+			switch (arg) {
+				case Tokens.TYPES:
+					String typesString = args[++i];
+
+					for (String oneType : typesString.split("\\s*,\\s*")) {
+						int sepatratorIndex = oneType.indexOf(TYPE_NAME_SEPARATOR);
+						if (sepatratorIndex == -1) {
+							numberedTypes.add(getType(oneType));
+						} else {
+							String namePart = oneType.substring(0, sepatratorIndex);
+							String typePart = oneType.substring(sepatratorIndex + TYPE_NAME_SEPARATOR.length(), oneType.length());
+							namedTypes.put(namePart, getType(typePart));
+						}
+					}
+					break;
+				case Tokens.NAME_PREFIX:
+					options.setNamePrefix(args[++i]);
+					break;
+				case Tokens.DB:
+					options.setDatabaseName(args[++i]);
+					break;
+				case Tokens.SQL:
+					options.setSql(args[++i]);
+					options.setCommandType(CLIOptions.COMMAND_TYPE.QUERY);
+					break;
+				case Tokens.SQL_UPDATE:
+				case Tokens.SQL_INSERT:
+					options.setSql(args[++i]);
+					options.setCommandType(CLIOptions.COMMAND_TYPE.UPDATE);
+					break;
+				case Tokens.BATCH:
+					options.setBatch(true);
+					break;
+				case Tokens.DATA: // --data is the last option
+					for (i++; i < args.length; i++) {
+						arg = args[i];
+
+						if (arg.startsWith(options.getNamePrefix())) {
+							String paramName = arg.substring(options.getNamePrefix().length());
+							String paramValue = args[++i];
+							options.addNamedParameter(new NamedParameter(paramName, paramValue, namedTypes.get(paramName)));
+						} else {
+							int paramIndex = options.getNumberedParameters().size();
+							int paramType;
+							try {
+								paramType = numberedTypes.get(paramIndex);
+							} catch (IndexOutOfBoundsException e) {
+								throw new IllegalArgumentException("Missing type for parameter #" + paramIndex, e);
+							} catch (NullPointerException e) {
+								throw new IllegalArgumentException("Invalid type definition for parameter #" + paramIndex, e);
+							}
+							options.addNumberedParameter(new Parameter(arg, paramType));
+						}
+					}
+					break;
+				default:
+					throw new IllegalArgumentException("Unknown option: " + arg);
+			}
+		}
+
+
+
+		return options;
+
+	}
+
+	public static class Tokens {
+
+		public static final String DB = "--db";
+		public static final String SQL = "--sql";
+		public static final String SQL_UPDATE = "--sql-update";
+		public static final String SQL_INSERT = "--sql-insert";
+		public static final String BATCH = "--batch";
+		public static final String DATA = "--data";
+		public static final String NAME_PREFIX = "--name-prefix";
+		public static final String TYPES = "--types";
+
+		private Tokens() {
+		}
+	}
+
+	private Integer getType(String typeString) {
+		return types.get(typeString);
+	}
+}