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 <[email protected]> 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
