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-scripting-core.git


The following commit(s) were added to refs/heads/master by this push:
     new 452d454  SLING-12643 : Support Jakarta ServletAPI in Scripting
452d454 is described below

commit 452d4547c7c0433684a157667ae0f70dab0e54fd
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Fri May 23 07:46:06 2025 +0200

    SLING-12643 : Support Jakarta ServletAPI in Scripting
---
 pom.xml                                            |   8 +-
 .../scripting/core/impl/DefaultSlingScript.java    | 550 +++++++++++++++++----
 ...elper.java => InternalJakartaScriptHelper.java} |  21 +-
 .../scripting/core/impl/InternalScriptHelper.java  |   1 +
 .../core/impl/ScriptingVariablesConsolePlugin.java |  57 +--
 .../core/impl/SlingScriptAdapterFactory.java       |   9 +-
 .../impl/bundled/AbstractBundledRenderUnit.java    |  24 +-
 .../core/impl/bundled/ScriptContextProvider.java   |  55 ++-
 .../core/impl/bundled/SlingScriptAdapter.java      |  10 +-
 .../core/impl/helper/OnDemandReaderRequest.java    |   1 +
 .../core/impl/helper/OnDemandWriterResponse.java   |   1 +
 ...elperTest.java => JakartaScriptHelperTest.java} |   8 +-
 .../sling/scripting/core/ScriptHelperTest.java     |   1 +
 .../sling/scripting/core/it/HtmlScriptingIT.java   |   1 +
 14 files changed, 555 insertions(+), 192 deletions(-)

diff --git a/pom.xml b/pom.xml
index ad39458..1ffe2bf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -71,6 +71,12 @@
             <version>3.0.0-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.http.wrappers</artifactId>
+            <version>6.1.0</version>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.commons.mime</artifactId>
@@ -91,7 +97,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.scripting.spi</artifactId>
-            <version>1.0.2</version>
+            <version>2.0.0-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git 
a/src/main/java/org/apache/sling/scripting/core/impl/DefaultSlingScript.java 
b/src/main/java/org/apache/sling/scripting/core/impl/DefaultSlingScript.java
index 18966a5..7a5a3a9 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/DefaultSlingScript.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/DefaultSlingScript.java
@@ -25,11 +25,6 @@ import javax.script.Invocable;
 import javax.script.ScriptContext;
 import javax.script.ScriptEngine;
 import javax.script.ScriptException;
-import javax.servlet.Servlet;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -49,10 +44,17 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.sling.api.SlingConstants;
+import jakarta.servlet.RequestDispatcher;
+import jakarta.servlet.Servlet;
+import jakarta.servlet.ServletConfig;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
 import org.apache.sling.api.SlingException;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
+import org.apache.sling.api.SlingJakartaHttpServletRequest;
+import org.apache.sling.api.SlingJakartaHttpServletResponse;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceMetadata;
 import org.apache.sling.api.resource.ResourceResolver;
@@ -61,9 +63,13 @@ import org.apache.sling.api.resource.SyntheticResource;
 import org.apache.sling.api.scripting.LazyBindings;
 import org.apache.sling.api.scripting.ScriptEvaluationException;
 import org.apache.sling.api.scripting.SlingBindings;
+import org.apache.sling.api.scripting.SlingJakartaBindings;
+import org.apache.sling.api.scripting.SlingJakartaScript;
+import org.apache.sling.api.scripting.SlingJakartaScriptHelper;
 import org.apache.sling.api.scripting.SlingScript;
 import org.apache.sling.api.scripting.SlingScriptConstants;
 import org.apache.sling.api.scripting.SlingScriptHelper;
+import org.apache.sling.api.wrappers.ScriptingWrapperSupport;
 import org.apache.sling.scripting.api.BindingsValuesProvider;
 import org.apache.sling.scripting.api.CachedScript;
 import org.apache.sling.scripting.api.ScriptCache;
@@ -74,17 +80,18 @@ import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.sling.api.scripting.SlingBindings.FLUSH;
-import static org.apache.sling.api.scripting.SlingBindings.LOG;
-import static org.apache.sling.api.scripting.SlingBindings.OUT;
-import static org.apache.sling.api.scripting.SlingBindings.READER;
-import static org.apache.sling.api.scripting.SlingBindings.REQUEST;
-import static org.apache.sling.api.scripting.SlingBindings.RESOLVER;
-import static org.apache.sling.api.scripting.SlingBindings.RESOURCE;
-import static org.apache.sling.api.scripting.SlingBindings.RESPONSE;
-import static org.apache.sling.api.scripting.SlingBindings.SLING;
+import static org.apache.sling.api.scripting.SlingJakartaBindings.FLUSH;
+import static org.apache.sling.api.scripting.SlingJakartaBindings.LOG;
+import static org.apache.sling.api.scripting.SlingJakartaBindings.OUT;
+import static org.apache.sling.api.scripting.SlingJakartaBindings.READER;
+import static org.apache.sling.api.scripting.SlingJakartaBindings.REQUEST;
+import static org.apache.sling.api.scripting.SlingJakartaBindings.RESOLVER;
+import static org.apache.sling.api.scripting.SlingJakartaBindings.RESOURCE;
+import static org.apache.sling.api.scripting.SlingJakartaBindings.RESPONSE;
+import static org.apache.sling.api.scripting.SlingJakartaBindings.SLING;
 
