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

kwin 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 e2dc780  SLING-12956 Use feature filename including groupId
e2dc780 is described below

commit e2dc780ec226b38748d71b68b9872e9fa221adcc
Author: Konrad Windszus <[email protected]>
AuthorDate: Tue Sep 30 15:20:26 2025 +0200

    SLING-12956 Use feature filename including groupId
    
    Otherwise there can be name clashes in the flat feature output
    directory.
---
 .../features/DefaultFeaturesManager.java           |  36 +++---
 .../ContentPackage2FeatureModelConverterTest.java  | 122 ++++++++++-----------
 .../ConverterUserAndPermissionTest.java            |   4 +-
 .../features/DefaultFeaturesManagerTest.java       |  36 ++++++
 .../cpconverter/features/FeaturesManagerTest.java  |   8 +-
 5 files changed, 126 insertions(+), 80 deletions(-)

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 2c93153..7bcc6b6 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
@@ -450,6 +450,26 @@ public class DefaultFeaturesManager implements 
FeaturesManager, PackagesEventsEm
         feature.getExtensions().add(apiRegions);
     }
 
+    /**
+     * 
+     * @param featureId
+     * @param prefix
+     * @return a filename for the given featureId and optional prefix 
excluding the .json extension
+     */
+    static String getFeatureFileName(@NotNull ArtifactId featureId, @Nullable 
String prefix) {
+        StringBuilder fileNameBuilder = new StringBuilder()
+                .append((prefix != null) ? prefix : "")
+                .append(featureId.getGroupId())
+                .append('-')
+                .append(featureId.getArtifactId());
+
+        String classifier = featureId.getClassifier();
+        if (classifier != null && !classifier.isEmpty()) {
+            fileNameBuilder.append('-').append(classifier);
+        }
+        return fileNameBuilder.toString();
+    }
+
     @Override
     public void serialize() throws IOException {
         RunmodeMapper runmodeMapper = 
RunmodeMapper.open(featureModelsOutputDirectory);
@@ -469,23 +489,13 @@ public class DefaultFeaturesManager implements 
FeaturesManager, PackagesEventsEm
     private void serialize(Feature feature, String runMode, RunmodeMapper 
runmodeMapper) throws IOException {
         addAPIRegions(feature, apiRegionExports.get(runMode));
 
-        StringBuilder fileNameBuilder = new StringBuilder()
-                .append((prefix != null) ? prefix : "")
-                .append(feature.getId().getArtifactId());
-
-        String classifier = feature.getId().getClassifier();
-        if (classifier != null && !classifier.isEmpty()) {
-            fileNameBuilder.append('-').append(classifier);
-        }
+        String fileName = getFeatureFileName(feature.getId(), prefix);
 
         if (properties != null) {
-            properties.put("filename", fileNameBuilder.toString());
+            properties.put("filename", fileName);
         }
 
-        fileNameBuilder.append(JSON_FILE_EXTENSION);
-
-        String fileName = fileNameBuilder.toString();
-
+        fileName = fileName + JSON_FILE_EXTENSION;
         File targetFile = new File(featureModelsOutputDirectory, fileName);
         if (!targetFile.getParentFile().exists()) {
             targetFile.getParentFile().mkdirs();
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 55f753b..34c9b06 100644
--- 
a/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
+++ 
b/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
@@ -154,7 +154,7 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
                     .convert(packageFile);
 
             verifyFeatureFile(outputDirectory,
-                            "asd.retail.all.json",
+                            "asd.sample-asd.retail.all.json",
                             "asd.sample:asd.retail.all:slingosgifeature:0.0.1",
                             
Collections.singletonList("org.apache.felix:org.apache.felix.framework:6.0.1"),
                             
Collections.singletonList("org.apache.sling.commons.log.LogManager.factory.config~asd-retail"),
@@ -163,13 +163,13 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
                                             
"asd:Asd.Retail.config:zip:cp2fm-converted:0.0.1",
                                             
"asd.sample:asd.retail.all:zip:cp2fm-converted:0.0.1"));
             verifyFeatureFile(outputDirectory,
-                            "asd.retail.all-author.json",
+                            "asd.sample-asd.retail.all-author.json",
                             
"asd.sample:asd.retail.all:slingosgifeature:author:0.0.1",
                             
Collections.singletonList("org.apache.sling:org.apache.sling.api:2.20.0"),
                             Collections.emptyList(),
                             Collections.emptyList());
             verifyFeatureFile(outputDirectory,
-                            "asd.retail.all-publish.json",
+                            "asd.sample-asd.retail.all-publish.json",
                             
"asd.sample:asd.retail.all:slingosgifeature:publish:0.0.1",
                             
Collections.singletonList("org.apache.sling:org.apache.sling.models.api:1.3.8"),
                             
Collections.singletonList("org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~asd-retail"),
@@ -185,9 +185,9 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
             }
             assertFalse(runModes.isEmpty());
             assertTrue(runModes.containsKey("(default)"));
-            assertEquals("asd.retail.all.json", 
runModes.getProperty("(default)"));
-            assertEquals("asd.retail.all-author.json", 
runModes.getProperty("author"));
-            assertEquals("asd.retail.all-publish.json", 
runModes.getProperty("publish"));
+            assertEquals("asd.sample-asd.retail.all.json", 
runModes.getProperty("(default)"));
+            assertEquals("asd.sample-asd.retail.all-author.json", 
runModes.getProperty("author"));
+            assertEquals("asd.sample-asd.retail.all-publish.json", 
runModes.getProperty("publish"));
 
             verifyContentPackage(new File(outputDirectory, 
"asd/Asd.Retail.config/0.0.1/Asd.Retail.config-0.0.1-cp2fm-converted.zip"),
                                 "META-INF/vault/settings.xml",
@@ -235,19 +235,19 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
                     .convert(packageFile);
 
             verifyFeatureFile(outputDirectory,
-                            "asd.retail.all.json",
+                            "asd.sample-asd.retail.all.json",
                             "asd.sample:asd.retail.all:slingosgifeature:0.0.1",
                             
Collections.singletonList("org.apache.felix:org.apache.felix.framework:6.0.1"),
                             
Collections.singletonList("org.apache.sling.commons.log.LogManager.factory.config~asd-retail"),
                             
Arrays.asList("asd.sample:asd.retail.apps:zip:cp2fm-converted:0.0.1", 
"asd:Asd.Retail.config:zip:cp2fm-converted:0.0.1"));
             verifyFeatureFile(outputDirectory,
-                            "asd.retail.all-author.json",
+                            "asd.sample-asd.retail.all-author.json",
                             
"asd.sample:asd.retail.all:slingosgifeature:author:0.0.1",
                             
Collections.singletonList("org.apache.sling:org.apache.sling.api:2.20.0"),
                             Collections.emptyList(),
                             Collections.emptyList());
             verifyFeatureFile(outputDirectory,
-                            "asd.retail.all-publish.json",
+                            "asd.sample-asd.retail.all-publish.json",
                             
"asd.sample:asd.retail.all:slingosgifeature:publish:0.0.1",
                             
Collections.singletonList("org.apache.sling:org.apache.sling.models.api:1.3.8"),
                             
Collections.singletonList("org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~asd-retail"),
@@ -263,9 +263,9 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
             }
             assertFalse(runModes.isEmpty());
             assertTrue(runModes.containsKey("(default)"));
-            assertEquals("asd.retail.all.json", 
runModes.getProperty("(default)"));
-            assertEquals("asd.retail.all-author.json", 
runModes.getProperty("author"));
-            assertEquals("asd.retail.all-publish.json", 
runModes.getProperty("publish"));
+            assertEquals("asd.sample-asd.retail.all.json", 
runModes.getProperty("(default)"));
+            assertEquals("asd.sample-asd.retail.all-author.json", 
runModes.getProperty("author"));
+            assertEquals("asd.sample-asd.retail.all-publish.json", 
runModes.getProperty("publish"));
 
             verifyContentPackage(new File(outputDirectory, 
"asd/Asd.Retail.config/0.0.1/Asd.Retail.config-0.0.1-cp2fm-converted.zip"),
                                 "META-INF/vault/settings.xml",
@@ -306,20 +306,20 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
                     .convert(packageFile);
 
             verifyFeatureFile(outputDirectory,
-                            "asd.retail.all.json",
+                            "asd.sample-asd.retail.all.json",
                             "asd.sample:asd.retail.all:slingosgifeature:0.0.1",
                             
Collections.singletonList("org.apache.felix:org.apache.felix.framework:6.0.1"),
                             
Collections.singletonList("org.apache.sling.commons.log.LogManager.factory.config~asd-retail"),
                             
Arrays.asList("asd.sample:asd.retail.apps:zip:cp2fm-converted:0.0.1",
                                     
"asd:Asd.Retail.config:zip:cp2fm-converted:0.0.1"));
             verifyFeatureFile(outputDirectory,
-                            "asd.retail.all-author.json",
+                            "asd.sample-asd.retail.all-author.json",
                             
"asd.sample:asd.retail.all:slingosgifeature:author:0.0.1",
                             
Collections.singletonList("org.apache.sling:org.apache.sling.api:2.20.0"),
                             Collections.emptyList(),
                             Collections.emptyList());
             verifyFeatureFile(outputDirectory,
-                            "asd.retail.all-publish.json",
+                            "asd.sample-asd.retail.all-publish.json",
                             
"asd.sample:asd.retail.all:slingosgifeature:publish:0.0.1",
                             
Collections.singletonList("org.apache.sling:org.apache.sling.models.api:1.3.8"),
                             
Collections.singletonList("org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~asd-retail"),
@@ -335,9 +335,9 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
             }
             assertFalse(runModes.isEmpty());
             assertTrue(runModes.containsKey("(default)"));
-            assertEquals("asd.retail.all.json", 
runModes.getProperty("(default)"));
-            assertEquals("asd.retail.all-author.json", 
runModes.getProperty("author"));
-            assertEquals("asd.retail.all-publish.json", 
runModes.getProperty("publish"));
+            assertEquals("asd.sample-asd.retail.all.json", 
runModes.getProperty("(default)"));
+            assertEquals("asd.sample-asd.retail.all-author.json", 
runModes.getProperty("author"));
+            assertEquals("asd.sample-asd.retail.all-publish.json", 
runModes.getProperty("publish"));
 
             verifyContentPackage(new File(outputDirectory, 
"asd/Asd.Retail.config/0.0.1/Asd.Retail.config-0.0.1-cp2fm-converted.zip"),
                     "META-INF/vault/settings.xml",
@@ -441,7 +441,7 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
                      .setEmitter(DefaultPackagesEventsEmitter.open(outDir))
                      .convert(cpFile);
 
-            File featureFile = new File(outDir, "test_c.json");
+            File featureFile = new File(outDir, "my_packages-test_c.json");
             try (Reader reader = new FileReader(featureFile)) {
                 Feature feature = FeatureJSONReader.read(reader, 
featureFile.getAbsolutePath());
 
@@ -596,38 +596,38 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
             }
             assertFalse(runModes.isEmpty());
             assertTrue(runModes.containsKey("(default)"));
-            assertEquals("runmodetest_parentcontainer-author.json", 
runModes.getProperty("author"));
+            assertEquals("asd.sample-runmodetest_parentcontainer-author.json", 
runModes.getProperty("author"));
             
             // general
-            assertContentPackage(new File(outputDirectory, 
"runmodetest_parentcontainer.json"), 
"asd.sample:embedded.test.app:zip:cp2fm-converted:0.0.0", false);
-            assertContentPackage(new File(outputDirectory, 
"runmodetest_parentcontainer.json"), 
"my_packages:test_a:zip:cp2fm-converted:1.0", false);
-            assertBundleEntry(new File(outputDirectory, 
"runmodetest_parentcontainer.json"), "io.wcm:io.wcm.handler.media:1.11.6", 
false);
+            assertContentPackage(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer.json"), 
"asd.sample:embedded.test.app:zip:cp2fm-converted:0.0.0", false);
+            assertContentPackage(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer.json"), 
"my_packages:test_a:zip:cp2fm-converted:1.0", false);
+            assertBundleEntry(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer.json"), 
"io.wcm:io.wcm.handler.media:1.11.6", false);
             
             // author
-            assertContentPackage(new File(outputDirectory, 
"runmodetest_parentcontainer-author.json"), 
"asd.sample:embedded.test.app:zip:cp2fm-converted:0.0.0", true);
-            assertContentPackage(new File(outputDirectory, 
"runmodetest_parentcontainer-author.json"), 
"my_packages:test_a:zip:cp2fm-converted:1.0", true);
-            assertContentPackage(new File(outputDirectory, 
"runmodetest_parentcontainer-author.json"), 
"my_packages:test_b:zip:cp2fm-converted:1.0", true);
-            assertBundleEntry(new File(outputDirectory, 
"runmodetest_parentcontainer-author.json"), 
"io.wcm:io.wcm.handler.media:1.11.6", true);
-            assertBundleEntry(new File(outputDirectory, 
"runmodetest_parentcontainer-author.json"), 
"io.wcm:io.wcm.handler.link:1.7.02", true);
+            assertContentPackage(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.json"), 
"asd.sample:embedded.test.app:zip:cp2fm-converted:0.0.0", true);
+            assertContentPackage(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.json"), 
"my_packages:test_a:zip:cp2fm-converted:1.0", true);
+            assertContentPackage(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.json"), 
"my_packages:test_b:zip:cp2fm-converted:1.0", true);
+            assertBundleEntry(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.json"), 
"io.wcm:io.wcm.handler.media:1.11.6", true);
+            assertBundleEntry(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.json"), 
"io.wcm:io.wcm.handler.link:1.7.02", true);
             
             // publish
-            assertFalse(new File(outputDirectory, 
"runmodetest_parentcontainer-publish.json").exists());
+            assertFalse(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-publish.json").exists());
             
             // author.publish (for cp converter those are not mutually 
exclusive)
-            assertContentPackage(new File(outputDirectory, 
"runmodetest_parentcontainer-author.publish.json"), 
"my_packages:test_c:zip:cp2fm-converted:1.0", true);
-            assertBundleEntry(new File(outputDirectory, 
"runmodetest_parentcontainer-author.publish.json"), 
"com.composum.nodes:composum-nodes-config:2.5.3", true);
-            assertConfigEntry(new File(outputDirectory, 
"runmodetest_parentcontainer-author.publish.json"), 
"org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~c",
 true);
+            assertContentPackage(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.publish.json"), 
"my_packages:test_c:zip:cp2fm-converted:1.0", true);
+            assertBundleEntry(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.publish.json"), 
"com.composum.nodes:composum-nodes-config:2.5.3", true);
+            assertConfigEntry(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.publish.json"), 
"org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~c",
 true);
 
             
             //author.dev
-            assertConfigEntry(new File(outputDirectory, 
"runmodetest_parentcontainer-author.dev.json"), 
"org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~d",
 true);
-            assertConfigEntry(new File(outputDirectory, 
"runmodetest_parentcontainer-author.dev.json"), 
"org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~f",
 true);
+            assertConfigEntry(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.dev.json"), 
"org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~d",
 true);
+            assertConfigEntry(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.dev.json"), 
"org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~f",
 true);
 
             //author.prod
-            assertConfigEntry(new File(outputDirectory, 
"runmodetest_parentcontainer-author.prod.json"), 
"org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~e",
 true);
+            assertConfigEntry(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.prod.json"), 
"org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~e",
 true);
             
             // dev
-            assertFalse(new File(outputDirectory, 
"runmodetest_parentcontainer-dev.json").exists());
+            assertFalse(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-dev.json").exists());
             
         } finally {
             deleteDirTree(outputDirectory);
@@ -658,33 +658,33 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
             }
             assertFalse(runModes.isEmpty());
             assertTrue(runModes.containsKey("(default)"));
-            assertEquals("runmodetest_parentcontainer-author.json", 
runModes.getProperty("author"));
+            assertEquals("asd.sample-runmodetest_parentcontainer-author.json", 
runModes.getProperty("author"));
             
             // general
-            assertContentPackage(new File(outputDirectory, 
"runmodetest_parentcontainer.json"), 
"asd.sample:embedded.test.app:zip:cp2fm-converted:0.0.0", false);
-            assertContentPackage(new File(outputDirectory, 
"runmodetest_parentcontainer.json"), 
"my_packages:test_a:zip:cp2fm-converted:1.0", true);
-            assertBundleEntry(new File(outputDirectory, 
"runmodetest_parentcontainer.json"), "io.wcm:io.wcm.handler.media:1.11.6", 
true);
+            assertContentPackage(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer.json"), 
"asd.sample:embedded.test.app:zip:cp2fm-converted:0.0.0", false);
+            assertContentPackage(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer.json"), 
"my_packages:test_a:zip:cp2fm-converted:1.0", true);
+            assertBundleEntry(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer.json"), 
"io.wcm:io.wcm.handler.media:1.11.6", true);
             
             // author
-            assertContentPackage(new File(outputDirectory, 
"runmodetest_parentcontainer-author.json"), 
"asd.sample:embedded.test.app:zip:cp2fm-converted:0.0.0", true);
-            assertContentPackage(new File(outputDirectory, 
"runmodetest_parentcontainer-author.json"), 
"my_packages:test_a:zip:cp2fm-converted:1.0", false);
-            assertContentPackage(new File(outputDirectory, 
"runmodetest_parentcontainer-author.json"), 
"my_packages:test_b:zip:cp2fm-converted:1.0", true);
-            assertBundleEntry(new File(outputDirectory, 
"runmodetest_parentcontainer-author.json"), 
"io.wcm:io.wcm.handler.link:1.7.02", true);
+            assertContentPackage(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.json"), 
"asd.sample:embedded.test.app:zip:cp2fm-converted:0.0.0", true);
+            assertContentPackage(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.json"), 
"my_packages:test_a:zip:cp2fm-converted:1.0", false);
+            assertContentPackage(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.json"), 
"my_packages:test_b:zip:cp2fm-converted:1.0", true);
+            assertBundleEntry(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.json"), 
"io.wcm:io.wcm.handler.link:1.7.02", true);
             // publish
-            assertContentPackage(new File(outputDirectory, 
"runmodetest_parentcontainer-publish.json"), 
"my_packages:test_c:zip:cp2fm-converted:1.0", true);
-            assertBundleEntry(new File(outputDirectory, 
"runmodetest_parentcontainer-publish.json"), 
"com.composum.nodes:composum-nodes-config:2.5.3", true);
+            assertContentPackage(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-publish.json"), 
"my_packages:test_c:zip:cp2fm-converted:1.0", true);
+            assertBundleEntry(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-publish.json"), 
"com.composum.nodes:composum-nodes-config:2.5.3", true);
             
             // author.publish (for cp converter those are not mutually 
exclusive)
-            assertFalse(new File(outputDirectory, 
"runmodetest_parentcontainer-author.publish.json").exists());
+            assertFalse(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.publish.json").exists());
             
            //author.dev
-            assertConfigEntry(new File(outputDirectory, 
"runmodetest_parentcontainer-author.dev.json"), 
"org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~d",
 true);
+            assertConfigEntry(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.dev.json"), 
"org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~d",
 true);
             
             //author.prod
-            assertConfigEntry(new File(outputDirectory, 
"runmodetest_parentcontainer-author.prod.json"), 
"org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~e",
 true);
+            assertConfigEntry(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-author.prod.json"), 
"org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~e",
 true);
         
             //dev
-            assertConfigEntry(new File(outputDirectory, 
"runmodetest_parentcontainer-dev.json"), 
"org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~f",
 true);
+            assertConfigEntry(new File(outputDirectory, 
"asd.sample-runmodetest_parentcontainer-dev.json"), 
"org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~f",
 true);
         } finally {
             deleteDirTree(outputDirectory);
         }
@@ -784,9 +784,9 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
             .setEmitter(DefaultPackagesEventsEmitter.open(outDir))
             .convert(cpFile);
 
-            assertAPIRegion(new File(outDir, "asd.retail.all.json"), "a.b.c");
-            assertAPIRegion(new File(outDir, "asd.retail.all-author.json"), 
"a.b.c");
-            assertAPIRegion(new File(outDir, "asd.retail.all-publish.json"), 
"a.b.c");
+            assertAPIRegion(new File(outDir, 
"asd.sample-asd.retail.all.json"), "a.b.c");
+            assertAPIRegion(new File(outDir, 
"asd.sample-asd.retail.all-author.json"), "a.b.c");
+            assertAPIRegion(new File(outDir, 
"asd.sample-asd.retail.all-publish.json"), "a.b.c");
         } finally {
             deleteDirTree(outDir);
         }
@@ -872,7 +872,7 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
                     .convert(packageFile);
 
             verifyFeatureFile(outputDirectory,
-                            "asd.retail.all.json",
+                            "asd.sample-asd.retail.all.json",
                             
"${project.groupId}:${project.artifactId}:slingosgifeature:asd.test.all-1.0.0:${project.version}",
                             
Collections.singletonList("org.apache.felix:org.apache.felix.framework:6.0.1"),
                             
Collections.singletonList("org.apache.sling.commons.log.LogManager.factory.config~asd-retail"),
@@ -881,13 +881,13 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
                                             
"asd:Asd.Retail.config:zip:cp2fm-converted:0.0.1",
                                             
"asd.sample:asd.retail.all:zip:cp2fm-converted:0.0.1"));
             verifyFeatureFile(outputDirectory,
-                            "asd.retail.all-author.json",
+                            "asd.sample-asd.retail.all-author.json",
                             
"${project.groupId}:${project.artifactId}:slingosgifeature:asd.test.all-1.0.0-author:${project.version}",
                             
Collections.singletonList("org.apache.sling:org.apache.sling.api:2.20.0"),
                             Collections.emptyList(),
                             Collections.emptyList());
             verifyFeatureFile(outputDirectory,
-                            "asd.retail.all-publish.json",
+                            "asd.sample-asd.retail.all-publish.json",
                             
"${project.groupId}:${project.artifactId}:slingosgifeature:asd.test.all-1.0.0-publish:${project.version}",
                             
Collections.singletonList("org.apache.sling:org.apache.sling.models.api:1.3.8"),
                             
Collections.singletonList("org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~asd-retail"),
@@ -944,7 +944,7 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
                     
.setEmitter(DefaultPackagesEventsEmitter.open(outputDirectory))
                     .convert(contentPackages[0]);
 
-            File featureFile = new File(outputDirectory, "test_a.json");
+            File featureFile = new File(outputDirectory, 
"my_packages-test_a.json");
             try (Reader reader = new FileReader(featureFile)) {
                 Feature feature = FeatureJSONReader.read(reader, 
featureFile.getAbsolutePath());
 
@@ -990,10 +990,10 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
                     
.setEmitter(DefaultPackagesEventsEmitter.open(outputDirectory))
                     .convert(contentPackages);
 
-            Feature a = getFeature(outputDirectory, "test_a.json");
+            Feature a = getFeature(outputDirectory, "my_packages-test_a.json");
             assertNull(a.getExtensions().getByName("content-packages"));
 
-            Feature b = getFeature(outputDirectory, "test_b.json");
+            Feature b = getFeature(outputDirectory, "my_packages-test_b.json");
             assertNotNull(b.getExtensions().getByName("content-packages"));
             Artifacts artifacts = 
b.getExtensions().getByName("content-packages").getArtifacts();
             assertFalse(artifacts.isEmpty());
@@ -1025,7 +1025,7 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
                     
.setEmitter(DefaultPackagesEventsEmitter.open(outputDirectory))
                     .convert(contentPackages);
 
-            Feature sub = getFeature(outputDirectory, "test_sub.json");
+            Feature sub = getFeature(outputDirectory, 
"my_packages-test_sub.json");
 
             assertNotNull(sub.getExtensions().getByName("content-packages"));
             Artifacts artifacts = 
sub.getExtensions().getByName("content-packages").getArtifacts();
@@ -1086,7 +1086,7 @@ public class ContentPackage2FeatureModelConverterTest 
extends AbstractConverterT
                     .convert(contentPackages);
 
             
-            Feature feature = getFeature(outputDirectory, 
"test_generated_package.json");
+            Feature feature = getFeature(outputDirectory, 
"test-test_generated_package.json");
             Configurations confs = feature.getConfigurations();
             
assertNotNull(confs.getConfiguration("org.apache.sling.installer.provider.jcr.impl.JcrInstaller"));
 
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 c9ce821..ee802e1 100644
--- 
a/src/test/java/org/apache/sling/feature/cpconverter/ConverterUserAndPermissionTest.java
+++ 
b/src/test/java/org/apache/sling/feature/cpconverter/ConverterUserAndPermissionTest.java
@@ -244,7 +244,7 @@ public class ConverterUserAndPermissionTest  extends 
AbstractConverterTest {
         expected1.add("jcr_root/var/eventproxy/.content.xml");
         verifyContentPackage(converted2, notExpected2, expected2);
 
-        try (FileReader reader = new FileReader(new File(outputDirectory, 
"content.json"))) {
+        try (FileReader reader = new FileReader(new File(outputDirectory, 
"b-content.json"))) {
             Feature feature = FeatureJSONReader.read(reader, "content1");
             Extension repoinit = 
feature.getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT);
             if (enforcePrincipalBased) {
@@ -268,7 +268,7 @@ public class ConverterUserAndPermissionTest  extends 
AbstractConverterTest {
             }
         }
 
-        try (FileReader reader = new FileReader(new File(outputDirectory, 
"content2.json"))) {
+        try (FileReader reader = new FileReader(new File(outputDirectory, 
"a-content2.json"))) {
             Feature feature = FeatureJSONReader.read(reader, "content2");
             Extension repoinit = 
feature.getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT);
             if (enforcePrincipalBased) {
diff --git 
a/src/test/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManagerTest.java
 
b/src/test/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManagerTest.java
new file mode 100644
index 0000000..fb30a34
--- /dev/null
+++ 
b/src/test/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManagerTest.java
@@ -0,0 +1,36 @@
+/*
+ * 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.cpconverter.features;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.sling.feature.ArtifactId;
+import org.junit.Test;
+
+public class DefaultFeaturesManagerTest {
+
+    @Test
+    public void testGetFeatureFileName() {
+        ArtifactId id = 
ArtifactId.parse("org.apache.sling:feature-name:1.0.0");
+        assertEquals("org.apache.sling-feature-name", 
DefaultFeaturesManager.getFeatureFileName(id, null));
+        id = 
ArtifactId.parse("org.apache.sling:feature-name:osgi-feature:myclassifier:1.0.0");
+        assertEquals("org.apache.sling-feature-name-myclassifier", 
DefaultFeaturesManager.getFeatureFileName(id, ""));
+        id = ArtifactId.parse("org.apache.sling:feature-name:1.0.0");
+        assertEquals("prefix-org.apache.sling-feature-name", 
DefaultFeaturesManager.getFeatureFileName(id, "prefix-"));
+    }
+
+}
diff --git 
a/src/test/java/org/apache/sling/feature/cpconverter/features/FeaturesManagerTest.java
 
b/src/test/java/org/apache/sling/feature/cpconverter/features/FeaturesManagerTest.java
index 61f98f1..a3ba34d 100644
--- 
a/src/test/java/org/apache/sling/feature/cpconverter/features/FeaturesManagerTest.java
+++ 
b/src/test/java/org/apache/sling/feature/cpconverter/features/FeaturesManagerTest.java
@@ -90,7 +90,7 @@ public class FeaturesManagerTest {
 
         featuresManager.serialize();
 
-        try (InputStream in = new FileInputStream(new File(tempDir.toFile(), 
"b.json"))) {
+        try (InputStream in = new FileInputStream(new File(tempDir.toFile(), 
"g-b.json"))) {
             JsonParser p = Json.createParser(in);
             JsonObject jo = p.getObject();
 
@@ -113,7 +113,7 @@ public class FeaturesManagerTest {
         }
 
         // Runmode file:
-        try (InputStream in = new FileInputStream(new File(tempDir.toFile(), 
"b-rm1.json"))) {
+        try (InputStream in = new FileInputStream(new File(tempDir.toFile(), 
"g-b-rm1.json"))) {
             JsonParser p = Json.createParser(in);
             JsonObject jo = p.getObject();
 
@@ -148,7 +148,7 @@ public class FeaturesManagerTest {
 
         featuresManager.serialize();
 
-        try (InputStream in = new FileInputStream(new File(tempDir.toFile(), 
"a.json"))) {
+        try (InputStream in = new FileInputStream(new File(tempDir.toFile(), 
"g-a.json"))) {
             JsonParser p = Json.createParser(in);
             JsonObject jo = p.getObject();
 
@@ -171,7 +171,7 @@ public class FeaturesManagerTest {
         }
 
         // Runmode file:
-        try (InputStream in = new FileInputStream(new File(tempDir.toFile(), 
"a-rm1.json"))) {
+        try (InputStream in = new FileInputStream(new File(tempDir.toFile(), 
"g-a-rm1.json"))) {
             JsonParser p = Json.createParser(in);
             JsonObject jo = p.getObject();
 


Reply via email to