java/sql-dk/src/info/globalcode/sql/dk/formatting/XhtmlFormatter.java
branchv_0
changeset 135 ef432015fdee
parent 134 f2510551b5bf
child 136 c0f9521900bf
equal deleted inserted replaced
134:f2510551b5bf 135:ef432015fdee
    23 import info.globalcode.sql.dk.Xmlns;
    23 import info.globalcode.sql.dk.Xmlns;
    24 import info.globalcode.sql.dk.configuration.DatabaseDefinition;
    24 import info.globalcode.sql.dk.configuration.DatabaseDefinition;
    25 import info.globalcode.sql.dk.configuration.Properties;
    25 import info.globalcode.sql.dk.configuration.Properties;
    26 import info.globalcode.sql.dk.configuration.Property;
    26 import info.globalcode.sql.dk.configuration.Property;
    27 import static info.globalcode.sql.dk.formatting.AbstractXmlFormatter.qname;
    27 import static info.globalcode.sql.dk.formatting.AbstractXmlFormatter.qname;
       
    28 import java.util.Date;
    28 import java.util.HashMap;
    29 import java.util.HashMap;
    29 import java.util.List;
    30 import java.util.List;
    30 import java.util.Map;
    31 import java.util.Map;
       
    32 import java.util.Scanner;
    31 import javax.xml.namespace.QName;
    33 import javax.xml.namespace.QName;
    32 
    34 
    33 /**
    35 /**
    34  *
    36  *
    35  * @author Ing. František Kučera (frantovo.cz)
    37  * @author Ing. František Kučera (frantovo.cz)
    36  */
    38  */
    37 public class XhtmlFormatter extends AbstractXmlFormatter {
    39 public class XhtmlFormatter extends AbstractXmlFormatter {
    38 
    40 
    39 	public static final String NAME = "xhtml"; // bash-completion:formatter
    41 	public static final String NAME = "xhtml"; // bash-completion:formatter
       
    42 	private static final String CSS_FILE = "info/globalcode/sql/dk/formatter/XhtmlFormatter.css";
    40 	private int resultSetCounter = 0;
    43 	private int resultSetCounter = 0;
    41 	private int updatesResultCounter = 0;
    44 	private int updatesResultCounter = 0;
    42 
    45 
    43 	public XhtmlFormatter(FormatterContext formatterContext) {
    46 	public XhtmlFormatter(FormatterContext formatterContext) {
    44 		super(addDefaults(formatterContext));
    47 		super(addDefaults(formatterContext));
    62 		attributes.put(qname("xmlns"), Xmlns.XHTML);
    65 		attributes.put(qname("xmlns"), Xmlns.XHTML);
    63 		printStartElement(qname("html"), attributes);
    66 		printStartElement(qname("html"), attributes);
    64 
    67 
    65 		printStartElement(qname("head"));
    68 		printStartElement(qname("head"));
    66 		printTextElement(qname("title"), null, Constants.PROGRAM_NAME + ": batch results");
    69 		printTextElement(qname("title"), null, Constants.PROGRAM_NAME + ": batch results");
       
    70 		printCss();
    67 		printEndElement();
    71 		printEndElement();
    68 
    72 
    69 		printStartElement(qname("body"));
    73 		printStartElement(qname("body"));
       
    74 	}
       
    75 
       
    76 	private void printCss() {
       
    77 
       
    78 		try (Scanner css = new Scanner(getClass().getClassLoader().getResourceAsStream(CSS_FILE))) {
       
    79 			Map<QName, String> attributes = new HashMap<>(1);
       
    80 			attributes.put(qname("type"), "text/css");
       
    81 			printStartElement(qname("style"), attributes);
       
    82 			while (css.hasNext()) {
       
    83 				printText(css.nextLine(), true);
       
    84 			}
       
    85 			printEndElement();
       
    86 		}
    70 	}
    87 	}
    71 
    88 
    72 	@Override
    89 	@Override
    73 	public void writeEndBatch() {
    90 	public void writeEndBatch() {
    74 		super.writeEndBatch();
    91 		super.writeEndBatch();
    79 
    96 
    80 	@Override
    97 	@Override
    81 	public void writeStartDatabase(DatabaseDefinition databaseDefinition) {
    98 	public void writeStartDatabase(DatabaseDefinition databaseDefinition) {
    82 		super.writeStartDatabase(databaseDefinition);
    99 		super.writeStartDatabase(databaseDefinition);
    83 		printTextElement(qname("h1"), null, "Database: " + databaseDefinition.getName());
   100 		printTextElement(qname("h1"), null, "Database: " + databaseDefinition.getName());
       
   101 
       
   102 		printStartElement(qname("p"));
       
   103 		printText("This is XHTML output of batch executed at: ", true);
       
   104 		printText(new Date().toString(), true);
       
   105 		printEndElement();
    84 	}
   106 	}
    85 
   107 
    86 	@Override
   108 	@Override
    87 	public void writeQuery(String sql) {
   109 	public void writeQuery(String sql) {
    88 		super.writeQuery(sql);
   110 		super.writeQuery(sql);
    99 		} else {
   121 		} else {
   100 			printTextElement(qname("h3"), null, "Parameters:");
   122 			printTextElement(qname("h3"), null, "Parameters:");
   101 
   123 
   102 			printStartElement(qname("table"));
   124 			printStartElement(qname("table"));
   103 
   125 
   104 			printStartElement(qname("theader"));
   126 			printStartElement(qname("thead"));
   105 			printStartElement(qname("tr"));
   127 			printStartElement(qname("tr"));
   106 			printTextElement(qname("td"), null, "number/name");
   128 			printTextElement(qname("td"), null, "id");
   107 			printTextElement(qname("td"), null, "type");
   129 			printTextElement(qname("td"), null, "type");
   108 			printTextElement(qname("td"), null, "value");
   130 			printTextElement(qname("td"), null, "value");
   109 			printEndElement();
   131 			printEndElement();
   110 			printEndElement();
   132 			printEndElement();
   111 
   133 
   119 				} else {
   141 				} else {
   120 					numberOrName = String.valueOf(i + 1);
   142 					numberOrName = String.valueOf(i + 1);
   121 				}
   143 				}
   122 				printTextElement(qname("td"), null, numberOrName);
   144 				printTextElement(qname("td"), null, numberOrName);
   123 				printTextElement(qname("td"), null, p.getType().name());
   145 				printTextElement(qname("td"), null, p.getType().name());
   124 				printTextElement(qname("td"), null, toString(p.getValue()));
   146 				printTableData(p.getValue());
   125 				printEndElement();
   147 				printEndElement();
   126 			}
   148 			}
   127 			printEndElement();
   149 			printEndElement();
   128 
   150 
   129 			printEndElement();
   151 			printEndElement();
   130 		}
   152 		}
       
   153 	}
       
   154 
       
   155 	private void printTableData(Object value) {
       
   156 		Map<QName, String> attributes = new HashMap<>(1);
       
   157 		if (value instanceof Number || value instanceof Boolean) {
       
   158 			attributes.put(qname("class"), "number");
       
   159 		}
       
   160 		printTextElement(qname("td"), attributes, String.valueOf(value));
   131 	}
   161 	}
   132 
   162 
   133 	@Override
   163 	@Override
   134 	public void writeColumnsHeader(ColumnsHeader header) {
   164 	public void writeColumnsHeader(ColumnsHeader header) {
   135 		super.writeColumnsHeader(header);
   165 		super.writeColumnsHeader(header);
   136 		printTextElement(qname("h3"), null, "Data:");
   166 		printTextElement(qname("h3"), null, "Data:");
   137 		printStartElement(qname("table"));
   167 		printStartElement(qname("table"));
   138 		printStartElement(qname("theader"));
   168 		printStartElement(qname("thead"));
   139 		printStartElement(qname("tr"));
   169 		printStartElement(qname("tr"));
   140 		for (ColumnDescriptor cd : header.getColumnDescriptors()) {
   170 		for (ColumnDescriptor cd : header.getColumnDescriptors()) {
   141 			// TODO: type
   171 			// TODO: type
   142 			printTextElement(qname("td"), null, cd.getLabel());
   172 			printTextElement(qname("td"), null, cd.getLabel());
   143 		}
   173 		}
   154 	}
   184 	}
   155 
   185 
   156 	@Override
   186 	@Override
   157 	public void writeColumnValue(Object value) {
   187 	public void writeColumnValue(Object value) {
   158 		super.writeColumnValue(value);
   188 		super.writeColumnValue(value);
   159 		printTextElement(qname("td"), null, toString(value));
   189 		printTableData(value);
   160 	}
   190 	}
   161 
   191 
   162 	@Override
   192 	@Override
   163 	public void writeEndRow() {
   193 	public void writeEndRow() {
   164 		super.writeEndRow();
   194 		super.writeEndRow();
   167 
   197 
   168 	@Override
   198 	@Override
   169 	public void writeStartResultSet() {
   199 	public void writeStartResultSet() {
   170 		super.writeStartResultSet();
   200 		super.writeStartResultSet();
   171 		resultSetCounter++;
   201 		resultSetCounter++;
   172 		printTextElement(qname("h2"), null, "Result set " + resultSetCounter);
   202 		printEmptyElement(qname("hr"), null);
       
   203 		printTextElement(qname("h2"), null, "Result set #" + resultSetCounter);
   173 	}
   204 	}
   174 
   205 
   175 	@Override
   206 	@Override
   176 	public void writeEndResultSet() {
   207 	public void writeEndResultSet() {
   177 		super.writeEndResultSet();
   208 		super.writeEndResultSet();
   178 		printEndElement();
   209 		printEndElement();
   179 		printEndElement();
   210 		printEndElement();
       
   211 
       
   212 		printTextElement(qname("p"), null, "Record count: " + getCurrentRowCount());
   180 	}
   213 	}
   181 
   214 
   182 	@Override
   215 	@Override
   183 	public void writeStartUpdatesResult() {
   216 	public void writeStartUpdatesResult() {
   184 		super.writeStartUpdatesResult();
   217 		super.writeStartUpdatesResult();
   185 		updatesResultCounter++;
   218 		updatesResultCounter++;
   186 		printTextElement(qname("h2"), null, "Updates result " + updatesResultCounter);
   219 		printEmptyElement(qname("hr"), null);
       
   220 		printTextElement(qname("h2"), null, "Updates result #" + updatesResultCounter);
   187 	}
   221 	}
   188 
   222 
   189 	@Override
   223 	@Override
   190 	public void writeUpdatedRowsCount(int updatedRowsCount) {
   224 	public void writeUpdatedRowsCount(int updatedRowsCount) {
   191 		super.writeUpdatedRowsCount(updatedRowsCount);
   225 		super.writeUpdatedRowsCount(updatedRowsCount);
   192 		printTextElement(qname("p"), null, "Updated rows: " + updatedRowsCount);
   226 		printTextElement(qname("p"), null, "Updated rows: " + updatedRowsCount);
   193 	}
   227 	}
   194 
       
   195 	protected String toString(Object value) {
       
   196 		return String.valueOf(value);
       
   197 	}
       
   198 }
   228 }