You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by mp...@apache.org on 2015/12/22 12:25:53 UTC

svn commit: r1721358 - in /sling/trunk/contrib/extensions/distribution/core/src: main/java/org/apache/sling/distribution/queue/impl/ test/java/org/apache/sling/distribution/queue/impl/

Author: mpetria
Date: Tue Dec 22 11:25:53 2015
New Revision: 1721358

URL: http://svn.apache.org/viewvc?rev=1721358&view=rev
Log:
SLING-5397: adding missing files

Added:
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/PriorityQueueDispatchingStrategy.java
    sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/queue/impl/PriorityQueueDispatchingStrategyTest.java
Removed:
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/SelectiveQueueDispatchingStrategy.java
    sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/queue/impl/SelectiveQueueDispatchingStrategyTest.java

Added: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/PriorityQueueDispatchingStrategy.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/PriorityQueueDispatchingStrategy.java?rev=1721358&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/PriorityQueueDispatchingStrategy.java (added)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/queue/impl/PriorityQueueDispatchingStrategy.java Tue Dec 22 11:25:53 2015
@@ -0,0 +1,107 @@
+/*
+ * 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.distribution.queue.impl;
+
+import org.apache.sling.distribution.common.DistributionException;
+import org.apache.sling.distribution.serialization.DistributionPackage;
+import org.apache.sling.distribution.queue.DistributionQueueItemStatus;
+import org.apache.sling.distribution.queue.DistributionQueueProvider;
+
+import javax.annotation.Nonnull;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+
+public class PriorityQueueDispatchingStrategy implements DistributionQueueDispatchingStrategy {
+
+    private final Map<String, String> selectors;
+    private final List<String> mainQueues;
+    private final Map<String, String> selectorQueues;
+    private final List<String> allQueues = new ArrayList<String>();
+
+    public PriorityQueueDispatchingStrategy(Map<String, String> selectors, String[] queueNames) {
+
+        this.selectors = selectors;
+        this.mainQueues = Arrays.asList(queueNames);
+        this.selectorQueues = getMatchingQueues(null);
+        this.allQueues.addAll(mainQueues);
+        this.allQueues.addAll(selectorQueues.keySet());
+    }
+
+    @Override
+    public Iterable<DistributionQueueItemStatus> add(@Nonnull DistributionPackage distributionPackage, @Nonnull DistributionQueueProvider queueProvider) throws DistributionException {
+        String[] paths = distributionPackage.getInfo().getPaths();
+        Map<String, String> matchingQueues = paths != null ?  getMatchingQueues(paths) : new HashMap<String, String>();
+
+        DistributionQueueDispatchingStrategy dispatchingStrategy = null;
+        if (matchingQueues.size() > 0) {
+            dispatchingStrategy = new MultipleQueueDispatchingStrategy(matchingQueues.keySet().toArray(new String[0]));
+        } else {
+            dispatchingStrategy = new MultipleQueueDispatchingStrategy(mainQueues.toArray(new String[0]));
+        }
+
+        return dispatchingStrategy.add(distributionPackage, queueProvider);
+    }
+
+    @Nonnull
+    @Override
+    public List<String> getQueueNames() {
+        return allQueues;
+    }
+
+
+    public Map<String, String> getMatchingQueues(String[] paths) {
+
+        Map<String, String> result = new TreeMap<String, String>();
+
+        if (paths == null) {
+            paths = new String[] { null };
+        }
+
+        for (String queueSelector : selectors.keySet()) {
+            String pathMatcher = selectors.get(queueSelector);
+            int idx =  queueSelector.indexOf('|');
+
+            String queuePrefix = queueSelector;
+            String queueMatcher = null;
+            if (idx >=0) {
+                queuePrefix = queueSelector.substring(0, idx);
+                queueMatcher = queueSelector.substring(idx+1);
+            }
+
+
+            for (String path : paths) {
+                if (path == null || path.matches(pathMatcher)) {
+
+                    for (String mainQueue : mainQueues) {
+                        if (queueMatcher == null || mainQueue.matches(queueMatcher)) {
+                            result.put(queuePrefix + "-" + mainQueue, mainQueue);
+                        }
+                    }
+                }
+            }
+        }
+
+        return result;
+    }
+}

Added: sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/queue/impl/PriorityQueueDispatchingStrategyTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/queue/impl/PriorityQueueDispatchingStrategyTest.java?rev=1721358&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/queue/impl/PriorityQueueDispatchingStrategyTest.java (added)
+++ sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/queue/impl/PriorityQueueDispatchingStrategyTest.java Tue Dec 22 11:25:53 2015
@@ -0,0 +1,175 @@
+/*
+ * 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.distribution.queue.impl;
+
+
+import org.apache.sling.distribution.serialization.DistributionPackage;
+import org.apache.sling.distribution.serialization.DistributionPackageInfo;
+import org.apache.sling.distribution.serialization.impl.SharedDistributionPackage;
+import org.apache.sling.distribution.queue.DistributionQueue;
+import org.apache.sling.distribution.queue.DistributionQueueProvider;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+public class PriorityQueueDispatchingStrategyTest {
+
+    static String[] queueNames;
+    static Map<String, String> selectors;
+
+    @BeforeClass
+    public static void setup() {
+        queueNames = new String[] { "publish1", "publish2"};
+        selectors = new HashMap<String, String>();
+
+        selectors.put("news|publish.*", "/content/news.*");
+        selectors.put("notes|publish1", "/content/notes");
+        selectors.put("important", "/content/important");
+    }
+
+    @Test
+    public void testQueueExpansion() throws Exception {
+        PriorityQueueDispatchingStrategy dispatchingStrategy = new PriorityQueueDispatchingStrategy(selectors, queueNames);
+
+        List<String> queues = dispatchingStrategy.getQueueNames();
+
+        assertEquals(7, queues.size());
+        assertTrue(queues.contains("publish1"));
+        assertTrue(queues.contains("news-publish1"));
+        assertTrue(queues.contains("publish2"));
+        assertTrue(queues.contains("news-publish2"));
+        assertTrue(queues.contains("notes-publish1"));
+        assertTrue(queues.contains("important-publish1"));
+        assertTrue(queues.contains("important-publish2"));
+
+    }
+
+
+
+    @Test
+    public void testQueueMatching() throws Exception {
+        PriorityQueueDispatchingStrategy dispatchingStrategy = new PriorityQueueDispatchingStrategy(selectors, queueNames);
+
+        Map<String, String> matchedQueues = dispatchingStrategy.getMatchingQueues(null);
+
+        assertEquals(5, matchedQueues.size());
+        assertEquals("publish1", matchedQueues.get("news-publish1"));
+        assertEquals("publish1", matchedQueues.get("notes-publish1"));
+        assertEquals("publish2", matchedQueues.get("news-publish2"));
+        assertEquals("publish1", matchedQueues.get("important-publish1"));
+        assertEquals("publish2", matchedQueues.get("important-publish2"));
+    }
+
+
+    @Test
+    public void testPathQueueMatching() throws Exception {
+        PriorityQueueDispatchingStrategy dispatchingStrategy = new PriorityQueueDispatchingStrategy(selectors, queueNames);
+
+        Map<String, String> matchedQueues = dispatchingStrategy.getMatchingQueues(new String[] { "/content/news/a" });
+
+        assertEquals(2, matchedQueues.size());
+        assertEquals("publish1", matchedQueues.get("news-publish1"));
+        assertEquals("publish2", matchedQueues.get("news-publish2"));
+
+
+        matchedQueues = dispatchingStrategy.getMatchingQueues(new String[] { "/content/notes" });
+
+        assertEquals(1, matchedQueues.size());
+        assertEquals("publish1", matchedQueues.get("notes-publish1"));
+
+        matchedQueues = dispatchingStrategy.getMatchingQueues(new String[] { "/content/notes/a" });
+        assertEquals(0, matchedQueues.size());
+
+        matchedQueues = dispatchingStrategy.getMatchingQueues(new String[] { "/content/other" });
+        assertEquals(0, matchedQueues.size());
+
+        matchedQueues = dispatchingStrategy.getMatchingQueues(new String[] { "/content/important" });
+        assertEquals(2, matchedQueues.size());
+        assertEquals("publish1", matchedQueues.get("important-publish1"));
+        assertEquals("publish2", matchedQueues.get("important-publish2"));
+
+    }
+
+
+
+    @Test
+    public void testMatchingDispatching() throws Exception {
+        PriorityQueueDispatchingStrategy dispatchingStrategy = new PriorityQueueDispatchingStrategy(selectors, queueNames);
+
+
+        DistributionPackage distributionPackage = mock(SharedDistributionPackage.class);
+        DistributionQueueProvider queueProvider = mock(DistributionQueueProvider.class);
+
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put(DistributionPackageInfo.PROPERTY_REQUEST_PATHS, new String[] { "/content/news/a" });
+        when(distributionPackage.getInfo()).thenReturn(new DistributionPackageInfo("vlt", properties));
+
+        DistributionQueue news1 = mock(DistributionQueue.class);
+        when(news1.getName()).thenReturn("news-publish1");
+        when(queueProvider.getQueue("news-publish1")).thenReturn(news1);
+
+        DistributionQueue news2 = mock(DistributionQueue.class);
+        when(news2.getName()).thenReturn("news-publish2");
+        when(queueProvider.getQueue("news-publish2")).thenReturn(news2);
+
+        dispatchingStrategy.add(distributionPackage, queueProvider);
+
+        verify(queueProvider).getQueue("news-publish1");
+        verify(queueProvider).getQueue("news-publish2");
+        verifyNoMoreInteractions(queueProvider);
+    }
+
+    @Test
+    public void testNoMatchingDispatching() throws Exception {
+        PriorityQueueDispatchingStrategy dispatchingStrategy = new PriorityQueueDispatchingStrategy(selectors, queueNames);
+
+
+        DistributionPackage distributionPackage = mock(SharedDistributionPackage.class);
+        DistributionQueueProvider queueProvider = mock(DistributionQueueProvider.class);
+
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put(DistributionPackageInfo.PROPERTY_REQUEST_PATHS, new String[] { "/content/other" });
+        when(distributionPackage.getInfo()).thenReturn(new DistributionPackageInfo("vlt", properties));
+
+        DistributionQueue other1 = mock(DistributionQueue.class);
+        when(other1.getName()).thenReturn("publish1");
+        when(queueProvider.getQueue("publish1")).thenReturn(other1);
+
+        DistributionQueue other2 = mock(DistributionQueue.class);
+        when(other2.getName()).thenReturn("publish2");
+        when(queueProvider.getQueue("publish2")).thenReturn(other2);
+
+        dispatchingStrategy.add(distributionPackage, queueProvider);
+
+        verify(queueProvider).getQueue("publish1");
+        verify(queueProvider).getQueue("publish2");
+        verifyNoMoreInteractions(queueProvider);
+    }
+}