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 2020/11/11 09:14:48 UTC
[sling-org-apache-sling-feature-cpconverter] branch master updated:
SLING-9894 - setting explicit dependency from embedded to non-container
parent to ensure same install order as in osgi installer (implicit
ordering)
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-cpconverter.git
The following commit(s) were added to refs/heads/master by this push:
new caca4a2 SLING-9894 - setting explicit dependency from embedded to non-container parent to ensure same install order as in osgi installer (implicit ordering)
new 16b2599 Merge pull request #34 from DominikSuess/issue/SLING-9894
caca4a2 is described below
commit caca4a2127e5a0c4c5c12b992bc6ca4ad639ef21
Author: Dominik Suess <su...@adobe.com>
AuthorDate: Tue Nov 10 18:19:42 2020 +0100
SLING-9894 - setting explicit dependency from embedded to non-container parent to ensure same install order as in osgi installer (implicit ordering)
---
.../ContentPackage2FeatureModelConverter.java | 13 +++++++++-
.../handlers/AbstractContentPackageHandler.java | 10 ++++++--
.../handlers/ContentPackageEntryHandler.java | 9 ++++---
.../VersionResolverContentPackageEntryHandler.java | 2 +-
.../cpconverter/vltpkg/VaultPackageAssembler.java | 11 +++++++-
.../ContentPackage2FeatureModelConverterTest.java | 28 ++++++++++++++++++++-
.../cpconverter/embedded.package.test-0.0.1.zip | Bin 0 -> 10023 bytes
7 files changed, 64 insertions(+), 9 deletions(-)
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
index 8a0fc92..fb1e5be 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
@@ -28,6 +28,7 @@ import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Properties;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern;
@@ -267,7 +268,7 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
idPackageMapping.remove(pack.getId());
}
- public void processSubPackage(String path, String runMode, VaultPackage vaultPackage) throws Exception {
+ public void processSubPackage(String path, String runMode, VaultPackage vaultPackage, boolean isEmbeddedPackage) throws Exception {
requireNonNull(path, "Impossible to process a null vault package");
requireNonNull(vaultPackage, "Impossible to process a null vault package");
@@ -286,12 +287,22 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
// temporary swap the main handler to collect stuff
VaultPackageAssembler handler = mainPackageAssembler;
assemblers.add(handler);
+ Properties parentProps = handler.getPackageProperties();
+ boolean isContainerPackage = PackageType.CONTAINER.equals(parentProps.get(PackageProperties.NAME_PACKAGE_TYPE));
mainPackageAssembler = clonedPackage;
// scan the detected package, first
traverse(vaultPackage);
clonedPackage.updateDependencies(mutableContentsIds);
+
+ //set dependency to parent package if the parent package is an application package & subpackage is embedded
+ if (isEmbeddedPackage && !isContainerPackage) {
+ PackageId parentId = new PackageId((String)parentProps.get(PackageProperties.NAME_GROUP),
+ (String)parentProps.get(PackageProperties.NAME_NAME),
+ (String)parentProps.get(PackageProperties.NAME_VERSION));
+ clonedPackage.addDependency(new Dependency(parentId));
+ }
File contentPackageArchive = clonedPackage.createPackage();
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java
index 4853fd2..1b8056c 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java
@@ -21,10 +21,13 @@ import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import org.apache.commons.io.IOUtils;
import org.apache.jackrabbit.vault.fs.io.Archive;
import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
+import org.apache.jackrabbit.vault.packaging.Dependency;
+import org.apache.jackrabbit.vault.packaging.PackageId;
import org.apache.jackrabbit.vault.packaging.VaultPackage;
import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
import org.codehaus.plexus.util.StringUtils;
@@ -35,6 +38,8 @@ public abstract class AbstractContentPackageHandler extends AbstractRegexEntryHa
private final File temporaryDir = new File(System.getProperty("java.io.tmpdir"), "sub-content-packages");
+ private final Pattern EMBEDDED_PACKAGE_PATTERN = Pattern.compile("/jcr_root/apps/.+/install(?:\\\\.([^/]+))?/.+.zip");
+
public AbstractContentPackageHandler() {
super("/jcr_root/(?:etc/packages|apps/.+/install(?:\\.([^/]+))?)/.+.zip");
temporaryDir.mkdirs();
@@ -85,13 +90,14 @@ public abstract class AbstractContentPackageHandler extends AbstractRegexEntryHa
logger.debug("Runmode {} was extracted from path {}", runMode, path);
}
+ boolean isEmbeddedPackage = EMBEDDED_PACKAGE_PATTERN.matcher(path).matches();
try (VaultPackage vaultPackage = converter.open(temporaryContentPackage)) {
- processSubPackage(path, runMode, vaultPackage, converter);
+ processSubPackage(path, runMode, vaultPackage, converter, isEmbeddedPackage);
}
logger.info("Sub-content package '{}' processing is over", entry.getName());
}
- protected abstract void processSubPackage(String path, String runMode, VaultPackage contentPackage, ContentPackage2FeatureModelConverter converter) throws Exception;
+ protected abstract void processSubPackage(String path, String runMode, VaultPackage contentPackage, ContentPackage2FeatureModelConverter converter, boolean isEmbeddedPackage) throws Exception;
}
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/handlers/ContentPackageEntryHandler.java b/src/main/java/org/apache/sling/feature/cpconverter/handlers/ContentPackageEntryHandler.java
index 573d01b..c1d4c2d 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/handlers/ContentPackageEntryHandler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/handlers/ContentPackageEntryHandler.java
@@ -22,9 +22,12 @@ import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter
public final class ContentPackageEntryHandler extends AbstractContentPackageHandler {
@Override
- protected void processSubPackage(String path, String runMode, VaultPackage contentPackage, ContentPackage2FeatureModelConverter converter)
- throws Exception {
- converter.processSubPackage(path, runMode, contentPackage);
+ protected void processSubPackage(String path, String runMode,
+ VaultPackage contentPackage,
+ ContentPackage2FeatureModelConverter converter,
+ boolean isEmbeddedPackage) throws Exception {
+ converter.processSubPackage(path, runMode, contentPackage, isEmbeddedPackage);
+
}
}
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/handlers/VersionResolverContentPackageEntryHandler.java b/src/main/java/org/apache/sling/feature/cpconverter/handlers/VersionResolverContentPackageEntryHandler.java
index e4e9a8e..ac143cb 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/handlers/VersionResolverContentPackageEntryHandler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/handlers/VersionResolverContentPackageEntryHandler.java
@@ -39,7 +39,7 @@ public final class VersionResolverContentPackageEntryHandler extends AbstractCon
}
@Override
- protected void processSubPackage(String path, String runMode, VaultPackage contentPackage, ContentPackage2FeatureModelConverter converter)
+ protected void processSubPackage(String path, String runMode, VaultPackage contentPackage, ContentPackage2FeatureModelConverter converter, boolean isEmbeddedPackage)
throws Exception {
boolean addPackage = false;
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
index ce24227..eaff712 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
@@ -70,7 +70,7 @@ public class VaultPackageAssembler implements EntryHandler, FileFilter {
private static final File TMP_DIR = new File(System.getProperty("java.io.tmpdir"), "synthetic-content-packages");
private static final Pattern OSGI_BUNDLE_PATTERN = Pattern.compile("(jcr_root)?/apps/[^/]+/install(\\.([^/]+))?/.+\\.jar");
-
+
public static VaultPackageAssembler create(VaultPackage vaultPackage) {
return create(vaultPackage, vaultPackage.getMetaInf().getFilter());
}
@@ -158,6 +158,10 @@ public class VaultPackageAssembler implements EntryHandler, FileFilter {
this.properties = properties;
this.dependencies = dependencies;
}
+
+ public Properties getPackageProperties() {
+ return this.properties;
+ }
public void mergeFilters(WorkspaceFilter filter) {
for (PathFilterSet pathFilterSet : filter.getFilterSets()) {
@@ -213,6 +217,11 @@ public class VaultPackageAssembler implements EntryHandler, FileFilter {
dependencies.addAll(match.getValue());
}
}
+
+
+ public void addDependency(Dependency dependency) {
+ dependencies.add(dependency);
+ }
public File createPackage() throws IOException {
return createPackage(TMP_DIR);
diff --git a/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java b/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
index 3b6693a..d98540a 100644
--- a/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
+++ b/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
@@ -49,9 +49,11 @@ import javax.json.JsonObject;
import org.apache.commons.io.FileUtils;
import org.apache.jackrabbit.vault.packaging.CyclicDependencyException;
+import org.apache.jackrabbit.vault.packaging.PackageId;
import org.apache.jackrabbit.vault.packaging.PackageProperties;
import org.apache.jackrabbit.vault.packaging.VaultPackage;
import org.apache.jackrabbit.vault.packaging.impl.PackageManagerImpl;
+import org.apache.maven.model.Dependency;
import org.apache.sling.feature.ArtifactId;
import org.apache.sling.feature.Artifacts;
import org.apache.sling.feature.Extension;
@@ -121,7 +123,7 @@ public class ContentPackage2FeatureModelConverterTest {
@Test(expected = NullPointerException.class)
public void processRequiresNotNullPackage() throws Exception {
- converter.processSubPackage("", null, null);
+ converter.processSubPackage("", null, null, false);
}
@Test
@@ -422,6 +424,30 @@ public class ContentPackage2FeatureModelConverterTest {
.setEmitter(DefaultPackagesEventsEmitter.open(outputDirectory))
.convert(packageFile);
}
+
+ /** app package containing another app package must lead to an explicit dependency from
+ * embedded to embedding package to reflect the implicit installation order via osgi Installer
+ **/
+
+ @Test
+ public void verifyEmbeddedDependency() throws Exception {
+ URL packageUrl = getClass().getResource("embedded.package.test-0.0.1.zip");
+ File packageFile = FileUtils.toFile(packageUrl);
+
+ File outputDirectory = new File(System.getProperty("java.io.tmpdir"), getClass().getName() + '_' + System.currentTimeMillis());
+
+ converter.setFeaturesManager(new DefaultFeaturesManager(true, 5, outputDirectory, null, null, null))
+ .setBundlesDeployer(new DefaultArtifactsDeployer(outputDirectory))
+ .setEmitter(DefaultPackagesEventsEmitter.open(outputDirectory))
+ .convert(packageFile);
+
+ File contentPackage = new File(outputDirectory, "asd/sample/embedded.test.app/0.0.0/embedded.test.app-0.0.0-cp2fm-converted.zip");
+ VaultPackage vaultPackage = new PackageManagerImpl().open(contentPackage);
+ String dependencies = vaultPackage.getProperties().getProperty(PackageProperties.NAME_DEPENDENCIES);
+ org.apache.jackrabbit.vault.packaging.Dependency dep = org.apache.jackrabbit.vault.packaging.Dependency.fromString(dependencies);
+ PackageId targetId = PackageId.fromString("asd/sample:embedded.package.test:0.0.1-cp2fm-converted");
+ assertTrue(dep.matches(targetId));
+ }
@Test(expected = IllegalStateException.class)
public void doesNotAllowSameConfigurationPidForSameRunmode() throws Exception {
diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/embedded.package.test-0.0.1.zip b/src/test/resources/org/apache/sling/feature/cpconverter/embedded.package.test-0.0.1.zip
new file mode 100644
index 0000000..2f4c929
Binary files /dev/null and b/src/test/resources/org/apache/sling/feature/cpconverter/embedded.package.test-0.0.1.zip differ