TabularFormatter: basic column padding v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Mon, 23 Dec 2013 12:16:22 +0100
branchv_0
changeset 39 be8db46a38c3
parent 38 ff5bbc06ed29
child 40 a9db7fb3ce65
TabularFormatter: basic column padding
java/sql-dk/src/info/globalcode/sql/dk/formatting/AbstractFormatter.java
java/sql-dk/src/info/globalcode/sql/dk/formatting/ColumnDescriptor.java
java/sql-dk/src/info/globalcode/sql/dk/formatting/ColumnsHeader.java
java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java
--- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/AbstractFormatter.java	Mon Dec 23 11:52:49 2013 +0100
+++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/AbstractFormatter.java	Mon Dec 23 12:16:22 2013 +0100
@@ -202,6 +202,17 @@
 		}
 	}
 
+	/**
+	 * @param value from ResultSet
+	 * @return String representation of given value
+	 */
+	protected String toString(Object value) {
+		/**
+		 * TODO: basic formatting: boolean, null, date, numbers…
+		 */
+		return String.valueOf(value);
+	}
+
 	@Override
 	public void writeStartUpdatesResult() {
 		pushState(State.UPDATES_RESULT, EnumSet.of(State.DATABASE));
--- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/ColumnDescriptor.java	Mon Dec 23 11:52:49 2013 +0100
+++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/ColumnDescriptor.java	Mon Dec 23 12:16:22 2013 +0100
@@ -29,6 +29,7 @@
 	private String typeName;
 	private boolean firstColumn;
 	private boolean lastColumn;
+	private int columnNumber;
 
 	/**
 	 * @return column name
@@ -84,4 +85,15 @@
 	public void setLastColumn(boolean lastColumn) {
 		this.lastColumn = lastColumn;
 	}
+
+	/**
+	 * @return number of this column, 1 = first
+	 */
+	public int getColumnNumber() {
+		return columnNumber;
+	}
+
+	public void setColumnNumber(int columnNumber) {
+		this.columnNumber = columnNumber;
+	}
 }
--- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/ColumnsHeader.java	Mon Dec 23 11:52:49 2013 +0100
+++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/ColumnsHeader.java	Mon Dec 23 12:16:22 2013 +0100
@@ -27,13 +27,13 @@
  * @author Ing. František Kučera (frantovo.cz)
  */
 public class ColumnsHeader {
-
+	
 	private ResultSetMetaData metaData;
-
+	
 	public ColumnsHeader(ResultSetMetaData metaData) {
 		this.metaData = metaData;
 	}
-
+	
 	public int getColumnCount() {
 		try {
 			return metaData.getColumnCount();
@@ -41,16 +41,19 @@
 			throw new IllegalStateException("Error during getting column count.", e);
 		}
 	}
-
+	
 	public List<ColumnDescriptor> getColumnDescriptors() {
 		try {
 			int count = metaData.getColumnCount();
 			List<ColumnDescriptor> list = new ArrayList<>(count);
-
+			
 			for (int i = 1; i <= count; i++) {
 				ColumnDescriptor cd = new ColumnDescriptor();
+				
 				cd.setFirstColumn(i == 1);
 				cd.setLastColumn(i == count);
+				cd.setColumnNumber(i);
+				
 				cd.setLabel(metaData.getColumnLabel(i));
 				cd.setName(metaData.getColumnName(i));
 				cd.setType(metaData.getColumnType(i));
@@ -58,7 +61,7 @@
 				/** TODO: more properties */
 				list.add(cd);
 			}
-
+			
 			return list;
 		} catch (SQLException e) {
 			throw new IllegalStateException("Error during building column descriptors.", e);
--- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java	Mon Dec 23 11:52:49 2013 +0100
+++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java	Mon Dec 23 12:16:22 2013 +0100
@@ -19,6 +19,8 @@
 
 import info.globalcode.sql.dk.ColorfulPrintWriter;
 import static info.globalcode.sql.dk.ColorfulPrintWriter.*;
+import static info.globalcode.sql.dk.Functions.lpad;
+import static info.globalcode.sql.dk.Functions.rpad;
 
 /**
  *
@@ -27,8 +29,11 @@
 public class TabularFormatter extends AbstractFormatter {
 
 	public static final String NAME = "tabular";
+	private static final String HEADER_TYPE_PREFIX = " (";
+	private static final String HEADER_TYPE_SUFFIX = ")";
 	private ColorfulPrintWriter out;
 	private boolean firstResult = true;
+	private int[] columnWidth;
 
 	public TabularFormatter(FormatterContext formatterContext) {
 		super(formatterContext);
@@ -45,14 +50,18 @@
 	public void writeColumnsHeader(ColumnsHeader header) {
 		super.writeColumnsHeader(header);
 
+		columnWidth = new int[header.getColumnCount()];
+
 		for (ColumnDescriptor cd : header.getColumnDescriptors()) {
 			out.print(TerminalStyle.Bright, cd.getLabel());
-			out.print(" (");
+			out.print(HEADER_TYPE_PREFIX);
 			out.print(cd.getTypeName());
-			out.print(")");
+			out.print(HEADER_TYPE_SUFFIX);
 			if (!cd.isLastColumn()) {
 				out.print(TerminalColor.Green, " | ");
 			}
+
+			setColumnWidth(cd.getColumnNumber(), cd.getLabel().length() + cd.getTypeName().length() + HEADER_TYPE_PREFIX.length() + HEADER_TYPE_SUFFIX.length());
 		}
 		out.println();
 		out.flush();
@@ -66,7 +75,31 @@
 			out.print(TerminalColor.Green, " | ");
 		}
 
-		out.print(TerminalColor.Cyan, String.valueOf(value));
+		out.print(TerminalColor.Cyan, toString(value));
+	}
+
+	private int getColumnWidth(int columnNumber) {
+		return columnWidth[columnNumber - 1];
+	}
+
+	private void setColumnWidth(int columnNumber, int width) {
+		columnWidth[columnNumber - 1] = width;
+	}
+
+	private void updateColumnWidth(int columnNumber, int width) {
+		int oldWidth = getColumnWidth(columnNumber);
+		setColumnWidth(columnNumber, Math.max(width, oldWidth));
+
+	}
+
+	@Override
+	protected String toString(Object value) {
+		final int width = getColumnWidth(getCurrentColumnsCount());
+		if (value instanceof Number) {
+			return lpad(super.toString(value), width);
+		} else {
+			return rpad(super.toString(value), width);
+		}
 	}
 
 	@Override