diff --git a/jOOQ/src/main/java/org/jooq/Result.java b/jOOQ/src/main/java/org/jooq/Result.java index 3521b1742b..75e6328a6b 100644 --- a/jOOQ/src/main/java/org/jooq/Result.java +++ b/jOOQ/src/main/java/org/jooq/Result.java @@ -878,6 +878,15 @@ public interface Result extends List, Attachable { */ Document intoXML(); + /** + * Get this result as XML. + * + * @see #formatXML() + * @see http://www.jooq.org/xsd/jooq-export-3.10.0.xsd + */ + Document intoXML(XMLFormat format); + /** * Get this result as XML using a SAX ContentHandler. * @@ -889,6 +898,17 @@ public interface Result extends List, Attachable { */ H intoXML(H handler) throws SAXException; + /** + * Get this result as XML using a SAX ContentHandler. + * + * @param handler The custom content handler. + * @return The argument content handler is returned for convenience. + * @see #formatXML() + * @see http://www.jooq.org/xsd/jooq-export-3.10.0.xsd + */ + H intoXML(H handler, XMLFormat format) throws SAXException; + /** * Return the generated result as a list of name/value maps. * diff --git a/jOOQ/src/main/java/org/jooq/XMLFormat.java b/jOOQ/src/main/java/org/jooq/XMLFormat.java index 2bb66062f1..3a4bc3adf2 100644 --- a/jOOQ/src/main/java/org/jooq/XMLFormat.java +++ b/jOOQ/src/main/java/org/jooq/XMLFormat.java @@ -44,23 +44,27 @@ public final class XMLFormat { final boolean format; final String newline; final int indent; + final boolean header; public XMLFormat() { this( false, "\n", - 2 + 2, + true ); } private XMLFormat( boolean format, String newline, - int indent + int indent, + boolean header ) { this.format = format; this.newline = newline; this.indent = indent; + this.header = header; } /** @@ -70,7 +74,8 @@ public final class XMLFormat { return new XMLFormat( newFormat, newline, - indent + indent, + header ); } @@ -88,7 +93,8 @@ public final class XMLFormat { return new XMLFormat( format, newNewline, - indent + indent, + header ); } @@ -106,7 +112,8 @@ public final class XMLFormat { return new XMLFormat( format, newline, - newIndent + newIndent, + header ); } @@ -116,4 +123,26 @@ public final class XMLFormat { public int indent() { return indent; } + + /** + * The new header value, defaulting to true. + *

+ * This flag governs whether the /result/fields element should be + * generated on export. + */ + public XMLFormat header(boolean newHeader) { + return new XMLFormat( + format, + newline, + indent, + newHeader + ); + } + + /** + * The header. + */ + public boolean header() { + return header; + } } diff --git a/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java b/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java index d51e132026..a77c71f362 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java @@ -1003,50 +1003,55 @@ final class ResultImpl implements Result, AttachableInterna format.format() ? rightPad("", format.indent() * 2) : "", format.format() ? rightPad("", format.indent() * 3) : "" }; + int recordLevel = format.header() ? 1 : 0; + int valueLevel = format.header() ? 2 : 1; try { - writer.append("") - .append(newline).append(indent[0]).append(""); + writer.append(""); - for (Field field : fields.fields) { - writer.append(newline).append(indent[1]).append(""); - if (field instanceof TableField) { - Table table = ((TableField) field).getTable(); + for (Field field : fields.fields) { + writer.append(newline).append(indent[1]).append(" table = ((TableField) field).getTable(); - if (schema != null) { - writer.append(" schema=\""); - writer.append(escapeXML(schema.getName())); + if (table != null) { + Schema schema = table.getSchema(); + + if (schema != null) { + writer.append(" schema=\""); + writer.append(escapeXML(schema.getName())); + writer.append("\""); + } + + writer.append(" table=\""); + writer.append(escapeXML(table.getName())); writer.append("\""); } - - writer.append(" table=\""); - writer.append(escapeXML(table.getName())); - writer.append("\""); } + + writer.append(" name=\""); + writer.append(escapeXML(field.getName())); + writer.append("\""); + writer.append(" type=\""); + writer.append(field.getDataType().getTypeName().toUpperCase()); + writer.append("\"/>"); } - writer.append(" name=\""); - writer.append(escapeXML(field.getName())); - writer.append("\""); - writer.append(" type=\""); - writer.append(field.getDataType().getTypeName().toUpperCase()); - writer.append("\"/>"); + writer.append(newline).append(indent[0]).append(""); + writer.append(newline).append(indent[0]).append(""); } - writer.append(newline).append(indent[0]).append(""); - writer.append(newline).append(indent[0]).append(""); - for (Record record : this) { - writer.append(newline).append(indent[1]).append(""); + writer.append(newline).append(indent[recordLevel]).append(""); for (int index = 0; index < fields.fields.length; index++) { Object value = record.get(index); - writer.append(newline).append(indent[2]).append(" implements Result, AttachableInterna } } - writer.append(newline).append(indent[1]).append(""); + writer.append(newline).append(indent[recordLevel]).append(""); } - writer.append(newline).append(indent[0]).append(""); - writer.append(newline).append(""); + if (format.header()) + writer.append(newline).append(indent[0]).append(""); + writer.append(newline).append(""); writer.flush(); } catch (java.io.IOException e) { @@ -1129,6 +1135,11 @@ final class ResultImpl implements Result, AttachableInterna @Override public final Document intoXML() { + return intoXML(new XMLFormat()); + } + + @Override + public final Document intoXML(XMLFormat format) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); @@ -1138,37 +1149,42 @@ final class ResultImpl implements Result, AttachableInterna eResult.setAttribute("xmlns", "http://www.jooq.org/xsd/jooq-export-3.7.0.xsd"); document.appendChild(eResult); - Element eFields = document.createElement("fields"); - eResult.appendChild(eFields); + Element eRecordParent = eResult; - for (Field field : fields.fields) { - Element eField = document.createElement("field"); + if (format.header()) { + Element eFields = document.createElement("fields"); + eResult.appendChild(eFields); - if (field instanceof TableField) { - Table table = ((TableField) field).getTable(); + for (Field field : fields.fields) { + Element eField = document.createElement("field"); - if (table != null) { - Schema schema = table.getSchema(); + if (field instanceof TableField) { + Table table = ((TableField) field).getTable(); - if (schema != null) { - eField.setAttribute("schema", schema.getName()); + if (table != null) { + Schema schema = table.getSchema(); + + if (schema != null) { + eField.setAttribute("schema", schema.getName()); + } + + eField.setAttribute("table", table.getName()); } - - eField.setAttribute("table", table.getName()); } + + eField.setAttribute("name", field.getName()); + eField.setAttribute("type", field.getDataType().getTypeName().toUpperCase()); + eFields.appendChild(eField); } - eField.setAttribute("name", field.getName()); - eField.setAttribute("type", field.getDataType().getTypeName().toUpperCase()); - eFields.appendChild(eField); + Element eRecords = document.createElement("records"); + eResult.appendChild(eRecords); + eRecordParent = eRecords; } - Element eRecords = document.createElement("records"); - eResult.appendChild(eRecords); - for (Record record : this) { Element eRecord = document.createElement("record"); - eRecords.appendChild(eRecord); + eRecordParent.appendChild(eRecord); for (int index = 0; index < fields.fields.length; index++) { Field field = fields.fields[index]; @@ -1193,40 +1209,48 @@ final class ResultImpl implements Result, AttachableInterna @Override public final H intoXML(H handler) throws SAXException { + return intoXML(handler, new XMLFormat()); + } + + @Override + public final H intoXML(H handler, XMLFormat format) throws SAXException { Attributes empty = new AttributesImpl(); handler.startDocument(); handler.startPrefixMapping("", "http://www.jooq.org/xsd/jooq-export-3.7.0.xsd"); handler.startElement("", "", "result", empty); - handler.startElement("", "", "fields", empty); - for (Field field : fields.fields) { - AttributesImpl attrs = new AttributesImpl(); + if (format.header()) { + handler.startElement("", "", "fields", empty); - if (field instanceof TableField) { - Table table = ((TableField) field).getTable(); + for (Field field : fields.fields) { + AttributesImpl attrs = new AttributesImpl(); - if (table != null) { - Schema schema = table.getSchema(); + if (field instanceof TableField) { + Table table = ((TableField) field).getTable(); - if (schema != null) { - attrs.addAttribute("", "", "schema", "CDATA", schema.getName()); + if (table != null) { + Schema schema = table.getSchema(); + + if (schema != null) { + attrs.addAttribute("", "", "schema", "CDATA", schema.getName()); + } + + attrs.addAttribute("", "", "table", "CDATA", table.getName()); } - - attrs.addAttribute("", "", "table", "CDATA", table.getName()); } + + attrs.addAttribute("", "", "name", "CDATA", field.getName()); + attrs.addAttribute("", "", "type", "CDATA", field.getDataType().getTypeName().toUpperCase()); + + handler.startElement("", "", "field", attrs); + handler.endElement("", "", "field"); } - attrs.addAttribute("", "", "name", "CDATA", field.getName()); - attrs.addAttribute("", "", "type", "CDATA", field.getDataType().getTypeName().toUpperCase()); - - handler.startElement("", "", "field", attrs); - handler.endElement("", "", "field"); + handler.endElement("", "", "fields"); + handler.startElement("", "", "records", empty); } - handler.endElement("", "", "fields"); - handler.startElement("", "", "records", empty); - for (Record record : this) { handler.startElement("", "", "record", empty); @@ -1250,7 +1274,9 @@ final class ResultImpl implements Result, AttachableInterna handler.endElement("", "", "record"); } - handler.endElement("", "", "records"); + if (format.header()) + handler.endElement("", "", "records"); + handler.endPrefixMapping(""); handler.endDocument(); return handler; diff --git a/jOOQ/src/main/resources/xsd/jooq-export-3.10.0.xsd b/jOOQ/src/main/resources/xsd/jooq-export-3.10.0.xsd index e2ed717afc..c3e08ec631 100644 --- a/jOOQ/src/main/resources/xsd/jooq-export-3.10.0.xsd +++ b/jOOQ/src/main/resources/xsd/jooq-export-3.10.0.xsd @@ -8,15 +8,18 @@ - - - - + + + + + + + - + @@ -30,13 +33,13 @@ - + - +