You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2023/02/13 15:14:53 UTC

[jackrabbit-filevault] branch JCRVLT-684 updated: JCRVLT-684: test coverage and fix for bug in mixin restoration

This is an automated email from the ASF dual-hosted git repository.

reschke pushed a commit to branch JCRVLT-684
in repository https://gitbox.apache.org/repos/asf/jackrabbit-filevault.git


The following commit(s) were added to refs/heads/JCRVLT-684 by this push:
     new a9146faa JCRVLT-684: test coverage and fix for bug in mixin restoration
a9146faa is described below

commit a9146faa35ef8e6efa4ef586cbc3b7cfd21b9c44
Author: Julian Reschke <ju...@gmx.de>
AuthorDate: Mon Feb 13 16:14:39 2023 +0100

    JCRVLT-684: test coverage and fix for bug in mixin restoration
---
 .../jackrabbit/vault/fs/impl/io/NodeStash.java     |  2 +-
 .../packaging/integration/NodeStashingIT.java      | 69 +++++++++++++++++
 .../stashing.zip/META-INF/vault/config.xml         | 86 ++++++++++++++++++++++
 .../META-INF/vault/definition/.content.xml         | 25 +++++++
 .../stashing.zip/META-INF/vault/filter.xml         |  3 +
 .../stashing.zip/META-INF/vault/nodetypes.cnd      |  7 ++
 .../stashing.zip/META-INF/vault/properties.xml     | 18 +++++
 .../stashing.zip/jcr_root/.content.xml             |  4 +
 .../stashing.zip/jcr_root/tmp/.content.xml         | 13 ++++
 .../stashing2.zip/META-INF/vault/config.xml        | 86 ++++++++++++++++++++++
 .../META-INF/vault/definition/.content.xml         | 25 +++++++
 .../stashing2.zip/META-INF/vault/filter.xml        |  3 +
 .../stashing2.zip/META-INF/vault/nodetypes.cnd     |  7 ++
 .../stashing2.zip/META-INF/vault/properties.xml    | 18 +++++
 .../stashing2.zip/jcr_root/.content.xml            |  4 +
 .../stashing2.zip/jcr_root/tmp/.content.xml        | 12 +++
 16 files changed, 381 insertions(+), 1 deletion(-)

diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/NodeStash.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/NodeStash.java
index 2028c9b0..f0b265fd 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/NodeStash.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/NodeStash.java
@@ -212,7 +212,7 @@ public class NodeStash {
         Property mixinProperty = tmpNode.hasProperty(JcrConstants.JCR_MIXINTYPES + PROTECTED_PROPERTIES_SUFFIX) ? tmpNode.getProperty(JcrConstants.JCR_MIXINTYPES + PROTECTED_PROPERTIES_SUFFIX) : null;
         if (mixinProperty != null) {
             for (Value value : mixinProperty.getValues()) {
-                tmpNode.addMixin(value.getString());
+                destNode.addMixin(value.getString());
             }
         }
         PropertyIterator propIterator = tmpNode.getProperties();
diff --git a/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/NodeStashingIT.java b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/NodeStashingIT.java
new file mode 100644
index 00000000..3abfd45a
--- /dev/null
+++ b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/NodeStashingIT.java
@@ -0,0 +1,69 @@
+/*
+ * 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.packaging.integration;
+
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.apache.jackrabbit.vault.fs.api.ImportMode;
+import org.apache.jackrabbit.vault.fs.io.ImportOptions;
+import org.apache.jackrabbit.vault.packaging.PackageException;
+import org.junit.Test;
+
+public class NodeStashingIT extends IntegrationTestBase {
+
+    private static final String TESTNS = "https://issues.apache.org/jira/browse/JCRVLT-684";
+
+    @Test
+    public void testStashMixinMandatoryChildNode() throws RepositoryException, IOException, PackageException {
+
+        ImportOptions options = getDefaultOptions();
+        options.setImportMode(ImportMode.MERGE_PROPERTIES);
+
+        extractVaultPackage("/test-packages/stashing.zip", options);
+
+        assertNodeExists("/tmp/stash");
+        assertNodeExists("/tmp/stash/{" + TESTNS + "}mandatoryChildNode");
+
+        Node node1 = admin.getNode("/tmp/stash");
+        String id1 = node1.getIdentifier();
+        assertTrue(node1.isNodeType("{" + TESTNS + "}noChildNodes"));
+        assertTrue(node1.isNodeType("{" + TESTNS + "}hasMandatoryChildNode"));
+
+        // import same path but without mixin allowing child nodes
+        extractVaultPackage("/test-packages/stashing2.zip", options);
+
+        // child node should be retained
+        assertNodeExists("/tmp/stash");
+        assertNodeExists("/tmp/stash/{" + TESTNS + "}mandatoryChildNode");
+
+        Node node2 = admin.getNode("/tmp/stash");
+        String id2 = node2.getIdentifier();
+
+        // make sure it's really the new node
+        assertNotEquals("imported node should have different identifier", id1, id2);
+
+        // make sure mixin type was restored
+        assertTrue(node2.isNodeType("{" + TESTNS + "}hasMandatoryChildNode"));
+    }
+}
\ No newline at end of file
diff --git a/vault-core/src/test/resources/test-packages/stashing.zip/META-INF/vault/config.xml b/vault-core/src/test/resources/test-packages/stashing.zip/META-INF/vault/config.xml
new file mode 100644
index 00000000..9befeacc
--- /dev/null
+++ b/vault-core/src/test/resources/test-packages/stashing.zip/META-INF/vault/config.xml
@@ -0,0 +1,86 @@
+<!--
+  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.
+  -->
+<vaultfs version="1.1">
+    <!--
+        Defines the content aggregation. The order of the defined aggregates
+        is important for finding the correct aggregator.
+    -->
+    <aggregates>
+        <!--
+            Defines an aggregate that handles nt:file and nt:resource nodes.
+        -->
+        <aggregate type="file" title="File Aggregate"/>
+
+        <!--
+            Defines an aggregate that handles file/folder like nodes. It matches
+            all nt:hierarchyNode nodes that have or define a jcr:content
+            child node and excludes child nodes that are nt:hierarchyNodes.
+        -->
+        <aggregate type="filefolder" title="File/Folder Aggregate"/>
+
+        <!--
+            Defines an aggregate that handles nt:nodeType nodes and serializes
+            them into .cnd notation.
+        -->
+        <aggregate type="nodetype" title="Node Type Aggregate" />
+
+        <!--
+            Defines an aggregate that defines full coverage for certain node
+            types that cannot be covered by the default aggregator.
+        -->
+        <aggregate type="full" title="Full Coverage Aggregate">
+            <matches>
+                <include nodeType="teststash:hasMandatoryChildNode" respectSupertype="true" />
+            </matches>
+        </aggregate>
+
+        <!--
+            Defines an aggregate that handles nt:folder like nodes.
+        -->
+        <aggregate type="generic" title="Folder Aggregate">
+            <matches>
+                <include nodeType="nt:folder" respectSupertype="true" />
+            </matches>
+            <contains>
+                <exclude isNode="true" />
+            </contains>
+        </aggregate>
+
+        <!--
+            Defines the default aggregate
+        -->
+        <aggregate type="generic" title="Default Aggregator" isDefault="true">
+            <matches>
+                <!-- all -->
+            </matches>
+            <contains>
+                <exclude nodeType="nt:hierarchyNode" respectSupertype="true" />
+            </contains>
+        </aggregate>
+
+    </aggregates>
+
+    <!--
+      defines the input handlers
+    -->
+    <handlers>
+        <handler type="folder"/>
+        <handler type="file"/>
+        <handler type="nodetype"/>
+        <handler type="generic"/>
+    </handlers>
+</vaultfs>
diff --git a/vault-core/src/test/resources/test-packages/stashing.zip/META-INF/vault/definition/.content.xml b/vault-core/src/test/resources/test-packages/stashing.zip/META-INF/vault/definition/.content.xml
new file mode 100644
index 00000000..9732fc59
--- /dev/null
+++ b/vault-core/src/test/resources/test-packages/stashing.zip/META-INF/vault/definition/.content.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jcr:root xmlns:vlt="http://www.day.com/jcr/vault/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
+    jcr:created="{Date}2015-12-16T16:59:10.779+01:00"
+    jcr:createdBy="admin"
+    jcr:description=""
+    jcr:lastModified="{Date}2015-12-16T16:59:10.779+01:00"
+    jcr:lastModifiedBy="admin"
+    jcr:primaryType="vlt:PackageDefinition"
+    buildCount="5"
+    builtWith="Adobe Experience Manager-6.1.0.20150507"
+    group="my_packages"
+    lastUnwrapped="{Date}2015-12-16T16:59:10.779+01:00"
+    lastUnwrappedBy="admin"
+    lastWrapped="{Date}2015-12-16T16:59:10.779+01:00"
+    lastWrappedBy="admin"
+    name="test_stas"
+    version="">
+    <filter jcr:primaryType="nt:unstructured">
+        <f0
+            jcr:primaryType="nt:unstructured"
+            mode="replace"
+            root="/tmp"
+            rules="[]"/>
+    </filter>
+</jcr:root>
diff --git a/vault-core/src/test/resources/test-packages/stashing.zip/META-INF/vault/filter.xml b/vault-core/src/test/resources/test-packages/stashing.zip/META-INF/vault/filter.xml
new file mode 100644
index 00000000..922561df
--- /dev/null
+++ b/vault-core/src/test/resources/test-packages/stashing.zip/META-INF/vault/filter.xml
@@ -0,0 +1,3 @@
+<workspaceFilter version="1.0">
+    <filter root="/tmp/stash"/>
+</workspaceFilter>
diff --git a/vault-core/src/test/resources/test-packages/stashing.zip/META-INF/vault/nodetypes.cnd b/vault-core/src/test/resources/test-packages/stashing.zip/META-INF/vault/nodetypes.cnd
new file mode 100644
index 00000000..fef66ef3
--- /dev/null
+++ b/vault-core/src/test/resources/test-packages/stashing.zip/META-INF/vault/nodetypes.cnd
@@ -0,0 +1,7 @@
+<'teststash'='https://issues.apache.org/jira/browse/JCRVLT-684'>
+
+[teststash:noChildNodes]
+
+[teststash:hasMandatoryChildNode]
+  mixin
+  + teststash:mandatoryChildNode mandatory
diff --git a/vault-core/src/test/resources/test-packages/stashing.zip/META-INF/vault/properties.xml b/vault-core/src/test/resources/test-packages/stashing.zip/META-INF/vault/properties.xml
new file mode 100644
index 00000000..2494f50c
--- /dev/null
+++ b/vault-core/src/test/resources/test-packages/stashing.zip/META-INF/vault/properties.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
+<properties>
+<comment>FileVault Package Properties</comment>
+<entry key="createdBy">admin</entry>
+<entry key="name">test_referenceable</entry>
+<entry key="lastModified">2015-12-16T16:59:10.779+01:00</entry>
+<entry key="lastModifiedBy">admin</entry>
+<entry key="created">2015-12-16T16:59:10.795+01:00</entry>
+<entry key="buildCount">5</entry>
+<entry key="version"/>
+<entry key="dependencies"/>
+<entry key="packageFormatVersion">2</entry>
+<entry key="description"/>
+<entry key="lastWrapped">2015-12-16T16:59:10.779+01:00</entry>
+<entry key="group">my_packages</entry>
+<entry key="lastWrappedBy">admin</entry>
+</properties>
diff --git a/vault-core/src/test/resources/test-packages/stashing.zip/jcr_root/.content.xml b/vault-core/src/test/resources/test-packages/stashing.zip/jcr_root/.content.xml
new file mode 100644
index 00000000..4f8ba9aa
--- /dev/null
+++ b/vault-core/src/test/resources/test-packages/stashing.zip/jcr_root/.content.xml
@@ -0,0 +1,4 @@
+<jcr:root
+  xmlns:jcr="http://www.jcp.org/jcr/1.0"
+  xmlns:rep="internal"
+  jcr:primaryType="rep:root"/>
diff --git a/vault-core/src/test/resources/test-packages/stashing.zip/jcr_root/tmp/.content.xml b/vault-core/src/test/resources/test-packages/stashing.zip/jcr_root/tmp/.content.xml
new file mode 100644
index 00000000..e4a57936
--- /dev/null
+++ b/vault-core/src/test/resources/test-packages/stashing.zip/jcr_root/tmp/.content.xml
@@ -0,0 +1,13 @@
+<jcr:root
+  xmlns:jcr="http://www.jcp.org/jcr/1.0"
+  xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
+  xmlns:mix="http://www.jcp.org/jcr/mix/1.0"
+  xmlns:teststash="https://issues.apache.org/jira/browse/JCRVLT-684"
+  jcr:primaryType="nt:unstructured">
+  <stash
+    jcr:primaryType="teststash:noChildNodes"
+    jcr:mixinTypes="[mix:referenceable,teststash:hasMandatoryChildNode]"
+    jcr:uuid="c842f252-ab9c-11ed-9e53-00155d01040e">
+    <teststash:mandatoryChildNode jcr:primaryType="nt:unstructured"/>
+  </stash>
+</jcr:root>
diff --git a/vault-core/src/test/resources/test-packages/stashing2.zip/META-INF/vault/config.xml b/vault-core/src/test/resources/test-packages/stashing2.zip/META-INF/vault/config.xml
new file mode 100644
index 00000000..9befeacc
--- /dev/null
+++ b/vault-core/src/test/resources/test-packages/stashing2.zip/META-INF/vault/config.xml
@@ -0,0 +1,86 @@
+<!--
+  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.
+  -->
+<vaultfs version="1.1">
+    <!--
+        Defines the content aggregation. The order of the defined aggregates
+        is important for finding the correct aggregator.
+    -->
+    <aggregates>
+        <!--
+            Defines an aggregate that handles nt:file and nt:resource nodes.
+        -->
+        <aggregate type="file" title="File Aggregate"/>
+
+        <!--
+            Defines an aggregate that handles file/folder like nodes. It matches
+            all nt:hierarchyNode nodes that have or define a jcr:content
+            child node and excludes child nodes that are nt:hierarchyNodes.
+        -->
+        <aggregate type="filefolder" title="File/Folder Aggregate"/>
+
+        <!--
+            Defines an aggregate that handles nt:nodeType nodes and serializes
+            them into .cnd notation.
+        -->
+        <aggregate type="nodetype" title="Node Type Aggregate" />
+
+        <!--
+            Defines an aggregate that defines full coverage for certain node
+            types that cannot be covered by the default aggregator.
+        -->
+        <aggregate type="full" title="Full Coverage Aggregate">
+            <matches>
+                <include nodeType="teststash:hasMandatoryChildNode" respectSupertype="true" />
+            </matches>
+        </aggregate>
+
+        <!--
+            Defines an aggregate that handles nt:folder like nodes.
+        -->
+        <aggregate type="generic" title="Folder Aggregate">
+            <matches>
+                <include nodeType="nt:folder" respectSupertype="true" />
+            </matches>
+            <contains>
+                <exclude isNode="true" />
+            </contains>
+        </aggregate>
+
+        <!--
+            Defines the default aggregate
+        -->
+        <aggregate type="generic" title="Default Aggregator" isDefault="true">
+            <matches>
+                <!-- all -->
+            </matches>
+            <contains>
+                <exclude nodeType="nt:hierarchyNode" respectSupertype="true" />
+            </contains>
+        </aggregate>
+
+    </aggregates>
+
+    <!--
+      defines the input handlers
+    -->
+    <handlers>
+        <handler type="folder"/>
+        <handler type="file"/>
+        <handler type="nodetype"/>
+        <handler type="generic"/>
+    </handlers>
+</vaultfs>
diff --git a/vault-core/src/test/resources/test-packages/stashing2.zip/META-INF/vault/definition/.content.xml b/vault-core/src/test/resources/test-packages/stashing2.zip/META-INF/vault/definition/.content.xml
new file mode 100644
index 00000000..9732fc59
--- /dev/null
+++ b/vault-core/src/test/resources/test-packages/stashing2.zip/META-INF/vault/definition/.content.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jcr:root xmlns:vlt="http://www.day.com/jcr/vault/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
+    jcr:created="{Date}2015-12-16T16:59:10.779+01:00"
+    jcr:createdBy="admin"
+    jcr:description=""
+    jcr:lastModified="{Date}2015-12-16T16:59:10.779+01:00"
+    jcr:lastModifiedBy="admin"
+    jcr:primaryType="vlt:PackageDefinition"
+    buildCount="5"
+    builtWith="Adobe Experience Manager-6.1.0.20150507"
+    group="my_packages"
+    lastUnwrapped="{Date}2015-12-16T16:59:10.779+01:00"
+    lastUnwrappedBy="admin"
+    lastWrapped="{Date}2015-12-16T16:59:10.779+01:00"
+    lastWrappedBy="admin"
+    name="test_stas"
+    version="">
+    <filter jcr:primaryType="nt:unstructured">
+        <f0
+            jcr:primaryType="nt:unstructured"
+            mode="replace"
+            root="/tmp"
+            rules="[]"/>
+    </filter>
+</jcr:root>
diff --git a/vault-core/src/test/resources/test-packages/stashing2.zip/META-INF/vault/filter.xml b/vault-core/src/test/resources/test-packages/stashing2.zip/META-INF/vault/filter.xml
new file mode 100644
index 00000000..922561df
--- /dev/null
+++ b/vault-core/src/test/resources/test-packages/stashing2.zip/META-INF/vault/filter.xml
@@ -0,0 +1,3 @@
+<workspaceFilter version="1.0">
+    <filter root="/tmp/stash"/>
+</workspaceFilter>
diff --git a/vault-core/src/test/resources/test-packages/stashing2.zip/META-INF/vault/nodetypes.cnd b/vault-core/src/test/resources/test-packages/stashing2.zip/META-INF/vault/nodetypes.cnd
new file mode 100644
index 00000000..fef66ef3
--- /dev/null
+++ b/vault-core/src/test/resources/test-packages/stashing2.zip/META-INF/vault/nodetypes.cnd
@@ -0,0 +1,7 @@
+<'teststash'='https://issues.apache.org/jira/browse/JCRVLT-684'>
+
+[teststash:noChildNodes]
+
+[teststash:hasMandatoryChildNode]
+  mixin
+  + teststash:mandatoryChildNode mandatory
diff --git a/vault-core/src/test/resources/test-packages/stashing2.zip/META-INF/vault/properties.xml b/vault-core/src/test/resources/test-packages/stashing2.zip/META-INF/vault/properties.xml
new file mode 100644
index 00000000..2494f50c
--- /dev/null
+++ b/vault-core/src/test/resources/test-packages/stashing2.zip/META-INF/vault/properties.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
+<properties>
+<comment>FileVault Package Properties</comment>
+<entry key="createdBy">admin</entry>
+<entry key="name">test_referenceable</entry>
+<entry key="lastModified">2015-12-16T16:59:10.779+01:00</entry>
+<entry key="lastModifiedBy">admin</entry>
+<entry key="created">2015-12-16T16:59:10.795+01:00</entry>
+<entry key="buildCount">5</entry>
+<entry key="version"/>
+<entry key="dependencies"/>
+<entry key="packageFormatVersion">2</entry>
+<entry key="description"/>
+<entry key="lastWrapped">2015-12-16T16:59:10.779+01:00</entry>
+<entry key="group">my_packages</entry>
+<entry key="lastWrappedBy">admin</entry>
+</properties>
diff --git a/vault-core/src/test/resources/test-packages/stashing2.zip/jcr_root/.content.xml b/vault-core/src/test/resources/test-packages/stashing2.zip/jcr_root/.content.xml
new file mode 100644
index 00000000..4f8ba9aa
--- /dev/null
+++ b/vault-core/src/test/resources/test-packages/stashing2.zip/jcr_root/.content.xml
@@ -0,0 +1,4 @@
+<jcr:root
+  xmlns:jcr="http://www.jcp.org/jcr/1.0"
+  xmlns:rep="internal"
+  jcr:primaryType="rep:root"/>
diff --git a/vault-core/src/test/resources/test-packages/stashing2.zip/jcr_root/tmp/.content.xml b/vault-core/src/test/resources/test-packages/stashing2.zip/jcr_root/tmp/.content.xml
new file mode 100644
index 00000000..b72b9a91
--- /dev/null
+++ b/vault-core/src/test/resources/test-packages/stashing2.zip/jcr_root/tmp/.content.xml
@@ -0,0 +1,12 @@
+<jcr:root
+  xmlns:jcr="http://www.jcp.org/jcr/1.0"
+  xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
+  xmlns:mix="http://www.jcp.org/jcr/mix/1.0"
+  xmlns:teststash="https://issues.apache.org/jira/browse/JCRVLT-684"
+  jcr:primaryType="nt:unstructured">
+  <stash
+    jcr:primaryType="teststash:noChildNodes"
+    jcr:mixinTypes="[mix:referenceable"
+    jcr:uuid="c842f252-ab9c-11ed-9e53-00155d01040f">
+  </stash>
+</jcr:root>