java/sql-dk/src/info/globalcode/sql/dk/CLIOptions.java
author František Kučera <franta-hg@frantovo.cz>
Mon, 16 Dec 2013 15:15:32 +0100
branchv_0
changeset 14 189b1260b942
parent 3 efdf2b886feb
child 15 bbd335b5410c
permissions -rw-r--r--
show info basics
     1 package info.globalcode.sql.dk;
     2 
     3 import static info.globalcode.sql.dk.Functions.isNotEmpty;
     4 import static info.globalcode.sql.dk.Functions.equalz;
     5 import java.util.ArrayList;
     6 import java.util.Collection;
     7 import java.util.EnumSet;
     8 import java.util.List;
     9 
    10 /**
    11  *
    12  * @author Ing. František Kučera (frantovo.cz)
    13  */
    14 public class CLIOptions {
    15 
    16 	public static final String DEFAULT_NAME_PREFIX = ":";
    17 	private String sql;
    18 	private String databaseName;
    19 	private String namePrefix = DEFAULT_NAME_PREFIX;
    20 	private String formatterName;
    21 	private boolean batch;
    22 
    23 	public enum MODE {
    24 
    25 		QUERY_NOW,
    26 		PREPARE_BATCH,
    27 		EXECUTE_BATCH,
    28 		JUST_SHOW_INFO
    29 	}
    30 
    31 	public enum INFO_TYPE {
    32 
    33 		HELP,
    34 		VERSION,
    35 		LICENSE,
    36 		FORMATTERS,
    37 		TYPES
    38 	}
    39 
    40 	public enum COMMAND_TYPE {
    41 
    42 		/** SELECT */
    43 		QUERY,
    44 		/** INSERT, UPDATE, DELETE */
    45 		UPDATE
    46 	};
    47 	private COMMAND_TYPE commandType;
    48 	private final Collection<NamedParameter> namedParameters = new ArrayList<>();
    49 	private final List<Parameter> numberedParameters = new ArrayList<>();
    50 	private final EnumSet<INFO_TYPE> showInfo = EnumSet.noneOf(INFO_TYPE.class);
    51 
    52 	public void validate() throws InvalidOptionsException {
    53 		InvalidOptionsException e = new InvalidOptionsException();
    54 
    55 		MODE mode = getMode();
    56 		if (mode == null) {
    57 			e.addProblem(new InvalidOptionsException.OptionProblem("Invalid combination of DB, SQL and BATCH – please specify just 2 of this 3 options"));
    58 		} else if (mode == MODE.JUST_SHOW_INFO) {
    59 			if (!namedParameters.isEmpty()) {
    60 				e.addProblem(new InvalidOptionsException.OptionProblem("Do not use named parameters if just showing info."));
    61 			}
    62 			if (!numberedParameters.isEmpty()) {
    63 				e.addProblem(new InvalidOptionsException.OptionProblem("Do not use numbered parameters if just showing info."));
    64 			}
    65 			if (isNotEmpty(sql, false)) {
    66 				e.addProblem(new InvalidOptionsException.OptionProblem("Do not specify SQL if just showing info."));
    67 			}
    68 			if (isNotEmpty(databaseName, false)) {
    69 				e.addProblem(new InvalidOptionsException.OptionProblem("Do not specify database if just showing info."));
    70 			}
    71 			if (batch) {
    72 				e.addProblem(new InvalidOptionsException.OptionProblem("Do not specify batch if just showing info."));
    73 			}
    74 			if (isNotEmpty(formatterName, false)) {
    75 				e.addProblem(new InvalidOptionsException.OptionProblem("Do not specify formatter if just showing info."));
    76 			}
    77 			if (!equalz(namePrefix, DEFAULT_NAME_PREFIX)) {
    78 				e.addProblem(new InvalidOptionsException.OptionProblem("Do not specify name prefix if just showing info."));
    79 			}
    80 		}
    81 
    82 		if (!namedParameters.isEmpty() && !numberedParameters.isEmpty()) {
    83 			e.addProblem(new InvalidOptionsException.OptionProblem("Named and numbered parameters can not be used together in one command."));
    84 		}
    85 
    86 
    87 		if (e.hasProblems()) {
    88 			throw e;
    89 		}
    90 	}
    91 
    92 	private boolean hasSql() {
    93 		return isNotEmpty(getSql(), true);
    94 	}
    95 
    96 	private boolean hasDb() {
    97 		return isNotEmpty(getDatabaseName(), true);
    98 	}
    99 
   100 	/**
   101 	 * Depends on options: DB, BATCH, SQL
   102 	 *
   103 	 * @return mode | or null if options are not yet initialized or combination of options is
   104 	 * invalid
   105 	 */
   106 	public MODE getMode() {
   107 		if (hasDb() && !batch && hasSql()) {
   108 			return MODE.QUERY_NOW;
   109 		} else if (!hasDb() && batch && hasSql()) {
   110 			return MODE.PREPARE_BATCH;
   111 		} else if (hasDb() && batch && !hasSql()) {
   112 			return MODE.EXECUTE_BATCH;
   113 		} else {
   114 			return showInfo.isEmpty() ? null : MODE.JUST_SHOW_INFO;
   115 		}
   116 	}
   117 
   118 	public String getSql() {
   119 		return sql;
   120 	}
   121 
   122 	public void setSql(String sql) {
   123 		this.sql = sql;
   124 	}
   125 
   126 	public String getDatabaseName() {
   127 		return databaseName;
   128 	}
   129 
   130 	public void setDatabaseName(String databaseName) {
   131 		this.databaseName = databaseName;
   132 	}
   133 
   134 	public void setBatch(boolean batch) {
   135 		this.batch = batch;
   136 	}
   137 
   138 	public COMMAND_TYPE getCommandType() {
   139 		return commandType;
   140 	}
   141 
   142 	public void setCommandType(COMMAND_TYPE commandType) {
   143 		this.commandType = commandType;
   144 	}
   145 
   146 	public Collection<NamedParameter> getNamedParameters() {
   147 		return namedParameters;
   148 	}
   149 
   150 	public List<Parameter> getNumberedParameters() {
   151 		return numberedParameters;
   152 	}
   153 
   154 	public void addNumberedParameter(Parameter p) {
   155 		numberedParameters.add(p);
   156 	}
   157 
   158 	public void addNamedParameter(NamedParameter p) {
   159 		namedParameters.add(p);
   160 	}
   161 
   162 	public String getNamePrefix() {
   163 		return namePrefix;
   164 	}
   165 
   166 	public void setNamePrefix(String namePrefix) {
   167 		this.namePrefix = namePrefix;
   168 	}
   169 
   170 	public String getFormatterName() {
   171 		return formatterName;
   172 	}
   173 
   174 	public void setFormatterName(String formatterName) {
   175 		this.formatterName = formatterName;
   176 	}
   177 
   178 	public void addShowInfo(INFO_TYPE info) {
   179 		showInfo.add(info);
   180 	}
   181 
   182 	public EnumSet<INFO_TYPE> getShowInfo() {
   183 		return showInfo;
   184 	}
   185 }