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