You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2018/02/05 02:51:40 UTC

svn commit: r1823118 - in /jackrabbit/commons/filevault/trunk/vault-core/src: main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXFormatter.java test/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSaxFormatterTest.java

Author: tripod
Date: Mon Feb  5 02:51:40 2018
New Revision: 1823118

URL: http://svn.apache.org/viewvc?rev=1823118&view=rev
Log:
JCRVLT-266 DocViewSaxFormatter does not always emit namespace declaration for "jcr"

this closes #22

Added:
    jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSaxFormatterTest.java
Modified:
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXFormatter.java

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXFormatter.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXFormatter.java?rev=1823118&r1=1823117&r2=1823118&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXFormatter.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXFormatter.java Mon Feb  5 02:51:40 2018
@@ -150,14 +150,18 @@ public class DocViewSAXFormatter impleme
      * @throws RepositoryException if a repository error occurs
      * @throws SAXException if the underlying content handler throws a sax exception
      */
-    protected void startNamespaceDeclarations()
-            throws RepositoryException, SAXException {
-        // start namespace declarations
+    private void startNamespaceDeclarations() throws RepositoryException, SAXException {
+        // always include jcr namespace (see JCRVLT-266)
+        contentHandler.startPrefixMapping(Name.NS_JCR_PREFIX, Name.NS_JCR_URI);
+
         for (String prefix: aggregate.getNamespacePrefixes()) {
             if (Name.NS_XML_PREFIX.equals(prefix)) {
                 // skip 'xml' prefix as this would be an illegal namespace declaration
                 continue;
             }
+            if (Name.NS_JCR_PREFIX.equals(prefix)) {
+                continue;
+            }
             contentHandler.startPrefixMapping(prefix, aggregate.getNamespaceURI(prefix));
         }
     }
@@ -168,14 +172,18 @@ public class DocViewSAXFormatter impleme
      * @throws RepositoryException if a repository error occurs
      * @throws SAXException if the underlying content handler throws a sax exception
       */
-    protected void endNamespaceDeclarations()
-            throws RepositoryException, SAXException {
-        // end namespace declarations
+    private void endNamespaceDeclarations() throws RepositoryException, SAXException {
+        // always include jcr namespace (see JCRVLT-266)
+        contentHandler.endPrefixMapping(Name.NS_JCR_PREFIX);
+
         for (String prefix: aggregate.getNamespacePrefixes()) {
             if (Name.NS_XML_PREFIX.equals(prefix)) {
                 // skip 'xml' prefix as this would be an illegal namespace declaration
                 continue;
             }
+            if (Name.NS_JCR_PREFIX.equals(prefix)) {
+                continue;
+            }
             contentHandler.endPrefixMapping(prefix);
         }
     }

Added: jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSaxFormatterTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSaxFormatterTest.java?rev=1823118&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSaxFormatterTest.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSaxFormatterTest.java Mon Feb  5 02:51:40 2018
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.vault.fs.impl.io;
+
+import java.io.ByteArrayOutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jcr.GuestCredentials;
+import javax.jcr.PropertyType;
+import javax.jcr.Session;
+import javax.jcr.Value;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.security.AccessControlManager;
+import javax.jcr.security.Privilege;
+
+import org.apache.jackrabbit.api.security.JackrabbitAccessControlList;
+import org.apache.jackrabbit.commons.JcrUtils;
+import org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
+import org.apache.jackrabbit.core.security.principal.EveryonePrincipal;
+import org.apache.jackrabbit.vault.fs.Mounter;
+import org.apache.jackrabbit.vault.fs.api.Aggregate;
+import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
+import org.apache.jackrabbit.vault.fs.api.RepositoryAddress;
+import org.apache.jackrabbit.vault.fs.api.VaultFileSystem;
+import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter;
+import org.apache.jackrabbit.vault.packaging.integration.IntegrationTestBase;
+import org.junit.Assume;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class DocViewSaxFormatterTest extends IntegrationTestBase {
+
+
+    /**
+     * Tests if an 'empty' node serialization includes the jcr namespace. see JCRVLT-266
+     */
+    @Test
+    public void testFormatterIncludesJcrNamespace() throws Exception {
+        // rep:itemNames restrictions are only supported in oak.
+        Assume.assumeTrue(isOak());
+
+        JcrUtils.getOrCreateByPath("/testroot", NodeType.NT_UNSTRUCTURED, admin);
+        admin.save();
+
+        // setup access control
+        AccessControlManager acMgr = admin.getAccessControlManager();
+        JackrabbitAccessControlList acl = AccessControlUtils.getAccessControlList(acMgr, "/testroot");
+
+        Privilege[] privs = new Privilege[]{acMgr.privilegeFromName(Privilege.JCR_READ)};
+        Map<String, Value[]> rest = new HashMap<>();
+        rest.put("rep:itemNames", new Value[]{
+                admin.getValueFactory().createValue("jcr:mixinTypes", PropertyType.NAME),
+                admin.getValueFactory().createValue("jcr:primaryType", PropertyType.NAME)
+        });
+        acl.addEntry(EveryonePrincipal.getInstance(), privs, false, null, rest);
+        acMgr.setPolicy("/testroot", acl);
+        admin.save();
+
+        Session guest = repository.login(new GuestCredentials());
+
+        DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
+        filter.add(new PathFilterSet("/testroot"));
+        RepositoryAddress addr = new RepositoryAddress("/" + admin.getWorkspace().getName() + "/");
+        VaultFileSystem jcrfs = Mounter.mount(null, filter, addr, null, guest);
+        Aggregate a = jcrfs.getAggregateManager().getRoot().getAggregate("testroot");
+        DocViewSerializer s = new DocViewSerializer(a);
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        s.writeContent(out);
+
+        assertEquals("valid xml",
+                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+                "<jcr:root xmlns:jcr=\"http://www.jcp.org/jcr/1.0\"/>\n", out.toString("utf-8"));
+    }
+
+    /**
+     * Tests minimal serialization
+     */
+    @Test
+    public void testMinimalSerialization() throws Exception {
+        JcrUtils.getOrCreateByPath("/testroot", NodeType.NT_UNSTRUCTURED, admin);
+        admin.save();
+
+        DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
+        filter.add(new PathFilterSet("/testroot"));
+        RepositoryAddress addr = new RepositoryAddress("/" + admin.getWorkspace().getName() + "/");
+        VaultFileSystem jcrfs = Mounter.mount(null, filter, addr, null, admin);
+        Aggregate a = jcrfs.getAggregateManager().getRoot().getAggregate("testroot");
+        DocViewSerializer s = new DocViewSerializer(a);
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        s.writeContent(out);
+
+        assertEquals("valid xml",
+                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+                "<jcr:root xmlns:jcr=\"http://www.jcp.org/jcr/1.0\" xmlns:nt=\"http://www.jcp.org/jcr/nt/1.0\"\n" +
+                "    jcr:primaryType=\"nt:unstructured\"/>\n", out.toString("utf-8"));
+    }
+
+}