You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by da...@apache.org on 2019/02/01 16:56:56 UTC

[sling-org-apache-sling-feature-extension-content] 22/46: SLING-8085 - adjusting ContentHandler to properly incorporating layering flow as implemented in JCRVLT-319 (based on SNAPSHOT for now) / adding testcoverage

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

davidb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-extension-content.git

commit 2023fafe7591293902f260f3eca355a0566772fc
Author: Dominik Suess <su...@adobe.com>
AuthorDate: Thu Nov 8 15:16:02 2018 +0100

    SLING-8085 - adjusting ContentHandler to properly incorporating layering flow as implemented in JCRVLT-319 (based on SNAPSHOT for now) / adding testcoverage
---
 pom.xml                                            |   2 +-
 .../feature/extension/content/ContentHandler.java  |  14 ++-
 .../extension/content/ContentHandlerTest.java      | 129 +++++++++++++++++++++
 .../extension/content/testpackages/test_a-1.0.zip  | Bin 0 -> 4470 bytes
 .../extension/content/testpackages/test_b-1.0.zip  | Bin 0 -> 4442 bytes
 .../extension/content/testpackages/test_c-1.0.zip  | Bin 0 -> 4402 bytes
 6 files changed, 140 insertions(+), 5 deletions(-)

diff --git a/pom.xml b/pom.xml
index e467dcf..a9d4c04 100644
--- a/pom.xml
+++ b/pom.xml
@@ -112,7 +112,7 @@
         <dependency>
             <groupId>org.apache.jackrabbit.vault</groupId>
             <artifactId>org.apache.jackrabbit.vault</artifactId>
-            <version>3.2.4</version>
+            <version>3.2.5-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
            <dependency>
diff --git a/src/main/java/org/apache/sling/feature/extension/content/ContentHandler.java b/src/main/java/org/apache/sling/feature/extension/content/ContentHandler.java
index 1a57118..8f039b7 100644
--- a/src/main/java/org/apache/sling/feature/extension/content/ContentHandler.java
+++ b/src/main/java/org/apache/sling/feature/extension/content/ContentHandler.java
@@ -21,9 +21,12 @@ import java.io.File;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.LinkedHashMap;
+import java.util.HashSet;
+
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
 
 import org.apache.commons.collections.map.MultiValueMap;
 import org.apache.jackrabbit.vault.packaging.PackageId;
