# HG changeset patch # User František Kučera # Date 1388089134 -3600 # Node ID 0befec5034c218db76a6172bb73ffa739fcc6638 # Parent 574cd7fbb5b2409262879d68f01c2ad068284953 InfoLister, InfoType: switch → enum diff -r 574cd7fbb5b2 -r 0befec5034c2 java/sql-dk/src/info/globalcode/sql/dk/CLIOptions.java --- 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 namedParameters = new ArrayList<>(); private final List numberedParameters = new ArrayList<>(); - private final EnumSet showInfo = EnumSet.noneOf(INFO_TYPE.class); + private final EnumSet 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 getShowInfo() { + public EnumSet getShowInfo() { return showInfo; } diff -r 574cd7fbb5b2 -r 0befec5034c2 java/sql-dk/src/info/globalcode/sql/dk/CLIParser.java --- 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: diff -r 574cd7fbb5b2 -r 0befec5034c2 java/sql-dk/src/info/globalcode/sql/dk/CLIStarter.java --- 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) { 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; + } } diff -r 574cd7fbb5b2 -r 0befec5034c2 java/sql-dk/test/info/globalcode/sql/dk/CLIParserTest.java --- 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