# HG changeset patch # User František Kučera # Date 1387143851 -3600 # Node ID 26223eb63851a4f1daaaf84d8da5039ff42b71d9 # Parent f5c3350f3d7888dd602f560e24b7b0a24b68ca84 more OOP diff -r f5c3350f3d78 -r 26223eb63851 java/sql-dk/src/info/globalcode/sql/dk/CLIParser.java --- /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 types; + + public CLIParser() { + Map 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 numberedTypes = new ArrayList<>(); + Map 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); + } +} diff -r f5c3350f3d78 -r 26223eb63851 java/sql-dk/src/info/globalcode/sql/dk/CLIStarter.java --- a/java/sql-dk/src/info/globalcode/sql/dk/CLIStarter.java Sun Dec 15 22:07:51 2013 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/CLIStarter.java Sun Dec 15 22:44:11 2013 +0100 @@ -1,129 +1,13 @@ 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 CLIStarter { - public static final String TYPE_NAME_SEPARATOR = ":"; - private static final Map types; - - static { - Map 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 static void main(String[] args) { - - args = new String[]{"--sql", "SELECT * FROM tabulka;", "--db", "databáze_1", "--types", "int,bbb,omfg:int,omg:boolean", "--data", "xxx", ":omfg", "hodnota omfg", ":omg", "true"}; - - CLIOptions options = parseOptions(args); - } - - private static CLIOptions parseOptions(String[] args) { - CLIOptions options = new CLIOptions(); - - List numberedTypes = new ArrayList<>(); - Map 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 static Integer getType(String typeString) { - return types.get(typeString); + CLIParser parser = new CLIParser(); + CLIOptions options = parser.parseOptions(args); } }