java/sql-dk/src/info/globalcode/sql/dk/formatting/XhtmlFormatter.java
author František Kučera <franta-hg@frantovo.cz>
Sat, 04 Jan 2014 22:38:59 +0100
branchv_0
changeset 134 f2510551b5bf
parent 128 67f5ff139da0
child 135 ef432015fdee
permissions -rw-r--r--
Basic XHTML formatter
     1 /**
     2  * SQL-DK
     3  * Copyright © 2014 František Kučera (frantovo.cz)
     4  *
     5  * This program is free software: you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation, either version 3 of the License, or
     8  * (at your option) any later version.
     9  *
    10  * This program is distributed in the hope that it will be useful,
    11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    13  * GNU General Public License for more details.
    14  *
    15  * You should have received a copy of the GNU General Public License
    16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
    17  */
    18 package info.globalcode.sql.dk.formatting;
    19 
    20 import info.globalcode.sql.dk.Constants;
    21 import info.globalcode.sql.dk.NamedParameter;
    22 import info.globalcode.sql.dk.Parameter;
    23 import info.globalcode.sql.dk.Xmlns;
    24 import info.globalcode.sql.dk.configuration.DatabaseDefinition;
    25 import info.globalcode.sql.dk.configuration.Properties;
    26 import info.globalcode.sql.dk.configuration.Property;
    27 import static info.globalcode.sql.dk.formatting.AbstractXmlFormatter.qname;
    28 import java.util.HashMap;
    29 import java.util.List;
    30 import java.util.Map;
    31 import javax.xml.namespace.QName;
    32 
    33 /**
    34  *
    35  * @author Ing. František Kučera (frantovo.cz)
    36  */
    37 public class XhtmlFormatter extends AbstractXmlFormatter {
    38 
    39 	public static final String NAME = "xhtml"; // bash-completion:formatter
    40 	private int resultSetCounter = 0;
    41 	private int updatesResultCounter = 0;
    42 
    43 	public XhtmlFormatter(FormatterContext formatterContext) {
    44 		super(addDefaults(formatterContext));
    45 	}
    46 
    47 	/**
    48 	 * Do not indent text – preserve whitespace for pre elements
    49 	 */
    50 	private static FormatterContext addDefaults(FormatterContext formatterContext) {
    51 		Properties defaults = new Properties(1);
    52 		defaults.add(new Property(PROPERTY_INDENT_TEXT, "false"));
    53 		formatterContext.getProperties().setLastDefaults(defaults);
    54 		return formatterContext;
    55 	}
    56 
    57 	@Override
    58 	public void writeStartBatch() {
    59 		super.writeStartBatch();
    60 		printStartDocument();
    61 		Map<QName, String> attributes = new HashMap<>(1);
    62 		attributes.put(qname("xmlns"), Xmlns.XHTML);
    63 		printStartElement(qname("html"), attributes);
    64 
    65 		printStartElement(qname("head"));
    66 		printTextElement(qname("title"), null, Constants.PROGRAM_NAME + ": batch results");
    67 		printEndElement();
    68 
    69 		printStartElement(qname("body"));
    70 	}
    71 
    72 	@Override
    73 	public void writeEndBatch() {
    74 		super.writeEndBatch();
    75 		printEndElement();
    76 		printEndElement();
    77 		printEndDocument();
    78 	}
    79 
    80 	@Override
    81 	public void writeStartDatabase(DatabaseDefinition databaseDefinition) {
    82 		super.writeStartDatabase(databaseDefinition);
    83 		printTextElement(qname("h1"), null, "Database: " + databaseDefinition.getName());
    84 	}
    85 
    86 	@Override
    87 	public void writeQuery(String sql) {
    88 		super.writeQuery(sql);
    89 		printTextElement(qname("h3"), null, "SQL:");
    90 		printTextElement(qname("pre"), null, sql);
    91 	}
    92 
    93 	@Override
    94 	public void writeParameters(List<? extends Parameter> parameters) {
    95 		super.writeParameters(parameters);
    96 
    97 		if (parameters == null || parameters.isEmpty()) {
    98 			printTextElement(qname("p"), null, "(this query has no parameters)");
    99 		} else {
   100 			printTextElement(qname("h3"), null, "Parameters:");
   101 
   102 			printStartElement(qname("table"));
   103 
   104 			printStartElement(qname("theader"));
   105 			printStartElement(qname("tr"));
   106 			printTextElement(qname("td"), null, "number/name");
   107 			printTextElement(qname("td"), null, "type");
   108 			printTextElement(qname("td"), null, "value");
   109 			printEndElement();
   110 			printEndElement();
   111 
   112 			printStartElement(qname("tbody"));
   113 			for (int i = 0; i < parameters.size(); i++) {
   114 				Parameter p = parameters.get(i);
   115 				printStartElement(qname("tr"));
   116 				String numberOrName;
   117 				if (p instanceof NamedParameter) {
   118 					numberOrName = ((NamedParameter) p).getName();
   119 				} else {
   120 					numberOrName = String.valueOf(i + 1);
   121 				}
   122 				printTextElement(qname("td"), null, numberOrName);
   123 				printTextElement(qname("td"), null, p.getType().name());
   124 				printTextElement(qname("td"), null, toString(p.getValue()));
   125 				printEndElement();
   126 			}
   127 			printEndElement();
   128 
   129 			printEndElement();
   130 		}
   131 	}
   132 
   133 	@Override
   134 	public void writeColumnsHeader(ColumnsHeader header) {
   135 		super.writeColumnsHeader(header);
   136 		printTextElement(qname("h3"), null, "Data:");
   137 		printStartElement(qname("table"));
   138 		printStartElement(qname("theader"));
   139 		printStartElement(qname("tr"));
   140 		for (ColumnDescriptor cd : header.getColumnDescriptors()) {
   141 			// TODO: type
   142 			printTextElement(qname("td"), null, cd.getLabel());
   143 		}
   144 		printEndElement();
   145 		printEndElement();
   146 
   147 		printStartElement(qname("tbody"));
   148 	}
   149 
   150 	@Override
   151 	public void writeStartRow() {
   152 		super.writeStartRow();
   153 		printStartElement(qname("tr"));
   154 	}
   155 
   156 	@Override
   157 	public void writeColumnValue(Object value) {
   158 		super.writeColumnValue(value);
   159 		printTextElement(qname("td"), null, toString(value));
   160 	}
   161 
   162 	@Override
   163 	public void writeEndRow() {
   164 		super.writeEndRow();
   165 		printEndElement();
   166 	}
   167 
   168 	@Override
   169 	public void writeStartResultSet() {
   170 		super.writeStartResultSet();
   171 		resultSetCounter++;
   172 		printTextElement(qname("h2"), null, "Result set " + resultSetCounter);
   173 	}
   174 
   175 	@Override
   176 	public void writeEndResultSet() {
   177 		super.writeEndResultSet();
   178 		printEndElement();
   179 		printEndElement();
   180 	}
   181 
   182 	@Override
   183 	public void writeStartUpdatesResult() {
   184 		super.writeStartUpdatesResult();
   185 		updatesResultCounter++;
   186 		printTextElement(qname("h2"), null, "Updates result " + updatesResultCounter);
   187 	}
   188 
   189 	@Override
   190 	public void writeUpdatedRowsCount(int updatedRowsCount) {
   191 		super.writeUpdatedRowsCount(updatedRowsCount);
   192 		printTextElement(qname("p"), null, "Updated rows: " + updatedRowsCount);
   193 	}
   194 
   195 	protected String toString(Object value) {
   196 		return String.valueOf(value);
   197 	}
   198 }