From 31e70a30c9fcebb92e8553c7733c4a71438e911d Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Fri, 26 Aug 2022 14:16:18 -0400 Subject: [PATCH 1/2] Correctly parses QName --- .../deser/XmlBeanDeserializerModifier.java | 5 +++ .../xml/deser/QNameDeserializer.java | 30 ++++++++++++++++ .../dataformat/xml/deser/QNameTest.java | 35 +++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 src/main/java/tools/jackson/dataformat/xml/deser/QNameDeserializer.java create mode 100644 src/test/java/tools/jackson/dataformat/xml/deser/QNameTest.java diff --git a/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/XmlBeanDeserializerModifier.java b/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/XmlBeanDeserializerModifier.java index 303ba80c6..3afbfa8d9 100644 --- a/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/XmlBeanDeserializerModifier.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/XmlBeanDeserializerModifier.java @@ -1,5 +1,6 @@ package com.fasterxml.jackson.dataformat.xml.deser; +import javax.xml.namespace.QName; import java.util.*; import com.fasterxml.jackson.databind.*; @@ -81,6 +82,10 @@ public List updateProperties(DeserializationConfig confi public JsonDeserializer modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer deser0) { + if (beanDesc.getBeanClass() == QName.class) { + return new QNameDeserializer(deser0); + } + if (!(deser0 instanceof BeanDeserializerBase)) { return deser0; } diff --git a/src/main/java/tools/jackson/dataformat/xml/deser/QNameDeserializer.java b/src/main/java/tools/jackson/dataformat/xml/deser/QNameDeserializer.java new file mode 100644 index 000000000..5810ba0f0 --- /dev/null +++ b/src/main/java/tools/jackson/dataformat/xml/deser/QNameDeserializer.java @@ -0,0 +1,30 @@ +package tools.jackson.dataformat.xml.deser; + +import javax.xml.namespace.QName; + +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.ValueDeserializer; + +public class QNameDeserializer extends ValueDeserializer { + ValueDeserializer originalDeserializer; + public QNameDeserializer(ValueDeserializer deserializer) { + originalDeserializer = deserializer; + } + + @Override + public Object deserialize(JsonParser p, DeserializationContext ctxt) throws JacksonException { + QName qName = (QName) originalDeserializer.deserialize(p, ctxt); + + if (qName.getLocalPart().indexOf(":") > 0) { + String prefix = qName.getLocalPart().split(":")[0]; + String localPart = qName.getLocalPart().split(":")[1]; + String namespace = ((FromXmlParser)ctxt.getParser()).getStaxReader().getNamespaceContext().getNamespaceURI(prefix); + + return new QName(namespace, localPart, prefix); + } + + return qName; + } +} diff --git a/src/test/java/tools/jackson/dataformat/xml/deser/QNameTest.java b/src/test/java/tools/jackson/dataformat/xml/deser/QNameTest.java new file mode 100644 index 000000000..ec542720f --- /dev/null +++ b/src/test/java/tools/jackson/dataformat/xml/deser/QNameTest.java @@ -0,0 +1,35 @@ +package tools.jackson.dataformat.xml.deser; + +import static junit.framework.TestCase.assertEquals; + +import javax.xml.namespace.QName; + +import org.junit.Test; +import tools.jackson.dataformat.xml.XmlMapper; + +public class QNameTest { + protected static class Parent { + public Level1 level1; + } + + protected static class Level1 { + public QName name; + } + + private final XmlMapper MAPPER = XmlMapper.builder() + .defaultUseWrapper(false) + .build(); + + @Test + public void testQNameParser() throws Exception + { + String xml = + "\n" + + " \n" + + ""; + + Parent bean = MAPPER.readValue(xml, Parent.class); + + assertEquals("{urn:example:types:r1}DateTime", bean.level1.name.toString()); + } +} From 99d8459caba81ceb3c6ec3d13f5a623005ceee55 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Fri, 26 Aug 2022 14:27:18 -0400 Subject: [PATCH 2/2] Moving to the right packages and folders --- .../xml/deser/QNameDeserializer.java | 21 +++++++++++-------- .../dataformat/xml/deser/QNameTest.java | 4 ++-- 2 files changed, 14 insertions(+), 11 deletions(-) rename src/main/java/{tools => com/fasterxml}/jackson/dataformat/xml/deser/QNameDeserializer.java (55%) rename src/test/java/{tools => com/fasterxml}/jackson/dataformat/xml/deser/QNameTest.java (88%) diff --git a/src/main/java/tools/jackson/dataformat/xml/deser/QNameDeserializer.java b/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/QNameDeserializer.java similarity index 55% rename from src/main/java/tools/jackson/dataformat/xml/deser/QNameDeserializer.java rename to src/main/java/com/fasterxml/jackson/dataformat/xml/deser/QNameDeserializer.java index 5810ba0f0..a904a655f 100644 --- a/src/main/java/tools/jackson/dataformat/xml/deser/QNameDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/QNameDeserializer.java @@ -1,20 +1,23 @@ -package tools.jackson.dataformat.xml.deser; +package com.fasterxml.jackson.dataformat.xml.deser; import javax.xml.namespace.QName; -import tools.jackson.core.JacksonException; -import tools.jackson.core.JsonParser; -import tools.jackson.databind.DeserializationContext; -import tools.jackson.databind.ValueDeserializer; +import java.io.IOException; -public class QNameDeserializer extends ValueDeserializer { - ValueDeserializer originalDeserializer; - public QNameDeserializer(ValueDeserializer deserializer) { +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + + +public class QNameDeserializer extends JsonDeserializer { + JsonDeserializer originalDeserializer; + public QNameDeserializer(JsonDeserializer deserializer) { originalDeserializer = deserializer; } @Override - public Object deserialize(JsonParser p, DeserializationContext ctxt) throws JacksonException { + public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException { QName qName = (QName) originalDeserializer.deserialize(p, ctxt); if (qName.getLocalPart().indexOf(":") > 0) { diff --git a/src/test/java/tools/jackson/dataformat/xml/deser/QNameTest.java b/src/test/java/com/fasterxml/jackson/dataformat/xml/deser/QNameTest.java similarity index 88% rename from src/test/java/tools/jackson/dataformat/xml/deser/QNameTest.java rename to src/test/java/com/fasterxml/jackson/dataformat/xml/deser/QNameTest.java index ec542720f..43d704bcb 100644 --- a/src/test/java/tools/jackson/dataformat/xml/deser/QNameTest.java +++ b/src/test/java/com/fasterxml/jackson/dataformat/xml/deser/QNameTest.java @@ -1,11 +1,11 @@ -package tools.jackson.dataformat.xml.deser; +package com.fasterxml.jackson.dataformat.xml.deser; import static junit.framework.TestCase.assertEquals; import javax.xml.namespace.QName; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; import org.junit.Test; -import tools.jackson.dataformat.xml.XmlMapper; public class QNameTest { protected static class Parent {