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 } |
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 } |