You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2014/10/13 00:26:20 UTC

svn commit: r1631261 - in /sling/trunk/tooling/ide: impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/ impl-vlt-test/src/test/resources/org/apache/sling/ide/impl/vlt/ impl-vlt/src/org/apache/sling/ide/impl/vlt/

Author: rombert
Date: Sun Oct 12 22:26:20 2014
New Revision: 1631261

URL: http://svn.apache.org/r1631261
Log:
SLING-4035 - Changing the jcr primary type does not work if properties
are added

Change the jcr primary type earlier in the AddOrUpdateNodeCommand .

Added:
    sling/trunk/tooling/ide/impl-vlt-test/src/test/resources/org/apache/sling/ide/impl/vlt/folder.cnd
Modified:
    sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommandTest.java
    sling/trunk/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommand.java

Modified: sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommandTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommandTest.java?rev=1631261&r1=1631260&r2=1631261&view=diff
==============================================================================
--- sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommandTest.java (original)
+++ sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommandTest.java Sun Oct 12 22:26:20 2014
@@ -20,6 +20,8 @@ import static org.hamcrest.CoreMatchers.
 import static org.junit.Assert.assertThat;
 
 import java.io.File;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 
 import javax.jcr.Node;
 import javax.jcr.Property;
@@ -29,6 +31,8 @@ import javax.jcr.SimpleCredentials;
 import javax.jcr.Value;
 import javax.jcr.nodetype.NodeType;
 
+import org.apache.commons.io.IOUtils;
+import org.apache.jackrabbit.commons.cnd.CndImporter;
 import org.apache.jackrabbit.core.TransientRepository;
 import org.apache.sling.ide.log.Logger;
 import org.apache.sling.ide.transport.ResourceProxy;
@@ -122,6 +126,78 @@ public class AddOrUpdateNodeCommandTest 
         doPropertyChangeTest(new String[] { "Title", "Title 2" }, "Title");
     }
 
