java/sql-dk/src/info/globalcode/sql/dk/formatting/XmlFormatter.java
branchv_0
changeset 165 871185e406b3
parent 163 1df10a9be6f4
child 206 e2f24eea8543
equal deleted inserted replaced
164:8cc7862605a1 165:871185e406b3
    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();