Implemented #654
diff --git a/release-notes/VERSION b/release-notes/VERSION
index e4c0065..626421f 100644
--- a/release-notes/VERSION
+++ b/release-notes/VERSION
@@ -62,6 +62,7 @@
(using @JsonAppend, VirtualBeanPropertyWriter)
#647: Deserialization fails when @JsonUnwrapped property contains an object with same property name
(reported by Konstantin L)
+#654: Add support for (re)configuring `JsonGenerator.setRootValueSeparator()` via `ObjectWriter`
#655: Add `ObjectWriter.writeValues()` for writing value sequences
- Allow use of `Shape.ARRAY` for Enums, as an alias to 'use index'
- Start using `JsonGenerator.writeStartArray(int)` to help data formats
diff --git a/src/main/java/com/fasterxml/jackson/databind/ObjectWriter.java b/src/main/java/com/fasterxml/jackson/databind/ObjectWriter.java
index e4cc60e..6d0146f 100644
--- a/src/main/java/com/fasterxml/jackson/databind/ObjectWriter.java
+++ b/src/main/java/com/fasterxml/jackson/databind/ObjectWriter.java
@@ -8,6 +8,7 @@
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.io.CharacterEscapes;
import com.fasterxml.jackson.core.io.SegmentedStringWriter;
+import com.fasterxml.jackson.core.io.SerializedString;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.core.util.*;
import com.fasterxml.jackson.databind.cfg.ContextAttributes;
@@ -98,7 +99,7 @@
_serializerFactory = mapper._serializerFactory;
_generatorFactory = mapper._jsonFactory;
_generatorSettings = (pp == null) ? GeneratorSettings.empty
- : new GeneratorSettings(pp, null, null);
+ : new GeneratorSettings(pp, null, null, null);
// 29-Apr-2014, tatu: There is no "untyped serializer", so:
if (rootType == null || rootType.hasRawClass(Object.class)) {
@@ -137,7 +138,7 @@
_prefetch = Prefetch.empty;
_generatorSettings = (s == null) ? GeneratorSettings.empty
- : new GeneratorSettings(null, s, null);
+ : new GeneratorSettings(null, s, null, null);
}
/**
@@ -580,6 +581,28 @@
return (newConfig == _config) ? this : _new(this, newConfig);
}
+ /**
+ * @since 2.5
+ */
+ public ObjectWriter withRootValueSeparator(String sep) {
+ GeneratorSettings genSet = _generatorSettings.withRootValueSeparator(sep);
+ if (genSet == _generatorSettings) {
+ return this;
+ }
+ return _new(genSet, _prefetch);
+ }
+
+ /**
+ * @since 2.5
+ */
+ public ObjectWriter withRootValueSeparator(SerializableString sep) {
+ GeneratorSettings genSet = _generatorSettings.withRootValueSeparator(sep);
+ if (genSet == _generatorSettings) {
+ return this;
+ }
+ return _new(genSet, _prefetch);
+ }
+
/*
/**********************************************************
/* Factory methods for sequence writers (2.5)
@@ -1192,11 +1215,14 @@
if (esc != null) {
gen.setCharacterEscapes(esc);
}
- // [JACKSON-520]: add support for pass-through schema:
FormatSchema sch = genSet.schema;
if (sch != null) {
gen.setSchema(sch);
}
+ SerializableString sep = genSet.rootValueSeparator;
+ if (sep != null) {
+ gen.setRootValueSeparator(sep);
+ }
_config.initialize(gen); // since 2.5
return gen;
}
@@ -1219,31 +1245,41 @@
{
private static final long serialVersionUID = 1L;
- public final static GeneratorSettings empty = new GeneratorSettings(null, null, null);
-
+ public final static GeneratorSettings empty = new GeneratorSettings(null, null, null, null);
+
/**
* To allow for dynamic enabling/disabling of pretty printing,
* pretty printer can be optionally configured for writer
* as well
*/
public final PrettyPrinter prettyPrinter;
-
+
/**
* When using data format that uses a schema, schema is passed
* to generator.
*/
public final FormatSchema schema;
-
+
/**
* Caller may want to specify character escaping details, either as
* defaults, or on call-by-call basis.
*/
public final CharacterEscapes characterEscapes;
- public GeneratorSettings(PrettyPrinter pp, FormatSchema sch, CharacterEscapes esc) {
+ /**
+ * Caller may want to override so-called "root value separator",
+ * String added (verbatim, with no quoting or escaping) between
+ * values in root context. Default value is a single space character,
+ * but this is often changed to linefeed.
+ */
+ public final SerializableString rootValueSeparator;
+
+ public GeneratorSettings(PrettyPrinter pp, FormatSchema sch,
+ CharacterEscapes esc, SerializableString rootSep) {
prettyPrinter = pp;
schema = sch;
characterEscapes = esc;
+ rootValueSeparator = rootSep;
}
public GeneratorSettings with(PrettyPrinter pp) {
@@ -1252,17 +1288,43 @@
pp = NULL_PRETTY_PRINTER;
}
return (pp == prettyPrinter) ? this
- : new GeneratorSettings(pp, schema, characterEscapes);
+ : new GeneratorSettings(pp, schema, characterEscapes, rootValueSeparator);
}
public GeneratorSettings with(FormatSchema sch) {
return (schema == sch) ? this
- : new GeneratorSettings(prettyPrinter, sch, characterEscapes);
+ : new GeneratorSettings(prettyPrinter, sch, characterEscapes, rootValueSeparator);
}
public GeneratorSettings with(CharacterEscapes esc) {
return (characterEscapes == esc) ? this
- : new GeneratorSettings(prettyPrinter, schema, esc);
+ : new GeneratorSettings(prettyPrinter, schema, esc, rootValueSeparator);
+ }
+
+ public GeneratorSettings withRootValueSeparator(String sep) {
+ if (sep == null) {
+ if (rootValueSeparator == null) {
+ return this;
+ }
+ } else if (sep.equals(rootValueSeparator)) {
+ return this;
+ }
+ return new GeneratorSettings(prettyPrinter, schema, characterEscapes,
+ (sep == null) ? null : new SerializedString(sep));
+ }
+
+ public GeneratorSettings withRootValueSeparator(SerializableString sep) {
+ if (sep == null) {
+ if (rootValueSeparator == null) {
+ return this;
+ }
+ } else {
+ if (rootValueSeparator != null
+ && sep.getValue().equals(rootValueSeparator.getValue())) {
+ return this;
+ }
+ }
+ return new GeneratorSettings(prettyPrinter, schema, characterEscapes, sep);
}
}
diff --git a/src/test/java/com/fasterxml/jackson/databind/seq/SequenceWriterTest.java b/src/test/java/com/fasterxml/jackson/databind/seq/SequenceWriterTest.java
index 3351d7a..43c6edb 100644
--- a/src/test/java/com/fasterxml/jackson/databind/seq/SequenceWriterTest.java
+++ b/src/test/java/com/fasterxml/jackson/databind/seq/SequenceWriterTest.java
@@ -47,10 +47,8 @@
*/
private final ObjectMapper MAPPER = new ObjectMapper();
- {
- MAPPER.getFactory().setRootValueSeparator("\n");
- }
- private final ObjectWriter WRITER = MAPPER.writer();
+ private final ObjectWriter WRITER = MAPPER.writer()
+ .withRootValueSeparator("\n");
public void testSimpleNonArray() throws Exception
{