You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by kw...@apache.org on 2020/11/09 18:03:15 UTC

[sling-slingfeature-maven-plugin] 01/01: SLING-9883 Export merged provided capabilities in 'Provide-Capability' header

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

kwin pushed a commit to branch feature/merge-capabilities
in repository https://gitbox.apache.org/repos/asf/sling-slingfeature-maven-plugin.git

commit 36d7b0031983a89270e8e45378d3d9e70d25df3d
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Mon Nov 9 19:01:20 2020 +0100

    SLING-9883 Export merged provided capabilities in 'Provide-Capability'
    header
---
 .../sling/feature/maven/mojos/ApisJarMojo.java     | 33 ++++++++++++++++++++--
 .../feature/maven/mojos/apis/ApisJarContext.java   | 12 ++++++++
 2 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/src/main/java/org/apache/sling/feature/maven/mojos/ApisJarMojo.java b/src/main/java/org/apache/sling/feature/maven/mojos/ApisJarMojo.java
index a72625f..d16a178 100644
--- a/src/main/java/org/apache/sling/feature/maven/mojos/ApisJarMojo.java
+++ b/src/main/java/org/apache/sling/feature/maven/mojos/ApisJarMojo.java
@@ -872,6 +872,8 @@ public class ApisJarMojo extends AbstractIncludingFeatureMojo {
                     ApisUtil.buildJavadocClasspath(getLog(), repositorySystem, mavenSession, artifact.getId())
                             .forEach(ctx::addJavadocClasspath);
                 }
+
+                info.setProvidedCapabilities(getProvidedCapability(manifest));
             }
         }
     }
@@ -1432,6 +1434,13 @@ public class ApisJarMojo extends AbstractIncludingFeatureMojo {
         return exportPackages;
     }
 
+    private Clause[] getProvidedCapability(final Manifest manifest) {
+        final String providedCapabilitiesHeader = manifest.getMainAttributes().getValue(Constants.PROVIDE_CAPABILITY);
+        final Clause[] providedCapabilities = Parser.parseHeader(providedCapabilitiesHeader);
+
+        return providedCapabilities;
+    }
+    
     /**
      * Compute exports based on a single region
      *
@@ -1494,7 +1503,7 @@ public class ApisJarMojo extends AbstractIncludingFeatureMojo {
         return result;
     }
 
-    private String getApiExportClause(final ApiRegion region, final Collection<ArtifactInfo> infos) {
+    private String getApiExportClauses(final ApiRegion region, final Collection<ArtifactInfo> infos) {
         final StringBuilder sb = new StringBuilder();
         boolean first = true;
         for (final ArtifactInfo info : infos) {
@@ -1510,6 +1519,24 @@ public class ApisJarMojo extends AbstractIncludingFeatureMojo {
         return sb.toString();
     }
 
+    private String getApiProvideCapabilityClauses(final ApiRegion region, final Collection<ArtifactInfo> infos) {
+        final StringBuilder sb = new StringBuilder();
+        boolean first = true;
+        for (final ArtifactInfo info : infos) {
+            // TODO: support regions
+            // TODO: check fo conflicts
+            for (final Clause clause : info.getProvidedCapabilities()) {
+                if (first) {
+                    first = false;
+                } else {
+                    sb.append(',');
+                }
+                sb.append(clause.toString());
+            }
+        }
+        return sb.toString();
+    }
+ 
     private void addFileSets(final ApiRegion apiRegion, 
              final ArtifactType archiveType,
              final Collection<ArtifactInfo> infos,
@@ -1670,7 +1697,7 @@ public class ApisJarMojo extends AbstractIncludingFeatureMojo {
         if (archiveType == ArtifactType.APIS) {
             // APIs need OSGi Manifest entry
             String symbolicName = artifactName.replace('-', '.');
-            archiveConfiguration.addManifestEntry("Export-Package", getApiExportClause(apiRegion, infos));
+            archiveConfiguration.addManifestEntry("Export-Package", getApiExportClauses(apiRegion, infos));
             archiveConfiguration.addManifestEntry("Bundle-Description", project.getDescription());
             archiveConfiguration.addManifestEntry("Bundle-Version", targetId.getOSGiVersion().toString());
             archiveConfiguration.addManifestEntry("Bundle-ManifestVersion", "2");
@@ -1689,7 +1716,7 @@ public class ApisJarMojo extends AbstractIncludingFeatureMojo {
             }
 
             // add provide / require capability to make the jar unresolvable
-            archiveConfiguration.addManifestEntry("Provide-Capability", "osgi.unresolvable");
+            archiveConfiguration.addManifestEntry(Constants.PROVIDE_CAPABILITY, getApiProvideCapabilityClauses(apiRegion, infos));
             archiveConfiguration.addManifestEntry("Require-Capability", "osgi.unresolvable;filter:=\"(&(must.not.resolve=*)(!(must.not.resolve=*)))\",osgi.ee;filter:=\"(&(osgi.ee=JavaSE/compact2)(version=1.8))\"");
         }
         archiveConfiguration.addManifestEntry("Implementation-Version", targetId.getVersion());
diff --git a/src/main/java/org/apache/sling/feature/maven/mojos/apis/ApisJarContext.java b/src/main/java/org/apache/sling/feature/maven/mojos/apis/ApisJarContext.java
index d468fad..09c3fdb 100644
--- a/src/main/java/org/apache/sling/feature/maven/mojos/apis/ApisJarContext.java
+++ b/src/main/java/org/apache/sling/feature/maven/mojos/apis/ApisJarContext.java
@@ -21,6 +21,7 @@ import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -73,6 +74,8 @@ public class ApisJarContext {
 
         private final Set<String> sources = new HashSet<>();
 
+        private Set<Clause> providedCapabilities;
+
         public ArtifactInfo(final Artifact artifact) {
             this.artifact = artifact;
         }
@@ -207,6 +210,15 @@ public class ApisJarContext {
         public Set<String> getSources() {
             return this.sources;
         }
+
+        public Set<Clause> getProvidedCapabilities() {
+            return providedCapabilities;
+        }
+
+        public void setProvidedCapabilities(Clause... providedCapabilities) {
+            this.providedCapabilities = new HashSet<Clause>(Arrays.asList(providedCapabilities));
+        }
+
     }
 
     private final ApisConfiguration config;