You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by to...@apache.org on 2014/11/03 11:35:31 UTC

svn commit: r1636311 - in /sling/trunk/contrib/extensions/replication: core/src/main/java/org/apache/sling/replication/component/ core/src/main/java/org/apache/sling/replication/component/impl/ core/src/main/java/org/apache/sling/replication/trigger/im...

Author: tommaso
Date: Mon Nov  3 10:35:30 2014
New Revision: 1636311

URL: http://svn.apache.org/r1636311
Log:
SLING-4128 - persisting event trigger automatically creates nuggets path

Added:
    sling/trunk/contrib/extensions/replication/it/src/main/resources/SLING-CONTENT/libs/test/install.author/org.apache.sling.replication.component.impl.GenericReplicationComponentFactory-trigger-test-persisting-event.json
Modified:
    sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/component/ReplicationComponentFactory.java
    sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/component/impl/DefaultReplicationComponentFactory.java
    sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/trigger/impl/PersistingJcrEventReplicationTrigger.java
    sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/trigger/impl/PersistingJcrEventReplicationTriggerTest.java
    sling/trunk/contrib/extensions/replication/it/src/test/java/org/apache/sling/replication/it/triggers/ReplicationTriggerResourcesTest.java

Modified: sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/component/ReplicationComponentFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/component/ReplicationComponentFactory.java?rev=1636311&r1=1636310&r2=1636311&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/component/ReplicationComponentFactory.java (original)
+++ sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/component/ReplicationComponentFactory.java Mon Nov  3 10:35:30 2014
@@ -257,7 +257,7 @@ public interface ReplicationComponentFac
     /**
      * jcr persisting event trigger nuggets path property
      */
-    String TRIGGER_PERSISTED_JCR_EVENT_PROPERTY_NUGGETS_PATH = "nuggets.path";
+    String TRIGGER_PERSISTED_JCR_EVENT_PROPERTY_NUGGETS_PATH = "nuggetsPath";
 
     /**
      * privilege request authorization strategy type

Modified: sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/component/impl/DefaultReplicationComponentFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/component/impl/DefaultReplicationComponentFactory.java?rev=1636311&r1=1636310&r2=1636311&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/component/impl/DefaultReplicationComponentFactory.java (original)
+++ sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/component/impl/DefaultReplicationComponentFactory.java Mon Nov  3 10:35:30 2014
@@ -130,7 +130,7 @@ public class DefaultReplicationComponent
                 return (ComponentType) createExporter(properties, componentProvider);
             }
         } catch (IllegalArgumentException e) {
-            log.warn("Cannot create component of type {} with properties {}", new Object[]{type, properties}, e);
+            log.warn("Cannot create component {}", new Object[]{type, properties}, e);
         }
 
         return null;

Modified: sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/trigger/impl/PersistingJcrEventReplicationTrigger.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/trigger/impl/PersistingJcrEventReplicationTrigger.java?rev=1636311&r1=1636310&r2=1636311&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/trigger/impl/PersistingJcrEventReplicationTrigger.java (original)
+++ sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/trigger/impl/PersistingJcrEventReplicationTrigger.java Mon Nov  3 10:35:30 2014
@@ -29,6 +29,7 @@ import java.util.Set;
 import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.replication.communication.ReplicationActionType;
 import org.apache.sling.replication.communication.ReplicationRequest;
+import org.apache.sling.replication.component.ManagedReplicationComponent;
 import org.apache.sling.replication.trigger.ReplicationTrigger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -37,7 +38,7 @@ import org.slf4j.LoggerFactory;
  * {@link org.apache.sling.replication.trigger.ReplicationTrigger} that listens for certain events and persists them
  * under a specific path in the repo
  */
