Skip to content

Commit 082711b

Browse files
committed
Fix #273
1 parent 6df610c commit 082711b

File tree

7 files changed

+81
-15
lines changed

7 files changed

+81
-15
lines changed

release-notes/CREDITS-2.x

+5
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ Alexei Volkov (softkot@github)
6666
* Reported #294: XML parser error with nested same element names
6767
(2.11.1)
6868

69+
Joseph Petersen (jetersen@github)
70+
71+
* Reported #273: Input mismatch with case-insensitive properties
72+
(2.12.0)
73+
6974
Jochen Schalanda (joschi@github)
7075

7176
* Reported #318: XMLMapper fails to deserialize null (POJO reference) from blank tag

release-notes/VERSION-2.x

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ Project: jackson-dataformat-xml
66

77
2.12.0 (not yet released)
88

9+
#273: Input mismatch with case-insensitive properties
10+
(reported by Joseph P)
911
#318: XMLMapper fails to deserialize null (POJO reference) from blank tag
1012
(reported by Jochen S)
1113

src/main/java/com/fasterxml/jackson/dataformat/xml/deser/FromXmlParser.java

+17-6
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.fasterxml.jackson.core.util.ByteArrayBuilder;
1717
import com.fasterxml.jackson.dataformat.xml.PackageVersion;
1818
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
19+
import com.fasterxml.jackson.dataformat.xml.util.CaseInsensitiveNameSet;
1920
import com.fasterxml.jackson.dataformat.xml.util.StaxUtil;
2021

