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

pauls 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 1b7246b  SLING-10579: fix package types in emitter events (#95)
1b7246b is described below

commit 1b7246b876076b6c0e41356a310eb1e02929724c
Author: Karl Pauls <[email protected]>
AuthorDate: Fri Jul 2 14:42:17 2021 +0200

    SLING-10579: fix package types in emitter events (#95)
    
    
    
    Co-authored-by: angela <[email protected]>
---
 .../ContentPackage2FeatureModelConverter.java      | 115 +++++++++++----------
 .../features/DefaultFeaturesManager.java           |  44 +++-----
 .../AbstractConfigurationEntryHandler.java         |   2 +-
 .../handlers/AbstractUserEntryHandler.java         |  11 +-
 .../vltpkg/DefaultPackagesEventsEmitter.java       |  46 +++++----
 .../cpconverter/vltpkg/PackagesEventsEmitter.java  |  40 ++++++-
 .../ContentPackage2FeatureModelConverterTest.java  |  29 ++++++
 .../ConverterUserAndPermissionTest.java            |   2 +
 .../vltpkg/PackagesEventsEmitterTest.java          |  10 +-
 .../apache/sling/feature/cpconverter/demo-cp2.zip  | Bin 14913 -> 14902 bytes
 10 files changed, 173 insertions(+), 126 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 cbc994c..a02f1a5 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
@@ -195,12 +195,17 @@ public class ContentPackage2FeatureModelConverter extends 
BaseVaultPackageScanne
         this.aclManager = aclManager;
         return this;
     }
+    
+    public boolean hasMainPackageAssembler() {
+        return mainPackageAssembler != null;
+    }
 
-    public @Nullable VaultPackageAssembler getMainPackageAssembler() {
-        return mainPackageAssembler;
+    public @NotNull VaultPackageAssembler getMainPackageAssembler() {
+        // verify that mainPackageAssembler has been set before retrieving it
+        return Objects.requireNonNull(mainPackageAssembler);
     }
 
-    public @NotNull ContentPackage2FeatureModelConverter 
setMainPackageAssembler(@Nullable VaultPackageAssembler assembler) {
+    public @NotNull ContentPackage2FeatureModelConverter 
setMainPackageAssembler(@NotNull VaultPackageAssembler assembler) {
         this.mainPackageAssembler = assembler;
         return this;
     }
@@ -292,22 +297,20 @@ public class ContentPackage2FeatureModelConverter extends 
BaseVaultPackageScanne
                 logger.info("Converting content-package '{}'...", 
vaultPackage.getId());
 
                 traverse(vaultPackage);
-                // attach all unmatched resources as new content-package
 
-                File contentPackageArchive = 
getMainPackageAssembler().createPackage();
+                // retrieve the resulting zip-content-package and deploy it to 
the local mvn bundles dir.
+                try (VaultPackage result = 
processContentPackageArchive(getMainPackageAssembler(), null)) {
 
-                // deploy the new zip content-package to the local mvn bundles 
dir
+                    // finally serialize the Feature Model(s) file(s)
 
-                processContentPackageArchive(contentPackageArchive, 
getMainPackageAssembler(), null);
+                    aclManager.addRepoinitExtension(assemblers, 
featuresManager);
 
-                // finally serialize the Feature Model(s) file(s)
+                    logger.info("Conversion complete!");
 
-                aclManager.addRepoinitExtension(assemblers, featuresManager);
+                    featuresManager.serialize();
 
-                logger.info("Conversion complete!");
-
-                featuresManager.serialize();
-                emitters.stream().forEach(PackagesEventsEmitter::endPackage);
+                    emitters.stream().forEach(e -> 
e.endPackage(vaultPackage.getId(), result));
+                }
             } finally {
                 aclManager.reset();
                 assemblers.clear();
@@ -379,57 +382,58 @@ public class ContentPackage2FeatureModelConverter extends 
BaseVaultPackageScanne
             clonedPackage.addDependency(new Dependency(parentId));
         }
 
-        File contentPackageArchive = clonedPackage.createPackage();
-
         // deploy the new content-package to the local mvn bundles dir and 
attach it to the feature
-        processContentPackageArchive(contentPackageArchive, clonedPackage, 
runMode);
+        try (VaultPackage result = processContentPackageArchive(clonedPackage, 
runMode)) {
+            emitters.stream().forEach(e -> e.endSubPackage(path, 
vaultPackage.getId(), result));
+        }
 
         // restore the previous assembler
         setMainPackageAssembler(handler);
-
-        emitters.stream().forEach(PackagesEventsEmitter::endSubPackage);
     }
 
-    public void processContentPackageArchive(@NotNull File 
contentPackageArchive, @NotNull VaultPackageAssembler assembler,
+    private @NotNull VaultPackage processContentPackageArchive(@NotNull 
VaultPackageAssembler assembler,
                                              @Nullable String runMode) throws 
Exception {
-        try (VaultPackage vaultPackage = open(contentPackageArchive)) {
-            PackageType packageType = detectPackageType(vaultPackage);
-
-            // SLING-8608 - Fail the conversion if the resulting attached 
content-package is MIXED type
-            if (PackageType.MIXED == packageType && failOnMixedPackages) {
-                throw new IllegalStateException("Generated content-package '"
-                        + vaultPackage.getId()
-                        + "' located in file "
-                        + contentPackageArchive
-                        + " is of MIXED type");
-            }
+        File contentPackageArchive = assembler.createPackage();
 
-            ArtifactId mvnPackageId = toArtifactId(vaultPackage.getId(), 
contentPackageArchive);
-            // special handling for converted packages of type content
-            if (PackageType.CONTENT == packageType) {
-                switch (contentTypePackagePolicy) {
-                    case DROP:
-                        mutableContentsIds.put(vaultPackage.getId(), 
getDependencies(vaultPackage));
-                        logger.info("Dropping package of PackageType.CONTENT 
{} (content-package id: {})",
-                                mvnPackageId.getArtifactId(), 
vaultPackage.getId());
-                        break;
-                    case PUT_IN_DEDICATED_FOLDER:
-                        mutableContentsIds.put(vaultPackage.getId(), 
getDependencies(vaultPackage));
-                        // deploy the new content-package to the unreferenced 
artifacts deployer
-                        if (unreferencedArtifactsDeployer == null) {
-                            throw new 
IllegalStateException("ContentTypePackagePolicy PUT_IN_DEDICATED_FOLDER 
requires a valid deployer ");
-                        }
-                        unreferencedArtifactsDeployer.deploy(new 
FileArtifactWriter(contentPackageArchive), mvnPackageId);
-                        logger.info("Put converted package of 
PackageType.CONTENT {} (content-package id: {}) in {} (not referenced in 
feature model)",
-                                mvnPackageId.getArtifactId(), 
vaultPackage.getId(), unreferencedArtifactsDeployer.getBaseDirectory());
-                        break;
-                    case REFERENCE:
-                        deploy(assembler, mvnPackageId, runMode);
-                }
-            } else {
-                deploy(assembler, mvnPackageId, runMode);
+        VaultPackage vaultPackage = open(contentPackageArchive);
+
+        PackageType packageType = detectPackageType(vaultPackage);
+
+        // SLING-8608 - Fail the conversion if the resulting attached 
content-package is MIXED type
+        if (PackageType.MIXED == packageType && failOnMixedPackages) {
+            throw new IllegalStateException("Generated content-package '"
+                    + vaultPackage.getId()
+                    + "' located in file "
+                    + contentPackageArchive
+                    + " is of MIXED type");
+        }
+
+        ArtifactId mvnPackageId = toArtifactId(vaultPackage.getId(), 
contentPackageArchive);
+        // special handling for converted packages of type content
+        if (PackageType.CONTENT == packageType) {
+            switch (contentTypePackagePolicy) {
+                case DROP:
+                    mutableContentsIds.put(vaultPackage.getId(), 
getDependencies(vaultPackage));
+                    logger.info("Dropping package of PackageType.CONTENT {} 
(content-package id: {})",
+                            mvnPackageId.getArtifactId(), 
vaultPackage.getId());
+                    break;
+                case PUT_IN_DEDICATED_FOLDER:
+                    mutableContentsIds.put(vaultPackage.getId(), 
getDependencies(vaultPackage));
+                    // deploy the new content-package to the unreferenced 
artifacts deployer
+                    if (unreferencedArtifactsDeployer == null) {
+                        throw new 
IllegalStateException("ContentTypePackagePolicy PUT_IN_DEDICATED_FOLDER 
requires a valid deployer ");
+                    }
+                    unreferencedArtifactsDeployer.deploy(new 
FileArtifactWriter(contentPackageArchive), mvnPackageId);
+                    logger.info("Put converted package of PackageType.CONTENT 
{} (content-package id: {}) in {} (not referenced in feature model)",
+                            mvnPackageId.getArtifactId(), 
vaultPackage.getId(), unreferencedArtifactsDeployer.getBaseDirectory());
+                    break;
+                case REFERENCE:
+                    deploy(assembler, mvnPackageId, runMode);
             }
+        } else {
+            deploy(assembler, mvnPackageId, runMode);
         }
+        return vaultPackage;
     }
 
     public void deployPackages() {
@@ -466,7 +470,7 @@ public class ContentPackage2FeatureModelConverter extends 
BaseVaultPackageScanne
         return subContentPackages.containsValue(path);
     }
 
-    private boolean process(@NotNull String entryPath, @NotNull Archive 
archive, @Nullable Entry entry) throws Exception {
+    private void process(@NotNull String entryPath, @NotNull Archive archive, 
@Nullable Entry entry) throws Exception {
         if (resourceFilter != null && resourceFilter.isFilteredOut(entryPath)) 
{
             throw new IllegalArgumentException("Path '"
                     + entryPath
@@ -490,7 +494,6 @@ public class ContentPackage2FeatureModelConverter extends 
BaseVaultPackageScanne
         if (!getMainPackageAssembler().recordEntryPath(entryPath)) {
             logger.warn("Duplicate entry path {}", entryPath);
         }
-        return true;
     }
 
     @Override
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManager.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManager.java
index 29452ba..bd6e66c 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManager.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManager.java
@@ -36,6 +36,7 @@ import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.Stack;
 
+import org.apache.jackrabbit.vault.packaging.PackageId;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import org.apache.sling.feature.Artifact;
 import org.apache.sling.feature.ArtifactId;
@@ -73,7 +74,7 @@ public class DefaultFeaturesManager implements 
FeaturesManager, PackagesEventsEm
         ORDERED,
         MERGE,
         STRICT
-    };
+    }
 
     private static final String CONTENT_PACKAGES = "content-packages";
 
@@ -538,49 +539,34 @@ public class DefaultFeaturesManager implements 
FeaturesManager, PackagesEventsEm
             }
         }
     }
-
-    /**
-     * Package converter starts
-     */
+    
+    @Override
     public void start() {
         // nothing to do
     }
 
-    /** 
-     * Package converter ends
-     */
+    @Override
     public void end() {
         // nothing to do
     }
 
-    /**
-     * Package starts
-     * @param vaultPackage the package
-     */
-    public void startPackage(final @NotNull VaultPackage vaultPackage) {
-        packageIds.push(vaultPackage.getId().toString());
+    @Override
+    public void startPackage(@NotNull VaultPackage originalPackage) {
+        packageIds.push(originalPackage.getId().toString());
     }
 
-    /**
-     * Package ends
-     */
-    public void endPackage() {
+    @Override
+    public void endPackage(@NotNull PackageId originalPackageId, @NotNull 
VaultPackage convertedPackage) {
         packageIds.pop();
     }
 
-    /**
-     * Sub package starts
-     * @param path The path
-     * @param vaultPackage the package
-     */
-    public void startSubPackage(final @NotNull String path, final @NotNull 
VaultPackage vaultPackage) {
-        packageIds.push(vaultPackage.getId().toString());
+    @Override
+    public void startSubPackage(@NotNull String path, @NotNull VaultPackage 
originalPackage) {
+        packageIds.push(originalPackage.getId().toString());
     }
 
-    /**
-     * Sub package ends
-     */
-    public void endSubPackage() {
+    @Override
+    public void endSubPackage(@NotNull String path, @NotNull PackageId 
originalPackageId, @NotNull VaultPackage convertedPackage) {
         packageIds.pop();
     }
 }
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractConfigurationEntryHandler.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractConfigurationEntryHandler.java
index fa0b514..2d10caf 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractConfigurationEntryHandler.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractConfigurationEntryHandler.java
@@ -76,7 +76,7 @@ abstract class AbstractConfigurationEntryHandler extends 
AbstractRegexEntryHandl
     
             if (configurationProperties == null) {
                 logger.info("{} entry does not contain a valid OSGi 
configuration, treating it as a regular resource", path);
-                
Objects.requireNonNull(converter.getMainPackageAssembler()).addEntry(path, 
archive, entry);
+                converter.getMainPackageAssembler().addEntry(path, archive, 
entry);
                 return;
             }
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractUserEntryHandler.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractUserEntryHandler.java
index b34871d..f2ab658 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractUserEntryHandler.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractUserEntryHandler.java
@@ -50,16 +50,13 @@ abstract class AbstractUserEntryHandler extends 
AbstractRegexEntryHandler {
             byte[] tmp = IOUtils.toByteArray((archive.openInputStream(entry)));
             AbstractUserParser parser = createParser(converter, originalPath, 
intermediatePath);
             boolean converted = parser.parse(new ByteArrayInputStream(tmp));
-            if (!converted && !path.contains(systemUserSegment)) {
+            if (!converted && !path.contains(systemUserSegment) && 
converter.hasMainPackageAssembler()) {
                 // write back regular users, groups and their intermediate 
folders that did not get converted into
                 // repo-init statements to the content package
                 VaultPackageAssembler assembler = 
converter.getMainPackageAssembler();
-                // if we don't have an assembler we are in the firstPass and 
are only collecting
-                if (assembler != null) {
-                    try (InputStream input = new ByteArrayInputStream(tmp);
-                         OutputStream output = assembler.createEntry(path)) {
-                        IOUtils.copy(input, output);
-                    }
+                try (InputStream input = new ByteArrayInputStream(tmp);
+                     OutputStream output = assembler.createEntry(path)) {
+                    IOUtils.copy(input, output);
                 }
             }
         }
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/DefaultPackagesEventsEmitter.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/DefaultPackagesEventsEmitter.java
index 3b2433c..ce54263 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/DefaultPackagesEventsEmitter.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/DefaultPackagesEventsEmitter.java
@@ -60,6 +60,10 @@ public final class DefaultPackagesEventsEmitter implements 
PackagesEventsEmitter
     private static final String FILENAME = "content-packages.csv";
 
     private static final String PATH_SEPARATOR_CHAR = "!";
+    /**
+     * placeholder used in the idOutputLine for the package type until the 
final package is given in the end call
+     */
+    private static final String PACKAGE_TYPE = "PACKAGE_TYPE";
 
     public static @NotNull DefaultPackagesEventsEmitter open(@NotNull File 
featureModelsOutputDirectory) throws IOException {
         if (!featureModelsOutputDirectory.exists()) {
@@ -74,7 +78,7 @@ public final class DefaultPackagesEventsEmitter implements 
PackagesEventsEmitter
 
     private final Stack<PackageId> hierarchy = new Stack<>();
     
-    private final Collection<VaultPackage> packages = new LinkedList<>();
+    private final Collection<VaultPackage> dependenciesOnly = new 
LinkedList<>();
     
     private final Map<PackageId, String> idOutputLine = new HashMap<>();
 
@@ -95,8 +99,8 @@ public final class DefaultPackagesEventsEmitter implements 
PackagesEventsEmitter
     @Override
     public void end() {
         try {
-            DependencyUtil.sort(packages);
-            for (VaultPackage pkg : packages) {
+            DependencyUtil.sort(dependenciesOnly);
+            for (VaultPackage pkg : dependenciesOnly) {
                 writer.printf(idOutputLine.get(pkg.getId()));
             }
 
@@ -112,40 +116,38 @@ public final class DefaultPackagesEventsEmitter 
implements PackagesEventsEmitter
     }
 
     @Override
-    public void startPackage(@NotNull VaultPackage vaultPackage) {
-        PackageId id = vaultPackage.getId();
-        Dependency[] dependencies = vaultPackage.getDependencies();
-        paths.add(vaultPackage.getFile().getAbsolutePath());
+    public void startPackage(@NotNull VaultPackage originalPackage) {
+        PackageId id = originalPackage.getId();
+        Dependency[] dependencies = originalPackage.getDependencies();
+        paths.add(originalPackage.getFile().getAbsolutePath());
         hierarchy.add(id);
-        current = vaultPackage;
+        current = originalPackage;
 
-        packages.add(getDepOnlyPackage(id, dependencies));
+        dependenciesOnly.add(getDepOnlyPackage(id, dependencies));
         idOutputLine.put(id, String.format("%s,%s,%s,,,\n",
             paths.peek(),
             hierarchy.peek(),
-            detectPackageType(vaultPackage)));
+                PACKAGE_TYPE));
     }
 
-   
-
     @Override
-    public void endPackage() {
+    public void endPackage(@NotNull PackageId originalPackageId, @NotNull 
VaultPackage convertedPackage) {
+        idOutputLine.computeIfPresent(originalPackageId, (key, value) -> 
value.replace(PACKAGE_TYPE, detectPackageType(convertedPackage).toString()));
         paths.pop();
         hierarchy.pop();
     }
 
     @Override
-    public void startSubPackage(@NotNull String path, @NotNull VaultPackage 
vaultPackage) {
-        PackageId id = vaultPackage.getId();
-        Dependency[] dependencies = vaultPackage.getDependencies();
+    public void startSubPackage(@NotNull String path, @NotNull VaultPackage 
originalPackage) {
+        Dependency[] dependencies = originalPackage.getDependencies();
         paths.add(path);
         String absolutePath = 
paths.stream().collect(joining(PATH_SEPARATOR_CHAR));
 
-        packages.add(getDepOnlyPackage(id, dependencies));
-        idOutputLine.put(vaultPackage.getId(), 
String.format("%s,%s,%s,%s,%s,%s\n",
+        PackageId id = originalPackage.getId();
+        dependenciesOnly.add(getDepOnlyPackage(id, dependencies));
+        idOutputLine.put(id, String.format("%s,%s,%s,%s,%s,%s\n",
             current.getFile().getAbsolutePath(),
-            id,
-            detectPackageType(vaultPackage),
+            id, PACKAGE_TYPE,
             hierarchy.peek(),
             path,
             absolutePath));
@@ -154,8 +156,8 @@ public final class DefaultPackagesEventsEmitter implements 
PackagesEventsEmitter
     }
 
     @Override
-    public void endSubPackage() {
-        endPackage();
+    public void endSubPackage(@NotNull String path, @NotNull PackageId 
originalPackageId, @NotNull VaultPackage convertedPackage) {
+        endPackage(originalPackageId,convertedPackage);
     }
     
     static @NotNull VaultPackage getDepOnlyPackage(@NotNull PackageId id,
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitter.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitter.java
index b8488ca..00dbe2f 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitter.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitter.java
@@ -16,21 +16,51 @@
  */
 package org.apache.sling.feature.cpconverter.vltpkg;
 
+import org.apache.jackrabbit.vault.packaging.PackageId;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import org.jetbrains.annotations.NotNull;
 
 public interface PackagesEventsEmitter {
 
+    /**
+     * Package converter starts
+     */
     void start();
 
+    /**
+     * Package converter ends
+     */
     void end();
 
-    void startPackage(@NotNull VaultPackage vaultPackage);
+    /**
+     * Marks the start of the given original package.
+     *
+     * @param originalPackage the package to be converted.
+     */
+    void startPackage(@NotNull VaultPackage originalPackage);
 
-    void endPackage();
+    /**
+     * Marks the end of the conversion of the package with {@code 
originalPackageId}.
+     * 
+     *  @param originalPackageId The id of the original package as passed to 
{@link #startPackage(VaultPackage)}. 
+     * @param convertedPackage the converted package.
+     */
+    void endPackage(@NotNull PackageId originalPackageId, @NotNull 
VaultPackage convertedPackage);
 
-    void startSubPackage(@NotNull String path, @NotNull VaultPackage 
vaultPackage);
-
-    void endSubPackage();
+    /**
+     * Marks the start of the given sub package.
+     * 
+     * @param path The path of the sub package in the original parent package
+     * @param originalPackage the sub package to be converted.
+     */
+    void startSubPackage(@NotNull String path, @NotNull VaultPackage 
originalPackage);
 
+    /**
+     * Marks the end of the conversion of the sub package with {@code 
originalPackageId}.
+     *
+     * @param path The path of the original sub package in the parent package
+     * @param originalPackageId The id of the original sub package as passed 
to {@link #startSubPackage(String, VaultPackage)}.
+     * @param convertedPackage the converted package
+     */
+    void endSubPackage(@NotNull String path, @NotNull PackageId 
originalPackageId, @NotNull VaultPackage convertedPackage);
 }
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 5bdd248..1f82f3a 100644
--- 
a/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
+++ 
b/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
@@ -52,6 +52,7 @@ import 
org.apache.jackrabbit.vault.fs.spi.PrivilegeDefinitions;
 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.PackageType;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import org.apache.jackrabbit.vault.packaging.impl.PackageManagerImpl;
 import org.apache.jackrabbit.vault.util.Constants;
@@ -852,6 +853,34 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
         }
     }
 
+    /**
+     * "demo-cp2.zip" contains no application content below /apps.
+     * The content package therefore gets type CONTENT assigned (and not 
MIXED).
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testConvertedCONTENTPackageHasTypeCalculatedCorrectly() throws 
Exception {
+        URL packageUrl = getClass().getResource("demo-cp2.zip");
+        File packageFile = FileUtils.toFile(packageUrl);
+        File outputDirectory = new File(System.getProperty("java.io.tmpdir"), 
getClass().getName() + '_' + System.currentTimeMillis());
+
+        File unrefOutputDir = new File(outputDirectory, "unref");
+
+        converter.setFeaturesManager(new DefaultFeaturesManager(true, 5, 
outputDirectory, null, null, null, new DefaultAclManager()))
+                .setUnreferencedArtifactsDeployer(new 
LocalMavenRepositoryArtifactsDeployer(unrefOutputDir))
+                
.setContentTypePackagePolicy(PackagePolicy.PUT_IN_DEDICATED_FOLDER)
+                .setEmitter(DefaultPackagesEventsEmitter.open(outputDirectory))
+                .convert(packageFile);
+
+        File converted = new File(unrefOutputDir, 
"my_packages/demo-cp/0.0.0/demo-cp-0.0.0-cp2fm-converted.zip");
+
+        assertEquals(PackageType.CONTENT, 
converter.open(converted).getProperties().getPackageType());
+        try (FileReader reader = new FileReader(new File(outputDirectory, 
"content-packages.csv"))){
+            
assertTrue(IOUtils.readLines(reader).get(2).contains("my_packages:demo-cp,CONTENT"));
+        }
+    }
+
     private File[] load(String...resources) {
         File[] loadedResources = new File[resources.length];
 
diff --git 
a/src/test/java/org/apache/sling/feature/cpconverter/ConverterUserAndPermissionTest.java
 
b/src/test/java/org/apache/sling/feature/cpconverter/ConverterUserAndPermissionTest.java
index 82f8d30..178f492 100644
--- 
a/src/test/java/org/apache/sling/feature/cpconverter/ConverterUserAndPermissionTest.java
+++ 
b/src/test/java/org/apache/sling/feature/cpconverter/ConverterUserAndPermissionTest.java
@@ -18,6 +18,7 @@ package org.apache.sling.feature.cpconverter;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
+import org.apache.jackrabbit.vault.packaging.PackageType;
 import org.apache.sling.feature.Extension;
 import org.apache.sling.feature.Feature;
 import 
org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter.PackagePolicy;
@@ -48,6 +49,7 @@ import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 import java.io.File;
+import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
diff --git 
a/src/test/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitterTest.java
 
b/src/test/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitterTest.java
index 97a2855..344fcb7 100644
--- 
a/src/test/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitterTest.java
+++ 
b/src/test/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitterTest.java
@@ -54,31 +54,29 @@ public class PackagesEventsEmitterTest {
         PackagesEventsEmitter emitter = new 
DefaultPackagesEventsEmitter(stringWriter);
         emitter.start();
         emitter.startPackage(parent);
-
         VaultPackage contentChild = mock(VaultPackage.class);
         when(contentChild.getPackageType()).thenReturn(PackageType.CONTENT);
         when(contentChild.getId()).thenReturn(ID_CONTENT_CHILD);
         when(contentChild.getDependencies()).thenReturn(new Dependency[]{new 
Dependency(ID_PARENT), new Dependency(ID_APPLICATION_CHILD)});
         
emitter.startSubPackage("/jcr_root/etc/packages/org/apache/sling/content-child-1.0.zip",
 contentChild);
-        emitter.endSubPackage();
+        
emitter.endSubPackage("/jcr_root/etc/packages/org/apache/sling/content-child-1.0.zip",
 contentChild.getId(), contentChild);
 
         VaultPackage applicationChild = mock(VaultPackage.class);
         
when(applicationChild.getPackageType()).thenReturn(PackageType.APPLICATION);
         when(applicationChild.getId()).thenReturn(ID_APPLICATION_CHILD);
         when(applicationChild.getDependencies()).thenReturn(new 
Dependency[]{new Dependency(ID_PARENT)});
         
emitter.startSubPackage("/jcr_root/etc/packages/org/apache/sling/application-child-1.0.zip",
 applicationChild);
-
         VaultPackage nestedChild = mock(VaultPackage.class);
         when(nestedChild.getPackageType()).thenReturn(PackageType.CONTAINER);
         when(nestedChild.getId()).thenReturn(ID_NESTED_CHILD);
         when(nestedChild.getDependencies()).thenReturn(new Dependency[]{new 
Dependency(ID_APPLICATION_CHILD)});
         
emitter.startSubPackage("/jcr_root/etc/packages/org/apache/sling/nested-child-1.0.zip",
 nestedChild);
-        emitter.endSubPackage();
+        
emitter.endSubPackage("/jcr_root/etc/packages/org/apache/sling/nested-child-1.0.zip",
 nestedChild.getId(), nestedChild);
 
         // applicationChild
-        emitter.endSubPackage();
+        
emitter.endSubPackage("/jcr_root/etc/packages/org/apache/sling/application-child-1.0.zip",
 applicationChild.getId(), applicationChild);
 
-        emitter.endPackage();
+        emitter.endPackage(parent.getId(),parent);
         emitter.end();
 
         String actual = stringWriter.toString();
diff --git 
a/src/test/resources/org/apache/sling/feature/cpconverter/demo-cp2.zip 
b/src/test/resources/org/apache/sling/feature/cpconverter/demo-cp2.zip
index d459a5d..ec81000 100644
Binary files 
a/src/test/resources/org/apache/sling/feature/cpconverter/demo-cp2.zip and 
b/src/test/resources/org/apache/sling/feature/cpconverter/demo-cp2.zip differ

Reply via email to