This is an automated email from the ASF dual-hosted git repository.
cziegeler pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-resolver.git
The following commit(s) were added to refs/heads/master by this push:
new 7a1631e SLING-12643 : Support Jakarta ServletAPI in Scripting
(Initial support)
7a1631e is described below
commit 7a1631e99467c2c810bb9cf343189f0ab464000c
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Wed Apr 23 07:51:04 2025 +0200
SLING-12643 : Support Jakarta ServletAPI in Scripting (Initial support)
---
.../bundle/BundledRenderUnitCapabilityImpl.java | 25 ++--
.../internal/bundle/BundledScriptTracker.java | 19 +--
.../BundledRenderUnitCapabilityImplTest.java | 163 +++++++++++++++++++++
3 files changed, 183 insertions(+), 24 deletions(-)
diff --git
a/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledRenderUnitCapabilityImpl.java
b/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledRenderUnitCapabilityImpl.java
index 871836d..56a82d3 100644
---
a/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledRenderUnitCapabilityImpl.java
+++
b/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledRenderUnitCapabilityImpl.java
@@ -56,13 +56,14 @@ class BundledRenderUnitCapabilityImpl implements
BundledRenderUnitCapability {
@Nullable String scriptEngineName,
@Nullable String scriptExtension) {
this.resourceTypes = resourceTypes;
- this.path = path;
+ this.path = path != null && path.isEmpty() ? null : path;
this.selectors = selectors;
- this.extension = extension;
- this.method = method;
- this.extendedResourceType = extendedResourceType;
- this.scriptEngineName = scriptEngineName;
- this.scriptExtension = scriptExtension;
+ this.extension = extension != null && extension.isEmpty() ? null :
extension;
+ this.method = method != null && method.isEmpty() ? null : method;
+ this.extendedResourceType =
+ extendedResourceType != null && extendedResourceType.isEmpty()
? null : extendedResourceType;
+ this.scriptEngineName = scriptEngineName != null &&
scriptEngineName.isEmpty() ? null : scriptEngineName;
+ this.scriptExtension = scriptExtension != null &&
scriptExtension.isEmpty() ? null : scriptExtension;
}
@Override
@@ -159,34 +160,34 @@ class BundledRenderUnitCapabilityImpl implements
BundledRenderUnitCapability {
.append("=")
.append(selectors);
}
- if (extension != null && !extension.isEmpty()) {
+ if (extension != null) {
sb.append("; ")
.append(ServletResolverConstants.SLING_SERVLET_EXTENSIONS)
.append("=")
.append(extension);
}
- if (method != null && !method.isEmpty()) {
+ if (method != null) {
sb.append("; ")
.append(ServletResolverConstants.SLING_SERVLET_METHODS)
.append("=")
.append(method);
}
- if (path != null && !path.isEmpty()) {
+ if (path != null) {
sb.append("; ")
.append(ServletResolverConstants.SLING_SERVLET_PATHS)
.append("=")
.append(path);
}
- if (extendedResourceType != null && !extendedResourceType.isEmpty()) {
+ if (extendedResourceType != null) {
sb.append(";
").append(BundledScriptTracker.AT_EXTENDS).append("=").append(extendedResourceType);
}
- if (scriptEngineName != null && !scriptEngineName.isEmpty()) {
+ if (scriptEngineName != null) {
sb.append("; ")
.append(BundledScriptTracker.AT_SCRIPT_ENGINE)
.append("=")
.append(scriptEngineName);
}
- if (scriptExtension != null && !scriptExtension.isEmpty()) {
+ if (scriptExtension != null) {
sb.append("; ")
.append(BundledScriptTracker.AT_SCRIPT_EXTENSION)
.append("=")
diff --git
a/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTracker.java
b/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTracker.java
index 3adb6d7..4ff38cd 100644
---
a/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTracker.java
+++
b/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTracker.java
@@ -235,7 +235,7 @@ public class BundledScriptTracker implements
BundleTrackerCustomizer<List<Servic
properties.put(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES,
resourceTypesRegistrationValue);
String extension = bundledRenderUnitCapability.getExtension();
- if (extension != null && !extension.isEmpty()) {
+ if (extension != null) {
properties.put(ServletResolverConstants.SLING_SERVLET_EXTENSIONS, extension);
}
@@ -245,13 +245,12 @@ public class BundledScriptTracker implements
BundleTrackerCustomizer<List<Servic
bundledRenderUnitCapability.getSelectors().toArray());
}
- if (bundledRenderUnitCapability.getMethod() != null
- && !bundledRenderUnitCapability.getMethod().isEmpty()) {
+ if (bundledRenderUnitCapability.getMethod() != null) {
properties.put(ServletResolverConstants.SLING_SERVLET_METHODS,
bundledRenderUnitCapability.getMethod());
}
String extendedResourceTypeString =
bundledRenderUnitCapability.getExtendedResourceType();
- if (extendedResourceTypeString != null &&
!extendedResourceTypeString.isEmpty()) {
+ if (extendedResourceTypeString != null) {
collectInheritanceChain(inheritanceChain, bundleWiring,
extendedResourceTypeString, cache);
inheritanceChain.stream()
.filter(typeProvider ->
@@ -281,9 +280,7 @@ public class BundledScriptTracker implements
BundleTrackerCustomizer<List<Servic
executable =
bundledRenderUnitFinder.findUnit(bundle.getBundleContext(), inheritanceChain,
aggregate);
}
} else if (bundledRenderUnitCapability.getPath() != null
- && !bundledRenderUnitCapability.getPath().isEmpty()
- && bundledRenderUnitCapability.getScriptEngineName() != null
- &&
!bundledRenderUnitCapability.getScriptEngineName().isEmpty()) {
+ && bundledRenderUnitCapability.getScriptEngineName() != null) {
Set<TypeProvider> aggregate =
Stream.concat(inheritanceChain.stream(), requiresChain.stream())
.collect(Collectors.toCollection(LinkedHashSet::new));
executable =
bundledRenderUnitFinder.findUnit(bundle.getBundleContext(), baseTypeProvider,
aggregate);
@@ -298,10 +295,8 @@ public class BundledScriptTracker implements
BundleTrackerCustomizer<List<Servic
} else {
if (!bundledRenderUnitCapability.getResourceTypes().isEmpty()
&& bundledRenderUnitCapability.getSelectors().isEmpty()
- && (bundledRenderUnitCapability.getExtension() == null
- ||
bundledRenderUnitCapability.getExtension().isEmpty())
- && (bundledRenderUnitCapability.getMethod() == null
- ||
bundledRenderUnitCapability.getMethod().isEmpty())) {
+ && bundledRenderUnitCapability.getExtension() == null
+ && bundledRenderUnitCapability.getMethod() == null) {
String scriptName =
FilenameUtils.getName(executable.getPath());
String scriptNameNoExtension = scriptName.substring(0,
scriptName.lastIndexOf('.'));
boolean noMatch =
bundledRenderUnitCapability.getResourceTypes().stream()
@@ -758,7 +753,7 @@ public class BundledScriptTracker implements
BundleTrackerCustomizer<List<Servic
Bundle providingBundle =
wire.getProvider().getBundle();
providers.add(new TypeProviderImpl(wiredCapability,
providingBundle));
String wiredExtends =
wiredCapability.getExtendedResourceType();
- if (wiredExtends != null && !wiredExtends.isEmpty()) {
+ if (wiredExtends != null) {
collectInheritanceChain(providers,
wire.getProviderWiring(), wiredExtends, cache);
}
}
diff --git
a/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledRenderUnitCapabilityImplTest.java
b/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledRenderUnitCapabilityImplTest.java
new file mode 100644
index 0000000..a02bdfb
--- /dev/null
+++
b/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledRenderUnitCapabilityImplTest.java
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.servlets.resolver.internal.bundle;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.sling.api.resource.type.ResourceType;
+import org.apache.sling.scripting.spi.bundle.BundledRenderUnitCapability;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+public class BundledRenderUnitCapabilityImplTest {
+
+ @Test
+ public void testNullValues() {
+ Set<ResourceType> resourceTypes = Collections.emptySet();
+ List<String> selectors = Collections.emptyList();
+
+ BundledRenderUnitCapability capability = new
BundledRenderUnitCapabilityImpl.Builder()
+ .withResourceTypes(resourceTypes)
+ .withPath(null)
+ .withSelectors(selectors)
+ .withExtension(null)
+ .withMethod(null)
+ .withExtendedResourceType(null)
+ .withScriptEngineName(null)
+ .withScriptEngineExtension(null)
+ .build();
+
+ assertNull("Path should be null when null is passed",
capability.getPath());
+ assertNull("Extension should be null when null is passed",
capability.getExtension());
+ assertNull("Method should be null when null is passed",
capability.getMethod());
+ assertNull("ExtendedResourceType should be null when null is passed",
capability.getExtendedResourceType());
+ assertNull("ScriptEngineName should be null when null is passed",
capability.getScriptEngineName());
+ assertNull("ScriptExtension should be null when null is passed",
capability.getScriptExtension());
+ }
+
+ @Test
+ public void testEmptyStringsReturnNull() {
+ Set<ResourceType> resourceTypes = Collections.emptySet();
+ List<String> selectors = Collections.emptyList();
+
+ BundledRenderUnitCapability capability = new
BundledRenderUnitCapabilityImpl.Builder()
+ .withResourceTypes(resourceTypes)
+ .withPath("")
+ .withSelectors(selectors)
+ .withExtension("")
+ .withMethod("")
+ .withExtendedResourceType("")
+ .withScriptEngineName("")
+ .withScriptEngineExtension("")
+ .build();
+
+ assertNull("Path should be null when empty string is passed",
capability.getPath());
+ assertNull("Extension should be null when empty string is passed",
capability.getExtension());
+ assertNull("Method should be null when empty string is passed",
capability.getMethod());
+ assertNull(
+ "ExtendedResourceType should be null when empty string is
passed",
+ capability.getExtendedResourceType());
+ assertNull("ScriptEngineName should be null when empty string is
passed", capability.getScriptEngineName());
+ assertNull("ScriptExtension should be null when empty string is
passed", capability.getScriptExtension());
+ }
+
+ @Test
+ public void testNonEmptyValues() {
+ Set<ResourceType> resourceTypes =
Collections.singleton(ResourceType.parseResourceType("test/resourceType"));
+ List<String> selectors = List.of("selector1", "selector2");
+
+ BundledRenderUnitCapability capability = new
BundledRenderUnitCapabilityImpl.Builder()
+ .withResourceTypes(resourceTypes)
+ .withPath("/test/path")
+ .withSelectors(selectors)
+ .withExtension("html")
+ .withMethod("GET")
+ .withExtendedResourceType("extended/type")
+ .withScriptEngineName("engineName")
+ .withScriptEngineExtension("scriptExt")
+ .build();
+
+ assertEquals("/test/path", capability.getPath());
+ assertEquals("html", capability.getExtension());
+ assertEquals("GET", capability.getMethod());
+ assertEquals("extended/type", capability.getExtendedResourceType());
+ assertEquals("engineName", capability.getScriptEngineName());
+ assertEquals("scriptExt", capability.getScriptExtension());
+ assertEquals(resourceTypes, capability.getResourceTypes());
+ assertEquals(selectors, capability.getSelectors());
+ }
+
+ @Test
+ public void testEmptyCollections() {
+ Set<ResourceType> resourceTypes = Collections.emptySet();
+ List<String> selectors = Collections.emptyList();
+
+ BundledRenderUnitCapability capability = new
BundledRenderUnitCapabilityImpl.Builder()
+ .withResourceTypes(resourceTypes)
+ .withSelectors(selectors)
+ .build();
+
+ assertTrue(
+ "ResourceTypes should be empty",
capability.getResourceTypes().isEmpty());
+ assertTrue("Selectors should be empty",
capability.getSelectors().isEmpty());
+ }
+
+ @Test
+ public void testEqualsAndHashCode() {
+ Set<ResourceType> resourceTypes =
Collections.singleton(ResourceType.parseResourceType("test/resourceType"));
+ List<String> selectors = List.of("selector1");
+
+ BundledRenderUnitCapability capability1 = new
BundledRenderUnitCapabilityImpl.Builder()
+ .withResourceTypes(resourceTypes)
+ .withPath("/test/path")
+ .withSelectors(selectors)
+ .build();
+
+ BundledRenderUnitCapability capability2 = new
BundledRenderUnitCapabilityImpl.Builder()
+ .withResourceTypes(resourceTypes)
+ .withPath("/test/path")
+ .withSelectors(selectors)
+ .build();
+
+ assertEquals("Capabilities should be equal", capability1, capability2);
+ assertEquals("Hash codes should match", capability1.hashCode(),
capability2.hashCode());
+ }
+
+ @Test
+ public void testToString() {
+ Set<ResourceType> resourceTypes =
Collections.singleton(ResourceType.parseResourceType("test/resourceType"));
+ List<String> selectors = List.of("selector1");
+
+ BundledRenderUnitCapability capability = new
BundledRenderUnitCapabilityImpl.Builder()
+ .withResourceTypes(resourceTypes)
+ .withPath("/test/path")
+ .withSelectors(selectors)
+ .build();
+
+ String toString = capability.toString();
+ assertTrue("toString should contain resource type",
toString.contains("test/resourceType"));
+ assertTrue("toString should contain path",
toString.contains("/test/path"));
+ assertTrue("toString should contain selector",
toString.contains("selector1"));
+ }
+}