[#5853] Allow for omitting header

This commit is contained in:
lukaseder 2017-02-09 22:40:56 +01:00
parent 51ba9796c8
commit d6c28cb742
4 changed files with 158 additions and 80 deletions

View File

@ -878,6 +878,15 @@ public interface Result<R extends Record> extends List<R>, Attachable {
*/
Document intoXML();
/**
* Get this result as XML.
*
* @see #formatXML()
* @see <a
* href="http://www.jooq.org/xsd/jooq-export-3.10.0.xsd">http://www.jooq.org/xsd/jooq-export-3.10.0.xsd</a>
*/
Document intoXML(XMLFormat format);
/**
* Get this result as XML using a SAX <code>ContentHandler</code>.
*
@ -889,6 +898,17 @@ public interface Result<R extends Record> extends List<R>, Attachable {
*/
<H extends ContentHandler> H intoXML(H handler) throws SAXException;
/**
* Get this result as XML using a SAX <code>ContentHandler</code>.
*
* @param handler The custom content handler.
* @return The argument content handler is returned for convenience.
* @see #formatXML()
* @see <a
* href="http://www.jooq.org/xsd/jooq-export-3.10.0.xsd">http://www.jooq.org/xsd/jooq-export-3.10.0.xsd</a>
*/
<H extends ContentHandler> H intoXML(H handler, XMLFormat format) throws SAXException;
/**
* Return the generated result as a list of name/value maps.
*

View File

@ -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 <code>true</code>.
* <p>
* This flag governs whether the <code>/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;
}
}

View File

@ -1003,50 +1003,55 @@ final class ResultImpl<R extends Record> implements Result<R>, 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("<result xmlns=\"" + Constants.NS_EXPORT + "\">")
.append(newline).append(indent[0]).append("<fields>");
writer.append("<result xmlns=\"" + Constants.NS_EXPORT + "\">");
for (Field<?> field : fields.fields) {
writer.append(newline).append(indent[1]).append("<field");
if (format.header()) {
writer.append(newline).append(indent[0]).append("<fields>");
if (field instanceof TableField) {
Table<?> table = ((TableField<?, ?>) field).getTable();
for (Field<?> field : fields.fields) {
writer.append(newline).append(indent[1]).append("<field");
if (table != null) {
Schema schema = table.getSchema();
if (field instanceof TableField) {
Table<?> 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("</fields>");
writer.append(newline).append(indent[0]).append("<records>");
}
writer.append(newline).append(indent[0]).append("</fields>");
writer.append(newline).append(indent[0]).append("<records>");
for (Record record : this) {
writer.append(newline).append(indent[1]).append("<record>");
writer.append(newline).append(indent[recordLevel]).append("<record>");
for (int index = 0; index < fields.fields.length; index++) {
Object value = record.get(index);
writer.append(newline).append(indent[2]).append("<value field=\"");
writer.append(newline).append(indent[valueLevel]).append("<value field=\"");
writer.append(escapeXML(fields.fields[index].getName()));
writer.append("\"");
@ -1060,12 +1065,13 @@ final class ResultImpl<R extends Record> implements Result<R>, AttachableInterna
}
}
writer.append(newline).append(indent[1]).append("</record>");
writer.append(newline).append(indent[recordLevel]).append("</record>");
}
writer.append(newline).append(indent[0]).append("</records>");
writer.append(newline).append("</result>");
if (format.header())
writer.append(newline).append(indent[0]).append("</records>");
writer.append(newline).append("</result>");
writer.flush();
}
catch (java.io.IOException e) {
@ -1129,6 +1135,11 @@ final class ResultImpl<R extends Record> implements Result<R>, 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<R extends Record> implements Result<R>, 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<R extends Record> implements Result<R>, AttachableInterna
@Override
public final <H extends ContentHandler> H intoXML(H handler) throws SAXException {
return intoXML(handler, new XMLFormat());
}
@Override
public final <H extends ContentHandler> 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<R extends Record> implements Result<R>, AttachableInterna
handler.endElement("", "", "record");
}
handler.endElement("", "", "records");
if (format.header())
handler.endElement("", "", "records");
handler.endPrefixMapping("");
handler.endDocument();
return handler;

View File

@ -8,15 +8,18 @@
<element name="result" type="jooq-export:Result"/>
<complexType name="Result">
<sequence>
<element name="fields" type="jooq-export:Fields" maxOccurs="1" minOccurs="1"/>
<element name="records" type="jooq-export:Records" maxOccurs="1" minOccurs="1"/>
</sequence>
<choice>
<sequence>
<element name="fields" type="jooq-export:Fields" minOccurs="0" maxOccurs="1"/>
<element name="records" type="jooq-export:Records" minOccurs="1" maxOccurs="1"/>
</sequence>
<element name="record" type="jooq-export:Record" minOccurs="0" maxOccurs="unbounded"/>
</choice>
</complexType>
<complexType name="Fields">
<sequence>
<element name="field" type="jooq-export:Field" maxOccurs="unbounded" minOccurs="0"/>
<element name="field" type="jooq-export:Field" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
@ -30,13 +33,13 @@
<complexType name="Records">
<sequence>
<element name="record" type="jooq-export:Record" maxOccurs="unbounded" minOccurs="0"/>
<element name="record" type="jooq-export:Record" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="Record">
<sequence>
<element name="value" type="jooq-export:Value" maxOccurs="unbounded" minOccurs="0"/>
<element name="value" type="jooq-export:Value" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>