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

royteeuwen pushed a commit to branch feature/osgi-bsn-collision-detection
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-launcher.git

commit 91efd4dc66f091c09ebc8e3f3953ea1246f99706
Author: Roy Teeuwen <[email protected]>
AuthorDate: Tue May 26 21:12:55 2026 +0200

    SLING-13217: Add BSN collision detection from feature-core 
--osgi-bsn-collision-detection CLI flag
---
 pom.xml                                             |  8 +++++++-
 .../feature/launcher/impl/FeatureProcessor.java     |  1 +
 .../sling/feature/launcher/impl/LauncherConfig.java | 21 +++++++++++++++++++++
 .../apache/sling/feature/launcher/impl/Main.java    | 17 +++++++++++++++--
 4 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/pom.xml b/pom.xml
index 24d756f..e9eef80 100644
--- a/pom.xml
+++ b/pom.xml
@@ -96,6 +96,12 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-failsafe-plugin</artifactId>
+                <configuration>
+                    <!-- MainIT.setUp() calls System.setSecurityManager, which 
throws on JDK 17+
+                         unless the SecurityManager is explicitly allowed. The 
Security Manager
+                         is deprecated for removal but remains functional 
behind this opt-in. -->
+                    <argLine>-Djava.security.manager=allow</argLine>
+                </configuration>
                 <executions>
                     <execution>
                         <goals>
@@ -265,7 +271,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.feature</artifactId>
-            <version>2.0.0</version>
+            <version>2.0.6</version>
             <scope>compile</scope>
         </dependency>
         <dependency>
diff --git 
a/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java 
b/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java
index fd3f16e..45d2438 100644
--- a/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java
+++ b/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java
@@ -96,6 +96,7 @@ public class FeatureProcessor {
         builderContext.addConfigsOverrides(config.getConfigClashOverrides());
         builderContext.addVariablesOverrides(config.getVariables());
         
builderContext.addFrameworkPropertiesOverrides(config.getInstallation().getFrameworkProperties());
+        
builderContext.setOsgiBsnCollisionDetection(config.isOsgiBsnCollisionDetectionEnabled());
         
builderContext.addMergeExtensions(StreamSupport.stream(Spliterators.spliteratorUnknownSize(
                 ServiceLoader.load(MergeHandler.class).iterator(), 
Spliterator.ORDERED), false)
                     .toArray(MergeHandler[]::new));
diff --git 
a/src/main/java/org/apache/sling/feature/launcher/impl/LauncherConfig.java 
b/src/main/java/org/apache/sling/feature/launcher/impl/LauncherConfig.java
index 64b5af6..2bc7248 100644
--- a/src/main/java/org/apache/sling/feature/launcher/impl/LauncherConfig.java
+++ b/src/main/java/org/apache/sling/feature/launcher/impl/LauncherConfig.java
@@ -62,6 +62,8 @@ public class LauncherConfig
 
     private volatile boolean cacheOnly = false;
 
+    private volatile boolean osgiBsnCollisionDetection;
+
     /**
      * Create a new configuration object.
      * Set the default values
@@ -135,6 +137,25 @@ public class LauncherConfig
         this.frameworkArtifact = frameworkArtifact;
     }
 
+    /**
+     * @return whether OSGi {@code Bundle-SymbolicName} collision detection is
+     *     enabled. Maps onto
+     *     {@code BuilderContext.setOsgiBsnCollisionDetection(boolean)}.
+     *     Default {@code false}.
+     *
+     * @since 1.4.0
+     */
+    public boolean isOsgiBsnCollisionDetectionEnabled() {
+        return osgiBsnCollisionDetection;
+    }
+
+    /**
+     * @since 1.4.0
+     */
+    public void setOsgiBsnCollisionDetection(final boolean enabled) {
+        this.osgiBsnCollisionDetection = enabled;
+    }
+
     /**
      * Set the feature id for the launch feature
      * @param id The id
diff --git a/src/main/java/org/apache/sling/feature/launcher/impl/Main.java 
b/src/main/java/org/apache/sling/feature/launcher/impl/Main.java
index 478f8c0..abb5527 100644
--- a/src/main/java/org/apache/sling/feature/launcher/impl/Main.java
+++ b/src/main/java/org/apache/sling/feature/launcher/impl/Main.java
@@ -67,6 +67,8 @@ public class Main {
 
     public static final String OPT_REPOSITORY_URLS = "u";
 
+    public static final String OPT_OSGI_BSN_COLLISION_DETECTION = 
"osgi-bsn-collision-detection";
+
     public static final String OPT_CONFIG_CLASH = "CC";
 
     public static final String OPT_ARTICACT_CLASH = "C";
@@ -253,11 +255,17 @@ public class Main {
                 .build();
 
         final Option printInsideContainerHelp = 
Option.builder(OPT_PRINT_CONTAINER_ENV_HELP)
-              
+
                 .desc("print additional help information for container env 
vars.")
                 .optionalArg(true)
                 .build();
-        
+
+        final Option osgiBsnCollisionDetectionOption = Option.builder()
+                .longOpt(OPT_OSGI_BSN_COLLISION_DETECTION)
+                .desc("Enable OSGi Bundle-SymbolicName collision detection 
during aggregation. "
+                        + "Resolved via -C *:*:<rule> overrides or fails the 
build. Off by default.")
+                .build();
+
                options = new Options().addOption(artifactClashOverride)
                 .addOption(configClashOverride)
                 .addOption(repoOption)
@@ -272,6 +280,7 @@ public class Main {
                 .addOption(extensionConfiguration)
                 .addOption(frameworkVersionOption)
                 .addOption(frameworkArtifactOption)
+                .addOption(osgiBsnCollisionDetectionOption)
                 .addOption(printInsideContainerHelp);
 
         
@@ -347,6 +356,10 @@ public class Main {
             extractValueFromOption(cl, OPT_OSGI_FRAMEWORK_ARTIFACT)
                     .ifPresent(config::setFrameworkArtifact);
 
+            if (cl.hasOption(OPT_OSGI_BSN_COLLISION_DETECTION)) {
+                config.setOsgiBsnCollisionDetection(true);
+            }
+
         } catch (final ParseException pe) {
             Main.LOG().error("Unable to parse command line: {}", 
pe.getMessage(), pe);
 

Reply via email to