2122
/**
@@ -317,21 +318,31 @@ public XMLStreamReader getStaxReader() {
317318
* patch versions). So if you have to use it, be prepared for
318319
* possible additional work.
319320
*
320-
* @since 2.1
321+
* @since 2.12
321322
*/
322-
public void addVirtualWrapping(Set<String> namesToWrap)
323+
public void addVirtualWrapping(Set<String> namesToWrap0, boolean caseInsensitive)
323324
{
324-
//System.out.println("addVirtualWrapping("+namesToWrap+")");
325-
// 17-Sep-2012, tatu: Not 100% sure why, but this is necessary to avoid
325+
System.out.printf("addVirtualWrapping(%s) [case-insensitive? %s]\n", namesToWrap0, caseInsensitive);
326+
327+
final Set<String> namesToWrap = caseInsensitive
328+
? CaseInsensitiveNameSet.construct(namesToWrap0)
329+
: namesToWrap0;
330+
331+
// 17-Sep-2012, tatu: Not 100% sure why, but this is necessary to avoid
326332
// problems with Lists-in-Lists properties
327333
String name = _xmlTokens.getLocalName();
328-
if (name != null && namesToWrap.contains(name)) {
329-
//System.out.println("REPEAT from addVirtualWrapping()");
334+
if ((name != null) && namesToWrap.contains(name)) {
335+
System.out.println("REPEAT from addVirtualWrapping()");
330336
_xmlTokens.repeatStartElement();
331337
}
332338
_parsingContext.setNamesToWrap(namesToWrap);
333339
}
334340

341+
@Deprecated // since 2.12
342+
public void addVirtualWrapping(Set<String> namesToWrap) {
343+
addVirtualWrapping(namesToWrap, false);
344+
}
345+
335346
/*
336347
/**********************************************************
337348
/* JsonParser impl

src/main/java/com/fasterxml/jackson/dataformat/xml/deser/WrapperHandlingDeserializer.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ public class WrapperHandlingDeserializer
2828
protected final Set<String> _namesToWrap;
2929

3030
protected final JavaType _type;
31+
32+
// @since 2.12
33+
protected final boolean _caseInsensitive;
3134

3235
/*
3336
/**********************************************************************
@@ -44,6 +47,7 @@ public WrapperHandlingDeserializer(BeanDeserializerBase delegate, Set<String> na
4447
super(delegate);
4548
_namesToWrap = namesToWrap;
4649
_type = delegate.getValueType();
50+
_caseInsensitive = delegate.isCaseInsensitive();
4751
}
4852

4953
/*
@@ -147,7 +151,7 @@ protected final void _configureParser(JsonParser p) throws IOException
147151
p = ((JsonParserDelegate) p).delegate();
148152
}
149153
if (p instanceof FromXmlParser) {
150-
((FromXmlParser) p).addVirtualWrapping(_namesToWrap);
154+
((FromXmlParser) p).addVirtualWrapping(_namesToWrap, _caseInsensitive);
151155
}
152156
}
153157

src/main/java/com/fasterxml/jackson/dataformat/xml/deser/XmlReadContext.java

-5
Original file line numberDiff line numberDiff line change
@@ -176,11 +176,6 @@ public void setNamesToWrap(Set<String> namesToWrap) {
176176
_namesToWrap = namesToWrap;
177177
}
178178

179-
@Deprecated // since 2.11.1
180-
public Set<String> getNamesToWrap() {
181-
return _namesToWrap;
182-
}
183-
184179
// @since 2.11.1
185180
public boolean shouldWrap(String localName) {
186181
return (_namesToWrap != null) && _namesToWrap.contains(localName);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.fasterxml.jackson.dataformat.xml.util;
2+
3+
import java.util.*;
4+
5+
/**
6+
* Helper class for matching element wrappers, possibly in case-insensitive
7+
* manner.
8+
*
9+
* @since 2.12
10+
*/
11+
public final class CaseInsensitiveNameSet extends AbstractSet<String>
12+
{
13+
private final Set<String> _namesToMatch;
14+
15+
private CaseInsensitiveNameSet(Set<String> namesToMatch) {
16+
_namesToMatch = namesToMatch;
17+
}
18+
19+
public static CaseInsensitiveNameSet construct(Set<String> names0) {
20+
Set<String> namesToMatch = new HashSet<String>(names0);
21+
for (String name : names0) {
22+
namesToMatch.add(name.toLowerCase());
23+
}
24+
return new CaseInsensitiveNameSet(namesToMatch);
25+
}
26+
27+
@Override
28+
public boolean contains(Object key0) {
29+
final String key = (String) key0;
30+
if (_namesToMatch.contains(key)) {
31+
return true;
32+
}
33+
final String lc = key.toLowerCase();
34+
return (lc != key) && _namesToMatch.contains(lc);
35+
}
36+
37+
@Override
38+
public Iterator<String> iterator() {
39+
return _namesToMatch.iterator();
40+
}
41+
42+
@Override
43+
public int size() {
44+
return _namesToMatch.size();
45+
}
46+
}

src/test/java/com/fasterxml/jackson/dataformat/xml/failing/CaseInsensitiveDeser273Test.java renamed to src/test/java/com/fasterxml/jackson/dataformat/xml/deser/CaseInsensitiveDeser273Test.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
package com.fasterxml.jackson.dataformat.xml.failing;
1+
package com.fasterxml.jackson.dataformat.xml.deser;
22

33
import java.util.List;
44

5+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
6+
57
import com.fasterxml.jackson.databind.*;
8+
69
import com.fasterxml.jackson.dataformat.xml.XmlTestBase;
710
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
811
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
@@ -25,7 +28,7 @@ public void setElement(List<Depot273> l) {
2528
}
2629
}
2730

28-
// @JsonIgnoreProperties(ignoreUnknown = true)
31+
@JsonIgnoreProperties(ignoreUnknown = true)
2932
static class Depot273
3033
{
3134
@JacksonXmlProperty(isAttribute = true)
@@ -34,7 +37,7 @@ static class Depot273
3437
@JacksonXmlProperty(isAttribute = true)
3538
public String name;
3639

37-
// Should not actually be necessary but...
40+
// Should not actually be necessary but unless unknown ignored is needed:
3841
@JacksonXmlText
3942
public String text;
4043

0 commit comments

Comments
 (0)