Skip to content

Commit 488d0aa

Browse files
committed
Merge branch '2.x' into 3.x
2 parents be336df + 2cf03a0 commit 488d0aa

5 files changed

Lines changed: 58 additions & 44 deletions

File tree

.github/workflows/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
strategy:
2020
fail-fast: false
2121
matrix:
22-
java_version: ['17', '21', '23' ]
22+
java_version: ['17', '21', '24' ]
2323
include:
2424
- java_version: '17'
2525
release_build: 'R'

release-notes/CREDITS-2.x

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,3 +276,8 @@ Bas Passon (@bpasson)
276276

277277
* Contributed #745: Add feature to include `standalone='yes'` in xml declaration
278278
(2.19.0)
279+
280+
(@xzxiaoshan)
281+
* Contributed #768: `FromXmlParser` lacks extension point for passing
282+
custom `XmlTokenStream`
283+
(2.20.0)

release-notes/VERSION-2.x

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ Project: jackson-dataformat-xml
66

77
2.20.0 (not yet released)
88

9+
#768: `FromXmlParser` lacks extension point for passing custom `XmlTokenStream`
10+
(contributed by @xzxiaoshan)
911
- Generate SBOMs [JSTEP-14]
1012

11-
2.19.1 (not yet released)
13+
2.19.1 (13-Jun-2025)
1214

1315
- Add explicit version for Woodstox, stax2-api (no longer managed via jackson-bom)
1416

src/main/java/tools/jackson/dataformat/xml/XmlFactory.java

Lines changed: 31 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -388,25 +388,15 @@ protected JsonGenerator _createGenerator(ObjectWriteContext writeCtxt,
388388
{
389389
// Only care about features and pretty-printer, for now;
390390
// may add CharacterEscapes in future?
391-
392-
return new ToXmlGenerator(writeCtxt, ioCtxt,
393-
writeCtxt.getStreamWriteFeatures(_streamWriteFeatures),
394-
writeCtxt.getFormatWriteFeatures(_formatWriteFeatures),
395-
_createXmlWriter(out),
396-
_xmlPrettyPrinter(writeCtxt),
397-
_nameProcessor);
398-
}
399391

392+
return _toXmlGenerator(writeCtxt, ioCtxt, _createXmlWriter(out));
393+
}
394+
400395
@Override
401396
protected JsonGenerator _createUTF8Generator(ObjectWriteContext writeCtxt,
402397
IOContext ioCtxt, OutputStream out)
403398
{
404-
return new ToXmlGenerator(writeCtxt, ioCtxt,
405-
writeCtxt.getStreamWriteFeatures(_streamWriteFeatures),
406-
writeCtxt.getFormatWriteFeatures(_formatWriteFeatures),
407-
_createXmlWriter(out),
408-
_xmlPrettyPrinter(writeCtxt),
409-
_nameProcessor);
399+
return _toXmlGenerator(writeCtxt, ioCtxt, _createXmlWriter(out));
410400
}
411401

412402
private final XmlPrettyPrinter _xmlPrettyPrinter(ObjectWriteContext writeCtxt)
@@ -423,6 +413,19 @@ private final XmlPrettyPrinter _xmlPrettyPrinter(ObjectWriteContext writeCtxt)
423413
return (XmlPrettyPrinter) pp;
424414
}
425415

