[jOOQ/jOOQ#13142] Add JSONFormat.mutable(), XMLFormat.mutable()

This commit is contained in:
Lukas Eder 2022-02-24 12:56:44 +01:00
parent 9575c383af
commit 3cc4b75fad
4 changed files with 368 additions and 198 deletions

View File

@ -73,18 +73,20 @@ public final class JSONFormat {
public final static JSONFormat DEFAULT_FOR_RESULTS = new JSONFormat();
public final static JSONFormat DEFAULT_FOR_RECORDS = new JSONFormat().header(false);
final boolean format;
final String newline;
final int globalIndent;
final int indent;
final String[] indented;
final boolean header;
final RecordFormat recordFormat;
final boolean wrapSingleColumnRecords;
final boolean quoteNested;
final boolean mutable;
boolean format;
String newline;
int globalIndent;
int indent;
String[] indented;
boolean header;
RecordFormat recordFormat;
boolean wrapSingleColumnRecords;
boolean quoteNested;
public JSONFormat() {
this(
false,
false,
"\n",
0,
@ -98,6 +100,7 @@ public final class JSONFormat {
}
private JSONFormat(
boolean mutable,
boolean format,
String newline,
int globalIndent,
@ -108,6 +111,7 @@ public final class JSONFormat {
boolean wrapSingleColumnRecords,
boolean quoteNested
) {
this.mutable = mutable;
this.format = format;
this.newline = newline;
this.globalIndent = globalIndent;
@ -124,22 +128,57 @@ public final class JSONFormat {
this.quoteNested = quoteNested;
}
/**
* Whether this configuration object is mutable.
*/
public final boolean mutable() {
return mutable;
}
/**
* The new value for the mutable flag, defaulting to <code>false</code>.
*/
@NotNull
public final JSONFormat mutable(boolean newMutable) {
if (mutable ^ newMutable)
return new JSONFormat(
newMutable,
format,
newline,
globalIndent,
indent,
null,
header,
recordFormat,
wrapSingleColumnRecords,
quoteNested
);
else
return this;
}
/**
* The new value for the formatting flag, defaulting to <code>false</code>.
*/
@NotNull
public final JSONFormat format(boolean newFormat) {
return new JSONFormat(
newFormat,
newline,
globalIndent,
indent,
null,
header,
recordFormat,
wrapSingleColumnRecords,
quoteNested
);
if (mutable) {
format = newFormat;
return this;
}
else
return new JSONFormat(
mutable,
newFormat,
newline,
globalIndent,
indent,
null,
header,
recordFormat,
wrapSingleColumnRecords,
quoteNested
);
}
/**
@ -154,17 +193,23 @@ public final class JSONFormat {
*/
@NotNull
public final JSONFormat newline(String newNewline) {
return new JSONFormat(
format,
newNewline,
globalIndent,
indent,
indented,
header,
recordFormat,
wrapSingleColumnRecords,
quoteNested
);
if (mutable) {
newline = newNewline;
return this;
}
else
return new JSONFormat(
mutable,
format,
newNewline,
globalIndent,
indent,
indented,
header,
recordFormat,
wrapSingleColumnRecords,
quoteNested
);
}
/**
@ -180,17 +225,23 @@ public final class JSONFormat {
*/
@NotNull
public final JSONFormat globalIndent(int newGlobalIndent) {
return new JSONFormat(
format,
newline,
newGlobalIndent,
indent,
null,
header,
recordFormat,
wrapSingleColumnRecords,
quoteNested
);
if (mutable) {
globalIndent = newGlobalIndent;
return this;
}
else
return new JSONFormat(
mutable,
format,
newline,
newGlobalIndent,
indent,
null,
header,
recordFormat,
wrapSingleColumnRecords,
quoteNested
);
}
/**
@ -205,17 +256,23 @@ public final class JSONFormat {
*/
@NotNull
public final JSONFormat indent(int newIndent) {
return new JSONFormat(
format,
newline,
globalIndent,
newIndent,
null,
header,
recordFormat,
wrapSingleColumnRecords,
quoteNested
);
if (mutable) {
indent = newIndent;
return this;
}
else
return new JSONFormat(
mutable,
format,
newline,
globalIndent,
newIndent,
null,
header,
recordFormat,
wrapSingleColumnRecords,
quoteNested
);
}
/**
@ -246,17 +303,23 @@ public final class JSONFormat {
*/
@NotNull
public final JSONFormat header(boolean newHeader) {
return new JSONFormat(
format,
newline,
globalIndent,
indent,
indented,
newHeader,
recordFormat,
wrapSingleColumnRecords,
quoteNested
);
if (mutable) {
header = newHeader;
return this;
}
else
return new JSONFormat(
mutable,
format,
newline,
globalIndent,
indent,
indented,
newHeader,
recordFormat,
wrapSingleColumnRecords,
quoteNested
);
}
/**
@ -273,17 +336,23 @@ public final class JSONFormat {
*/
@NotNull
public final JSONFormat recordFormat(RecordFormat newRecordFormat) {
return new JSONFormat(
format,
newline,
globalIndent,
indent,
indented,
header,
newRecordFormat,
wrapSingleColumnRecords,
quoteNested
);
if (mutable) {
recordFormat = newRecordFormat;
return this;
}
else
return new JSONFormat(
mutable,
format,
newline,
globalIndent,
indent,
indented,
header,
newRecordFormat,
wrapSingleColumnRecords,
quoteNested
);
}
/**
@ -300,17 +369,23 @@ public final class JSONFormat {
*/
@NotNull
public final JSONFormat wrapSingleColumnRecords(boolean newWrapSingleColumnRecords) {
return new JSONFormat(
format,
newline,
globalIndent,
indent,
indented,
header,
recordFormat,
newWrapSingleColumnRecords,
quoteNested
);
if (mutable) {
wrapSingleColumnRecords = newWrapSingleColumnRecords;
return this;
}
else
return new JSONFormat(
mutable,
format,
newline,
globalIndent,
indent,
indented,
header,
recordFormat,
newWrapSingleColumnRecords,
quoteNested
);
}
/**
@ -326,17 +401,23 @@ public final class JSONFormat {
*/
@NotNull
public final JSONFormat quoteNested(boolean newQuoteNested) {
return new JSONFormat(
format,
newline,
globalIndent,
indent,
indented,
header,
recordFormat,
wrapSingleColumnRecords,
newQuoteNested
);
if (mutable) {
quoteNested = newQuoteNested;
return this;
}
else
return new JSONFormat(
mutable,
format,
newline,
globalIndent,
indent,
indented,
header,
recordFormat,
wrapSingleColumnRecords,
newQuoteNested
);
}
/**

View File

@ -54,18 +54,20 @@ public final class XMLFormat {
public final static XMLFormat DEFAULT_FOR_RESULTS = new XMLFormat();
public final static XMLFormat DEFAULT_FOR_RECORDS = new XMLFormat().header(false).xmlns(false);
final boolean xmlns;
final boolean format;
final String newline;
final int globalIndent;
final int indent;
final String[] indented;
final boolean header;
final RecordFormat recordFormat;
final boolean quoteNested;
final boolean mutable;
boolean xmlns;
boolean format;
String newline;
int globalIndent;
int indent;
String[] indented;
boolean header;
RecordFormat recordFormat;
boolean quoteNested;
public XMLFormat() {
this(
false,
true,
false,
"\n",
@ -79,6 +81,7 @@ public final class XMLFormat {
}
private XMLFormat(
boolean mutable,
boolean xmlns,
boolean format,
String newline,
@ -89,6 +92,7 @@ public final class XMLFormat {
RecordFormat recordFormat,
boolean quoteNested
) {
this.mutable = mutable;
this.xmlns = xmlns;
this.format = format;
this.newline = newline;
@ -105,22 +109,57 @@ public final class XMLFormat {
this.quoteNested = quoteNested;
}
/**
* Whether this configuration object is mutable.
*/
public final boolean mutable() {
return mutable;
}
/**
* The new value for the mutable flag, defaulting to <code>false</code>.
*/
@NotNull
public final XMLFormat mutable(boolean newMutable) {
if (mutable ^ newMutable)
return new XMLFormat(
newMutable,
xmlns,
format,
newline,
globalIndent,
indent,
indented,
header,
recordFormat,
quoteNested
);
else
return this;
}
/**
* The new value for the xmlns flag, defaulting to <code>true</code>.
*/
@NotNull
public final XMLFormat xmlns(boolean newXmlns) {
return new XMLFormat(
newXmlns,
format,
newline,
globalIndent,
indent,
indented,
header,
recordFormat,
quoteNested
);
if (mutable) {
xmlns = newXmlns;
return this;
}
else
return new XMLFormat(
mutable,
newXmlns,
format,
newline,
globalIndent,
indent,
indented,
header,
recordFormat,
quoteNested
);
}
/**
@ -135,17 +174,23 @@ public final class XMLFormat {
*/
@NotNull
public final XMLFormat format(boolean newFormat) {
return new XMLFormat(
xmlns,
newFormat,
newline,
globalIndent,
indent,
null,
header,
recordFormat,
quoteNested
);
if (mutable) {
format = newFormat;
return this;
}
else
return new XMLFormat(
mutable,
xmlns,
newFormat,
newline,
globalIndent,
indent,
null,
header,
recordFormat,
quoteNested
);
}
/**
@ -160,17 +205,23 @@ public final class XMLFormat {
*/
@NotNull
public final XMLFormat newline(String newNewline) {
return new XMLFormat(
xmlns,
format,
newNewline,
globalIndent,
indent,
indented,
header,
recordFormat,
quoteNested
);
if (mutable) {
newline = newNewline;
return this;
}
else
return new XMLFormat(
mutable,
xmlns,
format,
newNewline,
globalIndent,
indent,
indented,
header,
recordFormat,
quoteNested
);
}
/**
@ -186,17 +237,23 @@ public final class XMLFormat {
*/
@NotNull
public final XMLFormat globalIndent(int newGlobalIndent) {
return new XMLFormat(
xmlns,
format,
newline,
newGlobalIndent,
indent,
null,
header,
recordFormat,
quoteNested
);
if (mutable) {
globalIndent = newGlobalIndent;
return this;
}
else
return new XMLFormat(
mutable,
xmlns,
format,
newline,
newGlobalIndent,
indent,
null,
header,
recordFormat,
quoteNested
);
}
/**
@ -211,17 +268,23 @@ public final class XMLFormat {
*/
@NotNull
public final XMLFormat indent(int newIndent) {
return new XMLFormat(
xmlns,
format,
newline,
globalIndent,
newIndent,
null,
header,
recordFormat,
quoteNested
);
if (mutable) {
indent = newIndent;
return this;
}
else
return new XMLFormat(
mutable,
xmlns,
format,
newline,
globalIndent,
newIndent,
null,
header,
recordFormat,
quoteNested
);
}
/**
@ -257,17 +320,23 @@ public final class XMLFormat {
*/
@NotNull
public final XMLFormat header(boolean newHeader) {
return new XMLFormat(
xmlns,
format,
newline,
globalIndent,
indent,
indented,
newHeader,
recordFormat,
quoteNested
);
if (mutable) {
header = newHeader;
return this;
}
else
return new XMLFormat(
mutable,
xmlns,
format,
newline,
globalIndent,
indent,
indented,
newHeader,
recordFormat,
quoteNested
);
}
/**
@ -283,17 +352,23 @@ public final class XMLFormat {
*/
@NotNull
public final XMLFormat recordFormat(RecordFormat newRecordFormat) {
return new XMLFormat(
xmlns,
format,
newline,
globalIndent,
indent,
indented,
header,
newRecordFormat,
quoteNested
);
if (mutable) {
recordFormat = newRecordFormat;
return this;
}
else
return new XMLFormat(
mutable,
xmlns,
format,
newline,
globalIndent,
indent,
indented,
header,
newRecordFormat,
quoteNested
);
}
/**
@ -311,17 +386,23 @@ public final class XMLFormat {
*/
@NotNull
public final XMLFormat quoteNested(boolean newQuoteNested) {
return new XMLFormat(
xmlns,
format,
newline,
globalIndent,
indent,
indented,
header,
recordFormat,
newQuoteNested
);
if (mutable) {
quoteNested = newQuoteNested;
return this;
}
else
return new XMLFormat(
mutable,
xmlns,
format,
newline,
globalIndent,
indent,
indented,
header,
recordFormat,
newQuoteNested
);
}
/**

View File

@ -1039,8 +1039,7 @@ abstract class AbstractRecord extends AbstractStore implements Record {
@Override
public final void formatJSON(Writer writer, JSONFormat format) {
if (format.header())
log.debug("JSONFormat.header currently not supported for Record.formatJSON()");
format = format.mutable(true);
try {
switch (format.recordFormat()) {
@ -1063,8 +1062,7 @@ abstract class AbstractRecord extends AbstractStore implements Record {
@Override
public final void formatXML(Writer writer, XMLFormat format) {
if (format.header())
log.debug("XMLFormat.header currently not supported for Record.formatXML()");
format = format.mutable(true);
try {
AbstractResult.formatXMLRecord(writer, format, 0, this, fields);

View File

@ -456,6 +456,8 @@ abstract class AbstractResult<R extends Record> extends AbstractFormattable impl
@Override
public final void formatJSON(Writer writer, JSONFormat format) {
format = format.mutable(true);
try {
String separator;
int recordLevel = format.header() ? 2 : 1;
@ -673,7 +675,9 @@ abstract class AbstractResult<R extends Record> extends AbstractFormattable impl
writer.append(' ');
}
int previous = format.globalIndent();
formatJSON0(record.get(index), writer, format.globalIndent(format.globalIndent() + format.indent() * (recordLevel + 1)));
format.globalIndent(previous);
if (format.format() && format.wrapSingleColumnRecords() && size == 1)
writer.append(' ');
@ -711,7 +715,9 @@ abstract class AbstractResult<R extends Record> extends AbstractFormattable impl
else if (format.wrapSingleColumnRecords())
writer.append(' ');
int previous = format.globalIndent();
formatJSON0(record.get(index), writer, format.globalIndent(format.globalIndent() + format.indent() * (recordLevel + 1)));
format.globalIndent(previous);
if (format.format() && format.wrapSingleColumnRecords() && size == 1)
writer.append(' ');
@ -733,6 +739,8 @@ abstract class AbstractResult<R extends Record> extends AbstractFormattable impl
@Override
public final void formatXML(Writer writer, XMLFormat format) {
format = format.mutable(true);
String newline = format.newline();
int recordLevel = format.header() ? 2 : 1;
@ -837,7 +845,9 @@ abstract class AbstractResult<R extends Record> extends AbstractFormattable impl
if (value instanceof Formattable) { Formattable f = (Formattable) value;
writer.append(newline).append(format.indentString(recordLevel + 2));
int previous = format.globalIndent();
f.formatXML(writer, format.globalIndent(format.globalIndent() + format.indent() * (recordLevel + 2)));
format.globalIndent(previous);
writer.append(newline).append(format.indentString(recordLevel + 1));
}
else if (value instanceof XML && !format.quoteNested())