Skip to content

Commit 0279595

Browse files
committed
[bugfix] Reference nodes in the in-memory DOM (Memtree) should be transparent to the org.w3c.dom API
Closes eXist-db/exist#5682
1 parent 0989610 commit 0279595

File tree

24 files changed

+1104
-388
lines changed

24 files changed

+1104
-388
lines changed

exist-core/pom.xml

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -677,12 +677,18 @@
677677
<header>${project.parent.relativePath}/../elemental-parent/elemental-LGPL-21-ONLY-license.template.txt</header>
678678
<includes>
679679
<include>project-suppression.xml</include>
680+
<include>src/main/java/org/exist/dom/memtree/reference/AbstractReferenceCharacterData.java</include>
681+
<include>src/main/java/org/exist/dom/memtree/reference/AbstractReferenceNodeImpl.java</include>
682+
<include>src/main/java/org/exist/dom/memtree/reference/CommentReferenceImpl.java</include>
683+
<include>src/main/java/org/exist/dom/memtree/reference/ElementReferenceImpl.java</include>
684+
<include>src/main/java/org/exist/dom/memtree/reference/TextReferenceImpl.java</include>
680685
<include>src/main/java/org/exist/util/ByteOrderMark.java</include>
681686
<include>src/test/java/org/exist/xquery/ImportFromPkgTest.java</include>
682687
<include>src/test/java/org/exist/xquery/WatchdogTest.java</include>
683688
<include>src/test/java/org/exist/xquery/value/DateTimeTypesTest.java</include>
684689
<include>src/test/java/org/exist/xquery/functions/fn/FunXmlToJsonTest.java</include>
685690
<include>src/test/java/org/exist/xquery/functions/fn/ParsingFunctionsTest.java</include>
691+
<include>src/test/java/org/exist/xquery/functions/fn/transform/FunTransformITTest.java</include>
686692
<include>src/test/java/org/exist/xquery/functions/xmldb/XMLDBStoreTest.java</include>
687693
<include>src/test/resources-filtered/org/exist/xquery/import-from-pkg-test.conf.xml</include>
688694
</includes>
@@ -730,11 +736,16 @@
730736
<include>src/main/java/org/exist/config/ConfigurationImpl.java</include>
731737
<include>src/main/java/org/exist/dom/memtree/DocumentImpl.java</include>
732738
<include>src/main/java/org/exist/dom/memtree/ElementImpl.java</include>
739+
<include>src/main/java/org/exist/dom/memtree/MemTreeBuilder.java</include>
740+
<include>src/main/java/org/exist/dom/memtree/NodeImpl.java</include>
741+
<include>src/main/java/org/exist/dom/persistent/AbstractCharacterData.java</include>
742+
<include>src/main/java/org/exist/dom/persistent/CommentImpl.java</include>
733743
<include>src/main/java/org/exist/dom/persistent/DocumentImpl.java</include>
734744
<include>src/main/java/org/exist/dom/persistent/DocumentSet.java</include>
735745
<include>src/main/java/org/exist/dom/persistent/ElementImpl.java</include>
736746
<include>src/test/java/org/exist/dom/persistent/NodeTest.java</include>
737747
<include>src/main/java/org/exist/dom/persistent/SymbolTable.java</include>
748+
<include>src/main/java/org/exist/dom/persistent/TextImpl.java</include>
738749
<include>src/main/java/org/exist/dom/persistent/VirtualNodeSet.java</include>
739750
<include>src/main/java/org/exist/http/Descriptor.java</include>
740751
<include>src/main/java/org/exist/http/RESTServer.java</include>
@@ -771,6 +782,7 @@
771782
<include>src/main/java/org/exist/storage/NativeBroker.java</include>
772783
<include>src/main/java/org/exist/storage/lock/FileLock.java</include>
773784
<include>src/main/java/org/exist/storage/recovery/RecoveryManager.java</include>
785+
<include>src/main/java/org/exist/storage/serializers/Serializer.java</include>
774786
<include>src/main/java/org/exist/storage/sync/SyncTask.java</include>
775787
<include>src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java</include>
776788
<include>src/main/java/org/exist/test/runner/XMLTestRunner.java</include>
@@ -795,6 +807,7 @@
795807
<include>src/main/java/org/exist/xquery/functions/system/Shutdown.java</include>
796808
<include>src/main/java/org/exist/xquery/functions/system/TriggerSystemTask.java</include>
797809
<include>src/main/java/org/exist/xquery/functions/xmldb/XMLDBStore.java</include>
810+
<include>src/main/java/org/exist/xquery/functions/xmldb/XMLDBXUpdate.java</include>
798811
<include>src/main/java/org/exist/xquery/value/AbstractDateTimeValue.java</include>
799812
<include>src/main/java/org/exist/xquery/value/Type.java</include>
800813
<include>src/main/java/org/exist/xslt/EXistURIResolver.java</include>
@@ -878,11 +891,22 @@
878891
<exclude>src/main/java/org/exist/config/ConfigurationImpl.java</exclude>
879892
<exclude>src/main/java/org/exist/dom/memtree/DocumentImpl.java</exclude>
880893
<exclude>src/main/java/org/exist/dom/memtree/ElementImpl.java</exclude>
894+
<exclude>src/main/java/org/exist/dom/memtree/MemTreeBuilder.java</exclude>
895+
<exclude>src/main/java/org/exist/dom/memtree/NodeImpl.java</exclude>
896+
<exclude>src/main/java/org/exist/dom/memtree/reference/AbstractReferenceNodeImpl.java</exclude>
897+
<exclude>src/main/java/org/exist/dom/memtree/reference/AbstractReferenceCharacterData.java</exclude>
898+
<exclude>src/main/java/org/exist/dom/memtree/reference/AbstractReferenceNodeImpl.java</exclude>
899+
<exclude>src/main/java/org/exist/dom/memtree/reference/CommentReferenceImpl.java</exclude>
900+
<exclude>src/main/java/org/exist/dom/memtree/reference/ElementReferenceImpl.java</exclude>
901+
<exclude>src/main/java/org/exist/dom/memtree/reference/TextReferenceImpl.java</exclude>
902+
<exclude>src/main/java/org/exist/dom/persistent/AbstractCharacterData.java</exclude>
903+
<exclude>src/main/java/org/exist/dom/persistent/CommentImpl.java</exclude>
881904
<exclude>src/main/java/org/exist/dom/persistent/DocumentImpl.java</exclude>
882905
<exclude>src/main/java/org/exist/dom/persistent/DocumentSet.java</exclude>
883906
<exclude>src/main/java/org/exist/dom/persistent/ElementImpl.java</exclude>
884-
<include>src/test/java/org/exist/dom/persistent/NodeTest.java</include>
907+
<exclude>src/test/java/org/exist/dom/persistent/NodeTest.java</exclude>
885908
<exclude>src/main/java/org/exist/dom/persistent/SymbolTable.java</exclude>
909+
<exclude>src/main/java/org/exist/dom/persistent/TextImpl.java</exclude>
886910
<exclude>src/main/java/org/exist/dom/persistent/VirtualNodeSet.java</exclude>
887911
<exclude>src/main/java/org/exist/http/Descriptor.java</exclude>
888912
<exclude>src/main/java/org/exist/http/RESTServer.java</exclude>
@@ -920,6 +944,7 @@
920944
<exclude>src/main/java/org/exist/storage/NativeBroker.java</exclude>
921945
<exclude>src/main/java/org/exist/storage/lock/FileLock.java</exclude>
922946
<exclude>src/main/java/org/exist/storage/recovery/RecoveryManager.java</exclude>
947+
<exclude>src/main/java/org/exist/storage/serializers/Serializer.java</exclude>
923948
<exclude>src/main/java/org/exist/storage/sync/SyncTask.java</exclude>
924949
<exclude>src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java</exclude>
925950
<exclude>src/main/java/org/exist/test/runner/XMLTestRunner.java</exclude>
@@ -930,23 +955,28 @@
930955
<exclude>src/main/java/org/exist/util/Configuration.java</exclude>
931956
<exclude>src/main/java/org/exist/util/ParametersExtractor.java</exclude>
932957
<exclude>src/main/java/org/exist/util/crypto/digest/DigestType.java</exclude>
958+
<exclude>src/main/java/org/exist/util/serializer/DOMStreamer.java</exclude>
959+
<exclude>src/main/java/org/exist/util/serializer/SerializerObjectFactory.java</exclude>
933960
<exclude>src/main/java/org/exist/webstart/JnlpJarFiles.java</exclude>
934961
<exclude>src/main/java/org/exist/xmldb/RemoteRestoreService.java</exclude>
935962
<exclude>src/main/java/org/exist/xmlrpc/ExistRpcTypeFactory.java</exclude>
936963
<exclude>src/main/java/org/exist/xqj/Marshaller.java</exclude>
937964
<exclude>src/test/java/org/exist/xquery/ImportFromPkgTest.java</exclude>
965+
<exclude>src/main/java/org/exist/xquery/NameTest.java</exclude>
938966
<exclude>src/test/java/org/exist/xquery/WatchdogTest.java</exclude>
939967
<exclude>src/main/java/org/exist/xquery/functions/fn/FunUriCollection.java</exclude>
940968
<exclude>src/main/java/org/exist/xquery/functions/fn/FunXmlToJson.java</exclude>
941969
<exclude>src/test/java/org/exist/xquery/functions/fn/FunXmlToJsonTest.java</exclude>
942970
<exclude>src/main/java/org/exist/xquery/functions/fn/LoadXQueryModule.java</exclude>
943971
<exclude>src/main/java/org/exist/xquery/functions/fn/ParsingFunctions.java</exclude>
944972
<exclude>src/test/java/org/exist/xquery/functions/fn/ParsingFunctionsTest.java</exclude>
973+
<exclude>src/test/java/org/exist/xquery/functions/fn/transform/FunTransformITTest.java</exclude>
945974
<exclude>src/main/java/org/exist/xquery/functions/system/GetUptime.java</exclude>
946975
<exclude>src/main/java/org/exist/xquery/functions/system/Shutdown.java</exclude>
947976
<exclude>src/main/java/org/exist/xquery/functions/system/TriggerSystemTask.java</exclude>
948977
<exclude>src/main/java/org/exist/xquery/functions/xmldb/XMLDBStore.java</exclude>
949978
<exclude>src/test/java/org/exist/xquery/functions/xmldb/XMLDBStoreTest.java</exclude>
979+
<exclude>src/main/java/org/exist/xquery/functions/xmldb/XMLDBXUpdate.java</exclude>
950980
<exclude>src/main/java/org/exist/xquery/value/AbstractDateTimeValue.java</exclude>
951981
<exclude>src/test/java/org/exist/xquery/value/DateTimeTypesTest.java</exclude>
952982
<exclude>src/main/java/org/exist/xquery/value/Type.java</exclude>
@@ -1034,6 +1064,7 @@
10341064
<exclude>src/test/java/org/exist/xquery/ImportModuleTest.java</exclude>
10351065
<exclude>src/main/java/org/exist/xquery/Materializable.java</exclude>
10361066
<exclude>src/test/java/org/exist/xquery/XQueryContextAttributesTest.java</exclude>
1067+
<exclude>src/main/java/org/exist/xquery/functions/fn/FunDeepEqual.java</exclude>
10371068
<exclude>src/main/java/org/exist/xquery/functions/map/MapType.java</exclude>
10381069
<exclude>src/test/java/org/exist/xquery/functions/session/AbstractSessionTest.java</exclude>
10391070
<exclude>src/test/java/org/exist/xquery/functions/xmldb/AbstractXMLDBTest.java</exclude>

