[#5853] Allow for omitting header
This commit is contained in:
parent
51ba9796c8
commit
d6c28cb742
@ -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.
|
||||
*
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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>
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user