Skip to content

Commit 5ea4f3b

Browse files
committed
A bit of renaming, changes to #531 (tag->name)
1 parent 917812c commit 5ea4f3b

File tree

14 files changed

+398
-350
lines changed

14 files changed

+398
-350
lines changed

release-notes/CREDITS-2.x

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,3 +195,8 @@ Volkan Yazıcı (vy@github)
195195
* Reported #491: `XmlMapper` 2.12 regression: no default no-arg ctor found
196196
(2.14.0)
197197

198+
Daniel Mensinger (mensinda@github)
199+
200+
* Contributed #531: Add mechanism for processing invalid XML names (transforming to
201+
valid ones)
202+
(2.14.0)

release-notes/VERSION-2.x

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ Project: jackson-dataformat-xml
88

99
#491: `XmlMapper` 2.12 regression: no default no-arg ctor found
1010
(reported by Volkan Y)
11+
#531: Add mechanism for processing invalid XML names (transforming to valid ones)
12+
(contributed by Daniel M)
1113
#538: Required attribute of `@JsonProperty` is ignored when deserializing from XML
1214
(reported by johandeschutterGET@github)
1315
#545: `@JacksonXmlText` does not work when paired with `@JsonRawValue`

src/main/java/com/fasterxml/jackson/dataformat/xml/XmlFactory.java

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public class XmlFactory extends JsonFactory
6666

6767
protected String _cfgNameForTextElement;
6868

69-
protected XmlTagProcessor _tagProcessor;
69+
protected XmlNameProcessor _nameProcessor;
7070