+    @Test
+    public void changeNtFolderToSlingFolderWithAddedProperty() throws Exception {
+
+        File out = new File(new File("target"), "jackrabbit");
+        TransientRepository repo = new TransientRepository(new File(out, "repository.xml"), new File(out, "repository"));
+        SimpleCredentials credentials = new SimpleCredentials("admin", "admin".toCharArray());
+        Session session = repo.login(credentials);
+
+        InputStream cndInput = getClass().getResourceAsStream("folder.cnd");
+        CndImporter.registerNodeTypes(new InputStreamReader(cndInput), session);
+
+        try {
+            session.getRootNode().addNode("content", "nt:folder");
+
+            session.save();
+
+            ResourceProxy resource = newResource("/content", "sling:Folder");
+            resource.getProperties().put("newProperty", "some/value");
+
+            AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repo, credentials, null, resource, logger);
+            cmd.execute().get();
+
+            session.refresh(false);
+
+            Node content = session.getRootNode().getNode("content");
+            assertThat(content.getPrimaryNodeType().getName(), equalTo("sling:Folder"));
+
+        } finally {
+            session.removeItem("/content");
+            session.save();
+            session.logout();
+
+            IOUtils.closeQuietly(cndInput);
+        }
+    }
+
+    @Test
+    public void changeSlingFolderToNtFolderWithExistingProperty() throws Exception {
+
+        File out = new File(new File("target"), "jackrabbit");
+        TransientRepository repo = new TransientRepository(new File(out, "repository.xml"), new File(out, "repository"));
+        SimpleCredentials credentials = new SimpleCredentials("admin", "admin".toCharArray());
+        Session session = repo.login(credentials);
+
+        InputStream cndInput = getClass().getResourceAsStream("folder.cnd");
+        CndImporter.registerNodeTypes(new InputStreamReader(cndInput), session);
+
+        try {
+            Node content = session.getRootNode().addNode("content", "sling:Folder");
+            content.setProperty("newProperty", "some/value");
+
+            session.save();
+
+            ResourceProxy resource = newResource("/content", "nt:folder");
+
+            AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repo, credentials, null, resource, logger);
+            cmd.execute().get();
+
+            session.refresh(false);
+
+            content = session.getRootNode().getNode("content");
+            assertThat(content.getPrimaryNodeType().getName(), equalTo("nt:folder"));
+
+        } finally {
+            session.removeItem("/content");
+            session.save();
+            session.logout();
+
+            IOUtils.closeQuietly(cndInput);
+        }
+    }
+
     private ResourceProxy newResource(String path, String primaryType) {
 
         ResourceProxy resource = new ResourceProxy(path);

Added: sling/trunk/tooling/ide/impl-vlt-test/src/test/resources/org/apache/sling/ide/impl/vlt/folder.cnd
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/impl-vlt-test/src/test/resources/org/apache/sling/ide/impl/vlt/folder.cnd?rev=1631261&view=auto
==============================================================================
--- sling/trunk/tooling/ide/impl-vlt-test/src/test/resources/org/apache/sling/ide/impl/vlt/folder.cnd (added)
+++ sling/trunk/tooling/ide/impl-vlt-test/src/test/resources/org/apache/sling/ide/impl/vlt/folder.cnd Sun Oct 12 22:26:20 2014
@@ -0,0 +1,46 @@
+//
+//  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.
+//
+
+<sling = 'http://sling.apache.org/jcr/sling/1.0'>
+
+//-----------------------------------------------------------------------------
+// Node type to be used as a replacement for nt:folder: it can be used
+// as a child of nt:folder and allows to add unstructured content
+// (See SLING-663)
+[sling:Folder] > nt:folder
+  - * (undefined) multiple
+  - * (undefined)
+  + * (nt:base) = sling:Folder version
+
+
+//-----------------------------------------------------------------------------
+// Mixin node type to turn any node into an nt:hierarchyNode to place
+// below any nt:folder (or extension thereof such as sling:Folder) 
+// (See SLING-663)
+[sling:HierarchyNode] > nt:hierarchyNode
+    mixin
+
+
+//-----------------------------------------------------------------------------
+// Node type extending sling:Folder supporting the creation of folder
+// structured with child node ordering.
+// (See SLING-663)
+[sling:OrderedFolder] > sling:Folder
+    orderable
+  + * (nt:base) = sling:OrderedFolder version 

Modified: sling/trunk/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommand.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommand.java?rev=1631261&r1=1631260&r2=1631261&view=diff
==============================================================================
--- sling/trunk/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommand.java (original)
+++ sling/trunk/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommand.java Sun Oct 12 22:26:20 2014
@@ -64,7 +64,6 @@ public class AddOrUpdateNodeCommand exte
 
     private ResourceProxy resource;
     private FileInfo fileInfo;
-    private boolean primaryTypeHasChanged;
 
     public AddOrUpdateNodeCommand(Repository jcrRepo, Credentials credentials, FileInfo fileInfo,
             ResourceProxy resource, Logger logger) {
@@ -103,13 +102,6 @@ public class AddOrUpdateNodeCommand exte
         for (ResourceProxy child : resource.getCoveredChildren()) {
             update(child, session);
         }
-
-        // save the changes so that the primary node type is propagated
-        // however, we can't do that too early, since required properties might not be set
-        // so we save right before checking for orderable child nodes
-        if (primaryTypeHasChanged) {
-            session.save();
-        }
     }
 
     private void processDeletedNodes(Node node, ResourceProxy resource2) throws RepositoryException {
@@ -199,10 +191,17 @@ public class AddOrUpdateNodeCommand exte
             updateMixins(node, mixinTypes);
         }
 
+        // remove old properties first
+        // this supports the scenario where the node type is changed to a less permissive one
+        for (String propertyToRemove : propertiesToRemove) {
+            node.getProperty(propertyToRemove).remove();
+            getLogger().trace("Removed property {0} from node at {1}", propertyToRemove, node.getPath());
+        }
+        
         String primaryType = (String) resource.getProperties().get(JcrConstants.JCR_PRIMARYTYPE);
         if (!node.getPrimaryNodeType().getName().equals(primaryType) && node.getDepth() != 0) {
             node.setPrimaryType(primaryType);
-            primaryTypeHasChanged = true;
+            session.save();
             getLogger().trace("Set new primary type {0} for node at {1}", primaryType, node.getPath());
         }
 
@@ -289,12 +288,6 @@ public class AddOrUpdateNodeCommand exte
                         + propertyName + "' with value '" + propertyValue + "'");
             }
         }
-
-        for (String propertyToRemove : propertiesToRemove) {
-            node.getProperty(propertyToRemove).remove();
-            getLogger().trace("Removed property {0} from node at {1}", propertyToRemove, node.getPath());
-        }
-
     }
 
     private void ensurePropertyDefinitionMatchers(Property property, int expectedType, boolean expectedMultiplicity)