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 2021/07/30 12:48:13 UTC

[sling-scriptingbundle-maven-plugin] 01/01: SLING-10689 optionally don't generate require-capabilities header for "extends"

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

kwin pushed a commit to branch feature/SLING-10689-optionally-disable-require-cap
in repository https://gitbox.apache.org/repos/asf/sling-scriptingbundle-maven-plugin.git

commit 520cce9f8ef6a6272751099b41ddd4fd0723d4dc
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Fri Jul 30 14:47:23 2021 +0200

    SLING-10689 optionally don't generate require-capabilities header for
    "extends"
---
 pom.xml                                            |  5 ++
 .../plugin/processor/FileProcessor.java            | 78 +++++++++++++---------
 src/site/markdown/usage.md.vm                      |  3 +-
 .../scripts/org.apache.sling.foobar/1.0.0/requires |  2 +-
 .../main/scripts/org.apache.sling.foobar/extends   |  2 +-
 .../src/main/scripts/libs/sling/utils/requires     |  2 +-
 .../scripts/org.apache.sling.foobar/1.0.0/requires |  2 +-
 .../main/scripts/org.apache.sling.foobar/extends   |  2 +-
 .../src/main/scripts/libs/sling/utils/requires     |  2 +-
 9 files changed, 58 insertions(+), 40 deletions(-)

diff --git a/pom.xml b/pom.xml
index 0219117..f527fb4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -165,6 +165,11 @@
                 <artifactId>maven-aether-provider</artifactId>
                 <version>${maven.version}</version>
             </dependency>
+            <dependency>
+                <groupId>biz.aQute.bnd</groupId>
+                <artifactId>biz.aQute.bndlib</artifactId>
+                <version>5.3.0</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
diff --git a/src/main/java/org/apache/sling/scriptingbundle/plugin/processor/FileProcessor.java b/src/main/java/org/apache/sling/scriptingbundle/plugin/processor/FileProcessor.java
index d3d9a85..7067dd7 100644
--- a/src/main/java/org/apache/sling/scriptingbundle/plugin/processor/FileProcessor.java
+++ b/src/main/java/org/apache/sling/scriptingbundle/plugin/processor/FileProcessor.java
@@ -26,6 +26,7 @@ import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.Set;
 
@@ -37,6 +38,10 @@ import org.apache.sling.scriptingbundle.plugin.capability.RequiredResourceTypeCa
 import org.jetbrains.annotations.NotNull;
 import org.osgi.framework.VersionRange;
 
