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)"