java/sql-dk/src/info/globalcode/sql/dk/InfoLister.java
branchv_0
changeset 69 0befec5034c2
parent 67 10c9b9e54622
child 70 02c8eaa425e8
--- 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;
+	}
 }