7171
/*
7272
/**********************************************************
@@ -107,15 +107,15 @@ public XmlFactory(ObjectCodec oc, XMLInputFactory xmlIn, XMLOutputFactory xmlOut
107107
public XmlFactory(ObjectCodec oc, int xpFeatures, int xgFeatures,
108108
XMLInputFactory xmlIn, XMLOutputFactory xmlOut,
109109
String nameForTextElem) {
110-
this(oc, xpFeatures, xgFeatures, xmlIn, xmlOut, nameForTextElem, XmlTagProcessors.newPassthroughProcessor());
110+
this(oc, xpFeatures, xgFeatures, xmlIn, xmlOut, nameForTextElem, XmlNameProcessors.newPassthroughProcessor());
111111
}
112112

113113
protected XmlFactory(ObjectCodec oc, int xpFeatures, int xgFeatures,
114114
XMLInputFactory xmlIn, XMLOutputFactory xmlOut,
115-
String nameForTextElem, XmlTagProcessor tagProcessor)
115+
String nameForTextElem, XmlNameProcessor nameProcessor)
116116
{
117117
super(oc);
118-
_tagProcessor = tagProcessor;
118+
_nameProcessor = nameProcessor;
119119
_xmlParserFeatures = xpFeatures;
120120
_xmlGeneratorFeatures = xgFeatures;
121121
_cfgNameForTextElement = nameForTextElem;
@@ -149,7 +149,7 @@ protected XmlFactory(XmlFactory src, ObjectCodec oc)
149149
_cfgNameForTextElement = src._cfgNameForTextElement;
150150
_xmlInputFactory = src._xmlInputFactory;
151151
_xmlOutputFactory = src._xmlOutputFactory;
152-
_tagProcessor = src._tagProcessor;
152+
_nameProcessor = src._nameProcessor;
153153
}
154154

155155
/**
@@ -165,7 +165,7 @@ protected XmlFactory(XmlFactoryBuilder b)
165165
_cfgNameForTextElement = b.nameForTextElement();
166166
_xmlInputFactory = b.xmlInputFactory();
167167
_xmlOutputFactory = b.xmlOutputFactory();
168-
_tagProcessor = b.xmlTagProcessor();
168+
_nameProcessor = b.xmlTagProcessor();
169169
_initFactories(_xmlInputFactory, _xmlOutputFactory);
170170
}
171171

@@ -336,12 +336,12 @@ public int getFormatGeneratorFeatures() {
336336
return _xmlGeneratorFeatures;
337337
}
338338

339-
public XmlTagProcessor getXmlTagProcessor() {
340-
return _tagProcessor;
339+
public XmlNameProcessor getXmlTagProcessor() {
340+
return _nameProcessor;
341341
}
342342

343-
public void setXmlTagProcessor(XmlTagProcessor _tagProcessor) {
344-
this._tagProcessor = _tagProcessor;
343+
public void setXmlTagProcessor(XmlNameProcessor processor) {
344+
_nameProcessor = processor;
345345
}
346346

347347
/*
@@ -517,7 +517,7 @@ public ToXmlGenerator createGenerator(OutputStream out, JsonEncoding enc) throws
517517
ctxt.setEncoding(enc);
518518
return new ToXmlGenerator(ctxt,
519519
_generatorFeatures, _xmlGeneratorFeatures,
520-
_objectCodec, _createXmlWriter(ctxt, out), _tagProcessor);
520+
_objectCodec, _createXmlWriter(ctxt, out), _nameProcessor);
521521
}
522522

523523
@Override
@@ -526,7 +526,7 @@ public ToXmlGenerator createGenerator(Writer out) throws IOException
526526
final IOContext ctxt = _createContext(_createContentReference(out), false);
527527
return new ToXmlGenerator(ctxt,
528528
_generatorFeatures, _xmlGeneratorFeatures,
529-
_objectCodec, _createXmlWriter(ctxt, out), _tagProcessor);
529+
_objectCodec, _createXmlWriter(ctxt, out), _nameProcessor);
530530
}
531531

532532
@SuppressWarnings("resource")
@@ -538,7 +538,7 @@ public ToXmlGenerator createGenerator(File f, JsonEncoding enc) throws IOExcepti
538538
final IOContext ctxt = _createContext(_createContentReference(out), true);
539539
ctxt.setEncoding(enc);
540540
return new ToXmlGenerator(ctxt, _generatorFeatures, _xmlGeneratorFeatures,
541-
_objectCodec, _createXmlWriter(ctxt, out), _tagProcessor);
541+
_objectCodec, _createXmlWriter(ctxt, out), _nameProcessor);
542542
}
543543

544544
/*
@@ -562,7 +562,7 @@ public FromXmlParser createParser(XMLStreamReader sr) throws IOException
562562

563563
// false -> not managed
564564
FromXmlParser xp = new FromXmlParser(_createContext(_createContentReference(sr), false),
565-
_parserFeatures, _xmlParserFeatures, _objectCodec, sr, _tagProcessor);
565+
_parserFeatures, _xmlParserFeatures, _objectCodec, sr, _nameProcessor);
566566
if (_cfgNameForTextElement != null) {
567567
xp.setXMLTextElementName(_cfgNameForTextElement);
568568
}
@@ -581,7 +581,7 @@ public ToXmlGenerator createGenerator(XMLStreamWriter sw) throws IOException
581581
sw = _initializeXmlWriter(sw);
582582
IOContext ctxt = _createContext(_createContentReference(sw), false);
583583
return new ToXmlGenerator(ctxt, _generatorFeatures, _xmlGeneratorFeatures,
584-
_objectCodec, sw, _tagProcessor);
584+
_objectCodec, sw, _nameProcessor);
585585
}
586586

587587
/*
@@ -601,7 +601,7 @@ protected FromXmlParser _createParser(InputStream in, IOContext ctxt) throws IOE
601601
}
602602
sr = _initializeXmlReader(sr);
603603
FromXmlParser xp = new FromXmlParser(ctxt, _parserFeatures, _xmlParserFeatures,
604-
_objectCodec, sr, _tagProcessor);
604+
_objectCodec, sr, _nameProcessor);
605605
if (_cfgNameForTextElement != null) {
606606
xp.setXMLTextElementName(_cfgNameForTextElement);
607607
}
@@ -619,7 +619,7 @@ protected FromXmlParser _createParser(Reader r, IOContext ctxt) throws IOExcepti
619619
}
620620
sr = _initializeXmlReader(sr);
621621
FromXmlParser xp = new FromXmlParser(ctxt, _parserFeatures, _xmlParserFeatures,
622-
_objectCodec, sr, _tagProcessor);
622+
_objectCodec, sr, _nameProcessor);
623623
if (_cfgNameForTextElement != null) {
624624
xp.setXMLTextElementName(_cfgNameForTextElement);
625625
}
@@ -646,7 +646,7 @@ protected FromXmlParser _createParser(char[] data, int offset, int len, IOContex
646646
}
647647
sr = _initializeXmlReader(sr);
648648
FromXmlParser xp = new FromXmlParser(ctxt, _parserFeatures, _xmlParserFeatures,
649-
_objectCodec, sr, _tagProcessor);
649+
_objectCodec, sr, _nameProcessor);
650650
if (_cfgNameForTextElement != null) {
651651
xp.setXMLTextElementName(_cfgNameForTextElement);
652652
}
@@ -670,7 +670,7 @@ protected FromXmlParser _createParser(byte[] data, int offset, int len, IOContex
670670
}
671671
sr = _initializeXmlReader(sr);
672672
FromXmlParser xp = new FromXmlParser(ctxt, _parserFeatures, _xmlParserFeatures,
673-
_objectCodec, sr, _tagProcessor);
673+
_objectCodec, sr, _nameProcessor);
674674
if (_cfgNameForTextElement != null) {
675675
xp.setXMLTextElementName(_cfgNameForTextElement);
676676
}

src/main/java/com/fasterxml/jackson/dataformat/xml/XmlFactoryBuilder.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,11 @@ public class XmlFactoryBuilder extends TSFBuilder<XmlFactory, XmlFactoryBuilder>
6464
protected ClassLoader _classLoaderForStax;
6565

6666
/**
67-
* See {@link XmlTagProcessor} and {@link XmlTagProcessors}
67+
* See {@link XmlNameProcessor} and {@link XmlNameProcessors}
6868
*
6969
* @since 2.14
7070
*/
71-
protected XmlTagProcessor _tagProcessor;
71+
protected XmlNameProcessor _nameProcessor;
7272

