Skip to content

Commit 60401d7

Browse files
committed
Support for NamespaceContext for JSON bindings.
1 parent 114268d commit 60401d7

File tree

7 files changed

+122
-59
lines changed

7 files changed

+122
-59
lines changed

xpath-to-json-gson/src/main/java/com/github/simy4/xpath/gson/navigator/node/GsonByNameNode.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public final class GsonByNameNode extends AbstractGsonNode {
2424

2525
private final JsonObject parentObject;
2626
private final String name;
27+
private final QName qName;
2728

2829
/**
2930
* Constructor.
@@ -36,11 +37,12 @@ public GsonByNameNode(JsonObject parentObject, String name, GsonNode parent) {
3637
super(parent);
3738
this.parentObject = parentObject;
3839
this.name = name;
40+
this.qName = QName.valueOf(name);
3941
}
4042

4143
@Override
4244
public QName getName() {
43-
return new QName(name);
45+
return qName;
4446
}
4547

4648
@Override

xpath-to-json-gson/src/test/java/com/github/simy4/xpath/gson/XmlBuilderTest.java

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import com.github.simy4.xpath.XmlBuilder;
1919
import com.github.simy4.xpath.fixtures.FixtureAccessor;
20+
import com.github.simy4.xpath.helpers.SimpleNamespaceContext;
2021
import com.google.gson.Gson;
2122
import com.google.gson.GsonBuilder;
2223
import com.google.gson.JsonElement;
@@ -25,6 +26,7 @@
2526
import org.junit.jupiter.params.provider.Arguments;
2627
import org.junit.jupiter.params.provider.MethodSource;
2728

29+
import javax.xml.namespace.NamespaceContext;
2830
import javax.xml.xpath.XPathExpressionException;
2931

3032
import java.util.stream.Stream;
@@ -38,67 +40,79 @@ class XmlBuilderTest {
3840

3941
static Stream<Arguments> data() {
4042
return Stream.of(
41-
arguments(new FixtureAccessor("attr", "json")),
42-
arguments(new FixtureAccessor("simple", "json")),
43-
arguments(new FixtureAccessor("special", "json")));
43+
arguments(new FixtureAccessor("attr", "json"), null),
44+
arguments(new FixtureAccessor("attr", "json"), new SimpleNamespaceContext()),
45+
arguments(new FixtureAccessor("simple", "json"), null),
46+
arguments(new FixtureAccessor("simple", "json"), new SimpleNamespaceContext()),
47+
arguments(new FixtureAccessor("special", "json"), null),
48+
arguments(new FixtureAccessor("special", "json"), new SimpleNamespaceContext()));
4449
}
4550

4651
@ParameterizedTest
4752
@MethodSource("data")
48-
void shouldBuildJsonFromSetOfXPaths(FixtureAccessor fixtureAccessor)
53+
void shouldBuildJsonFromSetOfXPaths(
54+
FixtureAccessor fixtureAccessor, NamespaceContext namespaceContext)
4955
throws XPathExpressionException {
5056
var xmlProperties = fixtureAccessor.getXmlProperties();
51-
var builtDocument = new XmlBuilder().putAll(xmlProperties.keySet()).build(new JsonObject());
57+
var builtDocument =
58+
new XmlBuilder(namespaceContext).putAll(xmlProperties.keySet()).build(new JsonObject());
5259

5360
assertThat(builtDocument).isEqualTo(stringToJson(fixtureAccessor.getPutXml()));
5461
}
5562

5663
@ParameterizedTest
5764
@MethodSource("data")
58-
void shouldBuildJsonFromSetOfXPathsAndSetValues(FixtureAccessor fixtureAccessor)
65+
void shouldBuildJsonFromSetOfXPathsAndSetValues(
66+
FixtureAccessor fixtureAccessor, NamespaceContext namespaceContext)
5967
throws XPathExpressionException {
6068
var xmlProperties = fixtureAccessor.getXmlProperties();
61-
var builtDocument = new XmlBuilder().putAll(xmlProperties).build(new JsonObject());
69+
var builtDocument =
70+
new XmlBuilder(namespaceContext).putAll(xmlProperties).build(new JsonObject());
6271

6372
assertThat(builtDocument).isEqualTo(stringToJson(fixtureAccessor.getPutValueXml()));
6473
}
6574

6675
@ParameterizedTest
6776
@MethodSource("data")
68-
void shouldModifyJsonWhenXPathsAreNotTraversable(FixtureAccessor fixtureAccessor)
77+
void shouldModifyJsonWhenXPathsAreNotTraversable(
78+
FixtureAccessor fixtureAccessor, NamespaceContext namespaceContext)
6979
throws XPathExpressionException {
7080
var xmlProperties = fixtureAccessor.getXmlProperties();
7181
var json = fixtureAccessor.getPutXml();
7282
var oldDocument = stringToJson(json);
73-
var builtDocument = new XmlBuilder().putAll(xmlProperties).build(oldDocument);
83+
var builtDocument = new XmlBuilder(namespaceContext).putAll(xmlProperties).build(oldDocument);
7484

7585
assertThat(builtDocument).isEqualTo(stringToJson(fixtureAccessor.getPutValueXml()));
7686
}
7787

7888
@ParameterizedTest
7989
@MethodSource("data")
80-
void shouldNotModifyJsonWhenAllXPathsTraversable(FixtureAccessor fixtureAccessor)
90+
void shouldNotModifyJsonWhenAllXPathsTraversable(
91+
FixtureAccessor fixtureAccessor, NamespaceContext namespaceContext)
8192
throws XPathExpressionException {
8293
var xmlProperties = fixtureAccessor.getXmlProperties();
8394
var json = fixtureAccessor.getPutValueXml();
8495
var oldDocument = stringToJson(json);
85-
var builtDocument = new XmlBuilder().putAll(xmlProperties).build(oldDocument);
96+
var builtDocument = new XmlBuilder(namespaceContext).putAll(xmlProperties).build(oldDocument);
8697

8798
assertThat(builtDocument).isEqualTo(stringToJson(json));
8899

89-
builtDocument = new XmlBuilder().putAll(xmlProperties.keySet()).build(oldDocument);
100+
builtDocument =
101+
new XmlBuilder(namespaceContext).putAll(xmlProperties.keySet()).build(oldDocument);
90102

91103
assertThat(builtDocument).isEqualTo(stringToJson(json));
92104
}
93105

94106
@ParameterizedTest
95107
@MethodSource("data")
96-
void shouldRemovePathsFromExistingXml(FixtureAccessor fixtureAccessor)
108+
void shouldRemovePathsFromExistingXml(
109+
FixtureAccessor fixtureAccessor, NamespaceContext namespaceContext)
97110
throws XPathExpressionException {
98111
var xmlProperties = fixtureAccessor.getXmlProperties();
99112
var json = fixtureAccessor.getPutValueXml();
100113
var oldDocument = stringToJson(json);
101-
var builtDocument = new XmlBuilder().removeAll(xmlProperties.keySet()).build(oldDocument);
114+
var builtDocument =
115+
new XmlBuilder(namespaceContext).removeAll(xmlProperties.keySet()).build(oldDocument);
102116

103117
assertThat(builtDocument).isNotEqualTo(stringToJson(fixtureAccessor.getPutValueXml()));
104118
}

xpath-to-json-jackson/src/main/java/com/github/simy4/xpath/jackson/navigator/node/JacksonByNameNode.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public final class JacksonByNameNode extends AbstractJacksonNode {
2424

2525
private final ObjectNode parentObject;
2626
private final String name;
27+
private final QName qName;
2728

2829
/**
2930
* Constructor.
@@ -36,11 +37,12 @@ public JacksonByNameNode(ObjectNode parentObject, String name, JacksonNode paren
3637
super(parent);
3738
this.parentObject = parentObject;
3839
this.name = name;
40+
this.qName = QName.valueOf(name);
3941
}
4042

4143
@Override
4244
public QName getName() {
43-
return new QName(name);
45+
return qName;
4446
}
4547

4648
@Override

xpath-to-json-jackson/src/test/java/com/github/simy4/xpath/jackson/JsonBuilderTest.java

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@
2222
import com.fasterxml.jackson.databind.node.ObjectNode;
2323
import com.github.simy4.xpath.XmlBuilder;
2424
import com.github.simy4.xpath.fixtures.FixtureAccessor;
25+
import com.github.simy4.xpath.helpers.SimpleNamespaceContext;
2526
import org.junit.jupiter.params.ParameterizedTest;
2627
import org.junit.jupiter.params.provider.Arguments;
2728
import org.junit.jupiter.params.provider.MethodSource;
2829

30+
import javax.xml.namespace.NamespaceContext;
2931
import javax.xml.xpath.XPathExpressionException;
3032

3133
import java.util.stream.Stream;
@@ -39,18 +41,22 @@ class JsonBuilderTest {
3941

4042
static Stream<Arguments> data() {
4143
return Stream.of(
42-
arguments(new FixtureAccessor("attr", "json")),
43-
arguments(new FixtureAccessor("simple", "json")),
44-
arguments(new FixtureAccessor("special", "json")));
44+
arguments(new FixtureAccessor("attr", "json"), null),
45+
arguments(new FixtureAccessor("attr", "json"), new SimpleNamespaceContext()),
46+
arguments(new FixtureAccessor("simple", "json"), null),
47+
arguments(new FixtureAccessor("simple", "json"), new SimpleNamespaceContext()),
48+
arguments(new FixtureAccessor("special", "json"), null),
49+
arguments(new FixtureAccessor("special", "json"), new SimpleNamespaceContext()));
4550
}
4651

4752
@ParameterizedTest
4853
@MethodSource("data")
49-
void shouldBuildJsonFromSetOfXPaths(FixtureAccessor fixtureAccessor)
54+
void shouldBuildJsonFromSetOfXPaths(
55+
FixtureAccessor fixtureAccessor, NamespaceContext namespaceContext)
5056
throws XPathExpressionException, JsonProcessingException {
5157
var xmlProperties = fixtureAccessor.getXmlProperties();
5258
var builtDocument =
53-
new XmlBuilder()
59+
new XmlBuilder(namespaceContext)
5460
.putAll(xmlProperties.keySet())
5561
.build(new ObjectNode(JsonNodeFactory.instance));
5662

@@ -59,51 +65,59 @@ void shouldBuildJsonFromSetOfXPaths(FixtureAccessor fixtureAccessor)
5965

6066
@ParameterizedTest
6167
@MethodSource("data")
62-
void shouldBuildJsonFromSetOfXPathsAndSetValues(FixtureAccessor fixtureAccessor)
68+
void shouldBuildJsonFromSetOfXPathsAndSetValues(
69+
FixtureAccessor fixtureAccessor, NamespaceContext namespaceContext)
6370
throws XPathExpressionException, JsonProcessingException {
6471
var xmlProperties = fixtureAccessor.getXmlProperties();
6572
var builtDocument =
66-
new XmlBuilder().putAll(xmlProperties).build(new ObjectNode(JsonNodeFactory.instance));
73+
new XmlBuilder(namespaceContext)
74+
.putAll(xmlProperties)
75+
.build(new ObjectNode(JsonNodeFactory.instance));
6776

6877
assertThat(builtDocument).isEqualTo(stringToJson(fixtureAccessor.getPutValueXml()));
6978
}
7079

7180
@ParameterizedTest
7281
@MethodSource("data")
73-
void shouldModifyJsonWhenXPathsAreNotTraversable(FixtureAccessor fixtureAccessor)
82+
void shouldModifyJsonWhenXPathsAreNotTraversable(
83+
FixtureAccessor fixtureAccessor, NamespaceContext namespaceContext)
7484
throws XPathExpressionException, JsonProcessingException {
7585
var xmlProperties = fixtureAccessor.getXmlProperties();
7686
var json = fixtureAccessor.getPutXml();
7787
var oldDocument = stringToJson(json);
78-
var builtDocument = new XmlBuilder().putAll(xmlProperties).build(oldDocument);
88+
var builtDocument = new XmlBuilder(namespaceContext).putAll(xmlProperties).build(oldDocument);
7989

8090
assertThat(builtDocument).isEqualTo(stringToJson(fixtureAccessor.getPutValueXml()));
8191
}
8292

8393
@ParameterizedTest
8494
@MethodSource("data")
85-
void shouldNotModifyJsonWhenAllXPathsTraversable(FixtureAccessor fixtureAccessor)
95+
void shouldNotModifyJsonWhenAllXPathsTraversable(
96+
FixtureAccessor fixtureAccessor, NamespaceContext namespaceContext)
8697
throws XPathExpressionException, JsonProcessingException {
8798
var xmlProperties = fixtureAccessor.getXmlProperties();
8899
var json = fixtureAccessor.getPutValueXml();
89100
var oldDocument = stringToJson(json);
90-
var builtDocument = new XmlBuilder().putAll(xmlProperties).build(oldDocument);
101+
var builtDocument = new XmlBuilder(namespaceContext).putAll(xmlProperties).build(oldDocument);
91102

92103
assertThat(builtDocument).isEqualTo(stringToJson(json));
93104

94-
builtDocument = new XmlBuilder().putAll(xmlProperties.keySet()).build(oldDocument);
105+
builtDocument =
106+
new XmlBuilder(namespaceContext).putAll(xmlProperties.keySet()).build(oldDocument);
95107

96108
assertThat(builtDocument).isEqualTo(stringToJson(json));
97109
}
98110

99111
@ParameterizedTest
100112
@MethodSource("data")
101-
void shouldRemovePathsFromExistingJson(FixtureAccessor fixtureAccessor)
113+
void shouldRemovePathsFromExistingJson(
114+
FixtureAccessor fixtureAccessor, NamespaceContext namespaceContext)
102115
throws XPathExpressionException, JsonProcessingException {
103116
var xmlProperties = fixtureAccessor.getXmlProperties();
104117
var json = fixtureAccessor.getPutValueXml();
105118
var oldDocument = stringToJson(json);
106-
var builtDocument = new XmlBuilder().removeAll(xmlProperties.keySet()).build(oldDocument);
119+
var builtDocument =
120+
new XmlBuilder(namespaceContext).removeAll(xmlProperties.keySet()).build(oldDocument);
107121

108122
assertThat(builtDocument).isNotEqualTo(stringToJson(fixtureAccessor.getPutValueXml()));
109123
}

xpath-to-json-jackson/src/test/java/com/github/simy4/xpath/jackson/YamlBuilderTest.java

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@
2424
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
2525
import com.github.simy4.xpath.XmlBuilder;
2626
import com.github.simy4.xpath.fixtures.FixtureAccessor;
27+
import com.github.simy4.xpath.helpers.SimpleNamespaceContext;
2728
import org.junit.jupiter.params.ParameterizedTest;
2829
import org.junit.jupiter.params.provider.Arguments;
2930
import org.junit.jupiter.params.provider.MethodSource;
3031

32+
import javax.xml.namespace.NamespaceContext;
3133
import javax.xml.xpath.XPathExpressionException;
3234

3335
import java.util.stream.Stream;
@@ -46,18 +48,22 @@ class YamlBuilderTest {
4648

4749
static Stream<Arguments> data() {
4850
return Stream.of(
49-
arguments(new FixtureAccessor("attr", "yaml")),
50-
arguments(new FixtureAccessor("simple", "yaml")),
51-
arguments(new FixtureAccessor("special", "yaml")));
51+
arguments(new FixtureAccessor("attr", "yaml"), null),
52+
arguments(new FixtureAccessor("attr", "yaml"), new SimpleNamespaceContext()),
53+
arguments(new FixtureAccessor("simple", "yaml"), null),
54+
arguments(new FixtureAccessor("simple", "yaml"), new SimpleNamespaceContext()),
55+
arguments(new FixtureAccessor("special", "yaml"), null),
56+
arguments(new FixtureAccessor("special", "yaml"), new SimpleNamespaceContext()));
5257
}
5358

5459
@ParameterizedTest
5560
@MethodSource("data")
56-
void shouldBuildYamlFromSetOfXPaths(FixtureAccessor fixtureAccessor)
61+
void shouldBuildYamlFromSetOfXPaths(
62+
FixtureAccessor fixtureAccessor, NamespaceContext namespaceContext)
5763
throws XPathExpressionException, JsonProcessingException {
5864
var xmlProperties = fixtureAccessor.getXmlProperties();
5965
var builtDocument =
60-
new XmlBuilder()
66+
new XmlBuilder(namespaceContext)
6167
.putAll(xmlProperties.keySet())
6268
.build(new ObjectNode(JsonNodeFactory.instance));
6369

@@ -66,51 +72,59 @@ void shouldBuildYamlFromSetOfXPaths(FixtureAccessor fixtureAccessor)
6672

6773
@ParameterizedTest
6874
@MethodSource("data")
69-
void shouldBuildYamlFromSetOfXPathsAndSetValues(FixtureAccessor fixtureAccessor)
75+
void shouldBuildYamlFromSetOfXPathsAndSetValues(
76+
FixtureAccessor fixtureAccessor, NamespaceContext namespaceContext)
7077
throws XPathExpressionException, JsonProcessingException {
7178
var xmlProperties = fixtureAccessor.getXmlProperties();
7279
var builtDocument =
73-
new XmlBuilder().putAll(xmlProperties).build(new ObjectNode(JsonNodeFactory.instance));
80+
new XmlBuilder(namespaceContext)
81+
.putAll(xmlProperties)
82+
.build(new ObjectNode(JsonNodeFactory.instance));
7483

7584
assertThat(builtDocument).isEqualTo(stringToYaml(fixtureAccessor.getPutValueXml()));
7685
}
7786

7887
@ParameterizedTest
7988
@MethodSource("data")
80-
void shouldModifyYamlWhenXPathsAreNotTraversable(FixtureAccessor fixtureAccessor)
89+
void shouldModifyYamlWhenXPathsAreNotTraversable(
90+
FixtureAccessor fixtureAccessor, NamespaceContext namespaceContext)
8191
throws XPathExpressionException, JsonProcessingException {
8292
var xmlProperties = fixtureAccessor.getXmlProperties();
8393
var json = fixtureAccessor.getPutXml();
8494
var oldDocument = stringToYaml(json);
85-
var builtDocument = new XmlBuilder().putAll(xmlProperties).build(oldDocument);
95+
var builtDocument = new XmlBuilder(namespaceContext).putAll(xmlProperties).build(oldDocument);
8696

8797
assertThat(builtDocument).isEqualTo(stringToYaml(fixtureAccessor.getPutValueXml()));
8898
}
8999

90100
@ParameterizedTest
91101
@MethodSource("data")
92-
void shouldNotModifyYamlWhenAllXPathsTraversable(FixtureAccessor fixtureAccessor)
102+
void shouldNotModifyYamlWhenAllXPathsTraversable(
103+
FixtureAccessor fixtureAccessor, NamespaceContext namespaceContext)
93104
throws XPathExpressionException, JsonProcessingException {
94105
var xmlProperties = fixtureAccessor.getXmlProperties();
95106
var yaml = fixtureAccessor.getPutValueXml();
96107
var oldDocument = stringToYaml(yaml);
97-
var builtDocument = new XmlBuilder().putAll(xmlProperties).build(oldDocument);
108+
var builtDocument = new XmlBuilder(namespaceContext).putAll(xmlProperties).build(oldDocument);
98109

99110
assertThat(builtDocument).isEqualTo(stringToYaml(yaml));
100111

101-
builtDocument = new XmlBuilder().putAll(xmlProperties.keySet()).build(oldDocument);
112+
builtDocument =
113+
new XmlBuilder(namespaceContext).putAll(xmlProperties.keySet()).build(oldDocument);
102114

103115
assertThat(builtDocument).isEqualTo(stringToYaml(yaml));
104116
}
105117

106118
@ParameterizedTest
107119
@MethodSource("data")
108-
void shouldRemovePathsFromExistingYaml(FixtureAccessor fixtureAccessor)
120+
void shouldRemovePathsFromExistingYaml(
121+
FixtureAccessor fixtureAccessor, NamespaceContext namespaceContext)
109122
throws XPathExpressionException, JsonProcessingException {
110123
var xmlProperties = fixtureAccessor.getXmlProperties();
111124
var yaml = fixtureAccessor.getPutValueXml();
112125
var oldDocument = stringToYaml(yaml);
113-
var builtDocument = new XmlBuilder().removeAll(xmlProperties.keySet()).build(oldDocument);
126+
var builtDocument =
127+
new XmlBuilder(namespaceContext).removeAll(xmlProperties.keySet()).build(oldDocument);
114128

115129
assertThat(builtDocument).isNotEqualTo(stringToYaml(fixtureAccessor.getPutValueXml()));
116130
}

xpath-to-json-jakarta/src/main/java/com/github/simy4/xpath/json/navigator/node/JakartaJsonByNameNode.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
public final class JakartaJsonByNameNode extends AbstractJakartaJsonNode {
2626

2727
private final String name;
28+
private final QName qName;
2829

2930
/**
3031
* Constructor.
@@ -35,11 +36,12 @@ public final class JakartaJsonByNameNode extends AbstractJakartaJsonNode {
3536
public JakartaJsonByNameNode(String name, JakartaJsonNode parent) {
3637
super(parent);
3738
this.name = name;
39+
this.qName = QName.valueOf(name);
3840
}
3941

4042
@Override
4143
public QName getName() {
42-
return new QName(name);
44+
return qName;
4345
}
4446

4547
@Override

0 commit comments

Comments
 (0)