Skip to content

Commit f2224b5

Browse files
change default property name for xml text from empty string to <xml:text>
1 parent 14d658a commit f2224b5

14 files changed

+37
-22
lines changed

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

+5
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder;
1414
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
1515
import com.fasterxml.jackson.dataformat.xml.annotation.*;
16+
import com.fasterxml.jackson.dataformat.xml.deser.XmlTextPropertyNameHolder;
1617

1718
/**
1819
* Extension of {@link JacksonAnnotationIntrospector} that is needed to support
@@ -213,6 +214,10 @@ public PropertyName findNameForDeserialization(Annotated a)
213214
PropertyName pn = PropertyName.merge(_findXmlName(a),
214215
super.findNameForDeserialization(a));
215216
if (pn == null) {
217+
if(_hasAnnotation(a, JacksonXmlText.class)) {
218+
return PropertyName.construct(XmlTextPropertyNameHolder.PROPERTY_NAME);
219+
}
220+
216221
if (_hasOneOf(a, ANNOTATIONS_TO_INFER_XML_PROP)) {
217222
return PropertyName.USE_DEFAULT;
218223
}

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.fasterxml.jackson.databind.ser.SerializerFactory;
66
import com.fasterxml.jackson.dataformat.xml.deser.FromXmlParser;
77
import com.fasterxml.jackson.dataformat.xml.deser.XmlBeanDeserializerModifier;
8+
import com.fasterxml.jackson.dataformat.xml.deser.XmlTextPropertyNameHolder;
89
import com.fasterxml.jackson.dataformat.xml.ser.XmlBeanSerializerModifier;
910

1011
/**
@@ -44,7 +45,7 @@ public class JacksonXmlModule
4445
*
4546
* @since 2.1
4647
*/
47-
protected String _cfgNameForTextElement = FromXmlParser.DEFAULT_UNNAMED_TEXT_PROPERTY;
48+
protected String _cfgNameForTextElement = XmlTextPropertyNameHolder.PROPERTY_NAME;
4849

4950
/**
5051
* Optional override for {@link SerializerFactory}
@@ -78,7 +79,7 @@ public void setupModule(SetupContext context)
7879
context.insertAnnotationIntrospector(_constructIntrospector());
7980

8081
// and finally inform XmlFactory about overrides, if need be:
81-
if (_cfgNameForTextElement != FromXmlParser.DEFAULT_UNNAMED_TEXT_PROPERTY) {
82+
if (_cfgNameForTextElement != FromXmlParser.DEFAULT_TEXT_PROPERTY) {
8283
XmlMapper m = (XmlMapper) context.getOwner();
8384
m.setXMLTextElementName(_cfgNameForTextElement);
8485
}

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ public class FromXmlParser
3535
implements ElementWrappable // @since 2.15
3636
{
3737
/**
38-
* The default name placeholder for XML text segments is empty
39-
* String ("").
38+
* The default name placeholder for XML text segments is "&lt;xml&gt;text"
39+
* @since 2.20 Was empty text before 2.20
4040
*/
41-
public final static String DEFAULT_UNNAMED_TEXT_PROPERTY = "";
41+
public final static String DEFAULT_TEXT_PROPERTY = XmlTextPropertyNameHolder.PROPERTY_NAME;
4242

4343
/**
4444
* XML format has some peculiarities, indicated via new (2.12) capability
@@ -160,7 +160,7 @@ private Feature(boolean defaultState) {
160160
*
161161
* @since 2.1
162162
*/
163-
protected String _cfgNameForTextElement = DEFAULT_UNNAMED_TEXT_PROPERTY;
163+
protected String _cfgNameForTextElement = XmlTextPropertyNameHolder.PROPERTY_NAME;
164164