7373
/*
7474
/**********************************************************
@@ -80,7 +80,7 @@ protected XmlFactoryBuilder() {
8080
_formatParserFeatures = XmlFactory.DEFAULT_XML_PARSER_FEATURE_FLAGS;
8181
_formatGeneratorFeatures = XmlFactory.DEFAULT_XML_GENERATOR_FEATURE_FLAGS;
8282
_classLoaderForStax = null;
83-
_tagProcessor = XmlTagProcessors.newPassthroughProcessor();
83+
_nameProcessor = XmlNameProcessors.newPassthroughProcessor();
8484
}
8585

8686
public XmlFactoryBuilder(XmlFactory base) {
@@ -90,7 +90,7 @@ public XmlFactoryBuilder(XmlFactory base) {
9090
_xmlInputFactory = base._xmlInputFactory;
9191
_xmlOutputFactory = base._xmlOutputFactory;
9292
_nameForTextElement = base._cfgNameForTextElement;
93-
_tagProcessor = base._tagProcessor;
93+
_nameProcessor = base._nameProcessor;
9494
_classLoaderForStax = null;
9595
}
9696

@@ -142,8 +142,8 @@ protected ClassLoader staxClassLoader() {
142142
getClass().getClassLoader() : _classLoaderForStax;
143143
}
144144

145-
public XmlTagProcessor xmlTagProcessor() {
146-
return _tagProcessor;
145+
public XmlNameProcessor xmlTagProcessor() {
146+
return _nameProcessor;
147147
}
148148

149149
// // // Parser features
@@ -270,8 +270,8 @@ public XmlFactoryBuilder staxClassLoader(ClassLoader cl) {
270270
/**
271271
* @since 2.14
272272
*/
273-
public XmlFactoryBuilder xmlTagProcessor(XmlTagProcessor tagProcessor) {
274-
_tagProcessor = tagProcessor;
273+
public XmlFactoryBuilder xmlTagProcessor(XmlNameProcessor nameProcessor) {
274+
_nameProcessor = nameProcessor;
275275
return _this();
276276
}
277277

src/main/java/com/fasterxml/jackson/dataformat/xml/XmlMapper.java

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ public Builder defaultUseWrapper(boolean state) {
112112
/**
113113
* @since 2.14
114114
*/
115-
public Builder xmlTagProcessor(XmlTagProcessor tagProcessor) {
116-
_mapper.setXmlTagProcessor(tagProcessor);
115+
public Builder xmlNameProcessor(XmlNameProcessor processor) {
116+
_mapper.setXmlNameProcessor(processor);
117117
return this;
118118
}
119119
}
@@ -291,15 +291,8 @@ public XmlMapper setDefaultUseWrapper(boolean state) {
291291
/**
292292
* @since 2.14
293293
*/
294-
public void setXmlTagProcessor(XmlTagProcessor tagProcessor) {
295-
((XmlFactory)_jsonFactory).setXmlTagProcessor(tagProcessor);
296-
}
297-
298-
/**
299-
* @since 2.14
300-
*/
301-
public XmlTagProcessor getXmlTagProcessor() {
302-
return ((XmlFactory)_jsonFactory).getXmlTagProcessor();
294+
public void setXmlNameProcessor(XmlNameProcessor processor) {
295+
((XmlFactory)_jsonFactory).setXmlTagProcessor(processor);
303296
}
304297

305298
/*
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.fasterxml.jackson.dataformat.xml;
2+
3+
import java.io.Serializable;
4+
5+
/**
6+
* API of processors primarily used for dealing with XML names
7+
* containing invalid characters. Invalid characters in names can,
8+
* for instance, easily appear in map keys.
9+
* <p>
10+
* Processors should be set in the {@link XmlMapper#setXmlNameProcessor}
11+
* and/or the {@link XmlMapper.Builder#xmlNameProcessor} methods.
12+
* <p>
13+
* See {@link XmlNameProcessors} for default processors.
14+
*
15+
* @since 2.14
16+
*/
17+
public interface XmlNameProcessor extends Serializable {
18+
19+
/**
20+
* Representation of an XML element or attribute name
21+
*/
22+
class XmlName {
23+
public String namespace;
24+
public String localPart;
25+
26+
public XmlName() { }
27+
}
28+
29+
/**
30+
* Used during XML serialization.
31+
* <p>
32+
* This method should process the provided {@link XmlName} and
33+
* escape / encode invalid XML characters.
34+
*
35+
* @param name The name to encode
36+
*/
37+
void encodeName(XmlName name);
38+
39+
40+
/**
41+
* Used during XML deserialization.
42+
* <p>
43+
* This method should process the provided {@link XmlName} and
44+
* revert the encoding done in the {@link #encodeName(XmlName)}
45+
* method.
46+
* <p>
47+
* Note: Depending on the use case, it is not always required (or
48+
* even possible) to reverse an encoding with 100% accuracy.
49+
*
50+
* @param name The name to encode
51+
*/
52+
void decodeName(XmlName name);
53+
54+
}

0 commit comments

Comments
 (0)