18 package info.globalcode.sql.dk.formatting; |
18 package info.globalcode.sql.dk.formatting; |
19 |
19 |
20 import info.globalcode.sql.dk.Parameter; |
20 import info.globalcode.sql.dk.Parameter; |
21 import info.globalcode.sql.dk.Xmlns; |
21 import info.globalcode.sql.dk.Xmlns; |
22 import info.globalcode.sql.dk.configuration.DatabaseDefinition; |
22 import info.globalcode.sql.dk.configuration.DatabaseDefinition; |
23 import static info.globalcode.sql.dk.formatting.AbstractXmlFormatter.qname; |
|
24 import static info.globalcode.sql.dk.Functions.notNull; |
23 import static info.globalcode.sql.dk.Functions.notNull; |
25 import info.globalcode.sql.dk.NamedParameter; |
24 import info.globalcode.sql.dk.NamedParameter; |
|
25 import static info.globalcode.sql.dk.formatting.AbstractXmlFormatter.qname; |
|
26 import java.sql.Array; |
|
27 import java.sql.SQLException; |
26 import java.util.LinkedHashMap; |
28 import java.util.LinkedHashMap; |
27 import java.util.List; |
29 import java.util.List; |
28 import java.util.Map; |
30 import java.util.Map; |
|
31 import java.util.logging.Level; |
|
32 import java.util.logging.Logger; |
29 import javax.xml.namespace.QName; |
33 import javax.xml.namespace.QName; |
30 |
34 |
31 /** |
35 /** |
32 * <p>Prints machine-readable output – XML document containing resultsets and updates count. Good |
36 * <p>Prints machine-readable output – XML document containing resultsets and updates count. Good |
33 * choice for further processing – e.g. XSL transformation.</p> |
37 * choice for further processing – e.g. XSL transformation.</p> |
38 */ |
42 */ |
39 public class XmlFormatter extends AbstractXmlFormatter { |
43 public class XmlFormatter extends AbstractXmlFormatter { |
40 |
44 |
41 public static final String NAME = "xml"; // bash-completion:formatter |
45 public static final String NAME = "xml"; // bash-completion:formatter |
42 public static final String PROPERTY_LABELED_COLUMNS = "labeledColumns"; |
46 public static final String PROPERTY_LABELED_COLUMNS = "labeledColumns"; |
|
47 private static final Logger log = Logger.getLogger(XmlFormatter.class.getName()); |
43 private final boolean labeledColumns; |
48 private final boolean labeledColumns; |
44 |
49 |
45 public XmlFormatter(FormatterContext formatterContext) { |
50 public XmlFormatter(FormatterContext formatterContext) { |
46 super(formatterContext); |
51 super(formatterContext); |
47 labeledColumns = formatterContext.getProperties().getBoolean(PROPERTY_LABELED_COLUMNS, false); |
52 labeledColumns = formatterContext.getProperties().getBoolean(PROPERTY_LABELED_COLUMNS, false); |
150 if (attributes == null) { |
155 if (attributes == null) { |
151 attributes = new LinkedHashMap<>(2); |
156 attributes = new LinkedHashMap<>(2); |
152 } |
157 } |
153 attributes.put(qname("null"), "true"); |
158 attributes.put(qname("null"), "true"); |
154 printEmptyElement(qname("column"), attributes); |
159 printEmptyElement(qname("column"), attributes); |
|
160 } else if (value instanceof Array) { |
|
161 |
|
162 |
|
163 |
|
164 Array sqlArray = (Array) value; |
|
165 try { |
|
166 Object[] array = (Object[]) sqlArray.getArray(); |
|
167 printStartElement(qname("column"), attributes); |
|
168 printArray(array); |
|
169 printEndElement(); |
|
170 } catch (SQLException e) { |
|
171 log.log(Level.SEVERE, "Unable to format array", e); |
|
172 writeColumnValue(String.valueOf(value)); |
|
173 } |
|
174 |
|
175 |
155 } else { |
176 } else { |
156 printTextElement(qname("column"), attributes, toString(value)); |
177 printTextElement(qname("column"), attributes, toString(value)); |
157 } |
178 } |
|
179 } |
|
180 |
|
181 private void printArray(Object[] array) { |
|
182 printStartElement(qname("array")); |
|
183 for (Object o : array) { |
|
184 if (o instanceof Object[]) { |
|
185 printStartElement(qname("item")); |
|
186 printArray((Object[]) o); |
|
187 printEndElement(); |
|
188 } else { |
|
189 printTextElement(qname("item"), null, String.valueOf(o)); |
|
190 } |
|
191 } |
|
192 printEndElement(); |
158 } |
193 } |
159 |
194 |
160 @Override |
195 @Override |
161 public void writeEndRow() { |
196 public void writeEndRow() { |
162 super.writeEndRow(); |
197 super.writeEndRow(); |