1 package info.globalcode.sql.dk;
3 import static info.globalcode.sql.dk.Functions.isNotEmpty;
4 import static info.globalcode.sql.dk.Functions.isEmpty;
5 import static info.globalcode.sql.dk.Functions.equalz;
6 import java.util.ArrayList;
7 import java.util.Collection;
8 import java.util.EnumSet;
13 * @author Ing. František Kučera (frantovo.cz)
15 public class CLIOptions {
17 public static final String DEFAULT_NAME_PREFIX = ":";
19 private String databaseName;
20 private String databaseNameToTest;
21 private String namePrefix = DEFAULT_NAME_PREFIX;
22 private String formatterName;
23 private boolean batch;
33 public enum INFO_TYPE {
44 public enum COMMAND_TYPE {
48 /** INSERT, UPDATE, DELETE */
51 private COMMAND_TYPE commandType;
52 private final Collection<NamedParameter> namedParameters = new ArrayList<>();
53 private final List<Parameter> numberedParameters = new ArrayList<>();
54 private final EnumSet<INFO_TYPE> showInfo = EnumSet.noneOf(INFO_TYPE.class);
56 public void validate() throws InvalidOptionsException {
57 InvalidOptionsException e = new InvalidOptionsException();
59 MODE mode = getMode();
61 e.addProblem(new InvalidOptionsException.OptionProblem("Invalid combination of DB, SQL and BATCH – please specify just 2 of this 3 options"));
62 } else if (mode == MODE.JUST_SHOW_INFO) {
63 if (!namedParameters.isEmpty()) {
64 e.addProblem(new InvalidOptionsException.OptionProblem("Do not use named parameters if just showing info."));
66 if (!numberedParameters.isEmpty()) {
67 e.addProblem(new InvalidOptionsException.OptionProblem("Do not use numbered parameters if just showing info."));
69 if (isNotEmpty(sql, false)) {
70 e.addProblem(new InvalidOptionsException.OptionProblem("Do not specify SQL if just showing info."));
72 if (isNotEmpty(databaseName, false)) {
73 e.addProblem(new InvalidOptionsException.OptionProblem("Do not specify database if just showing info."));
76 e.addProblem(new InvalidOptionsException.OptionProblem("Do not specify batch if just showing info."));
78 if (isNotEmpty(formatterName, false)) {
79 e.addProblem(new InvalidOptionsException.OptionProblem("Do not specify formatter if just showing info."));
81 if (!equalz(namePrefix, DEFAULT_NAME_PREFIX)) {
82 e.addProblem(new InvalidOptionsException.OptionProblem("Do not specify name prefix if just showing info."));
84 if (showInfo.contains(INFO_TYPE.CONNECTION) && isEmpty(databaseNameToTest, false)) {
85 e.addProblem(new InvalidOptionsException.OptionProblem("Please specify which database should be tested."));
89 if (!namedParameters.isEmpty() && !numberedParameters.isEmpty()) {
90 e.addProblem(new InvalidOptionsException.OptionProblem("Named and numbered parameters can not be used together in one command."));
94 if (e.hasProblems()) {
99 private boolean hasSql() {
100 return isNotEmpty(getSql(), true);
103 private boolean hasDb() {
104 return isNotEmpty(getDatabaseName(), true);
108 * Depends on options: DB, BATCH, SQL
110 * @return mode | or null if options are not yet initialized or combination of options is
113 public MODE getMode() {
114 if (hasDb() && !batch && hasSql()) {
115 return MODE.QUERY_NOW;
116 } else if (!hasDb() && batch && hasSql()) {
117 return MODE.PREPARE_BATCH;
118 } else if (hasDb() && batch && !hasSql()) {
119 return MODE.EXECUTE_BATCH;
121 return showInfo.isEmpty() ? null : MODE.JUST_SHOW_INFO;
125 public String getSql() {
129 public void setSql(String sql) {
133 public String getDatabaseName() {
137 public void setDatabaseName(String databaseName) {
138 this.databaseName = databaseName;
141 public void setBatch(boolean batch) {
145 public COMMAND_TYPE getCommandType() {
149 public void setCommandType(COMMAND_TYPE commandType) {
150 this.commandType = commandType;
153 public Collection<NamedParameter> getNamedParameters() {
154 return namedParameters;
157 public List<Parameter> getNumberedParameters() {
158 return numberedParameters;
161 public void addNumberedParameter(Parameter p) {
162 numberedParameters.add(p);
165 public void addNamedParameter(NamedParameter p) {
166 namedParameters.add(p);
169 public String getNamePrefix() {
173 public void setNamePrefix(String namePrefix) {
174 this.namePrefix = namePrefix;
177 public String getFormatterName() {
178 return formatterName;
181 public void setFormatterName(String formatterName) {
182 this.formatterName = formatterName;
185 public void addShowInfo(INFO_TYPE info) {
189 public EnumSet<INFO_TYPE> getShowInfo() {
193 public String getDatabaseNameToTest() {
194 return databaseNameToTest;
197 public void setDatabaseNameToTest(String databaseNameToTest) {
198 this.databaseNameToTest = databaseNameToTest;