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 <[email protected]> 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)"