@@ -48,7 +51,7 @@ public class ContentHandler implements ExtensionHandler {
 
     private static final String REGISTRY_FOLDER = "packageregistry";
 
-    private static ExecutionPlanBuilder buildExecutionPlan(Collection<Artifact> artifacts, LauncherPrepareContext prepareContext, File registryHome) throws Exception {
+    private static ExecutionPlanBuilder buildExecutionPlan(Collection<Artifact> artifacts, Set<PackageId> satisfiedPackages, LauncherPrepareContext prepareContext, File registryHome) throws Exception {
 
         List<File> packageReferences = new ArrayList<File>();
 
@@ -67,6 +70,7 @@ public class ContentHandler implements ExtensionHandler {
         FSPackageRegistry registry = new FSPackageRegistry(registryHome);
 
         ExecutionPlanBuilder builder = registry.createExecutionPlan();
+        builder.with(satisfiedPackages);
 
         for (File pkgFile : packageReferences) {
             PackageId pid = registry.registerExternal(pkgFile, true);
@@ -83,6 +87,7 @@ public class ContentHandler implements ExtensionHandler {
             builder.addTask().with(pid).with(Type.EXTRACT);
         }
         builder.validate();
+        satisfiedPackages.addAll(builder.preview());
         return builder;
 
     }
@@ -93,7 +98,7 @@ public class ContentHandler implements ExtensionHandler {
         File registryHome = getRegistryHomeDir(installationContext);
         if (extension.getType() == ExtensionType.ARTIFACTS
                 && extension.getName().equals(FeatureConstants.EXTENSION_NAME_CONTENT_PACKAGES)) {
-            MultiValueMap orderedArtifacts = MultiValueMap.decorate(new LinkedHashMap<Integer, Collection<Artifact>>());
+            MultiValueMap orderedArtifacts = MultiValueMap.decorate(new TreeMap<Integer, Collection<Artifact>>());
             for (final Artifact a : extension.getArtifacts()) {
                 int order;
                 // content-packages without explicit start-order to be installed last
@@ -105,10 +110,11 @@ public class ContentHandler implements ExtensionHandler {
                 orderedArtifacts.put(order, a);
             }
             List<String> executionPlans = new ArrayList<String>();
+            Set<PackageId> satisfiedPackages = new HashSet<>();
             for (Object key : orderedArtifacts.keySet()) {
                 @SuppressWarnings("unchecked")
                 Collection<Artifact> artifacts = orderedArtifacts.getCollection(key);
-                ExecutionPlanBuilder builder = buildExecutionPlan(artifacts, prepareContext, registryHome);
+                ExecutionPlanBuilder builder = buildExecutionPlan(artifacts, satisfiedPackages,  prepareContext, registryHome);
                 ByteArrayOutputStream baos = new ByteArrayOutputStream();
                 builder.save(baos);
                 executionPlans.add(baos.toString("UTF-8"));
diff --git a/src/test/java/org/apache/sling/feature/extension/content/ContentHandlerTest.java b/src/test/java/org/apache/sling/feature/extension/content/ContentHandlerTest.java
new file mode 100644
index 0000000..3e97c18
--- /dev/null
+++ b/src/test/java/org/apache/sling/feature/extension/content/ContentHandlerTest.java
@@ -0,0 +1,129 @@
+/*
+ * 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.feature.extension.content;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.io.File;
+import java.net.URL;
+import java.util.Dictionary;
+import java.util.Iterator;
+
+import org.apache.sling.feature.Artifact;
+import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.Extension;
+import org.apache.sling.feature.ExtensionType;
+import org.apache.sling.feature.launcher.spi.LauncherPrepareContext;
+import org.apache.sling.feature.launcher.spi.extensions.ExtensionInstallationContext;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ContentHandlerTest {
+    
+
+    @Rule
+    public TemporaryFolder testFolder = new TemporaryFolder();
+    
+    @Mock
+    LauncherPrepareContext prepareContext;
+    
+    @Mock
+    ExtensionInstallationContext installationContext;
+    
+    /**
+     * Test package A-1.0. Depends on B and C-1.X
+     */
+    private static final String COORDINATES_TEST_PACKAGE_A_10 = "my_packages:test_a:1.0";
+    private static String TEST_PACKAGE_A_10 = "testpackages/test_a-1.0.zip";
+    private static ArtifactId TEST_PACKAGE_AID_A_10 = ArtifactId.fromMvnId(COORDINATES_TEST_PACKAGE_A_10);
+
+    /**
+     * Test package B-1.0. Depends on C
+     */
+    private static final String COORDINATES_TEST_PACKAGE_B_10 = "my_packages:test_b:1.0";
+    private static String TEST_PACKAGE_B_10 = "testpackages/test_b-1.0.zip";
+    private static ArtifactId TEST_PACKAGE_AID_B_10 = ArtifactId.fromMvnId(COORDINATES_TEST_PACKAGE_B_10);
+
+    /**
+     * Test package C-1.0
+     */
+    private static final String COORDINATES_TEST_PACKAGE_C_10 = "my_packages:test_c:1.0";
+    private static String TEST_PACKAGE_C_10 = "testpackages/test_c-1.0.zip";
+    private static ArtifactId TEST_PACKAGE_AID_C_10 = ArtifactId.fromMvnId(COORDINATES_TEST_PACKAGE_C_10);
+
+    @Before
+    public void setUp() throws Exception {
+        URL test_a = this.getClass().getResource(TEST_PACKAGE_A_10);
+        when(prepareContext.getArtifactFile(TEST_PACKAGE_AID_A_10)).thenReturn(new File(test_a.getFile()));
+        URL test_b = this.getClass().getResource(TEST_PACKAGE_B_10);
+        when(prepareContext.getArtifactFile(TEST_PACKAGE_AID_B_10)).thenReturn(new File(test_b.getFile()));
+        URL test_c = this.getClass().getResource(TEST_PACKAGE_C_10);
+        when(prepareContext.getArtifactFile(TEST_PACKAGE_AID_C_10)).thenReturn(new File(test_c.getFile()));
+    }
+
+    @Test
+    public void testMultipleStartOrders() throws Exception {
+        ContentHandler ch = new ContentHandler();
+        System.setProperty(ContentHandler.PACKAGEREGISTRY_HOME, testFolder.getRoot().toString());
+        Extension ext = new Extension(ExtensionType.ARTIFACTS, "content-packages", false);
+        Artifact artifact_a = new Artifact(TEST_PACKAGE_AID_A_10);
+        Artifact artifact_b = new Artifact(TEST_PACKAGE_AID_B_10);
+        Artifact artifact_c = new Artifact(TEST_PACKAGE_AID_C_10);
+        artifact_a.getMetadata().put("start-order", "2");
+        artifact_b.getMetadata().put("start-order", "1");
+        artifact_c.getMetadata().put("start-order", "1");
+        ext.getArtifacts().add(artifact_a);
+        ext.getArtifacts().add(artifact_b);
+        ext.getArtifacts().add(artifact_c);
+        @SuppressWarnings("unchecked")
+        ArgumentCaptor<Dictionary<String, Object>> executionPlanCaptor = ArgumentCaptor.forClass(Dictionary.class);
+        
+        ch.handle(ext, prepareContext, installationContext);
+        verify(installationContext).addConfiguration(eq("org.apache.sling.jcr.packageinit.impl.ExecutionPlanRepoInitializer"), any(), executionPlanCaptor.capture());
+        verify(installationContext).addConfiguration(eq("org.apache.jackrabbit.vault.packaging.registry.impl.FSPackageRegistry"), any(), any());
+        Iterator<Dictionary<String, Object>> dictIt = executionPlanCaptor.getAllValues().iterator();
+        final String[] executionplans = (String[]) dictIt.next().get("executionplans");
+        final String expected_0 =
+                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+                        "<executionPlan version=\"1.0\">\n" +
+                        "    <task cmd=\"extract\" packageId=\"my_packages:test_c:1.0\"/>\n" +
+                        "    <task cmd=\"extract\" packageId=\"my_packages:test_b:1.0\"/>\n" +
+                        "</executionPlan>\n";
+
+        assertEquals(expected_0, executionplans[0]);
+        final String expected_1 =
+                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+                        "<executionPlan version=\"1.0\">\n" +
+                        "    <task cmd=\"extract\" packageId=\"my_packages:test_a:1.0\"/>\n" +
+                        "</executionPlan>\n";
+
+        assertEquals(expected_1, executionplans[1]);
+        assertFalse(dictIt.hasNext());
+    }
+}
diff --git a/src/test/resources/org/apache/sling/feature/extension/content/testpackages/test_a-1.0.zip b/src/test/resources/org/apache/sling/feature/extension/content/testpackages/test_a-1.0.zip
new file mode 100644
index 0000000..08df03a
Binary files /dev/null and b/src/test/resources/org/apache/sling/feature/extension/content/testpackages/test_a-1.0.zip differ
diff --git a/src/test/resources/org/apache/sling/feature/extension/content/testpackages/test_b-1.0.zip b/src/test/resources/org/apache/sling/feature/extension/content/testpackages/test_b-1.0.zip
new file mode 100644
index 0000000..85fac13
Binary files /dev/null and b/src/test/resources/org/apache/sling/feature/extension/content/testpackages/test_b-1.0.zip differ
diff --git a/src/test/resources/org/apache/sling/feature/extension/content/testpackages/test_c-1.0.zip b/src/test/resources/org/apache/sling/feature/extension/content/testpackages/test_c-1.0.zip
new file mode 100644
index 0000000..245291a
Binary files /dev/null and b/src/test/resources/org/apache/sling/feature/extension/content/testpackages/test_c-1.0.zip differ