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<>();

Reply via email to