1 package info.globalcode.sql.dk;
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;
12 * @author Ing. František Kučera (frantovo.cz)
14 public class CLIOptions {
16 public static final String DEFAULT_NAME_PREFIX = ":";
18 private String databaseName;
19 private String namePrefix = DEFAULT_NAME_PREFIX;
20 private String formatterName;
21 private boolean batch;
31 public enum INFO_TYPE {
40 public enum COMMAND_TYPE {
44 /** INSERT, UPDATE, DELETE */
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);
52 public void validate() throws InvalidOptionsException {
53 InvalidOptionsException e = new InvalidOptionsException();
55 MODE mode = getMode();
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."));
62 if (!numberedParameters.isEmpty()) {
63 e.addProblem(new InvalidOptionsException.OptionProblem("Do not use numbered parameters if just showing info."));
65 if (isNotEmpty(sql, false)) {
66 e.addProblem(new InvalidOptionsException.OptionProblem("Do not specify SQL if just showing info."));
68 if (isNotEmpty(databaseName, false)) {
69 e.addProblem(new InvalidOptionsException.OptionProblem("Do not specify database if just showing info."));
72 e.addProblem(new InvalidOptionsException.OptionProblem("Do not specify batch if just showing info."));
74 if (isNotEmpty(formatterName, false)) {
75 e.addProblem(new InvalidOptionsException.OptionProblem("Do not specify formatter if just showing info."));
77 if (!equalz(namePrefix, DEFAULT_NAME_PREFIX)) {
78 e.addProblem(new InvalidOptionsException.OptionProblem("Do not specify name prefix if just showing info."));
82 if (!namedParameters.isEmpty() && !numberedParameters.isEmpty()) {
83 e.addProblem(new InvalidOptionsException.OptionProblem("Named and numbered parameters can not be used together in one command."));
87 if (e.hasProblems()) {
92 private boolean hasSql() {
93 return isNotEmpty(getSql(), true);
96 private boolean hasDb() {
97 return isNotEmpty(getDatabaseName(), true);
101 * Depends on options: DB, BATCH, SQL
103 * @return mode | or null if options are not yet initialized or combination of options is
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;
114 return showInfo.isEmpty() ? null : MODE.JUST_SHOW_INFO;
118 public String getSql() {
122 public void setSql(String sql) {
126 public String getDatabaseName() {
130 public void setDatabaseName(String databaseName) {
131 this.databaseName = databaseName;
134 public void setBatch(boolean batch) {
138 public COMMAND_TYPE getCommandType() {
142 public void setCommandType(COMMAND_TYPE commandType) {
143 this.commandType = commandType;
146 public Collection<NamedParameter> getNamedParameters() {
147 return namedParameters;
150 public List<Parameter> getNumberedParameters() {
151 return numberedParameters;
154 public void addNumberedParameter(Parameter p) {
155 numberedParameters.add(p);
158 public void addNamedParameter(NamedParameter p) {
159 namedParameters.add(p);
162 public String getNamePrefix() {
166 public void setNamePrefix(String namePrefix) {
167 this.namePrefix = namePrefix;
170 public String getFormatterName() {
171 return formatterName;
174 public void setFormatterName(String formatterName) {
175 this.formatterName = formatterName;
178 public void addShowInfo(INFO_TYPE info) {
182 public EnumSet<INFO_TYPE> getShowInfo() {