-class DefaultSlingScript implements SlingScript, Servlet, ServletConfig {
+@SuppressWarnings("deprecation")
+class DefaultSlingScript implements SlingScript, SlingJakartaScript, Servlet, 
ServletConfig {
 
     /** The logger. */
     private static final Logger LOGGER = 
LoggerFactory.getLogger(DefaultSlingScript.class);
@@ -104,6 +111,10 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
     private static final Set<String> PROTECTED_KEYS =
             new HashSet<>(Arrays.asList(REQUEST, RESPONSE, READER, SLING, 
RESOURCE, RESOLVER, OUT, LOG));
 
+    private static final Integer[] SCOPES = {
+        SlingScriptConstants.SLING_SCOPE, Integer.valueOf(100), 
Integer.valueOf(200)
+    };
+
     /** The resource pointing to the script. */
     private final Resource scriptResource;
 
@@ -134,6 +145,8 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
     /* The cache for compiled scripts. */
     private final ScriptCache scriptCache;
 
+    private final boolean isJakartaScriptEngine;
+
     /**
      * Constructor
      * @param bundleContext The bundle context
@@ -167,6 +180,7 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
             encoding = "UTF-8";
         }
         this.scriptEncoding = encoding;
+        this.isJakartaScriptEngine = false;
     }
 
     // ---------- SlingScript interface 
----------------------------------------
@@ -183,24 +197,257 @@ class DefaultSlingScript implements SlingScript, 
Servlet, ServletConfig {
         return new LazyScriptResource(this.scriptName, 
this.scriptResource.getResourceType(), resolver);
     }
 
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingScript#eval(org.apache.sling.api.scripting.SlingBindings)
-     * @throws ScriptEvaluationException
-     */
-    public Object eval(SlingBindings props) {
-        return this.call(props, null);
+    @Override
+    public Object eval(final SlingBindings props) {
+        return call(props, null);
     }
 
-    // ---------- Servlet interface 
--------------------------------------------
-    private static final Integer[] SCOPES = {
-        SlingScriptConstants.SLING_SCOPE, Integer.valueOf(100), 
Integer.valueOf(200)
-    };
+    @Override
+    public Object call(final SlingBindings props, final String method, final 
Object... args) {
+        if (this.isJakartaScriptEngine) {
+            return this.call(ScriptingWrapperSupport.toJakartaBindings(props), 
method, args);
+        }
+        Bindings bindings = null;
+        Reader reader = null;
+        boolean disposeScriptHelper = !props.containsKey(SLING);
+        ResourceResolver oldResolver = null;
+        try {
+            bindings = verifySlingBindings(props);
 
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingScript#call(org.apache.sling.api.scripting.SlingBindings,
 java.lang.String, java.lang.Object[])
-     * @throws ScriptEvaluationException
-     */
-    public Object call(SlingBindings props, String method, Object... args) {
+            // use final variable for inner class!
+            final Bindings b = bindings;
+            // create script context
+            final ScriptContext ctx = new ScriptContext() {
+
+                private Bindings globalScope;
+                private Bindings engineScope = b;
+                private Writer writer = (Writer) b.get(OUT);
+                private Writer errorWriter = new LogWriter((Logger) 
b.get(LOG));
+                private Reader reader = (Reader) b.get(READER);
+                private Bindings slingScope = new LazyBindings();
+
+                @Override
+                public void setBindings(final Bindings bindings, final int 
scope) {
+                    switch (scope) {
+                        case SlingScriptConstants.SLING_SCOPE:
+                            this.slingScope = bindings;
+                            break;
+                        case 100:
+                            if (bindings == null) throw new 
NullPointerException("Bindings for ENGINE scope is null");
+                            this.engineScope = bindings;
+                            break;
+                        case 200:
+                            this.globalScope = bindings;
+                            break;
+                        default:
+                            throw new IllegalArgumentException("Invalid 
scope");
+                    }
+                }
+
+                @Override
+                public Bindings getBindings(final int scope) {
+                    switch (scope) {
+                        case SlingScriptConstants.SLING_SCOPE:
+                            return slingScope;
+                        case 100:
+                            return this.engineScope;
+                        case 200:
+                            return this.globalScope;
+                        default:
+                            throw new IllegalArgumentException("Invalid 
scope");
+                    }
+                }
+
+                @Override
+                public void setAttribute(final String name, final Object 
value, final int scope) {
+                    if (name == null) throw new IllegalArgumentException("Name 
is null");
+                    final Bindings bindings = getBindings(scope);
+                    if (bindings != null) {
+                        bindings.put(name, value);
+                    }
+                }
+
+                @Override
+                public Object getAttribute(final String name, final int scope) 
{
+                    if (name == null) throw new IllegalArgumentException("Name 
is null");
+                    final Bindings bindings = getBindings(scope);
+                    if (bindings != null) {
+                        return bindings.get(name);
+                    }
+                    return null;
+                }
+
+                @Override
+                public Object removeAttribute(final String name, final int 
scope) {
+                    if (name == null) throw new IllegalArgumentException("Name 
is null");
+                    final Bindings bindings = getBindings(scope);
+                    if (bindings != null) {
+                        return bindings.remove(name);
+                    }
+                    return null;
+                }
+
+                @Override
+                public Object getAttribute(String name) {
+                    if (name == null) throw new IllegalArgumentException("Name 
is null");
+                    for (final int scope : SCOPES) {
+                        final Bindings bindings = getBindings(scope);
+                        if (bindings != null) {
+                            final Object o = bindings.get(name);
+                            if (o != null) {
+                                return o;
+                            }
+                        }
+                    }
+                    return null;
+                }
+
+                @Override
+                public int getAttributesScope(String name) {
+                    if (name == null) throw new IllegalArgumentException("Name 
is null");
+                    for (final int scope : SCOPES) {
+                        if ((getBindings(scope) != null) && 
(getBindings(scope).containsKey(name))) {
+                            return scope;
+                        }
+                    }
+                    return -1;
+                }
+
+                @Override
+                public List<Integer> getScopes() {
+                    return Arrays.asList(SCOPES);
+                }
+
+                @Override
+                public Writer getWriter() {
+                    return this.writer;
+                }
+
+                @Override
+                public Writer getErrorWriter() {
+                    return this.errorWriter;
+                }
+
+                @Override
+                public void setWriter(Writer writer) {
+                    this.writer = writer;
+                }
+
+                @Override
+                public void setErrorWriter(Writer writer) {
+                    this.errorWriter = writer;
+                }
+
+                @Override
+                public Reader getReader() {
+                    return this.reader;
+                }
+
+                @Override
+                public void setReader(Reader reader) {
+                    this.reader = reader;
+                }
+            };
+
+            // set the current resource resolver if a request is available 
from the bindings
+            if (props.getRequest() != null) {
+                oldResolver = requestResourceResolver.get();
+                
requestResourceResolver.set(props.getRequest().getResourceResolver());
+            }
+
+            // set the script resource resolver as an attribute
+            ctx.setAttribute(
+                    SlingScriptConstants.ATTR_SCRIPT_RESOURCE_RESOLVER,
+                    this.scriptResource.getResourceResolver(),
+                    SlingScriptConstants.SLING_SCOPE);
+
+            reader = getScriptReader();
+            if (method != null && !(this.scriptEngine instanceof Invocable)) {
+                reader = getWrapperReader(reader, method, args);
+            }
+
+            // evaluate the script
+            final Object result;
+            if (method == null && this.scriptEngine instanceof Compilable) {
+                CachedScript cachedScript = scriptCache.getScript(scriptName);
+                if (cachedScript == null) {
+                    ScriptNameAwareReader snReader = new 
ScriptNameAwareReader(reader, scriptName);
+                    CompiledScript compiledScript = ((Compilable) 
scriptEngine).compile(snReader);
+                    cachedScript = new CachedScriptImpl(scriptName, 
compiledScript);
+                    scriptCache.putScript(cachedScript);
+                    LOGGER.debug("Adding {} to the script cache.", scriptName);
+                } else {
+                    LOGGER.debug("Script {} was already cached.", scriptName);
+                }
+                result = cachedScript.getCompiledScript().eval(ctx);
+            } else {
+                result = scriptEngine.eval(reader, ctx);
+            }
+
+            // call method - if supplied and script engine supports direct 
invocation
+            if (method != null && (this.scriptEngine instanceof Invocable)) {
+                try {
+                    ((Invocable) scriptEngine)
+                            .invokeFunction(method, 
Arrays.asList(args).toArray());
+                } catch (NoSuchMethodException e) {
+                    throw new ScriptEvaluationException(
+                            this.scriptName, "Method " + method + " not found 
in script.", e);
+                }
+            }
+            // optional flush the output channel
+            Object flushObject = bindings.get(FLUSH);
+            if (Boolean.TRUE.equals(flushObject)) {
+                ctx.getWriter().flush();
+            }
+
+            // allways flush the error channel
+            ctx.getErrorWriter().flush();
+
+            return result;
+
+        } catch (IOException ioe) {
+            throw new ScriptEvaluationException(this.scriptName, 
ioe.getMessage(), ioe);
+
+        } catch (ScriptEvaluationException see) {
+            throw see;
+        } catch (ScriptException se) {
+            Throwable cause = (se.getCause() == null) ? se : se.getCause();
+            throw new ScriptEvaluationException(this.scriptName, 
se.getMessage(), cause);
+
+        } finally {
+            if (props.getRequest() != null) {
+                requestResourceResolver.set(oldResolver);
+            }
+
+            // close the script reader (SLING-380)
+            if (reader != null) {
+                try {
+                    reader.close();
+                } catch (IOException ignore) {
+                    // don't care
+                }
+            }
+
+            // dispose of the SlingScriptHelper
+            if (bindings != null && disposeScriptHelper) {
+                final InternalScriptHelper helper = (InternalScriptHelper) 
bindings.get(SLING);
+                if (helper != null) {
+                    helper.cleanup();
+                }
+            }
+        }
+    }
+
+    @Override
+    public Object eval(final SlingJakartaBindings props) {
+        return this.call(props, null);
+    }
+
+    @Override
+    public Object call(final SlingJakartaBindings props, final String method, 
final Object... args) {
+        if (!this.isJakartaScriptEngine) {
+            return this.call(ScriptingWrapperSupport.toJavaxBindings(props), 
method, args);
+        }
         Bindings bindings = null;
         Reader reader = null;
         boolean disposeScriptHelper = !props.containsKey(SLING);
@@ -220,9 +467,7 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
                 private Reader reader = (Reader) b.get(READER);
                 private Bindings slingScope = new LazyBindings();
 
-                /**
-                 * @see 
javax.script.ScriptContext#setBindings(javax.script.Bindings, int)
-                 */
+                @Override
                 public void setBindings(final Bindings bindings, final int 
scope) {
                     switch (scope) {
                         case SlingScriptConstants.SLING_SCOPE:
@@ -240,9 +485,7 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
                     }
                 }
 
-                /**
-                 * @see javax.script.ScriptContext#getBindings(int)
-                 */
+                @Override
                 public Bindings getBindings(final int scope) {
                     switch (scope) {
                         case SlingScriptConstants.SLING_SCOPE:
@@ -256,9 +499,7 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
                     }
                 }
 
-                /**
-                 * @see 
javax.script.ScriptContext#setAttribute(java.lang.String, java.lang.Object, int)
-                 */
+                @Override
                 public void setAttribute(final String name, final Object 
value, final int scope) {
                     if (name == null) throw new IllegalArgumentException("Name 
is null");
                     final Bindings bindings = getBindings(scope);
@@ -267,9 +508,7 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
                     }
                 }
 
-                /**
-                 * @see 
javax.script.ScriptContext#getAttribute(java.lang.String, int)
-                 */
+                @Override
                 public Object getAttribute(final String name, final int scope) 
{
                     if (name == null) throw new IllegalArgumentException("Name 
is null");
                     final Bindings bindings = getBindings(scope);
@@ -279,9 +518,7 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
                     return null;
                 }
 
-                /**
-                 * @see 
javax.script.ScriptContext#removeAttribute(java.lang.String, int)
-                 */
+                @Override
                 public Object removeAttribute(final String name, final int 
scope) {
                     if (name == null) throw new IllegalArgumentException("Name 
is null");
                     final Bindings bindings = getBindings(scope);
@@ -291,9 +528,7 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
                     return null;
                 }
 
-                /**
-                 * @see 
javax.script.ScriptContext#getAttribute(java.lang.String)
-                 */
+                @Override
                 public Object getAttribute(String name) {
                     if (name == null) throw new IllegalArgumentException("Name 
is null");
                     for (final int scope : SCOPES) {
@@ -308,9 +543,7 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
                     return null;
                 }
 
-                /**
-                 * @see 
javax.script.ScriptContext#getAttributesScope(java.lang.String)
-                 */
+                @Override
                 public int getAttributesScope(String name) {
                     if (name == null) throw new IllegalArgumentException("Name 
is null");
                     for (final int scope : SCOPES) {
@@ -321,51 +554,37 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
                     return -1;
                 }
 
-                /**
-                 * @see javax.script.ScriptContext#getScopes()
-                 */
+                @Override
                 public List<Integer> getScopes() {
                     return Arrays.asList(SCOPES);
                 }
 
-                /**
-                 * @see javax.script.ScriptContext#getWriter()
-                 */
+                @Override
                 public Writer getWriter() {
                     return this.writer;
                 }
 
-                /**
-                 * @see javax.script.ScriptContext#getErrorWriter()
-                 */
+                @Override
                 public Writer getErrorWriter() {
                     return this.errorWriter;
                 }
 
-                /**
-                 * @see javax.script.ScriptContext#setWriter(java.io.Writer)
-                 */
+                @Override
                 public void setWriter(Writer writer) {
                     this.writer = writer;
                 }
 
-                /**
-                 * @see 
javax.script.ScriptContext#setErrorWriter(java.io.Writer)
-                 */
+                @Override
                 public void setErrorWriter(Writer writer) {
                     this.errorWriter = writer;
                 }
 
-                /**
-                 * @see javax.script.ScriptContext#getReader()
-                 */
+                @Override
                 public Reader getReader() {
                     return this.reader;
                 }
 
-                /**
-                 * @see javax.script.ScriptContext#setReader(java.io.Reader)
-                 */
+                @Override
                 public void setReader(Reader reader) {
                     this.reader = reader;
                 }
@@ -460,10 +679,10 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
         }
     }
 
-    /**
-     * @see javax.servlet.Servlet#init(javax.servlet.ServletConfig)
-     */
-    public void init(ServletConfig servletConfig) {
+    // ---------- Servlet interface 
--------------------------------------------
+
+    @Override
+    public void init(final ServletConfig servletConfig) {
         if (servletConfig != null) {
             final Dictionary<String, String> params = new Hashtable<>(); // 
NOSONAR
             for (Enumeration<?> ne = servletConfig.getInitParameterNames(); 
ne.hasMoreElements(); ) {
@@ -476,20 +695,18 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
         }
     }
 
-    /**
-     * @see javax.servlet.Servlet#service(javax.servlet.ServletRequest, 
javax.servlet.ServletResponse)
-     */
+    @Override
     public void service(ServletRequest req, ServletResponse res) {
-        final SlingHttpServletRequest request = (SlingHttpServletRequest) req;
+        final SlingJakartaHttpServletRequest request = 
(SlingJakartaHttpServletRequest) req;
 
         try {
             // prepare the properties for the script
-            final SlingBindings props = new SlingBindings();
-            props.setRequest((SlingHttpServletRequest) req);
-            props.setResponse((SlingHttpServletResponse) res);
+            final SlingJakartaBindings props = new SlingJakartaBindings();
+            props.setRequest(request);
+            props.setResponse((SlingJakartaHttpServletResponse) res);
 
             // try to set content type (unless included)
-            if (request.getAttribute(SlingConstants.ATTR_INCLUDE_SERVLET_PATH) 
== null) {
+            if (request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH) 
== null) {
                 final String contentType = request.getResponseContentType();
                 if (contentType != null) {
                     res.setContentType(contentType);
@@ -524,17 +741,17 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
         }
     }
 
+    @Override
     public ServletConfig getServletConfig() {
         return this;
     }
 
+    @Override
     public String getServletInfo() {
         return "Script " + scriptName;
     }
 
-    /**
-     * @see javax.servlet.Servlet#destroy()
-     */
+    @Override
     public void destroy() {
         initParameters = null;
         servletContext = null;
@@ -542,32 +759,24 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
 
     // ---------- ServletConfig 
------------------------------------------------
 
-    /**
-     * @see javax.servlet.ServletConfig#getInitParameter(java.lang.String)
-     */
+    @Override
     public String getInitParameter(String name) {
         final Dictionary<String, String> params = initParameters;
         return (params != null) ? params.get(name) : null;
     }
 
-    /**
-     * @see javax.servlet.ServletConfig#getInitParameterNames()
-     */
+    @Override
     public Enumeration<String> getInitParameterNames() {
         final Dictionary<String, String> params = initParameters;
         return (params != null) ? params.keys() : null;
     }
 
-    /**
-     * @see javax.servlet.ServletConfig#getServletContext()
-     */
+    @Override
     public ServletContext getServletContext() {
         return servletContext;
     }
 
-    /**
-     * @see javax.servlet.ServletConfig#getServletName()
-     */
+    @Override
     public String getServletName() {
         return this.scriptName;
     }
@@ -642,6 +851,143 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
         };
     }
 
+    Bindings verifySlingBindings(final SlingJakartaBindings slingBindings) 
throws IOException {
+
+        final Bindings bindings = new LazyBindings();
+
+        final SlingJakartaHttpServletRequest request = 
slingBindings.getRequest();
+
+        // check sling object
+        Object slingObject = slingBindings.get(SLING);
+        if (slingObject == null) {
+
+            if (request != null) {
+                slingObject = new InternalJakartaScriptHelper(
+                        this.bundleContext, this, request, 
slingBindings.getResponse(), this.cache);
+            } else {
+                slingObject = new InternalScriptHelper(this.bundleContext, 
this, this.cache);
+            }
+        } else if (!(slingObject instanceof SlingJakartaScriptHelper)) {
+            throw fail(SLING, "Wrong type");
+        }
+        final SlingJakartaScriptHelper sling = (SlingJakartaScriptHelper) 
slingObject;
+        bindings.put(SLING, sling);
+
+        if (request != null) {
+            final SlingJakartaHttpServletResponse response = 
slingBindings.getResponse();
+            if (response == null) {
+                throw fail(RESPONSE, "Missing or wrong type");
+            }
+
+            Object resourceObject = slingBindings.get(RESOURCE);
+            if (resourceObject != null && !(resourceObject instanceof 
Resource)) {
+                throw fail(RESOURCE, "Wrong type");
+            }
+
+            Object resolverObject = slingBindings.get(RESOLVER);
+            if (resolverObject != null && !(resolverObject instanceof 
ResourceResolver)) {
+                throw fail(RESOLVER, "Wrong type");
+            }
+
+            Object writerObject = slingBindings.get(OUT);
+            if (writerObject != null && !(writerObject instanceof 
PrintWriter)) {
+                throw fail(OUT, "Wrong type");
+            }
+
+            // if there is a provided sling script helper, check arguments
+            if (slingBindings.get(SLING) != null) {
+
+                if (sling.getRequest() != request) {
+                    throw fail(REQUEST, "Not the same as request field of 
SlingScriptHelper");
+                }
+
+                if (sling.getResponse() != response) {
+                    throw fail(RESPONSE, "Not the same as response field of 
SlingScriptHelper");
+                }
+
+                if (resourceObject != null && sling.getRequest().getResource() 
!= resourceObject) {
+                    throw fail(RESOURCE, "Not the same as resource of the 
SlingScriptHelper request");
+                }
+
+                if (resolverObject != null && 
sling.getRequest().getResourceResolver() != resolverObject) {
+                    throw fail(
+                            RESOLVER,
+                            "Not the same as the resource resolver of the 
SlingScriptHelper request's resolver");
+                }
+
+                if (writerObject != null && sling.getResponse().getWriter() != 
writerObject) {
+                    throw fail(OUT, "Not the same as writer of the 
SlingScriptHelper response");
+                }
+            }
+
+            // set base variables when executing inside a request
+            bindings.put(REQUEST, sling.getRequest());
+            bindings.put(READER, sling.getRequest().getReader());
+            bindings.put(RESPONSE, sling.getResponse());
+            bindings.put(RESOURCE, sling.getRequest().getResource());
+            bindings.put(RESOLVER, sling.getRequest().getResourceResolver());
+            bindings.put(OUT, sling.getResponse().getWriter());
+        }
+
+        Object logObject = slingBindings.get(LOG);
+        if (logObject == null) {
+            logObject = LoggerFactory.getLogger(getLoggerName());
+        } else if (!(logObject instanceof Logger)) {
+            throw fail(LOG, "Wrong type");
+        }
+        bindings.put(LOG, logObject);
+
+        // copy non-base variables
+        for (Map.Entry<String, Object> entry : slingBindings.entrySet()) {
+            if (!bindings.containsKey(entry.getKey())) {
+                bindings.put(entry.getKey(), entry.getValue());
+            }
+        }
+
+        if (!bindingsValuesProviders.isEmpty()) {
+            Set<String> protectedKeys = new HashSet<>();
+            protectedKeys.addAll(PROTECTED_KEYS);
+            ProtectedBindings protectedBindings = new 
ProtectedBindings(bindings, protectedKeys);
+
+            long inclusionStart = System.nanoTime();
+            for (BindingsValuesProvider provider : bindingsValuesProviders) {
+                long start = System.nanoTime();
+                provider.addBindings(protectedBindings);
+                long stop = System.nanoTime();
+                LOGGER.trace(
+                        "Invoking addBindings() of {} took {} nanoseconds",
+                        provider.getClass().getName(),
+                        stop - start);
+                if (stop - start > WARN_LIMIT_FOR_BVP_NANOS) {
+                    // SLING-11182 - make this work with older implementations 
of the Sling API
+                    if (request != null && request.getRequestProgressTracker() 
!= null) {
+                        request.getRequestProgressTracker()
+                                .log(String.format(
+                                        BINDINGS_THRESHOLD_MESSAGE,
+                                        provider.getClass().getName(),
+                                        (stop - start) / 1000,
+                                        WARN_LIMIT_FOR_BVP_NANOS / 1000));
+                    } else {
+                        if (LOGGER.isInfoEnabled()) {
+                            LOGGER.info(String.format(
+                                    BINDINGS_THRESHOLD_MESSAGE,
+                                    provider.getClass().getName(),
+                                    (stop - start) / 1000,
+                                    WARN_LIMIT_FOR_BVP_NANOS / 1000));
+                        }
+                    }
+                }
+            }
+            // SLING-11182 - make this work with older implementations of the 
Sling API
+            if (request != null && request.getRequestProgressTracker() != 
null) {
+                long duration = (System.nanoTime() - inclusionStart) / 1000;
+                request.getRequestProgressTracker().log("Adding bindings took 
" + duration + " microseconds");
+            }
+        }
+
+        return bindings;
+    }
+
     Bindings verifySlingBindings(final SlingBindings slingBindings) throws 
IOException {
 
         final Bindings bindings = new LazyBindings();
@@ -658,7 +1004,7 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
             } else {
                 slingObject = new InternalScriptHelper(this.bundleContext, 
this, this.cache);
             }
-        } else if (!(slingObject instanceof SlingScriptHelper)) {
+        } else if (!(slingObject instanceof SlingJakartaScriptHelper)) {
             throw fail(SLING, "Wrong type");
         }
         final SlingScriptHelper sling = (SlingScriptHelper) slingObject;
@@ -795,7 +1141,7 @@ class DefaultSlingScript implements SlingScript, Servlet, 
ServletConfig {
      * Logs the error caused by executing the script in the request progress
      * tracker.
      */
-    private void logScriptError(SlingHttpServletRequest request, Throwable 
throwable) {
+    private void logScriptError(SlingJakartaHttpServletRequest request, 
Throwable throwable) {
         String message = throwable.getMessage();
         if (message != null) {
             message = throwable.getMessage().replace('\n', '/');
diff --git 
a/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java 
b/src/main/java/org/apache/sling/scripting/core/impl/InternalJakartaScriptHelper.java
similarity index 72%
copy from 
src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java
copy to 
src/main/java/org/apache/sling/scripting/core/impl/InternalJakartaScriptHelper.java
index 526cc8f..4a43a6f 100644
--- 
a/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java
+++ 
b/src/main/java/org/apache/sling/scripting/core/impl/InternalJakartaScriptHelper.java
@@ -18,31 +18,32 @@
  */
 package org.apache.sling.scripting.core.impl;
 
-import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.api.SlingHttpServletResponse;
+import org.apache.sling.api.SlingJakartaHttpServletRequest;
+import org.apache.sling.api.SlingJakartaHttpServletResponse;
 import org.apache.sling.api.scripting.InvalidServiceFilterSyntaxException;
-import org.apache.sling.api.scripting.SlingScript;
-import org.apache.sling.scripting.core.ScriptHelper;
+import org.apache.sling.api.scripting.SlingJakartaScript;
+import org.apache.sling.scripting.core.JakartaScriptHelper;
 import org.osgi.framework.BundleContext;
 
 /**
  * Internal script helper
  */
-public class InternalScriptHelper extends ScriptHelper {
+public class InternalJakartaScriptHelper extends JakartaScriptHelper {
 
     private final ServiceCache serviceCache;
 
-    public InternalScriptHelper(
+    public InternalJakartaScriptHelper(
             final BundleContext ctx,
-            final SlingScript script,
-            final SlingHttpServletRequest request,
-            final SlingHttpServletResponse response,
+            final SlingJakartaScript script,
+            final SlingJakartaHttpServletRequest request,
+            final SlingJakartaHttpServletResponse response,
             final ServiceCache cache) {
         super(ctx, script, request, response);
         this.serviceCache = cache;
     }
 
-    public InternalScriptHelper(final BundleContext ctx, final SlingScript 
script, final ServiceCache cache) {
+    public InternalJakartaScriptHelper(
+            final BundleContext ctx, final SlingJakartaScript script, final 
ServiceCache cache) {
         super(ctx, script);
         this.serviceCache = cache;
     }
diff --git 
a/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java 
b/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java
index 526cc8f..1a0449c 100644
--- 
a/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java
+++ 
b/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java
@@ -28,6 +28,7 @@ import org.osgi.framework.BundleContext;
 /**
  * Internal script helper
  */
+@Deprecated
 public class InternalScriptHelper extends ScriptHelper {
 
     private final ServiceCache serviceCache;
diff --git 
a/src/main/java/org/apache/sling/scripting/core/impl/ScriptingVariablesConsolePlugin.java
 
b/src/main/java/org/apache/sling/scripting/core/impl/ScriptingVariablesConsolePlugin.java
index 505e6b3..e7d18cf 100644
--- 
a/src/main/java/org/apache/sling/scripting/core/impl/ScriptingVariablesConsolePlugin.java
+++ 
b/src/main/java/org/apache/sling/scripting/core/impl/ScriptingVariablesConsolePlugin.java
@@ -22,10 +22,6 @@ import javax.script.Bindings;
 import javax.script.ScriptEngine;
 import javax.script.ScriptEngineFactory;
 import javax.script.ScriptEngineManager;
-import javax.servlet.Servlet;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 
 import java.io.IOException;
 import java.io.PrintWriter;
@@ -33,15 +29,19 @@ import java.net.URL;
 import java.util.Collection;
 import java.util.Map;
 
+import jakarta.servlet.Servlet;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.felix.utils.json.JSONWriter;
-import org.apache.felix.webconsole.AbstractWebConsolePlugin;
-import org.apache.felix.webconsole.WebConsoleConstants;
-import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.felix.webconsole.servlet.ServletConstants;
+import org.apache.sling.api.SlingJakartaHttpServletRequest;
 import org.apache.sling.api.request.builder.Builders;
 import org.apache.sling.api.resource.NonExistingResource;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.api.scripting.SlingBindings;
+import org.apache.sling.api.scripting.SlingJakartaBindings;
 import org.apache.sling.api.scripting.SlingScriptConstants;
 import org.apache.sling.scripting.api.BindingsValuesProvider;
 import org.apache.sling.scripting.api.BindingsValuesProvidersByContext;
@@ -57,12 +57,12 @@ import org.osgi.service.component.annotations.Reference;
 @Component(
         property = {
             Constants.SERVICE_VENDOR + "=The Apache Software Foundation",
-            WebConsoleConstants.PLUGIN_LABEL + "=" + 
ScriptingVariablesConsolePlugin.LABEL,
-            WebConsoleConstants.PLUGIN_TITLE + "=" + 
ScriptingVariablesConsolePlugin.TITLE,
-            "felix.webconsole.category=Sling"
+            ServletConstants.PLUGIN_LABEL + "=" + 
ScriptingVariablesConsolePlugin.LABEL,
+            ServletConstants.PLUGIN_TITLE + "=" + 
ScriptingVariablesConsolePlugin.TITLE,
+            ServletConstants.PLUGIN_CATEGORY + "=Sling"
         },
         service = {Servlet.class})
-public class ScriptingVariablesConsolePlugin extends AbstractWebConsolePlugin {
+public class ScriptingVariablesConsolePlugin extends HttpServlet {
 
     protected static final String LABEL = "scriptingvariables";
     protected static final String TITLE = "Scripting Variables";
@@ -113,21 +113,12 @@ public class ScriptingVariablesConsolePlugin extends 
AbstractWebConsolePlugin {
         return null;
     }
 
-    @Override
-    public String getLabel() {
-        return LABEL;
-    }
-
-    @Override
-    public String getTitle() {
-        return TITLE;
-    }
-
     @Override
     protected void doGet(HttpServletRequest request, HttpServletResponse 
response)
             throws ServletException, IOException {
         final String path = request.getPathInfo();
         if (FORWARD_PATH.equals(path)) {
+            @SuppressWarnings("resource")
             final ResourceResolver resolver =
                     (ResourceResolver) 
request.getAttribute("org.apache.sling.auth.core.ResourceResolver");
             if (resolver == null) {
@@ -141,19 +132,13 @@ public class ScriptingVariablesConsolePlugin extends 
AbstractWebConsolePlugin {
             final String extension = request.getParameter(PARAMETER_EXTENSION);
             // resolve is used to get non existing resources as well
             final Resource resource = resolver.resolve(resourcePath);
-            final SlingHttpServletRequest slingRequest = 
Builders.newRequestBuilder(resource)
+            final SlingJakartaHttpServletRequest slingRequest = 
Builders.newRequestBuilder(resource)
                     .useServletContextFrom(request)
                     .useAttributesFrom(request)
-                    .build();
+                    .buildJakartaRequest();
             this.showBindings(slingRequest, response, extension);
             return;
         }
-        super.doGet(request, response);
-    }
-
-    @Override
-    protected void renderContent(HttpServletRequest request, 
HttpServletResponse response)
-            throws ServletException, IOException {
         final PrintWriter pw = response.getWriter();
         pw.append("<script type='text/javascript' 
src='").append(JS_RES_PATH).append("'></script>");
         pw.append("<div id='content'>");
@@ -182,7 +167,7 @@ public class ScriptingVariablesConsolePlugin extends 
AbstractWebConsolePlugin {
     }
 
     protected void showBindings(
-            SlingHttpServletRequest request, HttpServletResponse response, 
final String requestedExtension)
+            SlingJakartaHttpServletRequest request, HttpServletResponse 
response, final String requestedExtension)
             throws ServletException, IOException {
         response.setContentType("application/json");
         JSONWriter jsonWriter = new JSONWriter(response.getWriter());
@@ -204,7 +189,7 @@ public class ScriptingVariablesConsolePlugin extends 
AbstractWebConsolePlugin {
     }
 
     private void writeBindingsToJsonWriter(
-            JSONWriter jsonWriter, ScriptEngineFactory engineFactory, 
SlingHttpServletRequest request)
+            JSONWriter jsonWriter, ScriptEngineFactory engineFactory, 
SlingJakartaHttpServletRequest request)
             throws IOException {
         jsonWriter.object();
         jsonWriter.key("engine");
@@ -241,8 +226,8 @@ public class ScriptingVariablesConsolePlugin extends 
AbstractWebConsolePlugin {
      * @return the bindings (list of key/value pairs) as defined by {@link 
Bindings} for the given script engine.
      * @throws IOException
      */
-    private Bindings getBindingsByEngine(ScriptEngineFactory 
scriptEngineFactory, SlingHttpServletRequest request)
-            throws IOException {
+    private Bindings getBindingsByEngine(
+            ScriptEngineFactory scriptEngineFactory, 
SlingJakartaHttpServletRequest request) throws IOException {
         String context = SlingScriptAdapterFactory.BINDINGS_CONTEXT; // use 
default context only
         final Collection<BindingsValuesProvider> bindingsValuesProviders =
                 
bindingsValuesProviderTracker.getBindingsValuesProviders(scriptEngineFactory, 
context);
@@ -258,9 +243,9 @@ public class ScriptingVariablesConsolePlugin extends 
AbstractWebConsolePlugin {
                 null);
 
         // prepare the bindings (similar as in DefaultSlingScript#service)
-        final SlingBindings initalBindings = new SlingBindings();
+        final SlingJakartaBindings initalBindings = new SlingJakartaBindings();
         initalBindings.setRequest(request);
-        initalBindings.setResponse(Builders.newResponseBuilder().build());
+        
initalBindings.setResponse(Builders.newResponseBuilder().buildJakartaResponseResult());
         final Bindings bindings = 
defaultSlingScript.verifySlingBindings(initalBindings);
 
         // only thing being added in {DefaultSlingScript#call(...)} is 
resource resolver
diff --git 
a/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java
 
b/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java
index 09ddadd..ef0c010 100644
--- 
a/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java
+++ 
b/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java
@@ -25,6 +25,7 @@ import java.util.List;
 
 import org.apache.sling.api.adapter.AdapterFactory;
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.wrappers.JakartaToJavaxServletWrapper;
 import org.apache.sling.commons.mime.MimeTypeProvider;
 import org.apache.sling.scripting.api.BindingsValuesProvider;
 import org.apache.sling.scripting.api.BindingsValuesProvidersByContext;
@@ -48,6 +49,8 @@ import org.osgi.service.component.annotations.Reference;
             Constants.SERVICE_VENDOR + "=The Apache Software Foundation",
             Constants.SERVICE_DESCRIPTION + "=Default SlingScriptResolver",
             "adaptables=org.apache.sling.api.resource.Resource",
+            "adapters=org.apache.sling.api.scripting.SlingJakartaScript",
+            "adapters=jakarta.servlet.Servlet",
             "adapters=org.apache.sling.api.scripting.SlingScript",
             "adapters=javax.servlet.Servlet",
             "adapter.condition=If the resource's path ends in an extension 
registered by a script engine."
@@ -105,8 +108,12 @@ public class SlingScriptAdapterFactory implements 
AdapterFactory, MimeTypeProvid
             final Collection<BindingsValuesProvider> bindingsValuesProviders =
                     
bindingsValuesProviderTracker.getBindingsValuesProviders(engine.getFactory(), 
BINDINGS_CONTEXT);
             // unchecked cast
-            return (A) new DefaultSlingScript(
+            final DefaultSlingScript script = new DefaultSlingScript(
                     this.bundleContext, resource, engine, 
bindingsValuesProviders, this.serviceCache, scriptCache);
+            if (type == javax.servlet.Servlet.class) {
+                return (A) JakartaToJavaxServletWrapper.toJavaxServlet(script);
+            }
+            return (A) script;
         }
 
         return null;
diff --git 
a/src/main/java/org/apache/sling/scripting/core/impl/bundled/AbstractBundledRenderUnit.java
 
b/src/main/java/org/apache/sling/scripting/core/impl/bundled/AbstractBundledRenderUnit.java
index e9c3ba6..f534bfb 100644
--- 
a/src/main/java/org/apache/sling/scripting/core/impl/bundled/AbstractBundledRenderUnit.java
+++ 
b/src/main/java/org/apache/sling/scripting/core/impl/bundled/AbstractBundledRenderUnit.java
@@ -19,14 +19,16 @@
 package org.apache.sling.scripting.core.impl.bundled;
 
 import javax.script.ScriptException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 
 import java.io.IOException;
 import java.util.Set;
 
-import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.api.SlingHttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.apache.sling.api.SlingJakartaHttpServletRequest;
+import org.apache.sling.api.SlingJakartaHttpServletResponse;
+import org.apache.sling.api.wrappers.JavaxToJakartaRequestWrapper;
+import org.apache.sling.api.wrappers.JavaxToJakartaResponseWrapper;
 import org.apache.sling.scripting.core.impl.ServiceCache;
 import org.apache.sling.scripting.spi.bundle.TypeProvider;
 import org.jetbrains.annotations.NotNull;
@@ -139,14 +141,24 @@ abstract class AbstractBundledRenderUnit implements 
ExecutableUnit {
             throws ScriptException {
         try {
             ScriptContextProvider.ExecutableContext executableContext = 
scriptContextProvider.prepareScriptContext(
-                    (SlingHttpServletRequest) request, 
(SlingHttpServletResponse) response, this);
+                    (SlingJakartaHttpServletRequest) request, 
(SlingJakartaHttpServletResponse) response, this);
             try {
                 executableContext.eval();
             } finally {
                 executableContext.clean();
             }
-        } catch (IOException ex) {
+        } catch (final IOException ex) {
             throw new ScriptException(ex);
         }
     }
+
+    @Override
+    public void eval(
+            @NotNull javax.servlet.http.HttpServletRequest request,
+            @NotNull javax.servlet.http.HttpServletResponse response)
+            throws ScriptException {
+        this.eval(
+                JavaxToJakartaRequestWrapper.toJakartaRequest(request),
+                JavaxToJakartaResponseWrapper.toJakartaResponse(response));
+    }
 }
diff --git 
a/src/main/java/org/apache/sling/scripting/core/impl/bundled/ScriptContextProvider.java
 
b/src/main/java/org/apache/sling/scripting/core/impl/bundled/ScriptContextProvider.java
index afb5e3d..d1a31a8 100644
--- 
a/src/main/java/org/apache/sling/scripting/core/impl/bundled/ScriptContextProvider.java
+++ 
b/src/main/java/org/apache/sling/scripting/core/impl/bundled/ScriptContextProvider.java
@@ -32,16 +32,16 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.api.SlingHttpServletResponse;
+import org.apache.sling.api.SlingJakartaHttpServletRequest;
+import org.apache.sling.api.SlingJakartaHttpServletResponse;
 import org.apache.sling.api.scripting.LazyBindings;
-import org.apache.sling.api.scripting.SlingBindings;
+import org.apache.sling.api.scripting.SlingJakartaBindings;
 import org.apache.sling.api.scripting.SlingScriptConstants;
 import org.apache.sling.scripting.api.BindingsValuesProvider;
 import org.apache.sling.scripting.api.BindingsValuesProvidersByContext;
 import 
org.apache.sling.scripting.api.resource.ScriptingResourceResolverProvider;
-import org.apache.sling.scripting.core.ScriptHelper;
-import org.apache.sling.scripting.core.impl.InternalScriptHelper;
+import org.apache.sling.scripting.core.JakartaScriptHelper;
+import org.apache.sling.scripting.core.impl.InternalJakartaScriptHelper;
 import org.apache.sling.scripting.core.impl.helper.ProtectedBindings;
 import org.apache.sling.scripting.spi.bundle.BundledRenderUnit;
 import org.osgi.service.component.annotations.Component;
@@ -63,14 +63,14 @@ public class ScriptContextProvider {
                     + "general page rendering performance.";
 
     private static final Set<String> PROTECTED_BINDINGS = 
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
-            SlingBindings.REQUEST,
-            SlingBindings.RESPONSE,
-            SlingBindings.READER,
-            SlingBindings.RESOURCE,
-            SlingBindings.RESOLVER,
-            SlingBindings.OUT,
-            SlingBindings.LOG,
-            SlingBindings.SLING,
+            SlingJakartaBindings.REQUEST,
+            SlingJakartaBindings.RESPONSE,
+            SlingJakartaBindings.READER,
+            SlingJakartaBindings.RESOURCE,
+            SlingJakartaBindings.RESOLVER,
+            SlingJakartaBindings.OUT,
+            SlingJakartaBindings.LOG,
+            SlingJakartaBindings.SLING,
             ScriptEngine.FILENAME,
             BundledRenderUnit.VARIABLE)));
 
@@ -84,9 +84,9 @@ public class ScriptContextProvider {
     private ScriptingResourceResolverProvider 
scriptingResourceResolverProvider;
 
     public ExecutableContext prepareScriptContext(
-            SlingHttpServletRequest request, SlingHttpServletResponse 
response, ExecutableUnit executable)
+            SlingJakartaHttpServletRequest request, 
SlingJakartaHttpServletResponse response, ExecutableUnit executable)
             throws IOException {
-        InternalScriptHelper scriptHelper = new InternalScriptHelper(
+        InternalJakartaScriptHelper scriptHelper = new 
InternalJakartaScriptHelper(
                 executable.getBundleContext(),
                 new SlingScriptAdapter(request.getResourceResolver(), 
executable.getPath(), "sling/bundle/resource"),
                 request,
@@ -105,16 +105,17 @@ public class ScriptContextProvider {
         Bindings bindings = new LazyBindings();
         bindings.put("properties", (LazyBindings.Supplier)
                 () -> scriptHelper.getRequest().getResource().getValueMap());
-        bindings.put(SlingBindings.REQUEST, scriptHelper.getRequest());
-        bindings.put(SlingBindings.RESPONSE, scriptHelper.getResponse());
-        bindings.put(SlingBindings.READER, 
scriptHelper.getRequest().getReader());
-        bindings.put(SlingBindings.OUT, 
scriptHelper.getResponse().getWriter());
-        bindings.put(SlingBindings.RESOURCE, 
scriptHelper.getRequest().getResource());
+        bindings.put(SlingJakartaBindings.REQUEST, scriptHelper.getRequest());
+        bindings.put(SlingJakartaBindings.RESPONSE, 
scriptHelper.getResponse());
+        bindings.put(SlingJakartaBindings.READER, 
scriptHelper.getRequest().getReader());
+        bindings.put(SlingJakartaBindings.OUT, 
scriptHelper.getResponse().getWriter());
+        bindings.put(SlingJakartaBindings.RESOURCE, 
scriptHelper.getRequest().getResource());
         bindings.put(
-                SlingBindings.RESOLVER, 
scriptHelper.getRequest().getResource().getResourceResolver());
+                SlingJakartaBindings.RESOLVER,
+                scriptHelper.getRequest().getResource().getResourceResolver());
         Logger scriptLogger = LoggerFactory.getLogger(executable.getName());
-        bindings.put(SlingBindings.LOG, scriptLogger);
-        bindings.put(SlingBindings.SLING, scriptHelper);
+        bindings.put(SlingJakartaBindings.LOG, scriptLogger);
+        bindings.put(SlingJakartaBindings.SLING, scriptHelper);
         bindings.put(BundledRenderUnit.VARIABLE, executable);
         bindings.put(ScriptEngine.FILENAME, executable.getPath());
         bindings.put(ScriptEngine.FILENAME.replace(".", "_"), 
executable.getPath());
@@ -187,10 +188,10 @@ public class ScriptContextProvider {
 
         void clean() {
             Bindings engineBindings = 
scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
-            if (engineBindings != null && 
engineBindings.containsKey(SlingBindings.SLING)) {
-                Object scriptHelper = engineBindings.get(SlingBindings.SLING);
-                if (scriptHelper instanceof ScriptHelper) {
-                    ((ScriptHelper) scriptHelper).cleanup();
+            if (engineBindings != null && 
engineBindings.containsKey(SlingJakartaBindings.SLING)) {
+                Object scriptHelper = 
engineBindings.get(SlingJakartaBindings.SLING);
+                if (scriptHelper instanceof JakartaScriptHelper) {
+                    ((JakartaScriptHelper) scriptHelper).cleanup();
                 }
             }
         }
diff --git 
a/src/main/java/org/apache/sling/scripting/core/impl/bundled/SlingScriptAdapter.java
 
b/src/main/java/org/apache/sling/scripting/core/impl/bundled/SlingScriptAdapter.java
index 46fe9eb..05c964f 100644
--- 
a/src/main/java/org/apache/sling/scripting/core/impl/bundled/SlingScriptAdapter.java
+++ 
b/src/main/java/org/apache/sling/scripting/core/impl/bundled/SlingScriptAdapter.java
@@ -21,11 +21,11 @@ package org.apache.sling.scripting.core.impl.bundled;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.SyntheticResource;
-import org.apache.sling.api.scripting.SlingBindings;
-import org.apache.sling.api.scripting.SlingScript;
+import org.apache.sling.api.scripting.SlingJakartaBindings;
+import org.apache.sling.api.scripting.SlingJakartaScript;
 import org.jetbrains.annotations.NotNull;
 
-class SlingScriptAdapter extends SyntheticResource implements SlingScript {
+class SlingScriptAdapter extends SyntheticResource implements 
SlingJakartaScript {
     SlingScriptAdapter(ResourceResolver resolver, String path, String type) {
         super(resolver, path, type);
     }
@@ -36,12 +36,12 @@ class SlingScriptAdapter extends SyntheticResource 
implements SlingScript {
     }
 
     @Override
-    public Object eval(@NotNull SlingBindings props) {
+    public Object eval(@NotNull SlingJakartaBindings props) {
         throw new IllegalStateException("Not implemented");
     }
 
     @Override
-    public Object call(@NotNull SlingBindings props, @NotNull String method, 
Object... args) {
+    public Object call(@NotNull SlingJakartaBindings props, @NotNull String 
method, Object... args) {
         throw new IllegalStateException("Not implemented");
     }
 }
diff --git 
a/src/main/java/org/apache/sling/scripting/core/impl/helper/OnDemandReaderRequest.java
 
b/src/main/java/org/apache/sling/scripting/core/impl/helper/OnDemandReaderRequest.java
index b8a7e25..ddede08 100644
--- 
a/src/main/java/org/apache/sling/scripting/core/impl/helper/OnDemandReaderRequest.java
+++ 
b/src/main/java/org/apache/sling/scripting/core/impl/helper/OnDemandReaderRequest.java
@@ -23,6 +23,7 @@ import java.io.BufferedReader;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
 
+@SuppressWarnings("deprecation")
 public class OnDemandReaderRequest extends SlingHttpServletRequestWrapper {
 
     private BufferedReader reader;
diff --git 
a/src/main/java/org/apache/sling/scripting/core/impl/helper/OnDemandWriterResponse.java
 
b/src/main/java/org/apache/sling/scripting/core/impl/helper/OnDemandWriterResponse.java
index 54298b0..3d3d832 100644
--- 
a/src/main/java/org/apache/sling/scripting/core/impl/helper/OnDemandWriterResponse.java
+++ 
b/src/main/java/org/apache/sling/scripting/core/impl/helper/OnDemandWriterResponse.java
@@ -23,6 +23,7 @@ import java.io.PrintWriter;
 import org.apache.sling.api.SlingHttpServletResponse;
 import org.apache.sling.api.wrappers.SlingHttpServletResponseWrapper;
 
+@SuppressWarnings("deprecation")
 public class OnDemandWriterResponse extends SlingHttpServletResponseWrapper {
 
     private PrintWriter writer;
diff --git 
a/src/test/java/org/apache/sling/scripting/core/ScriptHelperTest.java 
b/src/test/java/org/apache/sling/scripting/core/JakartaScriptHelperTest.java
similarity index 93%
copy from src/test/java/org/apache/sling/scripting/core/ScriptHelperTest.java
copy to 
src/test/java/org/apache/sling/scripting/core/JakartaScriptHelperTest.java
index 9cd08a0..7aa3a3e 100644
--- a/src/test/java/org/apache/sling/scripting/core/ScriptHelperTest.java
+++ b/src/test/java/org/apache/sling/scripting/core/JakartaScriptHelperTest.java
@@ -32,17 +32,17 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 
-public class ScriptHelperTest {
+public class JakartaScriptHelperTest {
 
     @Rule
     public OsgiContext sling = new OsgiContext();
 
-    private ScriptHelper sh;
+    private JakartaScriptHelper sh;
     private final int[] RANKINGS = {42, 62, -12, 76, -123, 0, 7432, -21};
 
     @Before
     public void setup() {
-        sh = new ScriptHelper(sling.bundleContext(), null);
+        sh = new JakartaScriptHelper(sling.bundleContext(), null);
 
         for (int rank : RANKINGS) {
             final Integer svc = rank;
@@ -64,7 +64,7 @@ public class ScriptHelperTest {
 
     @Test
     public void testNullRefs() {
-        assertNull("Expecting null if no services found", 
sh.getService(ScriptHelperTest.class));
+        assertNull("Expecting null if no services found", 
sh.getService(JakartaScriptHelperTest.class));
     }
 
     @Test
diff --git 
a/src/test/java/org/apache/sling/scripting/core/ScriptHelperTest.java 
b/src/test/java/org/apache/sling/scripting/core/ScriptHelperTest.java
index 9cd08a0..0fd6526 100644
--- a/src/test/java/org/apache/sling/scripting/core/ScriptHelperTest.java
+++ b/src/test/java/org/apache/sling/scripting/core/ScriptHelperTest.java
@@ -32,6 +32,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 
+@SuppressWarnings("deprecation")
 public class ScriptHelperTest {
 
     @Rule
diff --git 
a/src/test/java/org/apache/sling/scripting/core/it/HtmlScriptingIT.java 
b/src/test/java/org/apache/sling/scripting/core/it/HtmlScriptingIT.java
index 9628aa2..b3395af 100644
--- a/src/test/java/org/apache/sling/scripting/core/it/HtmlScriptingIT.java
+++ b/src/test/java/org/apache/sling/scripting/core/it/HtmlScriptingIT.java
@@ -790,6 +790,7 @@ public class HtmlScriptingIT extends 
ScriptingCoreTestSupport {
      * @param classes the classes to include in the OSGi bundle
      * @return the provisioning option
      */
+    @SuppressWarnings("rawtypes")
     public static UrlProvisionOption buildBundleWithBnd(final Class... 
classes) {
         final TinyBundle bundle = 
org.ops4j.pax.tinybundles.TinyBundles.bundle();
         for (final Class clazz : classes) {

Reply via email to