Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow configuring spaces before and/or after the colon in DefaultPrettyPrinter #1042

Merged
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,8 @@ protected DefaultPrettyPrinter _withSpaces(boolean state)
*/
public DefaultPrettyPrinter withSeparators(Separators separators) {
_separators = separators;
_objectFieldValueSeparatorWithSpaces = " " + separators.getObjectFieldValueSeparator() + " ";
_objectFieldValueSeparatorWithSpaces = separators.getObjectFieldValueSpacing().apply(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For performance reasons, let's also add the other 2 "WithSpaces" fields that are missing to avoid calling apply() on those cases.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

separators.getObjectFieldValueSeparator());
return this;
}

Expand Down Expand Up @@ -334,7 +335,7 @@ public void writeObjectFieldValueSeparator(JsonGenerator g) throws IOException
@Override
public void writeObjectEntrySeparator(JsonGenerator g) throws IOException
{
g.writeRaw(_separators.getObjectEntrySeparator());
g.writeRaw(_separators.getObjectEntrySpacing().apply(_separators.getObjectEntrySeparator()));
_objectIndenter.writeIndentation(g, _nesting);
}

Expand Down Expand Up @@ -378,7 +379,7 @@ public void beforeArrayValues(JsonGenerator g) throws IOException {
@Override
public void writeArrayValueSeparator(JsonGenerator g) throws IOException
{
g.writeRaw(_separators.getArrayValueSeparator());
g.writeRaw(_separators.getArrayValueSpacing().apply(_separators.getArrayValueSeparator()));
_arrayIndenter.writeIndentation(g, _nesting);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.PrettyPrinter;
import com.fasterxml.jackson.core.util.Separators.Spacing;

/**
* {@link PrettyPrinter} implementation that adds no indentation,
Expand Down Expand Up @@ -46,7 +47,7 @@ public MinimalPrettyPrinter() {

public MinimalPrettyPrinter(String rootValueSeparator) {
_rootValueSeparator = rootValueSeparator;
_separators = DEFAULT_SEPARATORS;
_separators = DEFAULT_SEPARATORS.withObjectFieldValueSpacing(Spacing.NONE);
}

public void setRootValueSeparator(String sep) {
Expand Down
86 changes: 81 additions & 5 deletions src/main/java/com/fasterxml/jackson/core/util/Separators.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,39 @@ public class Separators implements Serializable
{
private static final long serialVersionUID = 1;

public enum Spacing {
cowtowncoder marked this conversation as resolved.
Show resolved Hide resolved
NONE("", ""),
BEFORE(" ", ""),
AFTER("", " "),
BOTH(" ", " ");

private final String spacesBefore;
private final String spacesAfter;

private Spacing(String spacesBefore, String spacesAfter) {
this.spacesBefore = spacesBefore;
this.spacesAfter = spacesAfter;
}

public String spacesBefore() {
return spacesBefore;
}

public String spacesAfter() {
return spacesAfter;
}

public String apply(char separator) {
return spacesBefore + separator + spacesAfter;
}
}

private final char objectFieldValueSeparator;
private final Spacing objectFieldValueSpacing;
private final char objectEntrySeparator;
private final Spacing objectEntrySpacing;
private final char arrayValueSeparator;
private final Spacing arrayValueSpacing;

public static Separators createDefaultInstance() {
return new Separators();
Expand All @@ -27,37 +57,83 @@ public Separators() {
this(':', ',', ',');
}

public Separators(char objectFieldValueSeparator,
char objectEntrySeparator, char arrayValueSeparator) {
public Separators(
char objectFieldValueSeparator,
char objectEntrySeparator,
char arrayValueSeparator
) {
this(objectFieldValueSeparator, Spacing.BOTH,
objectEntrySeparator, Spacing.NONE,
arrayValueSeparator, Spacing.NONE);
}

public Separators(
char objectFieldValueSeparator,
Spacing objectFieldValueSpacing,
char objectEntrySeparator,
Spacing objectEntrySpacing,
char arrayValueSeparator,
Spacing arrayValueSpacing
) {
this.objectFieldValueSeparator = objectFieldValueSeparator;
this.objectFieldValueSpacing = objectFieldValueSpacing;
this.objectEntrySeparator = objectEntrySeparator;
this.objectEntrySpacing = objectEntrySpacing;
this.arrayValueSeparator = arrayValueSeparator;
this.arrayValueSpacing = arrayValueSpacing;
}

public Separators withObjectFieldValueSeparator(char sep) {
return (objectFieldValueSeparator == sep) ? this
: new Separators(sep, objectEntrySeparator, arrayValueSeparator);
: new Separators(sep, objectFieldValueSpacing, objectEntrySeparator, objectEntrySpacing, arrayValueSeparator, arrayValueSpacing);
}

public Separators withObjectFieldValueSpacing(Spacing spacing) {
return (objectFieldValueSpacing == spacing) ? this
: new Separators(objectFieldValueSeparator, spacing, objectEntrySeparator, objectEntrySpacing, arrayValueSeparator, arrayValueSpacing);
}

public Separators withObjectEntrySeparator(char sep) {
return (objectEntrySeparator == sep) ? this
: new Separators(objectFieldValueSeparator, sep, arrayValueSeparator);
: new Separators(objectFieldValueSeparator, objectFieldValueSpacing, sep, objectEntrySpacing, arrayValueSeparator, arrayValueSpacing);
}

public Separators withObjectEntrySpacing(Spacing spacing) {
return (objectEntrySpacing == spacing) ? this
: new Separators(objectFieldValueSeparator, objectFieldValueSpacing, objectEntrySeparator, spacing, arrayValueSeparator, arrayValueSpacing);
}

public Separators withArrayValueSeparator(char sep) {
return (arrayValueSeparator == sep) ? this
: new Separators(objectFieldValueSeparator, objectEntrySeparator, sep);
: new Separators(objectFieldValueSeparator, objectFieldValueSpacing, objectEntrySeparator, objectEntrySpacing, sep, arrayValueSpacing);
}

public Separators withArrayValueSpacing(Spacing spacing) {
return (arrayValueSpacing == spacing) ? this
: new Separators(objectFieldValueSeparator, objectFieldValueSpacing, objectEntrySeparator, objectEntrySpacing, arrayValueSeparator, spacing);
}

public char getObjectFieldValueSeparator() {
return objectFieldValueSeparator;
}

public Spacing getObjectFieldValueSpacing() {
return objectFieldValueSpacing;
}

public char getObjectEntrySeparator() {
return objectEntrySeparator;
}

public Spacing getObjectEntrySpacing() {
return objectEntrySpacing;
}

public char getArrayValueSeparator() {
return arrayValueSeparator;
}

public Spacing getArrayValueSpacing() {
return arrayValueSpacing;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.io.StringWriter;

import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.util.Separators.Spacing;

public class TestDefaultPrettyPrinter extends BaseTest
{
Expand Down Expand Up @@ -81,6 +82,36 @@ public void testTabIndent() throws IOException
assertEquals(EXP, _printTestData(pp, false));
assertEquals(EXP, _printTestData(pp, true));
}

public void testObjectFieldValueSpacingAfter() throws IOException
{
Separators separators = new Separators()
.withObjectFieldValueSpacing(Spacing.AFTER);
PrettyPrinter pp = new DefaultPrettyPrinter()
.withObjectIndenter(new DefaultIndenter(" ", "\n"))
.withSeparators(separators);
String EXP = "{\n" +
" \"name\": \"John Doe\",\n" +
" \"age\": 3.14\n" +
"}";
assertEquals(EXP, _printTestData(pp, false));
assertEquals(EXP, _printTestData(pp, true));
}

public void testObjectFieldValueSpacingNone() throws IOException
{
Separators separators = new Separators()
.withObjectFieldValueSpacing(Spacing.NONE);
PrettyPrinter pp = new DefaultPrettyPrinter()
.withObjectIndenter(new DefaultIndenter(" ", "\n"))
.withSeparators(separators);
String EXP = "{\n" +
" \"name\":\"John Doe\",\n" +
" \"age\":3.14\n" +
"}";
assertEquals(EXP, _printTestData(pp, false));
assertEquals(EXP, _printTestData(pp, true));
}

public void testRootSeparator() throws IOException
{
Expand Down