Skip to content

Commit

Permalink
Merge branch '2.17'
Browse files Browse the repository at this point in the history
  • Loading branch information
cowtowncoder committed Jan 1, 2024
2 parents eeb83b9 + 80e79f1 commit 3832f26
Show file tree
Hide file tree
Showing 5 changed files with 209 additions and 34 deletions.
5 changes: 5 additions & 0 deletions release-notes/CREDITS-2.x
Original file line number Diff line number Diff line change
Expand Up @@ -415,3 +415,8 @@ Robert Elliot (@Mahoney)
(2.17.0)
* Reported #1168: `JsonPointer.append(JsonPointer.tail())` includes the original pointer
(2.16.1)

Guillaume Lecroc (@gulecroc)
* Contributed #1179: Allow configuring `DefaultPrettyPrinter` separators for empty
Arrays and Objects
(2.17.0)
3 changes: 3 additions & 0 deletions release-notes/VERSION-2.x
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ a pure JSON library.
(contributed by @pjfanning)
#1169: `ArrayIndexOutOfBoundsException` for specific invalid content,
with Reader-based parser
#1179: Allow configuring `DefaultPrettyPrinter` separators for empty
Arrays and Objects
(contributed by Guillaume L)

2.16.2 (not yet released)

Expand Down
31 changes: 24 additions & 7 deletions src/main/java/tools/jackson/core/util/DefaultPrettyPrinter.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,25 +72,37 @@ public interface Indenter
*/
protected transient int _nesting;

protected Separators _separators;
protected final Separators _separators;

/**
* Separator between Object property names and values,
* including possible before/after spaces.
*/
protected String _objectNameValueSeparator;
protected final String _objectNameValueSeparator;

/**
* Separator between Object property entries,
* including possible before/after spaces.
*/
protected String _objectEntrySeparator;
protected final String _objectEntrySeparator;

/**
* String to use in empty Object to separate start and end markers.
* Default is single space, resulting in output of {@code { }}.
*/
protected final String _objectEmptySeparator;

/**
* Separator between Array elements,
* including possible before/after spaces.
*/
protected String _arrayElementSeparator;
protected final String _arrayElementSeparator;

/**
* String to use in empty Array to separate start and end markers.
* Default is single space, resulting in output of {@code [ ]}.
*/
protected final String _arrayEmptySeparator;

/*
/**********************************************************************
Expand All @@ -113,7 +125,9 @@ public DefaultPrettyPrinter(Separators separators)
_objectNameValueSeparator = separators.getObjectNameValueSpacing().apply(
separators.getObjectNameValueSeparator());
_objectEntrySeparator = separators.getObjectEntrySpacing().apply(separators.getObjectEntrySeparator());
_objectEmptySeparator = separators.getObjectEmptySeparator();
_arrayElementSeparator = separators.getArrayElementSpacing().apply(separators.getArrayElementSeparator());
_arrayEmptySeparator = separators.getArrayEmptySeparator();
}

/**
Expand All @@ -130,7 +144,9 @@ public DefaultPrettyPrinter(DefaultPrettyPrinter base) {
_rootValueSeparator = base._rootValueSeparator;
_objectNameValueSeparator = base._objectNameValueSeparator;
_objectEntrySeparator = base._objectEntrySeparator;
_objectEmptySeparator = base._objectEmptySeparator;
_arrayElementSeparator = base._arrayElementSeparator;
_arrayEmptySeparator = base._arrayEmptySeparator;
}

public DefaultPrettyPrinter(DefaultPrettyPrinter base, Separators separators) {
Expand All @@ -143,8 +159,9 @@ public DefaultPrettyPrinter(DefaultPrettyPrinter base, Separators separators) {
_objectNameValueSeparator = separators.getObjectNameValueSpacing().apply(
separators.getObjectNameValueSeparator());
_objectEntrySeparator = separators.getObjectEntrySpacing().apply(separators.getObjectEntrySeparator());
_objectEmptySeparator = separators.getObjectEmptySeparator();
_arrayElementSeparator = separators.getArrayElementSpacing().apply(separators.getArrayElementSeparator());

_arrayEmptySeparator = separators.getArrayEmptySeparator();
}

public void indentArraysWith(Indenter i) {
Expand Down Expand Up @@ -281,7 +298,7 @@ public void writeEndObject(JsonGenerator g, int nrOfEntries) throws JacksonExcep
if (nrOfEntries > 0) {
_objectIndenter.writeIndentation(g, _nesting);
} else {
g.writeRaw(' ');
g.writeRaw(_objectEmptySeparator);
}
g.writeRaw('}');
}
Expand Down Expand Up @@ -325,7 +342,7 @@ public void writeEndArray(JsonGenerator g, int nrOfValues) throws JacksonExcepti
if (nrOfValues > 0) {
_arrayIndenter.writeIndentation(g, _nesting);
} else {
g.writeRaw(' ');
g.writeRaw(_arrayEmptySeparator);
}
g.writeRaw(']');
}
Expand Down
88 changes: 75 additions & 13 deletions src/main/java/tools/jackson/core/util/Separators.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package tools.jackson.core.util;

import java.io.Serializable;
import java.util.Objects;

/**
* Value class used with some {@link tools.jackson.core.PrettyPrinter}
Expand All @@ -19,6 +20,19 @@ public class Separators implements Serializable
*/
public final static String DEFAULT_ROOT_VALUE_SEPARATOR = " ";


