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