diff -r 574cd7fbb5b2 -r 0befec5034c2 java/sql-dk/src/info/globalcode/sql/dk/InfoLister.java --- 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 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()}); - } + 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 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); + } + } - List 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 listTypes() throws FormatterException { + } - 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 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 listDatabases() throws ConfigurationException { + final List 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 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; + } }