416+
/**
417+
* Overridable method to allow using custom FromXmlParser sub-classes.
418+
*/
419+
protected ToXmlGenerator _toXmlGenerator(ObjectWriteContext writeCtxt, IOContext ioCtxt,
420+
XMLStreamWriter sw) {
421+
return new ToXmlGenerator(writeCtxt, ioCtxt,
422+
writeCtxt.getStreamWriteFeatures(_streamWriteFeatures),
423+
writeCtxt.getFormatWriteFeatures(_formatWriteFeatures),
424+
sw,
425+
_xmlPrettyPrinter(writeCtxt),
426+
_nameProcessor);
427+
}
428+
426429
/*
427430
/**********************************************************************
428431
/* Extended public API, mostly for XmlMapper
@@ -442,11 +445,9 @@ public FromXmlParser createParser(ObjectReadContext readCtxt,
442445
}
443446

444447
// false -> not managed
445-
return new FromXmlParser(readCtxt,
448+
return _fromXmlParser(readCtxt,
446449
_createContext(_createContentReference(sr), false),
447-
readCtxt.getStreamReadFeatures(_streamReadFeatures),
448-
readCtxt.getFormatReadFeatures(_formatReadFeatures),
449-
sr, _nameProcessor, _cfgNameForTextElement);
450+
sr);
450451
}
451452

452453
/**
@@ -459,11 +460,7 @@ public ToXmlGenerator createGenerator(ObjectWriteContext writeCtxt,
459460
{
460461
sw = _initializeXmlWriter(sw);
461462
IOContext ioCtxt = _createContext(_createContentReference(sw), false);
462-
return new ToXmlGenerator(writeCtxt, ioCtxt,
463-
writeCtxt.getStreamWriteFeatures(_streamWriteFeatures),
464-
writeCtxt.getFormatWriteFeatures(_formatWriteFeatures),
465-
sw,
466-
_xmlPrettyPrinter(writeCtxt), _nameProcessor);
463+
return _toXmlGenerator(writeCtxt, ioCtxt, sw);
467464
}
468465

469466
/*
@@ -482,11 +479,7 @@ protected FromXmlParser _createParser(ObjectReadContext readCtxt, IOContext ioCt
482479
} catch (XMLStreamException e) {
483480
return StaxUtil.throwAsReadException(e, null);
484481
}
485-
sr = _initializeXmlReader(sr);
486-
return new FromXmlParser(readCtxt, ioCtxt,
487-
readCtxt.getStreamReadFeatures(_streamReadFeatures),
488-
readCtxt.getFormatReadFeatures(_formatReadFeatures),
489-
sr, _nameProcessor, _cfgNameForTextElement);
482+
return _fromXmlParser(readCtxt, ioCtxt, _initializeXmlReader(sr));
490483
}
491484

492485
@Override
@@ -499,11 +492,7 @@ protected FromXmlParser _createParser(ObjectReadContext readCtxt, IOContext ioCt
499492
} catch (XMLStreamException e) {
500493
return StaxUtil.throwAsReadException(e, null);
501494
}
502-
sr = _initializeXmlReader(sr);
503-
return new FromXmlParser(readCtxt, ioCtxt,
504-
readCtxt.getStreamReadFeatures(_streamReadFeatures),
505-
readCtxt.getFormatReadFeatures(_formatReadFeatures),
506-
sr, _nameProcessor, _cfgNameForTextElement);
495+
return _fromXmlParser(readCtxt, ioCtxt, _initializeXmlReader(sr));
507496
}
508497

509498
@Override
@@ -525,11 +514,7 @@ protected FromXmlParser _createParser(ObjectReadContext readCtxt, IOContext ioCt
525514
} catch (XMLStreamException e) {
526515
return StaxUtil.throwAsReadException(e, null);
527516
}
528-
sr = _initializeXmlReader(sr);
529-
return new FromXmlParser(readCtxt, ioCtxt,
530-
readCtxt.getStreamReadFeatures(_streamReadFeatures),
531-
readCtxt.getFormatReadFeatures(_formatReadFeatures),
532-
sr, _nameProcessor, _cfgNameForTextElement);
517+
return _fromXmlParser(readCtxt, ioCtxt, _initializeXmlReader(sr));
533518
}
534519

535520
@Override
@@ -548,7 +533,14 @@ protected FromXmlParser _createParser(ObjectReadContext readCtxt, IOContext ioCt
548533
} catch (XMLStreamException e) {
549534
return StaxUtil.throwAsReadException(e, null);
550535
}
551-
sr = _initializeXmlReader(sr);
536+
return _fromXmlParser(readCtxt, ioCtxt, _initializeXmlReader(sr));
537+
}
538+
539+
/**
540+
* Overridable method to allow using custom FromXmlParser sub-classes.
541+
*/
542+
protected FromXmlParser _fromXmlParser(ObjectReadContext readCtxt, IOContext ioCtxt,
543+
XMLStreamReader sr) {
552544
return new FromXmlParser(readCtxt, ioCtxt,
553545
readCtxt.getStreamReadFeatures(_streamReadFeatures),
554546
readCtxt.getFormatReadFeatures(_formatReadFeatures),

src/main/java/tools/jackson/dataformat/xml/deser/FromXmlParser.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.io.Writer;
55
import java.math.BigDecimal;
66
import java.math.BigInteger;
7+
import java.util.Objects;
78
import java.util.Set;
89

910
import javax.xml.stream.XMLStreamException;
@@ -160,14 +161,28 @@ public FromXmlParser(ObjectReadContext readCtxt, IOContext ioCtxt,
160161
XMLStreamReader xmlReader,
161162
XmlNameProcessor nameProcessor,
162163
String nameForTextElement)
164+
{
165+
this(readCtxt, ioCtxt,
166+
parserFeatures, xmlFeatures,
167+
xmlReader,
168+
new XmlTokenStream(xmlReader, ioCtxt.contentReference(),
169+
xmlFeatures, nameProcessor),
170+
nameProcessor,
171+
nameForTextElement);
172+
}
173+
174+
public FromXmlParser(ObjectReadContext readCtxt, IOContext ioCtxt,
175+
int parserFeatures, int xmlFeatures,
176+
XMLStreamReader xmlReader,
177+
XmlTokenStream tokenStream,
178+
XmlNameProcessor nameProcessor,
179+
String nameForTextElement)
163180
{
164181
super(readCtxt, ioCtxt, parserFeatures);
165182
_formatFeatures = xmlFeatures;
166183
_streamReadContext = XmlReadContext.createRootContext(-1, -1);
167-
_xmlTokens = new XmlTokenStream(xmlReader, ioCtxt.contentReference(),
168-
_formatFeatures, nameProcessor);
184+
_xmlTokens = Objects.requireNonNull(tokenStream, "xmlTokenStream cannot be null");
169185
_cfgNameForTextElement = nameForTextElement;
170-
171186
final int firstToken;
172187
try {
173188
firstToken = _xmlTokens.initialize();

0 commit comments

Comments
 (0)