Skip to content

Commit 1ed262f

Browse files
committed
[bugfix] Allow XDM Array and Map types to be serialized over the XML:DB API
Closes eXist-db/exist#4919
1 parent dcc8782 commit 1ed262f

4 files changed

Lines changed: 70 additions & 5 deletions

File tree

exist-core/src/main/java/org/exist/xmldb/LocalXMLResource.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,11 @@ else if (root != null && !(root instanceof NodeValue)) {
137137
} else if (value != null) {
138138
try {
139139
if (Type.subTypeOf(value.getType(),Type.STRING)) {
140-
return ((StringValue)value).getStringValue(true);
140+
return ((StringValue) value).getStringValue(true);
141+
142+
} else if (Type.subTypeOf(value.getType(), Type.MAP_ITEM) || Type.subTypeOf(value.getType(), Type.ARRAY_ITEM)) {
143+
return value.toString();
144+
141145
} else {
142146
return value.getStringValue();
143147
}

exist-core/src/main/java/org/exist/xmlrpc/RpcConnection.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1818,6 +1818,10 @@ private Map<String, Object> queryResultToRpcResponse(final long startTime, final
18181818
entry.add(String.valueOf(((NodeImpl) next).getNodeNumber()));
18191819
}
18201820
result.add(entry);
1821+
1822+
} else if (Type.subTypeOf(next.getType(), Type.MAP_ITEM) || Type.subTypeOf(next.getType(), Type.ARRAY_ITEM)) {
1823+
result.add(next.toString());
1824+
18211825
} else {
18221826
result.add(next.getStringValue());
18231827
}
@@ -1982,7 +1986,14 @@ private Map<String, String> atomicMap(final Item item) throws XPathException {
19821986

19831987
final int type = item.getType();
19841988
result.put("type", Type.getTypeName(type));
1985-
result.put("value", item.getStringValue());
1989+
1990+
final String value;
1991+
if (Type.subTypeOf(item.getType(), Type.MAP_ITEM) || Type.subTypeOf(item.getType(), Type.ARRAY_ITEM)) {
1992+
value = item.toString();
1993+
} else {
1994+
value = item.getStringValue();
1995+
}
1996+
result.put("value", value);
19861997

19871998
return result;
19881999
}

exist-core/src/main/java/org/exist/xquery/functions/array/ArrayType.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -489,11 +489,37 @@ public String toString() {
489489
builder.append(' ');
490490
}
491491
for (int i = 0; i < vector.length(); i++) {
492-
final Sequence value = vector.nth(i);
493-
builder.append(value.toString());
494-
if (i < vector.length() - 1) {
492+
493+
if (i > 0) {
495494
builder.append(", ");
496495
}
496+
497+
final Sequence sequence = vector.nth(i);
498+
499+
if (!sequence.hasOne()) {
500+
builder.append('(');
501+
}
502+
503+
for (int j = 0; j < sequence.getItemCount(); j++) {
504+
if (j > 0) {
505+
builder.append(", ");
506+
}
507+
508+
final Item item = sequence.itemAt(j);
509+
if (Type.subTypeOf(item.getType(), Type.STRING)) {
510+
builder.append('"');
511+
}
512+
513+
builder.append(item.toString());
514+
515+
if (Type.subTypeOf(item.getType(), Type.STRING)) {
516+
builder.append('"');
517+
}
518+
}
519+
520+
if (!sequence.hasOne()) {
521+
builder.append(')');
522+
}
497523
}
498524
if (vector.length() > 0) {
499525
builder.append(' ');

exist-core/src/test/java/org/exist/xmldb/SerializationTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,30 @@ public void getXmlDeclYes() throws XMLDBException {
242242
}
243243
}
244244

245+
@Test
246+
public void testArray() throws XMLDBException {
247+
final String query = "array { \"value 1\", \"value 2\" }";
248+
249+
final XQueryService service = testCollection.getService(XQueryService.class);
250+
final ResourceSet result = service.query(query);
251+
assertEquals(1, result.getSize());
252+
253+
final Resource resource = result.getResource(0);
254+
assertEquals("[ \"value 1\", \"value 2\" ]", resource.getContent());
255+
}
256+
257+
@Test
258+
public void testMap() throws XMLDBException {
259+
final String query = "map { \"prop1\" : \"value 1\", \"prop2\" : \"value 2\" }";
260+
261+
final XQueryService service = testCollection.getService(XQueryService.class);
262+
final ResourceSet result = service.query(query);
263+
assertEquals(1, result.getSize());
264+
265+
final Resource resource = result.getResource(0);
266+
assertEquals("map {\"prop2\": \"value 2\", \"prop1\": \"value 1\"}", resource.getContent());
267+
}
268+
245269
private static void assertXMLEquals(final String expected, final Resource actual) throws XMLDBException {
246270
final Source srcExpected = Input.fromString(expected).build();
247271
final Source srcActual = Input.fromString(actual.getContent().toString()).build();

0 commit comments

Comments
 (0)