From b08e191ea25692ecb088d90d37b5a6d577e10823 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Thu, 9 Feb 2017 23:28:47 +0100 Subject: [PATCH] [#5853] Alternative record representations --- jOOQ/src/main/java/org/jooq/XMLFormat.java | 77 ++++++++++++++++--- .../main/java/org/jooq/impl/ResultImpl.java | 44 ++++++++--- .../main/resources/xsd/jooq-export-3.10.0.xsd | 13 +++- 3 files changed, 111 insertions(+), 23 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/XMLFormat.java b/jOOQ/src/main/java/org/jooq/XMLFormat.java index 8ad7eaade3..28007e6163 100644 --- a/jOOQ/src/main/java/org/jooq/XMLFormat.java +++ b/jOOQ/src/main/java/org/jooq/XMLFormat.java @@ -41,11 +41,12 @@ package org.jooq; */ public final class XMLFormat { - final boolean xmlns; - final boolean format; - final String newline; - final int indent; - final boolean header; + final boolean xmlns; + final boolean format; + final String newline; + final int indent; + final boolean header; + final RecordFormat recordFormat; public XMLFormat() { this( @@ -53,7 +54,8 @@ public final class XMLFormat { false, "\n", 2, - true + true, + RecordFormat.VALUE_ELEMENTS_WITH_FIELD_ATTRIBUTE ); } @@ -62,13 +64,15 @@ public final class XMLFormat { boolean format, String newline, int indent, - boolean header + boolean header, + RecordFormat recordFormat ) { this.xmlns = xmlns; this.format = format; this.newline = newline; this.indent = indent; this.header = header; + this.recordFormat = recordFormat; } /** @@ -80,7 +84,8 @@ public final class XMLFormat { format, newline, indent, - header + header, + recordFormat ); } @@ -100,7 +105,8 @@ public final class XMLFormat { newFormat, newline, indent, - header + header, + recordFormat ); } @@ -120,7 +126,8 @@ public final class XMLFormat { format, newNewline, indent, - header + header, + recordFormat ); } @@ -140,7 +147,8 @@ public final class XMLFormat { format, newline, newIndent, - header + header, + recordFormat ); } @@ -163,7 +171,8 @@ public final class XMLFormat { format, newline, indent, - newHeader + newHeader, + recordFormat ); } @@ -173,4 +182,48 @@ public final class XMLFormat { public boolean header() { return header; } + + /** + * The record format to be applied, defaulting to + * {@link RecordFormat#VALUE_ELEMENTS_WITH_FIELD_ATTRIBUTE}. + */ + public XMLFormat recordFormat(RecordFormat newRecordFormat) { + return new XMLFormat( + xmlns, + format, + newline, + indent, + header, + newRecordFormat + ); + } + + /** + * The record format to be applied, defaulting to + * {@link RecordFormat#VALUE_ELEMENTS_WITH_FIELD_ATTRIBUTE}. + */ + public RecordFormat recordFormat() { + return recordFormat; + } + + /** + * The format of individual XML records. + */ + public enum RecordFormat { + + /** + * The default: /record/value[@field="colname"]/text(). + */ + VALUE_ELEMENTS_WITH_FIELD_ATTRIBUTE, + + /** + * Simplified: /record/value/text(). + */ + VALUE_ELEMENTS, + + /** + * Simplified: /record/colname/text(). + */ + COLUMN_NAME_ELEMENTS, + } } diff --git a/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java b/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java index 8ffa6411ab..a2340565af 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java @@ -37,6 +37,8 @@ package org.jooq.impl; import static java.lang.Math.max; import static java.lang.Math.min; +import static org.jooq.XMLFormat.RecordFormat.COLUMN_NAME_ELEMENTS; +import static org.jooq.XMLFormat.RecordFormat.VALUE_ELEMENTS_WITH_FIELD_ATTRIBUTE; import static org.jooq.impl.DSL.insertInto; import static org.jooq.impl.DSL.name; import static org.jooq.impl.DSL.table; @@ -1052,11 +1054,21 @@ final class ResultImpl implements Result, AttachableInterna writer.append(newline).append(indent[recordLevel]).append(""); for (int index = 0; index < fields.fields.length; index++) { + writer.append(newline).append(indent[valueLevel]); + + String tag = format.recordFormat() == COLUMN_NAME_ELEMENTS + ? escapeXML(fields.fields[index].getName()) + : "value"; + Object value = record.get(index); - writer.append(newline).append(indent[valueLevel]).append(""); @@ -1064,7 +1076,7 @@ final class ResultImpl implements Result, AttachableInterna else { writer.append(">"); writer.append(escapeXML(format0(value, false, false))); - writer.append(""); + writer.append(""); } } @@ -1195,8 +1207,14 @@ final class ResultImpl implements Result, AttachableInterna Field field = fields.fields[index]; Object value = record.get(index); - Element eValue = document.createElement("value"); - eValue.setAttribute("field", field.getName()); + String tag = format.recordFormat() == COLUMN_NAME_ELEMENTS + ? escapeXML(fields.fields[index].getName()) + : "value"; + + Element eValue = document.createElement(tag); + + if (format.recordFormat() == VALUE_ELEMENTS_WITH_FIELD_ATTRIBUTE) + eValue.setAttribute("field", field.getName()); eRecord.appendChild(eValue); if (value != null) { @@ -1265,17 +1283,23 @@ final class ResultImpl implements Result, AttachableInterna Field field = fields.fields[index]; Object value = record.get(index); - AttributesImpl attrs = new AttributesImpl(); - attrs.addAttribute("", "", "field", "CDATA", field.getName()); + String tag = format.recordFormat() == COLUMN_NAME_ELEMENTS + ? escapeXML(fields.fields[index].getName()) + : "value"; - handler.startElement("", "", "value", attrs); + AttributesImpl attrs = new AttributesImpl(); + + if (format.recordFormat() == VALUE_ELEMENTS_WITH_FIELD_ATTRIBUTE) + attrs.addAttribute("", "", "field", "CDATA", field.getName()); + + handler.startElement("", "", tag, attrs); if (value != null) { char[] chars = format0(value, false, false).toCharArray(); handler.characters(chars, 0, chars.length); } - handler.endElement("", "", "value"); + handler.endElement("", "", tag); } handler.endElement("", "", "record"); 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 c3e08ec631..3132e2198d 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 @@ -38,15 +38,26 @@ + + + + - +