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/04 17:22:04 UTC

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

Author: tommaso
Date: Tue Nov  4 16:22:04 2014
New Revision: 1636636

URL: http://svn.apache.org/r1636636
Log:
SLING-4132 - fixed event listeners registration

Added:
    sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/component/
    sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/component/impl/
    sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/component/impl/DefaultReplicationComponentFactoryTest.java   (with props)
Removed:
    sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/agent/impl/DefaultReplicationComponentFactoryTest.java
Modified:
    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/queue/ReplicationQueueDistributionStrategy.java
    sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/queue/ReplicationQueueProvider.java
    sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/trigger/impl/AbstractJcrEventTrigger.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/sample/src/main/resources/SLING-CONTENT/libs/sling/replication/install/resources/settings/org.apache.sling.replication.resources.impl.OsgiPropertiesResourceProviderFactory-simpleAgents.json

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=1636636&r1=1636635&r2=1636636&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 Tue Nov  4 16:22:04 2014
@@ -175,7 +175,6 @@ public class DefaultReplicationComponent
 
             boolean isPassive = PropertiesUtil.toBoolean(properties.get(ReplicationComponentFactory.AGENT_SIMPLE_PROPERTY_IS_PASSIVE), false);
 
-
             return new SimpleReplicationAgent(name, isPassive, serviceName,
                     packageImporter, packageExporter, packageExporterStrategy,
                     queueProvider, queueDistributionStrategy, replicationEventFactory, resourceResolverFactory, triggers);
@@ -336,7 +335,7 @@ public class DefaultReplicationComponent
     }
 
 
