1.1 --- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/XhtmlFormatter.java Sat Jan 04 21:21:04 2014 +0100
1.2 +++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/XhtmlFormatter.java Sat Jan 04 22:38:59 2014 +0100
1.3 @@ -17,6 +17,19 @@
1.4 */
1.5 package info.globalcode.sql.dk.formatting;
1.6
1.7 +import info.globalcode.sql.dk.Constants;
1.8 +import info.globalcode.sql.dk.NamedParameter;
1.9 +import info.globalcode.sql.dk.Parameter;
1.10 +import info.globalcode.sql.dk.Xmlns;
1.11 +import info.globalcode.sql.dk.configuration.DatabaseDefinition;
1.12 +import info.globalcode.sql.dk.configuration.Properties;
1.13 +import info.globalcode.sql.dk.configuration.Property;
1.14 +import static info.globalcode.sql.dk.formatting.AbstractXmlFormatter.qname;
1.15 +import java.util.HashMap;
1.16 +import java.util.List;
1.17 +import java.util.Map;
1.18 +import javax.xml.namespace.QName;
1.19 +
1.20 /**
1.21 *
1.22 * @author Ing. František Kučera (frantovo.cz)
1.23 @@ -24,8 +37,162 @@
1.24 public class XhtmlFormatter extends AbstractXmlFormatter {
1.25
1.26 public static final String NAME = "xhtml"; // bash-completion:formatter
1.27 + private int resultSetCounter = 0;
1.28 + private int updatesResultCounter = 0;
1.29
1.30 public XhtmlFormatter(FormatterContext formatterContext) {
1.31 - super(formatterContext);
1.32 + super(addDefaults(formatterContext));
1.33 + }
1.34 +
1.35 + /**
1.36 + * Do not indent text – preserve whitespace for pre elements
1.37 + */
1.38 + private static FormatterContext addDefaults(FormatterContext formatterContext) {
1.39 + Properties defaults = new Properties(1);
1.40 + defaults.add(new Property(PROPERTY_INDENT_TEXT, "false"));
1.41 + formatterContext.getProperties().setLastDefaults(defaults);
1.42 + return formatterContext;
1.43 + }
1.44 +
1.45 + @Override
1.46 + public void writeStartBatch() {
1.47 + super.writeStartBatch();
1.48 + printStartDocument();
1.49 + Map<QName, String> attributes = new HashMap<>(1);
1.50 + attributes.put(qname("xmlns"), Xmlns.XHTML);
1.51 + printStartElement(qname("html"), attributes);
1.52 +
1.53 + printStartElement(qname("head"));
1.54 + printTextElement(qname("title"), null, Constants.PROGRAM_NAME + ": batch results");
1.55 + printEndElement();
1.56 +
1.57 + printStartElement(qname("body"));
1.58 + }
1.59 +
1.60 + @Override
1.61 + public void writeEndBatch() {
1.62 + super.writeEndBatch();
1.63 + printEndElement();
1.64 + printEndElement();
1.65 + printEndDocument();
1.66 + }
1.67 +
1.68 + @Override
1.69 + public void writeStartDatabase(DatabaseDefinition databaseDefinition) {
1.70 + super.writeStartDatabase(databaseDefinition);
1.71 + printTextElement(qname("h1"), null, "Database: " + databaseDefinition.getName());
1.72 + }
1.73 +
1.74 + @Override
1.75 + public void writeQuery(String sql) {
1.76 + super.writeQuery(sql);
1.77 + printTextElement(qname("h3"), null, "SQL:");
1.78 + printTextElement(qname("pre"), null, sql);
1.79 + }
1.80 +
1.81 + @Override
1.82 + public void writeParameters(List<? extends Parameter> parameters) {
1.83 + super.writeParameters(parameters);
1.84 +
1.85 + if (parameters == null || parameters.isEmpty()) {
1.86 + printTextElement(qname("p"), null, "(this query has no parameters)");
1.87 + } else {
1.88 + printTextElement(qname("h3"), null, "Parameters:");
1.89 +
1.90 + printStartElement(qname("table"));
1.91 +
1.92 + printStartElement(qname("theader"));
1.93 + printStartElement(qname("tr"));
1.94 + printTextElement(qname("td"), null, "number/name");
1.95 + printTextElement(qname("td"), null, "type");
1.96 + printTextElement(qname("td"), null, "value");
1.97 + printEndElement();
1.98 + printEndElement();
1.99 +
1.100 + printStartElement(qname("tbody"));
1.101 + for (int i = 0; i < parameters.size(); i++) {
1.102 + Parameter p = parameters.get(i);
1.103 + printStartElement(qname("tr"));
1.104 + String numberOrName;
1.105 + if (p instanceof NamedParameter) {
1.106 + numberOrName = ((NamedParameter) p).getName();
1.107 + } else {
1.108 + numberOrName = String.valueOf(i + 1);
1.109 + }
1.110 + printTextElement(qname("td"), null, numberOrName);
1.111 + printTextElement(qname("td"), null, p.getType().name());
1.112 + printTextElement(qname("td"), null, toString(p.getValue()));
1.113 + printEndElement();
1.114 + }
1.115 + printEndElement();
1.116 +
1.117 + printEndElement();
1.118 + }
1.119 + }
1.120 +
1.121 + @Override
1.122 + public void writeColumnsHeader(ColumnsHeader header) {
1.123 + super.writeColumnsHeader(header);
1.124 + printTextElement(qname("h3"), null, "Data:");
1.125 + printStartElement(qname("table"));
1.126 + printStartElement(qname("theader"));
1.127 + printStartElement(qname("tr"));
1.128 + for (ColumnDescriptor cd : header.getColumnDescriptors()) {
1.129 + // TODO: type
1.130 + printTextElement(qname("td"), null, cd.getLabel());
1.131 + }
1.132 + printEndElement();
1.133 + printEndElement();
1.134 +
1.135 + printStartElement(qname("tbody"));
1.136 + }
1.137 +
1.138 + @Override
1.139 + public void writeStartRow() {
1.140 + super.writeStartRow();
1.141 + printStartElement(qname("tr"));
1.142 + }
1.143 +
1.144 + @Override
1.145 + public void writeColumnValue(Object value) {
1.146 + super.writeColumnValue(value);
1.147 + printTextElement(qname("td"), null, toString(value));
1.148 + }
1.149 +
1.150 + @Override
1.151 + public void writeEndRow() {
1.152 + super.writeEndRow();
1.153 + printEndElement();
1.154 + }
1.155 +
1.156 + @Override
1.157 + public void writeStartResultSet() {
1.158 + super.writeStartResultSet();
1.159 + resultSetCounter++;
1.160 + printTextElement(qname("h2"), null, "Result set " + resultSetCounter);
1.161 + }
1.162 +
1.163 + @Override
1.164 + public void writeEndResultSet() {
1.165 + super.writeEndResultSet();
1.166 + printEndElement();
1.167 + printEndElement();
1.168 + }
1.169 +
1.170 + @Override
1.171 + public void writeStartUpdatesResult() {
1.172 + super.writeStartUpdatesResult();
1.173 + updatesResultCounter++;
1.174 + printTextElement(qname("h2"), null, "Updates result " + updatesResultCounter);
1.175 + }
1.176 +
1.177 + @Override
1.178 + public void writeUpdatedRowsCount(int updatedRowsCount) {
1.179 + super.writeUpdatedRowsCount(updatedRowsCount);
1.180 + printTextElement(qname("p"), null, "Updated rows: " + updatedRowsCount);
1.181 + }
1.182 +
1.183 + protected String toString(Object value) {
1.184 + return String.valueOf(value);
1.185 }
1.186 }