--- a/java/sql-dk/src/info/globalcode/sql/dk/CLIOptions.java Thu Dec 26 11:58:14 2013 +0100
+++ b/java/sql-dk/src/info/globalcode/sql/dk/CLIOptions.java Thu Dec 26 21:18:54 2013 +0100
@@ -20,6 +20,7 @@
import static info.globalcode.sql.dk.Functions.isNotEmpty;
import static info.globalcode.sql.dk.Functions.isEmpty;
import static info.globalcode.sql.dk.Functions.equalz;
+import info.globalcode.sql.dk.InfoLister.InfoType;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
@@ -51,20 +52,9 @@
EXECUTE_BATCH,
JUST_SHOW_INFO
}
-
- public enum INFO_TYPE {
-
- HELP,
- VERSION,
- LICENSE,
- FORMATTERS,
- TYPES,
- DATABASES,
- CONNECTION
- }
private final List<NamedParameter> namedParameters = new ArrayList<>();
private final List<Parameter> numberedParameters = new ArrayList<>();
- private final EnumSet<INFO_TYPE> showInfo = EnumSet.noneOf(INFO_TYPE.class);
+ private final EnumSet<InfoType> showInfo = EnumSet.noneOf(InfoType.class);
public void validate() throws InvalidOptionsException {
InvalidOptionsException e = new InvalidOptionsException();
@@ -97,7 +87,7 @@
if (!equalz(nameSuffix, DEFAULT_NAME_SUFFIX)) {
e.addProblem(new InvalidOptionsException.OptionProblem("Do not specify name suffix if just showing info."));
}
- if (showInfo.contains(INFO_TYPE.CONNECTION) && isEmpty(databaseNameToTest, false)) {
+ if (showInfo.contains(InfoType.CONNECTION) && isEmpty(databaseNameToTest, false)) {
e.addProblem(new InvalidOptionsException.OptionProblem("Please specify which database should be tested."));
}
}
@@ -215,11 +205,11 @@
this.formatterName = formatterName;
}
- public void addShowInfo(INFO_TYPE info) {
+ public void addShowInfo(InfoType info) {
showInfo.add(info);
}
- public EnumSet<INFO_TYPE> getShowInfo() {
+ public EnumSet<InfoType> getShowInfo() {
return showInfo;
}
--- a/java/sql-dk/src/info/globalcode/sql/dk/CLIParser.java Thu Dec 26 11:58:14 2013 +0100
+++ b/java/sql-dk/src/info/globalcode/sql/dk/CLIParser.java Thu Dec 26 21:18:54 2013 +0100
@@ -17,6 +17,7 @@
*/
package info.globalcode.sql.dk;
+import info.globalcode.sql.dk.InfoLister.InfoType;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -100,25 +101,25 @@
options.setFormatterName(fetchNext(args, ++i));
break;
case Tokens.INFO_HELP:
- options.addShowInfo(CLIOptions.INFO_TYPE.HELP);
+ options.addShowInfo(InfoType.HELP);
break;
case Tokens.INFO_FORMATTERS:
- options.addShowInfo(CLIOptions.INFO_TYPE.FORMATTERS);
+ options.addShowInfo(InfoType.FORMATTERS);
break;
case Tokens.INFO_LICENSE:
- options.addShowInfo(CLIOptions.INFO_TYPE.LICENSE);
+ options.addShowInfo(InfoType.LICENSE);
break;
case Tokens.INFO_TYPES:
- options.addShowInfo(CLIOptions.INFO_TYPE.TYPES);
+ options.addShowInfo(InfoType.TYPES);
break;
case Tokens.INFO_VERSION:
- options.addShowInfo(CLIOptions.INFO_TYPE.VERSION);
+ options.addShowInfo(InfoType.VERSION);
break;
case Tokens.INFO_DATABASES:
- options.addShowInfo(CLIOptions.INFO_TYPE.DATABASES);
+ options.addShowInfo(InfoType.DATABASES);
break;
case Tokens.INFO_CONNECTION:
- options.addShowInfo(CLIOptions.INFO_TYPE.CONNECTION);
+ options.addShowInfo(InfoType.CONNECTION);
options.setDatabaseNameToTest(fetchNext(args, ++i));
break;
default:
--- a/java/sql-dk/src/info/globalcode/sql/dk/CLIStarter.java Thu Dec 26 11:58:14 2013 +0100
+++ b/java/sql-dk/src/info/globalcode/sql/dk/CLIStarter.java Thu Dec 26 21:18:54 2013 +0100
@@ -97,8 +97,10 @@
/** Show info */
if (!options.getShowInfo().isEmpty()) {
PrintStream infoOut = mode == MODE.JUST_SHOW_INFO ? System.out : System.err;
- InfoLister infoLister = new InfoLister(infoOut, this);
- infoLister.showInfo(options);
+ InfoLister infoLister = new InfoLister(infoOut, this, options);
+ for (InfoLister.InfoType infoType : options.getShowInfo()) {
+ infoType.showInfo(infoLister);
+ }
}
switch (mode) {
--- a/java/sql-dk/src/info/globalcode/sql/dk/InfoLister.java Thu Dec 26 11:58:14 2013 +0100
+++ b/java/sql-dk/src/info/globalcode/sql/dk/InfoLister.java Thu Dec 26 21:18:54 2013 +0100
@@ -23,14 +23,18 @@
import info.globalcode.sql.dk.configuration.DatabaseDefinition;
import info.globalcode.sql.dk.configuration.FormatterDefinition;
import static info.globalcode.sql.dk.Functions.rpad;
+import info.globalcode.sql.dk.formatting.ColumnsHeader;
+import info.globalcode.sql.dk.formatting.Formatter;
+import info.globalcode.sql.dk.formatting.FormatterContext;
+import info.globalcode.sql.dk.formatting.FormatterException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.sql.SQLException;
-import java.util.EnumSet;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
+import javax.sql.rowset.RowSetMetaDataImpl;
/**
* Displays info like help, version etc.
@@ -42,86 +46,67 @@
private static final Logger log = Logger.getLogger(InfoLister.class.getName());
private PrintStream out;
private ConfigurationProvider configurationProvider;
+ private CLIOptions options;
- public InfoLister(PrintStream out, ConfigurationProvider configurationProvider) {
+ public InfoLister(PrintStream out, ConfigurationProvider configurationProvider, CLIOptions options) {
this.out = out;
this.configurationProvider = configurationProvider;
+ this.options = options;
}
- public void showInfo(CLIOptions options) throws ConfigurationException {
- EnumSet<CLIOptions.INFO_TYPE> infoTypes = options.getShowInfo();
- for (CLIOptions.INFO_TYPE infoType : infoTypes) {
- switch (infoType) {
- /**
- * TODO: implement show info
- */
- case FORMATTERS:
- for (FormatterDefinition fd : configurationProvider.getConfiguration().getBuildInFormatters()) {
- log.log(Level.INFO, "Built-in formatter: {0} implemented by class: {1}", new Object[]{rpad(fd.getName(), 16), fd.getClassName()});
- }
-
- List<FormatterDefinition> configuredFormatters = configurationProvider.getConfiguration().getFormatters();
- for (FormatterDefinition fd : configuredFormatters) {
- log.log(Level.INFO, "Configured formatter: {0} implemented by class: {1}", new Object[]{rpad(fd.getName(), 16), fd.getClassName()});
- }
- if (configuredFormatters.isEmpty()) {
- log.log(Level.INFO, "No other formatters are configured");
- }
+ public void listFormatters() throws ConfigurationException {
+ for (FormatterDefinition fd : configurationProvider.getConfiguration().getBuildInFormatters()) {
+ log.log(Level.INFO, "Built-in formatter: {0} implemented by class: {1}", new Object[]{rpad(fd.getName(), 16), fd.getClassName()});
+ }
+ List<FormatterDefinition> configuredFormatters = configurationProvider.getConfiguration().getFormatters();
+ for (FormatterDefinition fd : configuredFormatters) {
+ log.log(Level.INFO, "Configured formatter: {0} implemented by class: {1}", new Object[]{rpad(fd.getName(), 16), fd.getClassName()});
+ }
+ if (configuredFormatters.isEmpty()) {
+ log.log(Level.INFO, "No other formatters are configured");
+ }
+ String configuredDefaultFormatter = configurationProvider.getConfiguration().getDefaultFormatter();
+ if (configuredDefaultFormatter == null) {
+ log.log(Level.INFO, "Built-in default formatter: {0}", Configuration.DEFAULT_FORMATTER);
+ } else {
+ log.log(Level.INFO, "Configured default formatter: {0}", configuredDefaultFormatter);
+ }
+ }
- String configuredDefaultFormatter = configurationProvider.getConfiguration().getDefaultFormatter();
- if (configuredDefaultFormatter == null) {
- log.log(Level.INFO, "Built-in default formatter: {0}", Configuration.DEFAULT_FORMATTER);
- } else {
- log.log(Level.INFO, "Configured default formatter: {0}", configuredDefaultFormatter);
- }
- break;
- case HELP:
- printResource(Constants.HELP_FILE);
- break;
- case LICENSE:
- printResource(Constants.LICENSE_FILE);
- break;
- case TYPES:
- println("TODO: list supported types");
- break;
- case VERSION:
- printResource(Constants.VERSION_FILE);
- break;
- case DATABASES:
- final List<DatabaseDefinition> configuredDatabases = configurationProvider.getConfiguration().getDatabases();
- if (configuredDatabases.isEmpty()) {
- log.log(Level.WARNING, "No databases are configured.");
- } else {
- for (DatabaseDefinition dd : configuredDatabases) {
- log.log(Level.INFO, "Configured database: {0}", dd.getName());
- }
- }
- break;
- case CONNECTION:
- boolean connectionTestResult = false;
- String dbName = options.getDatabaseNameToTest();
- log.log(Level.FINE, "Testing connection to database: {0}", dbName);
- try {
- DatabaseDefinition dd = configurationProvider.getConfiguration().getDatabase(dbName);
- if (dd == null) {
- log.log(Level.SEVERE, "No database with this name is configured: {0}", dbName);
- } else {
- log.log(Level.FINE, "Database definition was loaded from configuration");
- DatabaseConnection dc = dd.connect();
- connectionTestResult = dc.test();
- }
- } catch (ConfigurationException | SQLException e) {
- log.log(Level.SEVERE, "Error during testing connection", e);
- }
- log.log(Level.INFO, "Connection test result: {0}", connectionTestResult ? "success" : "failure");
- break;
- default:
- throw new IllegalArgumentException("Unsupported INFO_TYPE: " + infoType);
+ public void listTypes() throws FormatterException {
+ }
+
+ public void listDatabases() throws ConfigurationException {
+ final List<DatabaseDefinition> configuredDatabases = configurationProvider.getConfiguration().getDatabases();
+ if (configuredDatabases.isEmpty()) {
+ log.log(Level.WARNING, "No databases are configured.");
+ } else {
+ for (DatabaseDefinition dd : configuredDatabases) {
+ log.log(Level.INFO, "Configured database: {0}", dd.getName());
}
}
}
- private void printResource(String fileName) {
+ public void testConnection() {
+ boolean connectionTestResult = false;
+ String dbName = options.getDatabaseNameToTest();
+ log.log(Level.FINE, "Testing connection to database: {0}", dbName);
+ try {
+ DatabaseDefinition dd = configurationProvider.getConfiguration().getDatabase(dbName);
+ if (dd == null) {
+ log.log(Level.SEVERE, "No database with this name is configured: {0}", dbName);
+ } else {
+ log.log(Level.FINE, "Database definition was loaded from configuration");
+ DatabaseConnection dc = dd.connect();
+ connectionTestResult = dc.test();
+ }
+ } catch (ConfigurationException | SQLException e) {
+ log.log(Level.SEVERE, "Error during testing connection", e);
+ }
+ log.log(Level.INFO, "Connection test result: {0}", connectionTestResult ? "success" : "failure");
+ }
+
+ public void printResource(String fileName) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getClassLoader().getResourceAsStream(fileName)))) {
while (true) {
String line = reader.readLine();
@@ -139,4 +124,104 @@
private void println(String line) {
out.println(line);
}
+
+ private void printTable(Formatter formatter, ColumnsHeader header, List<Object[]> data) throws ConfigurationException, FormatterException {
+ formatter.writeStartResultSet();
+ formatter.writeColumnsHeader(header);
+
+ for (Object[] row : data) {
+ formatter.writeStartRow();
+ for (Object cell : row) {
+ formatter.writeColumnValue(cell);
+ }
+ formatter.writeEndRow();
+ }
+
+ formatter.writeEndResultSet();
+ }
+
+ private Formatter getFormatter() throws ConfigurationException, FormatterException {
+ FormatterDefinition fd = configurationProvider.getConfiguration().getFormatter(options.getFormatterName());
+ FormatterContext context = new FormatterContext(out);
+ return fd.getInstance(context);
+ }
+
+ private ColumnsHeader constructHeader(HeaderField... fields) throws FormatterException {
+ try {
+ RowSetMetaDataImpl metaData = new RowSetMetaDataImpl();
+ metaData.setColumnCount(fields.length);
+
+ for (int i = 0; i < fields.length; i++) {
+ HeaderField hf = fields[i];
+ int sqlIndex = i + 1;
+ metaData.setColumnName(sqlIndex, hf.name);
+ metaData.setColumnLabel(sqlIndex, hf.name);
+ metaData.setColumnType(sqlIndex, hf.type.getCode());
+ metaData.setColumnTypeName(sqlIndex, hf.type.name());
+ }
+
+ return new ColumnsHeader(metaData);
+ } catch (SQLException e) {
+ throw new FormatterException("Error while constructing table headers", e);
+ }
+ }
+
+ private static class HeaderField {
+
+ String name;
+ SQLType type;
+
+ public HeaderField(String name, SQLType type) {
+ this.name = name;
+ this.type = type;
+ }
+ }
+
+ public enum InfoType {
+
+ HELP {
+ @Override
+ public void showInfo(InfoLister infoLister) {
+ infoLister.printResource(Constants.HELP_FILE);
+ }
+ },
+ VERSION {
+ @Override
+ public void showInfo(InfoLister infoLister) {
+ infoLister.printResource(Constants.VERSION_FILE);
+ }
+ },
+ LICENSE {
+ @Override
+ public void showInfo(InfoLister infoLister) {
+ infoLister.printResource(Constants.LICENSE_FILE);
+ }
+ },
+ FORMATTERS {
+ @Override
+ public void showInfo(InfoLister infoLister) throws ConfigurationException {
+ infoLister.listFormatters();
+ }
+ },
+ TYPES {
+ @Override
+ public void showInfo(InfoLister infoLister) throws FormatterException {
+ infoLister.listTypes();
+ }
+ },
+ DATABASES {
+ @Override
+ public void showInfo(InfoLister infoLister) throws ConfigurationException {
+ infoLister.listDatabases();
+ }
+ },
+ CONNECTION {
+ @Override
+ public void showInfo(InfoLister infoLister) {
+ infoLister.testConnection();
+ }
+ };
+
+ public abstract void showInfo(InfoLister infoLister) throws ConfigurationException, FormatterException;
+ }
}
--- a/java/sql-dk/test/info/globalcode/sql/dk/CLIParserTest.java Thu Dec 26 11:58:14 2013 +0100
+++ b/java/sql-dk/test/info/globalcode/sql/dk/CLIParserTest.java Thu Dec 26 21:18:54 2013 +0100
@@ -184,6 +184,6 @@
assertEquals(options.getMode(), CLIOptions.MODE.JUST_SHOW_INFO);
assertEquals(options.getShowInfo().size(), 1);
- assertTrue(options.getShowInfo().contains(CLIOptions.INFO_TYPE.HELP));
+ assertTrue(options.getShowInfo().contains(CLIOptions.InfoType.HELP));
}
}
\ No newline at end of file