-public class PersistingJcrEventReplicationTrigger extends AbstractJcrEventTrigger implements ReplicationTrigger {
+public class PersistingJcrEventReplicationTrigger extends AbstractJcrEventTrigger implements ReplicationTrigger, ManagedReplicationComponent {
 
     private static final String DEFAULT_NUGGETS_PATH = "/var/nuggets";
 
@@ -58,7 +59,11 @@ public class PersistingJcrEventReplicati
 
         Session session = getSession();
 
-        if (session != null && session.hasPermission(nuggetsPath, Privilege.JCR_ADD_CHILD_NODES)) {
+        if (!session.nodeExists(nuggetsPath)) {
+            initializeNuggetsPath(session);
+        }
+
+        if (session.hasPermission(nuggetsPath, Privilege.JCR_ADD_CHILD_NODES)) {
             log.debug("persisting event under {}", nuggetsPath);
             Node nuggetsNode = session.getNode(nuggetsPath);
             if (nuggetsNode != null) {
@@ -92,4 +97,38 @@ public class PersistingJcrEventReplicati
         return replicationRequest;
     }
 
+    private void initializeNuggetsPath(Session session) throws RepositoryException {
+        if (session != null) {
+            Node parent = session.getRootNode();
+            if (session.hasPermission(parent.getPath(), Privilege.JCR_ADD_CHILD_NODES)) {
+                for (String nodeName : nuggetsPath.split("/")) {
+                    if (!parent.hasNode(nodeName)) {
+                        parent = parent.addNode(nodeName, "sling:Folder");
+                    } else {
+                        parent = parent.getNode(nodeName);
+                    }
+                }
+            }
+        }
+    }
+
+    public void enable() {
+        Session session = null;
+        try {
+            session = getSession();
+            if (!session.nodeExists(nuggetsPath)) {
+                initializeNuggetsPath(session);
+            }
+        } catch (RepositoryException e) {
+            log.warn("could not create nuggets path " + nuggetsPath, e);
+        } finally {
+            if (session != null) {
+                session.logout();
+            }
+        }
+    }
+
+    public void disable() {
+
+    }
 }

Modified: sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/trigger/impl/PersistingJcrEventReplicationTriggerTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/trigger/impl/PersistingJcrEventReplicationTriggerTest.java?rev=1636311&r1=1636310&r2=1636311&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/trigger/impl/PersistingJcrEventReplicationTriggerTest.java (original)
+++ sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/trigger/impl/PersistingJcrEventReplicationTriggerTest.java Mon Nov  3 10:35:30 2014
@@ -33,6 +33,7 @@ import org.junit.Test;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -45,6 +46,32 @@ public class PersistingJcrEventReplicati
     public void testProcessEventWithoutPrivileges() throws Exception {
         String serviceName = "serviceId";
         Session session = mock(Session.class);
+        when(session.nodeExists("/var/nuggets")).thenReturn(true);
+        SlingRepository repository = mock(SlingRepository.class);
+        when(repository.loginService(serviceName, null)).thenReturn(session);
+        String path = "/some/path";
+        String nuggetsPath = "/var/nuggets";
+        PersistingJcrEventReplicationTrigger persistingJcrEventReplicationTrigger = new PersistingJcrEventReplicationTrigger(
+                repository, path, serviceName, nuggetsPath);
+        Event event = mock(Event.class);
+        ReplicationRequest replicationRequest = persistingJcrEventReplicationTrigger.processEvent(event);
+        assertNull(replicationRequest);
+    }
+
+    @Test
+    public void testProcessEventWithoutPrivilegesAndNuggetsPath() throws Exception {
+        String serviceName = "serviceId";
+        Session session = mock(Session.class);
+        when(session.hasPermission(eq("var"), eq(Privilege.JCR_ADD_CHILD_NODES))).thenReturn(true);
+        when(session.hasPermission(eq("nuggets"), eq(Privilege.JCR_ADD_CHILD_NODES))).thenReturn(true);
+        when(session.nodeExists("/var/nuggets")).thenReturn(false); // first time it doesn't exist and should be created
+        when(session.nodeExists("/var/nuggets")).thenReturn(true); // second time it should exist
+        Node rootNode = mock(Node.class);
+        Node varNode = mock(Node.class);
+        Node nuggetsNode = mock(Node.class);
+        when(varNode.addNode("nuggets", "sling:Folder")).thenReturn(nuggetsNode);
+        when(rootNode.addNode("var", "sling:Folder")).thenReturn(varNode);
+        when(session.getRootNode()).thenReturn(rootNode);
         SlingRepository repository = mock(SlingRepository.class);
         when(repository.loginService(serviceName, null)).thenReturn(session);
         String path = "/some/path";
@@ -61,6 +88,7 @@ public class PersistingJcrEventReplicati
         String nuggetsPath = "/var/nuggets";
         String serviceName = "serviceId";
         Session session = mock(Session.class);
+        when(session.nodeExists("/var/nuggets")).thenReturn(true);
         Workspace workspace = mock(Workspace.class);
         ObservationManager observationManager = mock(ObservationManager.class);
         when(workspace.getObservationManager()).thenReturn(observationManager);
@@ -85,4 +113,41 @@ public class PersistingJcrEventReplicati
         ReplicationRequest replicationRequest = persistingJcrEventReplicationTrigger.processEvent(event);
         assertNotNull(replicationRequest);
     }
+
+    @Test
+    public void testProcessEventWithPrivilegesAndNoNuggetsNode() throws Exception {
+        String nuggetsPath = "/var/nuggets";
+        String serviceName = "serviceId";
+        Session session = mock(Session.class);
+        when(session.nodeExists("/var/nuggets")).thenReturn(false); // first time it doesn't exist and should be created
+        when(session.nodeExists("/var/nuggets")).thenReturn(true); // second time it should exist
+        Node rootNode = mock(Node.class);
+        Node varNode = mock(Node.class);
+        Node nuggetsNode = mock(Node.class);
+        when(varNode.addNode("nuggets", "sling:Folder")).thenReturn(nuggetsNode);
+        when(rootNode.addNode("var", "sling:Folder")).thenReturn(varNode);
+        when(session.getRootNode()).thenReturn(rootNode);
+        Workspace workspace = mock(Workspace.class);
+        ObservationManager observationManager = mock(ObservationManager.class);
+        when(workspace.getObservationManager()).thenReturn(observationManager);
+        when(session.getWorkspace()).thenReturn(workspace);
+        when(session.hasPermission(any(String.class), eq(Privilege.JCR_ADD_CHILD_NODES))).thenReturn(true);
+
+        SlingRepository repository = mock(SlingRepository.class);
+        when(repository.loginService(serviceName, null)).thenReturn(session);
+
+        String path = "/some/path";
+        PersistingJcrEventReplicationTrigger persistingJcrEventReplicationTrigger = new PersistingJcrEventReplicationTrigger(
+                repository, path, serviceName, nuggetsPath);
+        ReplicationRequestHandler handler = mock(ReplicationRequestHandler.class);
+        persistingJcrEventReplicationTrigger.register(handler);
+
+        Node eventNode = mock(Node.class);
+        when(nuggetsNode.addNode(any(String.class))).thenReturn(eventNode);
+        when(session.getNode(nuggetsPath)).thenReturn(nuggetsNode);
+        Event event = mock(Event.class);
+        when(event.getPath()).thenReturn("/some/path/generating/event");
+        ReplicationRequest replicationRequest = persistingJcrEventReplicationTrigger.processEvent(event);
+        assertNotNull(replicationRequest);
+    }
 }
\ No newline at end of file

Added: sling/trunk/contrib/extensions/replication/it/src/main/resources/SLING-CONTENT/libs/test/install.author/org.apache.sling.replication.component.impl.GenericReplicationComponentFactory-trigger-test-persisting-event.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/it/src/main/resources/SLING-CONTENT/libs/test/install.author/org.apache.sling.replication.component.impl.GenericReplicationComponentFactory-trigger-test-persisting-event.json?rev=1636311&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/replication/it/src/main/resources/SLING-CONTENT/libs/test/install.author/org.apache.sling.replication.component.impl.GenericReplicationComponentFactory-trigger-test-persisting-event.json (added)
+++ sling/trunk/contrib/extensions/replication/it/src/main/resources/SLING-CONTENT/libs/test/install.author/org.apache.sling.replication.component.impl.GenericReplicationComponentFactory-trigger-test-persisting-event.json Mon Nov  3 10:35:30 2014
@@ -0,0 +1,13 @@
+{
+    "jcr:primaryType": "sling:OsgiConfig",
+    "name": "test-persisting-event",
+
+    "componentType": "trigger",
+
+    "properties": [
+        "type=persistedJcrEvent",
+        "path=/content",
+        "servicename=replicationService"
+    ]
+
+}
\ No newline at end of file

Modified: sling/trunk/contrib/extensions/replication/it/src/test/java/org/apache/sling/replication/it/triggers/ReplicationTriggerResourcesTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/it/src/test/java/org/apache/sling/replication/it/triggers/ReplicationTriggerResourcesTest.java?rev=1636311&r1=1636310&r2=1636311&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/replication/it/src/test/java/org/apache/sling/replication/it/triggers/ReplicationTriggerResourcesTest.java (original)
+++ sling/trunk/contrib/extensions/replication/it/src/test/java/org/apache/sling/replication/it/triggers/ReplicationTriggerResourcesTest.java Mon Nov  3 10:35:30 2014
@@ -34,7 +34,8 @@ public class ReplicationTriggerResources
                 "test-content-event",
                 "test-remote-event",
                 "test-replicate-event",
-                "test-scheduled-event"
+                "test-scheduled-event",
+                "test-persisting-event"
         };
         for (String name : names) {
             assertExists(authorClient, triggerUrl(name));