exist-core/src/main/java/org/exist/dom/memtree/DocumentImpl.java

Lines changed: 69 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,28 @@
11
/*
2+
* Elemental
3+
* Copyright (C) 2024, Evolved Binary Ltd
4+
*
5+
6+
* https://www.evolvedbinary.com | https://www.elemental.xyz
7+
*
8+
* This library is free software; you can redistribute it and/or
9+
* modify it under the terms of the GNU Lesser General Public
10+
* License as published by the Free Software Foundation; version 2.1.
11+
*
12+
* This library is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15+
* Lesser General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU Lesser General Public
18+
* License along with this library; if not, write to the Free Software
19+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20+
*
21+
* NOTE: Parts of this file contain code from 'The eXist-db Authors'.
22+
* The original license header is included below.
23+
*
24+
* =====================================================================
25+
*
226
* eXist-db Open Source Native XML Database
327
* Copyright (C) 2001 The eXist-db Authors
428
*
@@ -27,6 +51,9 @@
2751
import org.exist.dom.NodeListImpl;
2852
import org.exist.dom.QName;
2953
import org.exist.dom.QName.IllegalQNameException;
54+
import org.exist.dom.memtree.reference.CommentReferenceImpl;
55+
import org.exist.dom.memtree.reference.ElementReferenceImpl;
56+
import org.exist.dom.memtree.reference.TextReferenceImpl;
3057
import org.exist.dom.persistent.NodeProxy;
3158
import org.exist.numbering.NodeId;
3259
import org.exist.numbering.NodeIdFactory;
@@ -47,6 +74,7 @@
4774
import org.w3c.dom.*;
4875
import org.xml.sax.SAXException;
4976

77+
import javax.annotation.Nullable;
5078
import javax.xml.XMLConstants;
5179
import java.util.Arrays;
5280
import java.util.Objects;
@@ -222,11 +250,11 @@ public boolean isExplicitlyCreated() {
222250
return explicitlyCreated;
223251
}
224252

225-
public int addNode(final short kind, final short level, final QName qname) {
226-
if(nodeKind == null) {
253+
public int addNode(final short kind, final short level, @Nullable final QName qname) {
254+
if (nodeKind == null) {
227255
init();
228256
}
229-
if(size == nodeKind.length) {
257+
if (size == nodeKind.length) {
230258
grow();
231259
}
232260
nodeKind[size] = kind;
@@ -318,10 +346,10 @@ public void appendChars(final int nodeNum, final CharSequence s) {
318346
}
319347

320348
public void addReferenceNode(final int nodeNum, final NodeProxy proxy) {
321-
if(nodeKind == null) {
349+
if (nodeKind == null) {
322350
init();
323351
}
324-
if((references == null) || (nextReferenceIdx == references.length)) {
352+
if (references == null || nextReferenceIdx == references.length) {
325353
growReferences();
326354
}
327355
references[nextReferenceIdx] = proxy;
@@ -513,32 +541,61 @@ public NodeImpl getNamespaceNode(final int nodeNum) throws DOMException {
513541
}
514542

515543
public NodeImpl getNode(final int nodeNum) throws DOMException {
516-
if(nodeNum == 0) {
544+
if (nodeNum == 0) {
517545
return this;
518546
}
519-
if(nodeNum >= size) {
547+
548+
if (nodeNum >= size) {
520549
throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, "node not found");
521550
}
522-
final NodeImpl node;
523-
switch(nodeKind[nodeNum]) {
551+
552+
final NodeImpl<?> node;
553+
switch (nodeKind[nodeNum]) {
524554
case Node.ELEMENT_NODE:
525555
node = new ElementImpl(getExpression(), this, nodeNum);
526556
break;
557+
527558
case Node.TEXT_NODE:
528559
node = new TextImpl(getExpression(), this, nodeNum);
529560
break;
561+
530562
case Node.COMMENT_NODE:
531563
node = new CommentImpl(getExpression(), this, nodeNum);
532564
break;
565+
533566
case Node.PROCESSING_INSTRUCTION_NODE:
534567
node = new ProcessingInstructionImpl(getExpression(), this, nodeNum);
535568
break;
569+
536570
case Node.CDATA_SECTION_NODE:
537571
node = new CDATASectionImpl(getExpression(), this, nodeNum);
538572
break;
573+
539574
case NodeImpl.REFERENCE_NODE:
540-
node = new ReferenceNode(getExpression(), this, nodeNum);
575+
final NodeProxy nodeProxy = references[alpha[nodeNum]];
576+
switch (nodeProxy.getNodeType()) {
577+
case Node.DOCUMENT_NODE:
578+
final NodeProxy documentElementProxy = new NodeProxy(nodeProxy.getExpression(), nodeProxy.getDoc(), NodeId.ROOT_NODE, Node.ELEMENT_NODE, nodeProxy.getInternalAddress());
579+
node = new ElementReferenceImpl(getExpression(), this, nodeNum, documentElementProxy);
580+
break;
581+
582+
case Node.ELEMENT_NODE:
583+
node = new ElementReferenceImpl(getExpression(), this, nodeNum, nodeProxy);
584+
break;
585+
586+
case Node.COMMENT_NODE:
587+
node = new CommentReferenceImpl(getExpression(), this, nodeNum, nodeProxy);
588+
break;
589+
590+
case Node.TEXT_NODE:
591+
node = new TextReferenceImpl(getExpression(), this, nodeNum, nodeProxy);
592+
break;
593+
594+
default:
595+
throw new DOMException(DOMException.NOT_FOUND_ERR, "reference node not found");
596+
}
541597
break;
598+
542599
default:
543600
throw new DOMException(DOMException.NOT_FOUND_ERR, "node not found");
544601
}
@@ -1105,13 +1162,7 @@ protected void copyTo(NodeImpl node, final DocumentBuilderReceiver receiver, fin
11051162
final NodeImpl top = node;
11061163
while(node != null) {
11071164
copyStartNode(node, receiver, expandRefs);
1108-
NodeImpl nextNode;
1109-
if(node instanceof ReferenceNode) {
1110-
//Nothing more to stream ?
1111-
nextNode = null;
1112-
} else {
1113-
nextNode = (NodeImpl) node.getFirstChild();
1114-
}
1165+
@Nullable NodeImpl nextNode = (NodeImpl) node.getFirstChild();
11151166
while(nextNode == null) {
11161167
if (node != null) {
11171168
copyEndNode(node, receiver);
@@ -1349,13 +1400,7 @@ public void streamTo(final Serializer serializer, NodeImpl node, final Receiver
13491400
final NodeImpl top = node;
13501401
while(node != null) {
13511402
startNode(serializer, node, receiver);
1352-
NodeImpl nextNode;
1353-
if(node instanceof ReferenceNode) {
1354-
//Nothing more to stream ?
1355-
nextNode = null;
1356-
} else {
1357-
nextNode = (NodeImpl) node.getFirstChild();
1358-
}
1403+
@Nullable NodeImpl nextNode = (NodeImpl) node.getFirstChild();
13591404
while(nextNode == null) {
13601405
endNode(node, receiver);
13611406
if((top != null) && (top.nodeNumber == node.nodeNumber)) {

0 commit comments

Comments
 (0)