InfoLister, InfoType: switch → enum v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Thu, 26 Dec 2013 21:18:54 +0100
branchv_0
changeset 69 0befec5034c2
parent 68 574cd7fbb5b2
child 70 02c8eaa425e8
InfoLister, InfoType: switch → enum
java/sql-dk/src/info/globalcode/sql/dk/CLIOptions.java
java/sql-dk/src/info/globalcode/sql/dk/CLIParser.java
java/sql-dk/src/info/globalcode/sql/dk/CLIStarter.java
java/sql-dk/src/info/globalcode/sql/dk/InfoLister.java
java/sql-dk/test/info/globalcode/sql/dk/CLIParserTest.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<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