-
-
Notifications
You must be signed in to change notification settings - Fork 229
Feature : Allow setting custom linefeed on DefaultXmlPrettyPrinter #568
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
Changes from 4 commits
374e125
eb23bbd
c0b3e41
3b066cb
8595328
79564a4
f515eba
4cc4394
6974014
b75bfdd
18abcc2
c764189
af70ece
7deeb84
8360276
6187f3d
d0aaf64
29a2bbf
fc4fb17
dd198f2
b43811c
05b1f04
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -77,6 +77,27 @@ public interface Indenter | |
*/ | ||
protected boolean _spacesInObjectEntries = true; | ||
|
||
/** | ||
* By default, will try to set as System.getProperty("line.separator") | ||
* Can later set custom lineFeed with withCustomlineFeed method | ||
* @since 2.15 | ||
*/ | ||
private final static String DEFAULT_LINE_FEED; | ||
static { | ||
String lf = null; | ||
try { | ||
lf = System.getProperty("line.separator"); | ||
} catch (Throwable t) { } // access exception? | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's just catch There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. late reply, but done 👍🏻 |
||
|
||
if (lf != null) { | ||
DEFAULT_LINE_FEED = lf; | ||
} else { | ||
DEFAULT_LINE_FEED = "\n"; // incase system has changed property name? line.separator | ||
} | ||
} | ||
|
||
protected static String _lineFeed = DEFAULT_LINE_FEED; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @pjfanning I have a question. How can we solve this? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. My thoughts, line-feed outside of Lf2SpacesIndenter? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Lf2SpacesIndenter could have a constructor that takes an instance of DefaultXmlPrettyPrinter in its constructor. Or we could make Lf2SpacesIndenter non-static. |
||
|
||
/* | ||
/********************************************************** | ||
/* State | ||
|
@@ -126,6 +147,18 @@ public void indentObjectsWith(Indenter i) | |
|
||
public void spacesInObjectEntries(boolean b) { _spacesInObjectEntries = b; } | ||
|
||
/** | ||
* Sets custom linefeed | ||
* @since 2.15 | ||
*/ | ||
public DefaultXmlPrettyPrinter withCustomLineFeed(String lineFeed) { | ||
// 06-Feb-2023, joohyukkim: when JacksonException extends RuntimeExceptions, throw it? | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. can you remove this comment? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done :) |
||
if (lineFeed != null) { | ||
_lineFeed = lineFeed; | ||
} | ||
return this; | ||
pjfanning marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
|
||
/* | ||
/********************************************************** | ||
/* Instantiatable impl | ||
|
@@ -443,7 +476,7 @@ public void writeLeafXsiNilElement(XMLStreamWriter2 sw, | |
public void writePrologLinefeed(XMLStreamWriter2 sw) throws XMLStreamException | ||
{ | ||
// 06-Dec-2015, tatu: Alternatively could try calling `writeSpace()`... | ||
sw.writeRaw(Lf2SpacesIndenter.SYSTEM_LINE_SEPARATOR); | ||
sw.writeRaw(_lineFeed); | ||
} | ||
|
||
/* | ||
|
@@ -506,15 +539,6 @@ protected static class Lf2SpacesIndenter | |
{ | ||
private static final long serialVersionUID = 1L; | ||
|
||
final static String SYSTEM_LINE_SEPARATOR; | ||
static { | ||
String lf = null; | ||
try { | ||
lf = System.getProperty("line.separator"); | ||
} catch (Throwable t) { } // access exception? | ||
SYSTEM_LINE_SEPARATOR = (lf == null) ? "\n" : lf; | ||
} | ||
|
||
final static int SPACE_COUNT = 64; | ||
final static char[] SPACES = new char[SPACE_COUNT]; | ||
static { | ||
|
@@ -529,7 +553,7 @@ public Lf2SpacesIndenter() { } | |
@Override | ||
public void writeIndentation(XMLStreamWriter2 sw, int level) throws XMLStreamException | ||
{ | ||
sw.writeRaw(SYSTEM_LINE_SEPARATOR); | ||
sw.writeRaw(_lineFeed); | ||
level += level; // 2 spaces per level | ||
while (level > SPACE_COUNT) { // should never happen but... | ||
sw.writeRaw(SPACES, 0, SPACE_COUNT); | ||
|
@@ -541,7 +565,7 @@ public void writeIndentation(XMLStreamWriter2 sw, int level) throws XMLStreamExc | |
@Override | ||
public void writeIndentation(JsonGenerator jg, int level) throws IOException | ||
{ | ||
jg.writeRaw(SYSTEM_LINE_SEPARATOR); | ||
jg.writeRaw(_lineFeed); | ||
level += level; // 2 spaces per level | ||
while (level > SPACE_COUNT) { // should never happen but... | ||
jg.writeRaw(SPACES, 0, SPACE_COUNT); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,6 +9,7 @@ | |
import com.fasterxml.jackson.dataformat.xml.XmlTestBase; | ||
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; | ||
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; | ||
import com.fasterxml.jackson.dataformat.xml.util.DefaultXmlPrettyPrinter; | ||
|
||
public class XmlPrettyPrinterTest extends XmlTestBase | ||
{ | ||
|
@@ -188,4 +189,76 @@ public void testMultiLevel172() throws Exception | |
+"</Company>\n", | ||
xml); | ||
} | ||
|
||
public void testLineFeed_withCustomLineFeed() throws Exception { | ||
Company root = new Company(); | ||
root.employee.add(new Employee("abc")); | ||
|
||
String xml = _xmlMapper.writer() | ||
.with(new DefaultXmlPrettyPrinter().withCustomLineFeed("\n\rLF\n\r")) | ||
.with(ToXmlGenerator.Feature.WRITE_XML_DECLARATION) | ||
.writeValueAsString(root); | ||
// unify possible apostrophes to quotes | ||
xml = a2q(xml); | ||
|
||
// with indentation, should get linefeeds in prolog/epilog too | ||
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\rLF\n\r" | ||
+ "<Company>\n\rLF\n\r" | ||
+ " <e>\n\rLF\n\r" | ||
+ " <employee>\n\rLF\n\r" | ||
+ " <id>abc</id>\n\rLF\n\r" | ||
+ " <type>FULL_TIME</type>\n\rLF\n\r" | ||
+ " </employee>\n\rLF\n\r" | ||
+ " </e>\n\rLF\n\r" | ||
+ "</Company>\n\rLF\n\r", | ||
xml); | ||
} | ||
|
||
public void testLineFeed_systemDefault() throws Exception { | ||
Company root = new Company(); | ||
root.employee.add(new Employee("abc")); | ||
|
||
String xml = _xmlMapper.writer() | ||
.with(new DefaultXmlPrettyPrinter()) | ||
.with(ToXmlGenerator.Feature.WRITE_XML_DECLARATION) | ||
.writeValueAsString(root); | ||
// unify possible apostrophes to quotes | ||
xml = a2q(xml); | ||
|
||
// with indentation, should get linefeeds in prolog/epilog too | ||
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Need to replace There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Right, done! 🙏🏼 And plus I checked other similar test cases' assertions and some hard coded There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah sounds good wrt hard-coded linefeeds |
||
+ "<Company>\n" | ||
+ " <e>\n" | ||
+ " <employee>\n" | ||
+ " <id>abc</id>\n" | ||
+ " <type>FULL_TIME</type>\n" | ||
+ " </employee>\n" | ||
+ " </e>\n" | ||
+ "</Company>\n", | ||
xml); | ||
} | ||
|
||
public void testLineFeed_UseSystemDefaultLineSeperatorOnNullCustomLineFeed() throws Exception { | ||
Company root = new Company(); | ||
root.employee.add(new Employee("abc")); | ||
|
||
String xml = _xmlMapper.writer() | ||
.with(new DefaultXmlPrettyPrinter().withCustomLineFeed(null)) | ||
.with(ToXmlGenerator.Feature.WRITE_XML_DECLARATION) | ||
.writeValueAsString(root); | ||
// unify possible apostrophes to quotes | ||
xml = a2q(xml); | ||
|
||
// with indentation, should get linefeeds in prolog/epilog too | ||
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" | ||
+ "<Company>\n" | ||
+ " <e>\n" | ||
+ " <employee>\n" | ||
+ " <id>abc</id>\n" | ||
+ " <type>FULL_TIME</type>\n" | ||
+ " </employee>\n" | ||
+ " </e>\n" | ||
+ "</Company>\n", | ||
xml); | ||
} | ||
} |
Uh oh!
There was an error while loading. Please reload this page.