+import aQute.bnd.header.Attrs;
+import aQute.bnd.header.OSGiHeader;
+import aQute.bnd.header.Parameters;
+
 public class FileProcessor {
 
     private final Logger log;
@@ -56,34 +61,39 @@ public class FileProcessor {
             List<String> extendResources = Files.readAllLines(extendsFile, StandardCharsets.UTF_8);
             if (extendResources.size() == 1) {
                 String extend = extendResources.get(0);
-                if (StringUtils.isNotEmpty(extend)) {
-                    String[] extendParts = extend.split(";");
-                    String extendedResourceType = FilenameUtils.normalize(extendParts[0], true);
-                    String extendedResourceTypeVersion = extendParts.length > 1 ? extendParts[1] : null;
-                    Set<String> searchPathResourceTypes = processSearchPathResourceTypes(resourceType);
-                    Optional<ProvidedResourceTypeCapability> rootCapability = providedCapabilities.stream().filter(capability ->
-                        capability.getResourceTypes().equals(searchPathResourceTypes) && capability.getSelectors().isEmpty() &&
-                                StringUtils.isEmpty(capability.getRequestMethod()) && StringUtils.isEmpty(capability.getRequestExtension())
-                    ).findFirst();
-                    rootCapability.ifPresent(capability -> {
-                        providedCapabilities.remove(capability);
-                        ProvidedResourceTypeCapability replacement =
-                                ProvidedResourceTypeCapability.builder().fromCapability(capability)
-                                        .withExtendsResourceType(extendedResourceType).build();
-                        providedCapabilities.add(replacement);
+                Parameters parameters = OSGiHeader.parseHeader(extend);
+                if (parameters.size() < 1 || parameters.size() > 1) {
+                    log.error(String.format("The file '%s' must contain one clause only (not multiple ones separated by ','", extendsFile));
+                }
+                Entry<String, Attrs> extendsParameter = parameters.entrySet().iterator().next();
+                String extendedResourceType = FilenameUtils.normalize(extendsParameter.getKey(), true);
+                String disableRequireString = extendsParameter.getValue().get("disableRequiresCapability");
+                boolean generateRequireCapability = !Boolean.parseBoolean(disableRequireString);
+                Set<String> searchPathResourceTypes = processSearchPathResourceTypes(resourceType);
+                Optional<ProvidedResourceTypeCapability> rootCapability = providedCapabilities.stream().filter(capability ->
+                    capability.getResourceTypes().equals(searchPathResourceTypes) && capability.getSelectors().isEmpty() &&
+                            StringUtils.isEmpty(capability.getRequestMethod()) && StringUtils.isEmpty(capability.getRequestExtension())
+                ).findFirst();
+                rootCapability.ifPresent(capability -> {
+                    providedCapabilities.remove(capability);
+                    ProvidedResourceTypeCapability replacement =
+                            ProvidedResourceTypeCapability.builder().fromCapability(capability)
+                                    .withExtendsResourceType(extendedResourceType).build();
+                    providedCapabilities.add(replacement);
 
-                    });
-                    if (!rootCapability.isPresent()) {
-                        providedCapabilities.add(
-                                ProvidedResourceTypeCapability.builder()
-                                        .withResourceTypes(processSearchPathResourceTypes(resourceType))
-                                        .withVersion(resourceType.getVersion())
-                                        .withExtendsResourceType(extendedResourceType)
-                                        .build());
-                    }
+                });
+                if (!rootCapability.isPresent()) {
+                    providedCapabilities.add(
+                            ProvidedResourceTypeCapability.builder()
+                                    .withResourceTypes(processSearchPathResourceTypes(resourceType))
+                                    .withVersion(resourceType.getVersion())
+                                    .withExtendsResourceType(extendedResourceType)
+                                    .build());
+                }
+                if (generateRequireCapability) {
                     RequiredResourceTypeCapability.Builder requiredBuilder =
                             RequiredResourceTypeCapability.builder().withResourceType(extendedResourceType);
-                    extractVersionRange(extendsFile, requiredBuilder, extendedResourceTypeVersion);
+                    extractVersionRange(extendsFile, requiredBuilder, extendsParameter.getValue().getVersion());
                     requiredCapabilities.add(requiredBuilder.build());
                 }
             }
@@ -97,15 +107,17 @@ public class FileProcessor {
         try {
             List<String> requiredResourceTypes = Files.readAllLines(requiresFile, StandardCharsets.UTF_8);
             for (String requiredResourceType : requiredResourceTypes) {
-                if (StringUtils.isNotEmpty(requiredResourceType)) {
-                    String[] requireParts = requiredResourceType.split(";");
-                    String resourceType = FilenameUtils.normalize(requireParts[0], true);
-                    String version = requireParts.length > 1 ? requireParts[1] : null;
-                    RequiredResourceTypeCapability.Builder requiredBuilder =
-                            RequiredResourceTypeCapability.builder().withResourceType(resourceType);
-                    extractVersionRange(requiresFile, requiredBuilder, version);
-                    requiredCapabilities.add(requiredBuilder.build());
+                Parameters parameters = OSGiHeader.parseHeader(requiredResourceType);
+                if (parameters.size() < 1 || parameters.size() > 1) {
+                    log.error(String.format("Each line in file '%s' must contain one clause only (not multiple ones separated by ',', skipping line", requiresFile));
+                    continue;
                 }
+                Entry<String, Attrs> requiresParameter = parameters.entrySet().iterator().next();
+                String resourceType = FilenameUtils.normalize(requiresParameter.getKey(), true);
+                RequiredResourceTypeCapability.Builder requiredBuilder =
+                        RequiredResourceTypeCapability.builder().withResourceType(resourceType);
+                extractVersionRange(requiresFile, requiredBuilder, requiresParameter.getValue().getVersion());
+                requiredCapabilities.add(requiredBuilder.build());
             }
         } catch (IOException e) {
             log.error(String.format("Unable to read file %s.", requiresFile.toString()), e);
diff --git a/src/site/markdown/usage.md.vm b/src/site/markdown/usage.md.vm
index 1a45c7c..86d173e 100644
--- a/src/site/markdown/usage.md.vm
+++ b/src/site/markdown/usage.md.vm
@@ -25,7 +25,8 @@ page. In addition to the normal way of structuring scripts in the file tree, the
      An `extends` file in the resource type folder (versioned or not) allows defining this explicit relationship. This file must contain a
      single line with the `resourceType` used for the `extends` capability attribute followed by a `;version=<version-range>`; in this
      case, the plugin will set the `extends` attribute to the given `resourceType` and generate a `Require-Capability` for that
-     `resourceType` with the given version range.
+     `resourceType` with the given version range. To disable generating the ``Require-Capability` header (when the bundled script extends from
+     a non-bundle, resource script), append `;disableRequiresCapability:=true` to the line. The line must comply with the OSGI common header syntax from [OSGI Core R7 ยง3.2.4](http://docs.osgi.org/specification/osgi.core/7.0.0/framework.module.html#framework.common.header.syntax).
 
   3. Defining an explicit requirement, without an inheritance relationship (e.g. delegation to another resource type)<br/>
      A `requires` file (assuming the same conventions and syntax as for the `extends` file) will generate a `Require-Capability` for each
diff --git a/src/test/resources/bnd/project-1/src/main/scripts/org.apache.sling.foobar/1.0.0/requires b/src/test/resources/bnd/project-1/src/main/scripts/org.apache.sling.foobar/1.0.0/requires
index ddfb7af..9a77466 100644
--- a/src/test/resources/bnd/project-1/src/main/scripts/org.apache.sling.foobar/1.0.0/requires
+++ b/src/test/resources/bnd/project-1/src/main/scripts/org.apache.sling.foobar/1.0.0/requires
@@ -1 +1 @@
-sling/default;version=[1.0.0,2)
+sling/default;version="[1.0.0,2)"
diff --git a/src/test/resources/bnd/project-1/src/main/scripts/org.apache.sling.foobar/extends b/src/test/resources/bnd/project-1/src/main/scripts/org.apache.sling.foobar/extends
index 74c19c3..5d6b33b 100644
--- a/src/test/resources/bnd/project-1/src/main/scripts/org.apache.sling.foobar/extends
+++ b/src/test/resources/bnd/project-1/src/main/scripts/org.apache.sling.foobar/extends
@@ -1 +1 @@
-org/apache/sling/bar;version=[1.0.0,2.0.0)
+org/apache/sling/bar;version="[1.0.0,2.0.0)"
diff --git a/src/test/resources/bnd/project-2/src/main/scripts/libs/sling/utils/requires b/src/test/resources/bnd/project-2/src/main/scripts/libs/sling/utils/requires
index 11faa97..2b4933f 100644
--- a/src/test/resources/bnd/project-2/src/main/scripts/libs/sling/utils/requires
+++ b/src/test/resources/bnd/project-2/src/main/scripts/libs/sling/utils/requires
@@ -1 +1 @@
-sling/scripting/warpDrive;version=[1.0.0,2.0.0)
+sling/scripting/warpDrive;version="[1.0.0,2.0.0)"
diff --git a/src/test/resources/mvn/project-1/src/main/scripts/org.apache.sling.foobar/1.0.0/requires b/src/test/resources/mvn/project-1/src/main/scripts/org.apache.sling.foobar/1.0.0/requires
index ddfb7af..9a77466 100644
--- a/src/test/resources/mvn/project-1/src/main/scripts/org.apache.sling.foobar/1.0.0/requires
+++ b/src/test/resources/mvn/project-1/src/main/scripts/org.apache.sling.foobar/1.0.0/requires
@@ -1 +1 @@
-sling/default;version=[1.0.0,2)
+sling/default;version="[1.0.0,2)"
diff --git a/src/test/resources/mvn/project-1/src/main/scripts/org.apache.sling.foobar/extends b/src/test/resources/mvn/project-1/src/main/scripts/org.apache.sling.foobar/extends
index 74c19c3..5d6b33b 100644
--- a/src/test/resources/mvn/project-1/src/main/scripts/org.apache.sling.foobar/extends
+++ b/src/test/resources/mvn/project-1/src/main/scripts/org.apache.sling.foobar/extends
@@ -1 +1 @@
-org/apache/sling/bar;version=[1.0.0,2.0.0)
+org/apache/sling/bar;version="[1.0.0,2.0.0)"
diff --git a/src/test/resources/mvn/project-2/src/main/scripts/libs/sling/utils/requires b/src/test/resources/mvn/project-2/src/main/scripts/libs/sling/utils/requires
index 11faa97..2b4933f 100644
--- a/src/test/resources/mvn/project-2/src/main/scripts/libs/sling/utils/requires
+++ b/src/test/resources/mvn/project-2/src/main/scripts/libs/sling/utils/requires
@@ -1 +1 @@
-sling/scripting/warpDrive;version=[1.0.0,2.0.0)
+sling/scripting/warpDrive;version="[1.0.0,2.0.0)"