-    private ReplicationTrigger createTrigger(Map<String, Object> properties, ReplicationComponentProvider componentProvider) {
+    protected ReplicationTrigger createTrigger(Map<String, Object> properties, ReplicationComponentProvider componentProvider) {
         String factory = PropertiesUtil.toString(properties.get(COMPONENT_TYPE), COMPONENT_TYPE_SERVICE);
 
         if (COMPONENT_TYPE_SERVICE.equals(factory)) {

Modified: sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/queue/ReplicationQueueDistributionStrategy.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/queue/ReplicationQueueDistributionStrategy.java?rev=1636636&r1=1636635&r2=1636636&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/queue/ReplicationQueueDistributionStrategy.java (original)
+++ sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/queue/ReplicationQueueDistributionStrategy.java Tue Nov  4 16:22:04 2014
@@ -41,10 +41,9 @@ public interface ReplicationQueueDistrib
      *
      * @param replicationPackage          a {@link org.apache.sling.replication.packaging.ReplicationPackage} to distribute
      * @param queueProvider the {@link ReplicationQueueProvider} used to provide the queues to be used for the given package
-     * @return a {@link ReplicationQueueItemState} representing the state of the package in the queue after its distribution
-     * @throws ReplicationQueueException if distribution fails
+     * @return <code>true</code> if addition was successful, <code>false</code> otherwise
+     * @throws ReplicationQueueException if any internal error happens during distribution
      */
-    @Nonnull
     boolean add(@Nonnull ReplicationPackage replicationPackage, @Nonnull ReplicationQueueProvider queueProvider) throws ReplicationQueueException;
 
 
@@ -52,6 +51,7 @@ public interface ReplicationQueueDistrib
      * Returns the queue names available for this strategy.
      * @return a list of queue names
      */
+    @Nonnull
     List<String> getQueueNames();
 
 }

Modified: sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/queue/ReplicationQueueProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/queue/ReplicationQueueProvider.java?rev=1636636&r1=1636635&r2=1636636&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/queue/ReplicationQueueProvider.java (original)
+++ sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/queue/ReplicationQueueProvider.java Tue Nov  4 16:22:04 2014
@@ -19,7 +19,6 @@
 package org.apache.sling.replication.queue;
 
 import javax.annotation.Nonnull;
-import java.util.Collection;
 
 import aQute.bnd.annotation.ConsumerType;
 import org.apache.sling.replication.component.ReplicationComponent;
@@ -33,15 +32,13 @@ public interface ReplicationQueueProvide
     /**
      * provide a named queue for the given agent
      *
-     * @param queueName      the name of the queue to retrieve
-     * @return a replication queue to be used for the given parameters
-     * @throws ReplicationQueueException
+     * @param queueName the name of the queue to retrieve
+     * @return a {@link org.apache.sling.replication.queue.ReplicationQueue}
+     * @throws ReplicationQueueException if any error happens
      */
     @Nonnull
     ReplicationQueue getQueue(@Nonnull String queueName) throws ReplicationQueueException;
 
-
-
     /**
      * enables queue driven processing for an agent
      *

Modified: sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/trigger/impl/AbstractJcrEventTrigger.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/trigger/impl/AbstractJcrEventTrigger.java?rev=1636636&r1=1636635&r2=1636636&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/trigger/impl/AbstractJcrEventTrigger.java (original)
+++ sling/trunk/contrib/extensions/replication/core/src/main/java/org/apache/sling/replication/trigger/impl/AbstractJcrEventTrigger.java Tue Nov  4 16:22:04 2014
@@ -51,6 +51,8 @@ public abstract class AbstractJcrEventTr
 
     protected final SlingRepository repository;
 
+    private Session cachedSession;
+
     public AbstractJcrEventTrigger(SlingRepository repository, String path, String serviceUser) {
         this.repository = repository;
         this.path = path;
@@ -58,7 +60,7 @@ public abstract class AbstractJcrEventTr
     }
 
     public void register(@Nonnull ReplicationRequestHandler requestHandler) throws ReplicationTriggerException {
-        Session session = null;
+        Session session;
         try {
             session = getSession();
             JcrEventReplicationTriggerListener listener = new JcrEventReplicationTriggerListener(requestHandler);
@@ -67,26 +69,18 @@ public abstract class AbstractJcrEventTr
                     listener, getEventTypes(), path, true, null, null, false);
         } catch (RepositoryException e) {
             throw new ReplicationTriggerException("unable to register handler " + requestHandler, e);
-        } finally {
-            if (session != null) {
-                session.logout();
-            }
         }
     }
 
     public void unregister(@Nonnull ReplicationRequestHandler requestHandler) throws ReplicationTriggerException {
         JcrEventReplicationTriggerListener listener = registeredListeners.get(requestHandler.toString());
         if (listener != null) {
-            Session session = null;
+            Session session;
             try {
                 session = getSession();
                 session.getWorkspace().getObservationManager().removeEventListener(listener);
             } catch (RepositoryException e) {
                 throw new ReplicationTriggerException("unable to unregister handler " + requestHandler, e);
-            } finally {
-                if (session != null) {
-                    session.logout();
-                }
             }
         }
     }
@@ -143,7 +137,7 @@ public abstract class AbstractJcrEventTr
      * @throws RepositoryException
      */
     protected Session getSession() throws RepositoryException {
-        return repository.loginService(serviceUser, null);
+        return cachedSession != null ? cachedSession : (cachedSession = repository.loginService(serviceUser, 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=1636636&r1=1636635&r2=1636636&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 Tue Nov  4 16:22:04 2014
@@ -22,6 +22,8 @@ import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.observation.Event;
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
 
@@ -66,20 +68,23 @@ public class PersistingJcrEventReplicati
             log.info("persisting event under {}", nuggetsPath);
             Node nuggetsNode = session.getNode(nuggetsPath);
             if (nuggetsNode != null) {
-                String nodeName = event.getIdentifier() != null ? event.getIdentifier() : String.valueOf(System.nanoTime());
-                Node createdNode = nuggetsNode.addNode(nodeName);
+                String nodeName = String.valueOf(System.nanoTime());
+                Node createdNode = nuggetsNode.addNode(nodeName, "nt:unstructured");
                 if (createdNode != null) {
                     String path = createdNode.getPath();
-                    nuggetsNode.setProperty("path", event.getPath());
-                    nuggetsNode.setProperty("date", event.getDate());
-                    nuggetsNode.setProperty("type", event.getType());
-                    nuggetsNode.setProperty("userData", event.getUserData());
-                    nuggetsNode.setProperty("userID", event.getUserID());
+                    createdNode.setProperty("identifier", event.getIdentifier());
+                    createdNode.setProperty("path", event.getPath());
+                    createdNode.setProperty("date", event.getDate());
+                    createdNode.setProperty("type", event.getType());
+                    createdNode.setProperty("userData", event.getUserData());
+                    createdNode.setProperty("userID", event.getUserID());
 
                     Set<Map.Entry> set = event.getInfo().entrySet();
+                    Collection<String> values = new ArrayList<String>();
                     for (Map.Entry entry : set) {
-                        nuggetsNode.setProperty("info." + entry.getKey(), String.valueOf(entry.getValue()));
+                        values.add(String.valueOf(entry.getKey()) + ":" + String.valueOf(entry.getValue()));
                     }
+                    createdNode.setProperty("info", values.toArray(new String[values.size()]));
                     session.save();
                     log.info("event persisted at {}", path);
                     replicationRequest = new ReplicationRequest(System.currentTimeMillis(), ReplicationActionType.ADD, path);
@@ -127,10 +132,6 @@ public class PersistingJcrEventReplicati
             }
         } catch (RepositoryException e) {
             log.warn("could not create nuggets path " + nuggetsPath, e);
-        } finally {
-            if (session != null) {
-                session.logout();
-            }
         }
     }
 

Added: sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/component/impl/DefaultReplicationComponentFactoryTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/component/impl/DefaultReplicationComponentFactoryTest.java?rev=1636636&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/component/impl/DefaultReplicationComponentFactoryTest.java (added)
+++ sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/component/impl/DefaultReplicationComponentFactoryTest.java Tue Nov  4 16:22:04 2014
@@ -0,0 +1,121 @@
+/*
+ * 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.sling.replication.component.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.sling.replication.agent.ReplicationAgent;
+import org.apache.sling.replication.component.ReplicationComponentProvider;
+import org.apache.sling.replication.packaging.ReplicationPackageExporter;
+import org.apache.sling.replication.packaging.ReplicationPackageImporter;
+import org.apache.sling.replication.transport.authentication.TransportAuthenticationProvider;
+import org.apache.sling.replication.trigger.ReplicationTrigger;
+import org.apache.sling.replication.trigger.impl.PersistingJcrEventReplicationTrigger;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+/**
+ * Testcase for {@link org.apache.sling.replication.component.impl.DefaultReplicationComponentFactory}
+ */
+public class DefaultReplicationComponentFactoryTest {
+
+    @Test
+    public void testDefaultCreateComponentForAgentByService() throws Exception {
+        DefaultReplicationComponentFactory defaultReplicationComponentFactory = new DefaultReplicationComponentFactory();
+        String name = "sample-agent";
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put("name", name);
+        ReplicationComponentProvider provider = mock(ReplicationComponentProvider.class);
+        ReplicationAgent agent = mock(ReplicationAgent.class);
+        when(provider.getComponent(ReplicationAgent.class, name)).thenReturn(agent);
+        ReplicationAgent component = defaultReplicationComponentFactory.createComponent(ReplicationAgent.class, properties, provider);
+        assertNull(component); // agents cannot be referenced by service name using the factory
+    }
+
+    @Test
+    public void testDefaultCreateComponentForTriggerByService() throws Exception {
+        DefaultReplicationComponentFactory defaultReplicationComponentFactory = new DefaultReplicationComponentFactory();
+        String name = "sample-trigger";
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put("name", name);
+        ReplicationComponentProvider provider = mock(ReplicationComponentProvider.class);
+        ReplicationTrigger trigger = mock(ReplicationTrigger.class);
+        when(provider.getComponent(ReplicationTrigger.class, name)).thenReturn(trigger);
+        ReplicationTrigger component = defaultReplicationComponentFactory.createComponent(ReplicationTrigger.class, properties, provider);
+        assertNotNull(component);
+    }
+
+    @Test
+    public void testDefaultCreateComponentForTransportAuthenticationProviderByService() throws Exception {
+        DefaultReplicationComponentFactory defaultReplicationComponentFactory = new DefaultReplicationComponentFactory();
+        String name = "sample-auth";
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put("name", name);
+        ReplicationComponentProvider provider = mock(ReplicationComponentProvider.class);
+        TransportAuthenticationProvider authenticationProvider = mock(TransportAuthenticationProvider.class);
+        when(provider.getComponent(TransportAuthenticationProvider.class, name)).thenReturn(authenticationProvider);
+        TransportAuthenticationProvider component = defaultReplicationComponentFactory.createComponent(TransportAuthenticationProvider.class, properties, provider);
+        assertNotNull(component);
+    }
+
+    @Test
+    public void testDefaultCreateComponentForImporterByService() throws Exception {
+        DefaultReplicationComponentFactory defaultReplicationComponentFactory = new DefaultReplicationComponentFactory();
+        String name = "sample-importer";
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put("name", name);
+        ReplicationComponentProvider provider = mock(ReplicationComponentProvider.class);
+        ReplicationPackageImporter importer = mock(ReplicationPackageImporter.class);
+        when(provider.getComponent(ReplicationPackageImporter.class, name)).thenReturn(importer);
+        ReplicationPackageImporter component = defaultReplicationComponentFactory.createComponent(ReplicationPackageImporter.class, properties, provider);
+        assertNotNull(component);
+    }
+
+    @Test
+    public void testDefaultCreateComponentForExporterByService() throws Exception {
+        DefaultReplicationComponentFactory defaultReplicationComponentFactory = new DefaultReplicationComponentFactory();
+        String name = "sample-exporter";
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put("name", name);
+        ReplicationComponentProvider provider = mock(ReplicationComponentProvider.class);
+        ReplicationPackageExporter exporter = mock(ReplicationPackageExporter.class);
+        when(provider.getComponent(ReplicationPackageExporter.class, name)).thenReturn(exporter);
+        ReplicationPackageExporter component = defaultReplicationComponentFactory.createComponent(ReplicationPackageExporter.class, properties, provider);
+        assertNotNull(component);
+    }
+
+    @Test
+    public void testPersistingJcrEventTriggerCreation() throws Exception {
+        DefaultReplicationComponentFactory defaultReplicationComponentFactory = new DefaultReplicationComponentFactory();
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put("type", "persistedJcrEvent");
+        properties.put("path", "/content/persistedEvents");
+        properties.put("servicename", "replicationService");
+        ReplicationComponentProvider componentProvider = mock(ReplicationComponentProvider.class);
+        ReplicationTrigger trigger = defaultReplicationComponentFactory.createTrigger(properties, componentProvider);
+        assertNotNull(trigger);
+        assertEquals(PersistingJcrEventReplicationTrigger.class, trigger.getClass());
+    }
+}
\ No newline at end of file

Propchange: sling/trunk/contrib/extensions/replication/core/src/test/java/org/apache/sling/replication/component/impl/DefaultReplicationComponentFactoryTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

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=1636636&r1=1636635&r2=1636636&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 Tue Nov  4 16:22:04 2014
@@ -23,7 +23,6 @@ import javax.jcr.Session;
 import javax.jcr.Workspace;
 import javax.jcr.observation.Event;
 import javax.jcr.observation.ObservationManager;
-import javax.jcr.security.Privilege;
 
 import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.replication.communication.ReplicationRequest;
@@ -106,7 +105,7 @@ public class PersistingJcrEventReplicati
 
         Node nuggetsNode = mock(Node.class);
         Node eventNode = mock(Node.class);
-        when(nuggetsNode.addNode(any(String.class))).thenReturn(eventNode);
+        when(nuggetsNode.addNode(any(String.class), any(String.class))).thenReturn(eventNode);
         when(session.getNode(nuggetsPath)).thenReturn(nuggetsNode);
         Event event = mock(Event.class);
         when(event.getPath()).thenReturn("/some/path/generating/event");
@@ -143,7 +142,7 @@ public class PersistingJcrEventReplicati
         persistingJcrEventReplicationTrigger.register(handler);
 
         Node eventNode = mock(Node.class);
-        when(nuggetsNode.addNode(any(String.class))).thenReturn(eventNode);
+        when(nuggetsNode.addNode(any(String.class), any(String.class))).thenReturn(eventNode);
         when(session.getNode(nuggetsPath)).thenReturn(nuggetsNode);
         Event event = mock(Event.class);
         when(event.getPath()).thenReturn("/some/path/generating/event");

Modified: sling/trunk/contrib/extensions/replication/sample/src/main/resources/SLING-CONTENT/libs/sling/replication/install/resources/settings/org.apache.sling.replication.resources.impl.OsgiPropertiesResourceProviderFactory-simpleAgents.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/replication/sample/src/main/resources/SLING-CONTENT/libs/sling/replication/install/resources/settings/org.apache.sling.replication.resources.impl.OsgiPropertiesResourceProviderFactory-simpleAgents.json?rev=1636636&r1=1636635&r2=1636636&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/replication/sample/src/main/resources/SLING-CONTENT/libs/sling/replication/install/resources/settings/org.apache.sling.replication.resources.impl.OsgiPropertiesResourceProviderFactory-simpleAgents.json (original)
+++ sling/trunk/contrib/extensions/replication/sample/src/main/resources/SLING-CONTENT/libs/sling/replication/install/resources/settings/org.apache.sling.replication.resources.impl.OsgiPropertiesResourceProviderFactory-simpleAgents.json Tue Nov  4 16:22:04 2014
@@ -6,7 +6,6 @@
     "providerType": "osgiConfig",
     "groupPrefix": "agents",
 
-
     "resourceProperties": [
         "sling:resourceType=sling/replication/setting/agent",
         "sling:resourceSuperType=sling/replication/setting",