165165
/*
166166
/**********************************************************

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ public String extractScalarFromObject(JsonParser p, JsonDeserializer<?> deser,
126126
final String propName = p.currentName();
127127
JsonToken t = p.nextToken();
128128
if (t == JsonToken.VALUE_STRING) {
129-
if (propName.equals("")) {
129+
if (propName.equals(XmlTextPropertyNameHolder.PROPERTY_NAME)) {
130130
text = p.getText();
131131
}
132132
} else {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.fasterxml.jackson.dataformat.xml.deser;
2+
3+
public class XmlTextPropertyNameHolder {
4+
5+
public static final String PROPERTY_NAME = "<xml:text>";
6+
}

src/test-jdk17/java/com/fasterxml/jackson/dataformat/xml/records/failing/XmlRecordDeser734Test.java

-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ record Amount(@JacksonXmlText String value,
1818
private final String XML =
1919
a2q("<Amt Ccy='EUR'>1</Amt>");
2020

21-
@JacksonTestFailureExpected
2221
@Test
2322
public void testDeser() throws Exception {
2423
XmlMapper mapper = new XmlMapper();

src/test/java/com/fasterxml/jackson/dataformat/xml/deser/MapDeserializationTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public void testMapWithAttr() throws Exception
4141
assertEquals(1, map.size());
4242
Map<String,Object> inner = new LinkedHashMap<>();
4343
inner.put("lang", "en");
44-
inner.put("", "John Smith");
44+
inner.put(XmlTextPropertyNameHolder.PROPERTY_NAME, "John Smith");
4545
assertEquals(Collections.singletonMap("person", inner), map);
4646
}
4747
}

src/test/java/com/fasterxml/jackson/dataformat/xml/deser/UntypedObjectDeserTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public void testMixedContent() throws Exception
7676
final String XML = "<root>first<a>123</a>second<b>abc</b>last</root>";
7777
final JsonNode fromXml = XML_MAPPER.valueToTree(XML_MAPPER.readValue(XML, Object.class));
7878
final ObjectNode exp = XML_MAPPER.createObjectNode();
79-
exp.putArray("")
79+
exp.putArray(XmlTextPropertyNameHolder.PROPERTY_NAME)
8080
.add("first")
8181
.add("second")
8282
.add("last");

src/test/java/com/fasterxml/jackson/dataformat/xml/node/JsonNodeBasicDeserTest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.fasterxml.jackson.dataformat.xml.node;
22

3+
import com.fasterxml.jackson.dataformat.xml.deser.XmlTextPropertyNameHolder;
34
import org.junit.jupiter.api.Test;
45

56
import com.fasterxml.jackson.databind.*;
@@ -43,7 +44,7 @@ public void testMixedContent() throws Exception
4344
{
4445
JsonNode fromXml = XML_MAPPER.readTree("<root>first<a>123</a>second<b>abc</b>last</root>");
4546
final ObjectNode exp = XML_MAPPER.createObjectNode();
46-
exp.putArray("")
47+
exp.putArray(XmlTextPropertyNameHolder.PROPERTY_NAME)
4748
.add("first")
4849
.add("second")
4950
.add("last");

src/test/java/com/fasterxml/jackson/dataformat/xml/node/JsonNodeMixedContent403Test.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.fasterxml.jackson.dataformat.xml.node;
22

3+
import com.fasterxml.jackson.dataformat.xml.deser.XmlTextPropertyNameHolder;
34
import org.junit.jupiter.api.Test;
45

56
import com.fasterxml.jackson.databind.JsonNode;
@@ -19,23 +20,23 @@ public class JsonNodeMixedContent403Test extends XmlTestUtil
1920
public void testMixedContentBefore() throws Exception
2021
{
2122
// First, before elements:
22-
assertEquals(JSON_MAPPER.readTree(a2q("{'':'before','a':'1','b':'2'}")),
23+
assertEquals(JSON_MAPPER.readTree(a2q("{'%s':'before','a':'1','b':'2'}".formatted(XmlTextPropertyNameHolder.PROPERTY_NAME))),
2324
XML_MAPPER.readTree("<root>before<a>1</a><b>2</b></root>"));
2425
}
2526

2627
@Test
2728
public void testMixedContentBetween() throws Exception
2829
{
2930
// Second, between
30-
assertEquals(JSON_MAPPER.readTree(a2q("{'a':'1','':'between','b':'2'}")),
31+
assertEquals(JSON_MAPPER.readTree(a2q("{'a':'1','%s':'between','b':'2'}".formatted(XmlTextPropertyNameHolder.PROPERTY_NAME))),
3132
XML_MAPPER.readTree("<root><a>1</a>between<b>2</b></root>"));
3233
}
3334

3435
@Test
3536
public void testMixedContentAfter() throws Exception
3637
{
3738
// and then after
38-
assertEquals(JSON_MAPPER.readTree(a2q("{'a':'1','b':'2','':'after'}")),
39+
assertEquals(JSON_MAPPER.readTree(a2q("{'a':'1','b':'2','%s':'after'}".formatted(XmlTextPropertyNameHolder.PROPERTY_NAME))),
3940
XML_MAPPER.readTree("<root><a>1</a><b>2</b>after</root>"));
4041
}
4142

@@ -44,7 +45,7 @@ public void testMultipleMixedContent() throws Exception
4445
{
4546
// and then after
4647
assertEquals(JSON_MAPPER.readTree(
47-
a2q("{'':['first','second','third'],'a':'1','b':'2'}")),
48+
a2q("{'%s':['first','second','third'],'a':'1','b':'2'}".formatted(XmlTextPropertyNameHolder.PROPERTY_NAME))),
4849
XML_MAPPER.readTree("<root>first<a>1</a>second<b>2</b>third</root>"));
4950
}
5051

@@ -57,7 +58,7 @@ public void testMixed226() throws Exception
5758
+" mixed2</a>\n"
5859
+"</root>";
5960
JsonNode fromJson = JSON_MAPPER.readTree(
60-
a2q("{'a':{'':['mixed1 ',' mixed2'],'b':'leaf'}}"));
61+
a2q("{'a':{'%s':['mixed1 ',' mixed2'],'b':'leaf'}}".formatted(XmlTextPropertyNameHolder.PROPERTY_NAME)));
6162
assertEquals(fromJson, XML_MAPPER.readTree(XML));
6263
}
6364
}

src/test/java/com/fasterxml/jackson/dataformat/xml/ser/TestSerializationWithFilter.java

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.fasterxml.jackson.dataformat.xml.ser;
22

3+
import com.fasterxml.jackson.dataformat.xml.deser.XmlTextPropertyNameHolder;
34
import org.junit.jupiter.api.Test;
45

56
import com.fasterxml.jackson.annotation.JsonFilter;

src/test/java/com/fasterxml/jackson/dataformat/xml/stream/XmlParser442Test.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.fasterxml.jackson.dataformat.xml.stream;
22

3+
import com.fasterxml.jackson.dataformat.xml.deser.XmlTextPropertyNameHolder;
34
import org.junit.jupiter.api.Test;
45

56
import com.fasterxml.jackson.core.JsonToken;
@@ -43,7 +44,7 @@ public void testMixedContentBeforeElement442() throws Exception
4344
// Here's what we are missing:
4445
assertToken(JsonToken.START_OBJECT, xp.nextToken());
4546
assertToken(JsonToken.FIELD_NAME, xp.nextToken());
46-
assertEquals("", xp.currentName());
47+
assertEquals(XmlTextPropertyNameHolder.PROPERTY_NAME, xp.currentName());
4748

4849
assertToken(JsonToken.VALUE_STRING, xp.nextToken());
4950
assertEquals("text", xp.getText().trim());

src/test/java/com/fasterxml/jackson/dataformat/xml/stream/XmlParserTest.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.*;
44

5+
import com.fasterxml.jackson.dataformat.xml.deser.XmlTextPropertyNameHolder;
56
import org.junit.jupiter.api.Test;
67

78
import com.fasterxml.jackson.core.*;
@@ -99,7 +100,7 @@ public void testRootScalar() throws Exception
99100
try (JsonParser p = _xmlMapper.createParser(XML)) {
100101
assertToken(JsonToken.START_OBJECT, p.nextToken());
101102
assertToken(JsonToken.FIELD_NAME, p.nextToken());
102-
assertEquals("", p.currentName());
103+
assertEquals(XmlTextPropertyNameHolder.PROPERTY_NAME, p.currentName());
103104
assertToken(JsonToken.VALUE_STRING, p.nextToken());
104105
assertEquals("value", p.getText());
105106
assertToken(JsonToken.END_OBJECT, p.nextToken());
@@ -118,7 +119,7 @@ public void testRootMixed() throws Exception
118119
assertToken(JsonToken.START_OBJECT, p.nextToken());
119120

120121
assertToken(JsonToken.FIELD_NAME, p.nextToken());
121-
assertEquals("", p.currentName());
122+
assertEquals(XmlTextPropertyNameHolder.PROPERTY_NAME, p.currentName());
122123
assertToken(JsonToken.VALUE_STRING, p.nextToken());
123124
assertEquals("value", p.getText());
124125

@@ -344,7 +345,7 @@ public void testXmlAttributes() throws Exception
344345
@Test
345346
public void testMixedContent() throws Exception
346347
{
347-
String exp = a2q("{'':'first','a':'123','':'second','b':'456','':'last'}");
348+
String exp = a2q("{'%1$s':'first','a':'123','%1$s':'second','b':'456','%1$s':'last'}".formatted(XmlTextPropertyNameHolder.PROPERTY_NAME));
348349
String result = _readXmlWriteJson("<root>first<a>123</a>second<b>456</b>last</root>");
349350

350351
//System.err.println("result = \n"+result);
@@ -375,7 +376,7 @@ public void testInferredNumbers() throws Exception
375376
assertEquals(42, xp.getIntValue());
376377

377378
assertToken(JsonToken.FIELD_NAME, xp.nextToken()); // implicit for text
378-
assertEquals("", xp.currentName());
379+
assertEquals(XmlTextPropertyNameHolder.PROPERTY_NAME, xp.currentName());
379380

380381
assertToken(JsonToken.VALUE_STRING, xp.nextToken());
381382
assertTrue(xp.isExpectedNumberIntToken());

src/test/java/com/fasterxml/jackson/dataformat/xml/tofix/XmlTextViaCreator306Test.java

-1
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,6 @@ public void testIssue306NoCtor() throws Exception
115115
}
116116

117117
// [dataformat-xml#423]
118-
@JacksonTestFailureExpected
119118
@Test
120119
public void testXmlTextViaCtor423() throws Exception
121120
{

0 commit comments

Comments
 (0)