This is an automated email from the ASF dual-hosted git repository.
reschke pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git
The following commit(s) were added to refs/heads/trunk by this push:
new 437274b9ce OAK-11783: DocViewImport fails for content not using
namespace prefixes (#2361)
437274b9ce is described below
commit 437274b9cefda88adfae1d14e4509dd6462fe2bb
Author: Julian Reschke <[email protected]>
AuthorDate: Mon Jul 28 13:43:34 2025 +0200
OAK-11783: DocViewImport fails for content not using namespace prefixes
(#2361)
* OAK-11783: DocViewImport fails for content not using namespace prefixes -
test cases
* OAK-11783: Import fails for content not using namespace prefixes
Fixed it and added a test case.
* OAK-11783: Import fails for content not using namespace prefixes
Improved test cases.
---------
Co-authored-by: Manfred Baedke <[email protected]>
---
.../oak/jcr/xml/TargetImportHandler.java | 21 ++---
.../apache/jackrabbit/oak/jcr/RepositoryTest.java | 98 +++++++++++++++++++++-
2 files changed, 105 insertions(+), 14 deletions(-)
diff --git
a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/xml/TargetImportHandler.java
b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/xml/TargetImportHandler.java
index 16d8eee75d..7cf4e17658 100644
---
a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/xml/TargetImportHandler.java
+++
b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/xml/TargetImportHandler.java
@@ -136,7 +136,7 @@ public abstract class TargetImportHandler extends
DefaultHandler {
NameInfo(String docQualifiedName) throws RepositoryException {
int idx = docQualifiedName.indexOf(':');
if (idx == -1) {
- docPrefix = null;
+ docPrefix = "";
localName = docQualifiedName;
} else {
String[] splits = docQualifiedName.split(":", 2);
@@ -153,19 +153,14 @@ public abstract class TargetImportHandler extends
DefaultHandler {
}
private void init() throws RepositoryException {
- if (docPrefix == null) {
- namespaceUri = "";
- repoPrefix = null;
+ Tree rootTree =
sessionContext.getSessionDelegate().getRoot().getTree("/");
+ List<String> uris = documentContext.get(docPrefix);
+ if (uris.isEmpty()) {
+ namespaceUri = Namespaces.getNamespaceURI(rootTree, docPrefix);
+ repoPrefix = docPrefix;
} else {
- List<String> uris = documentContext.get(docPrefix);
- Tree tree =
sessionContext.getSessionDelegate().getRoot().getTree("/");
- if (uris.isEmpty()) {
- namespaceUri = Namespaces.getNamespaceURI(tree, docPrefix);
- repoPrefix = docPrefix;
- } else {
- namespaceUri = uris.get(uris.size() - 1);
- repoPrefix = Namespaces.getNamespacePrefix(tree,
namespaceUri);
- }
+ namespaceUri = uris.get(uris.size() - 1);
+ repoPrefix = Namespaces.getNamespacePrefix(rootTree,
namespaceUri);
}
}
diff --git
a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
index e9203a1a0a..58a06d4e64 100644
--- a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
+++ b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
@@ -25,6 +25,7 @@ import static
org.apache.jackrabbit.commons.JcrUtils.getChildNodes;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
@@ -38,6 +39,7 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.math.BigDecimal;
+import java.nio.charset.StandardCharsets;
import java.security.Principal;
import java.util.ArrayList;
import java.util.Arrays;
@@ -48,6 +50,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.UUID;
import java.util.stream.Collectors;
import javax.jcr.Binary;
@@ -2287,7 +2290,7 @@ public class RepositoryTest extends
AbstractRepositoryTest {
Node node = session.getRootNode().addNode("node", "fooType");
node.setProperty("fooProp", "fooValue");
session.save();
-
+
ByteArrayOutputStream out = new ByteArrayOutputStream();
session.exportDocumentView("/node", out, true, false);
node.remove();
@@ -2299,6 +2302,99 @@ public class RepositoryTest extends
AbstractRepositoryTest {
assertEquals("fooValue",
session.getProperty("/node/fooProp").getString());
}
+ private void internalShadedNamespaceMappingsInImport(String xml, String
ns1, String ns2) throws Exception {
+ Session session = getAdminSession();
+ session.getWorkspace().importXML(
+ "/", new
ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)) ,
IMPORT_UUID_CREATE_NEW);
+ session.save();
+
+ String pref1 = session.getNamespacePrefix(ns1);
+ String pref2 = session.getNamespacePrefix(ns2);
+ assertNotEquals("prefixes should be different - " + pref1 + " vs " +
pref2, pref1, pref2);
+
+ Node nPrefFoo = session.getNode("/" + pref1 + ":foo");
+ Node nExpFoo = session.getNode("/{" + ns1 + "}foo");
+ assertTrue(nPrefFoo.isSame(nExpFoo));
+
+ Node nPrefQux = nPrefFoo.getNode(pref2 + ":qux");
+ Node nExpQux = nExpFoo.getNode("{" + ns2 + "}qux");
+ assertTrue(nPrefQux.isSame(nExpQux));
+
+ Node nPrefXyz = nPrefQux.getNode(pref1 + ":xyz");
+ Node nExpXyz = nExpQux.getNode("{" + ns1 + "}xyz");
+ assertTrue(nPrefXyz.isSame(nExpXyz));
+
+ Node nPrefBar = nPrefFoo.getNode( pref1 + ":" + "bar");
+ Node nExpBar = nExpFoo.getNode("{" + ns1 + "}bar");
+ assertTrue(nPrefBar.isSame(nExpBar));
+ }
+
+ // tests import with namespace prefixes re-used for different namespace
names
+ @Test
+ public void reusedNameSpacePrefixesInDocViewImport() throws Exception {
+ String ns1 = "urn:uuid:" + UUID.randomUUID();
+ String ns2 = "urn:uuid:" + UUID.randomUUID();
+
+ String docView =
+ "<a:foo xmlns:a=\"" + ns1 + "\">" +
+ " <a:qux xmlns:a=\"" + ns2 + "\">" +
+ " <a:xyz xmlns:a=\"" + ns1 + "\"/>" +
+ " </a:qux>" +
+ " <a:bar/>" +
+ "</a:foo>";
+ String sysView =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
+ "<sv:node xmlns:nt=\"http://www.jcp.org/jcr/nt/1.0\"" +
+ " xmlns:sv=\"http://www.jcp.org/jcr/sv/1.0\"" +
+ " xmlns:jcr=\"http://www.jcp.org/jcr/1.0\"" +
+ " xmlns:a=\"" + ns1 + "\"" +
+ " sv:name=\"a:foo\">" +
+ " <sv:property sv:name=\"jcr:primaryType\"
sv:type=\"Name\">" +
+ " <sv:value>nt:unstructured</sv:value>" +
+ " </sv:property>" +
+ " <sv:node xmlns:a=\"" + ns2 + "\" sv:name=\"a:qux\">" +
+ " <sv:node xmlns:a=\"" + ns1 + "\" sv:name=\"a:xyz\"/>"
+
+ " </sv:node>" +
+ " <sv:node sv:name=\"a:bar\"/>" +
+ "</sv:node>";
+
+ internalShadedNamespaceMappingsInImport(docView, ns1, ns2);
+ internalShadedNamespaceMappingsInImport(sysView, ns1, ns2);
+ }
+
+ // tests import with no namespace prefixes
+ @Test
+ public void noNameSpacePrefixesInImport() throws Exception {
+ String ns1 = "urn:uuid:" + UUID.randomUUID();
+ String ns2 = "urn:uuid:" + UUID.randomUUID();
+
+ String docView =
+ "<foo xmlns=\"" + ns1 + "\">" +
+ " <qux xmlns=\"" + ns2 + "\">" +
+ " <xyz xmlns=\"" + ns1 + "\"/>" +
+ " </qux>" +
+ " <bar/>" +
+ "</foo>";
+ String sysView =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
+ "<sv:node xmlns:nt=\"http://www.jcp.org/jcr/nt/1.0\"" +
+ " xmlns:sv=\"http://www.jcp.org/jcr/sv/1.0\"" +
+ " xmlns:jcr=\"http://www.jcp.org/jcr/1.0\"" +
+ " xmlns=\"" + ns1 + "\"" +
+ " sv:name=\"foo\">" +
+ " <sv:property sv:name=\"jcr:primaryType\"
sv:type=\"Name\">" +
+ " <sv:value>nt:unstructured</sv:value>" +
+ " </sv:property>" +
+ " <sv:node xmlns=\"" + ns2 + "\" sv:name=\"qux\">" +
+ " <sv:node xmlns=\"" + ns1 + "\"
sv:name=\"xyz\"/>" +
+ " </sv:node>" +
+ " <sv:node sv:name=\"bar\"/>" +
+ "</sv:node>";
+
+ internalShadedNamespaceMappingsInImport(docView, ns1, ns2);
+ internalShadedNamespaceMappingsInImport(sysView, ns1, ns2);
+ }
+
@Test
public void largeMultiValueProperty() throws Exception{
final List<String> logMessages = new ArrayList<>();