/**
* String to use in empty Object to separate start and end markers.
* Default is single space, resulting in output of {@code { }}.
*/
public final static String DEFAULT_OBJECT_EMPTY_SEPARATOR = " ";

/**
* String to use in empty Array to separate start and end markers.
* Default is single space, resulting in output of {@code [ ]}.
*/
public final static String DEFAULT_ARRAY_EMPTY_SEPARATOR = " ";

/**
* Define the spacing around elements like commas and colons.
*/
Expand Down Expand Up @@ -53,8 +67,10 @@ public String apply(char separator) {
private final Spacing objectNameValueSpacing;
private final char objectEntrySeparator;
private final Spacing objectEntrySpacing;
private final String objectEmptySeparator;
private final char arrayElementSeparator;
private final Spacing arrayElementSpacing;
private final String arrayEmptySeparator;
private final String rootSeparator;

public static Separators createDefaultInstance() {
Expand All @@ -66,8 +82,8 @@ public Separators() {
}

/**
* Create an instance with the specified separator characters. There will be spaces before and
* after the <code>objectNameValueSeparator</code> and none around the other two.
* Constructor for creating an instance with default settings for all
* separators.
*/
public Separators(
char objectNameValueSeparator,
Expand All @@ -76,8 +92,8 @@ public Separators(
) {
this(DEFAULT_ROOT_VALUE_SEPARATOR,
objectNameValueSeparator, Spacing.BOTH,
objectEntrySeparator, Spacing.NONE,
arrayElementSeparator, Spacing.NONE);
objectEntrySeparator, Spacing.NONE, DEFAULT_OBJECT_EMPTY_SEPARATOR,
arrayElementSeparator, Spacing.NONE, DEFAULT_ARRAY_EMPTY_SEPARATOR);
}

/**
Expand All @@ -89,51 +105,83 @@ public Separators(
Spacing objectNameValueSpacing,
char objectEntrySeparator,
Spacing objectEntrySpacing,
String objectEmptySeparator,
char arrayElementSeparator,
Spacing arrayElementSpacing
Spacing arrayElementSpacing,
String arrayEmptySeparator
) {
this.rootSeparator = rootSeparator;
this.objectNameValueSeparator = objectNameValueSeparator;
this.objectNameValueSpacing = objectNameValueSpacing;
this.objectEntrySeparator = objectEntrySeparator;
this.objectEntrySpacing = objectEntrySpacing;
this.objectEmptySeparator = objectEmptySeparator;
this.arrayElementSeparator = arrayElementSeparator;
this.arrayElementSpacing = arrayElementSpacing;
this.arrayEmptySeparator = arrayEmptySeparator;
}

public Separators withRootSeparator(String sep) {
return (rootSeparator.equals(sep)) ? this
: new Separators(sep, objectNameValueSeparator, objectNameValueSpacing, objectEntrySeparator, objectEntrySpacing, arrayElementSeparator, arrayElementSpacing);
return Objects.equals(rootSeparator, sep) ? this
: new Separators(sep, objectNameValueSeparator, objectNameValueSpacing,
objectEntrySeparator, objectEntrySpacing, objectEmptySeparator,
arrayElementSeparator, arrayElementSpacing, arrayEmptySeparator);
}

public Separators withObjectNameValueSeparator(char sep) {
return (objectNameValueSeparator == sep) ? this
: new Separators(rootSeparator, sep, objectNameValueSpacing, objectEntrySeparator, objectEntrySpacing, arrayElementSeparator, arrayElementSpacing);
: new Separators(rootSeparator, sep, objectNameValueSpacing,
objectEntrySeparator, objectEntrySpacing, objectEmptySeparator,
arrayElementSeparator, arrayElementSpacing, arrayEmptySeparator);
}

public Separators withObjectNameValueSpacing(Spacing spacing) {
return (objectNameValueSpacing == spacing) ? this
: new Separators(rootSeparator, objectNameValueSeparator, spacing, objectEntrySeparator, objectEntrySpacing, arrayElementSeparator, arrayElementSpacing);
: new Separators(rootSeparator, objectNameValueSeparator, spacing,
objectEntrySeparator, objectEntrySpacing, objectEmptySeparator,
arrayElementSeparator, arrayElementSpacing, arrayEmptySeparator);
}

public Separators withObjectEntrySeparator(char sep) {
return (objectEntrySeparator == sep) ? this
: new Separators(rootSeparator, objectNameValueSeparator, objectNameValueSpacing, sep, objectEntrySpacing, arrayElementSeparator, arrayElementSpacing);
: new Separators(rootSeparator, objectNameValueSeparator, objectNameValueSpacing,
sep, objectEntrySpacing, objectEmptySeparator,
arrayElementSeparator, arrayElementSpacing, arrayEmptySeparator);
}

public Separators withObjectEntrySpacing(Spacing spacing) {
return (objectEntrySpacing == spacing) ? this
: new Separators(rootSeparator, objectNameValueSeparator, objectNameValueSpacing, objectEntrySeparator, spacing, arrayElementSeparator, arrayElementSpacing);
: new Separators(rootSeparator, objectNameValueSeparator, objectNameValueSpacing,
objectEntrySeparator, spacing, objectEmptySeparator,
arrayElementSeparator, arrayElementSpacing, arrayEmptySeparator);
}

public Separators withObjectEmptySeparator(String sep) {
return Objects.equals(objectEmptySeparator, sep) ? this
: new Separators(rootSeparator, objectNameValueSeparator, objectNameValueSpacing,
objectEntrySeparator, objectEntrySpacing, sep,
arrayElementSeparator, arrayElementSpacing, arrayEmptySeparator);
}

public Separators withArrayElementSeparator(char sep) {
return (arrayElementSeparator == sep) ? this
: new Separators(rootSeparator, objectNameValueSeparator, objectNameValueSpacing, objectEntrySeparator, objectEntrySpacing, sep, arrayElementSpacing);
: new Separators(rootSeparator, objectNameValueSeparator, objectNameValueSpacing,
objectEntrySeparator, objectEntrySpacing, objectEmptySeparator,
sep, arrayElementSpacing, arrayEmptySeparator);
}

public Separators withArrayElementSpacing(Spacing spacing) {
return (arrayElementSpacing == spacing) ? this
: new Separators(rootSeparator, objectNameValueSeparator, objectNameValueSpacing, objectEntrySeparator, objectEntrySpacing, arrayElementSeparator, spacing);
: new Separators(rootSeparator, objectNameValueSeparator, objectNameValueSpacing,
objectEntrySeparator, objectEntrySpacing, objectEmptySeparator,
arrayElementSeparator, spacing, arrayEmptySeparator);
}

public Separators withArrayEmptySeparator(String sep) {
return Objects.equals(arrayEmptySeparator, sep) ? this
: new Separators(rootSeparator, objectNameValueSeparator, objectNameValueSpacing,
objectEntrySeparator, objectEntrySpacing, objectEmptySeparator,
arrayElementSeparator, arrayElementSpacing, sep);
}

public String getRootSeparator() {
Expand All @@ -156,11 +204,25 @@ public Spacing getObjectEntrySpacing() {
return objectEntrySpacing;
}

/**
* @return String to use in empty Object
*/
public String getObjectEmptySeparator() {
return objectEmptySeparator;
}

public char getArrayElementSeparator() {
return arrayElementSeparator;
}

public Spacing getArrayElementSpacing() {
return arrayElementSpacing;
}

/**
* @return String to use in empty Array
*/
public String getArrayEmptySeparator() {
return arrayEmptySeparator;
}
}
Loading

0 comments on commit 3832f26

Please sign in to comment.