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 f055f89  SLING-12643 : Support Jakarta ServletAPI in Scripting
f055f89 is described below

commit f055f89c047e6ae24b7b0a04e7555d4f46f0916c
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Sun May 25 11:01:12 2025 +0200

    SLING-12643 : Support Jakarta ServletAPI in Scripting
---
 pom.xml                                            |   1 +
 .../sling/scripting/core/JakartaScriptHelper.java  | 378 -----------------
 .../apache/sling/scripting/core/ScriptHelper.java  | 231 ++++++++--
 .../scripting/core/impl/DefaultSlingScript.java    | 465 ++-------------------
 .../core/impl/InternalJakartaScriptHelper.java     |  63 ---
 .../scripting/core/impl/InternalScriptHelper.java  |  11 +-
 .../core/impl/ScriptingVariablesConsolePlugin.java |   8 +-
 .../core/impl/bundled/ScriptContextProvider.java   |  52 +--
 .../core/impl/bundled/SlingScriptAdapter.java      |  10 +-
 .../scripting/core/JakartaScriptHelperTest.java    |  77 ----
 .../sling/scripting/core/ScriptHelperTest.java     | 406 +++++++++++++++++-
 11 files changed, 694 insertions(+), 1008 deletions(-)

diff --git a/pom.xml b/pom.xml
index 1ffe2bf..f6ff365 100644
--- a/pom.xml
+++ b/pom.xml
@@ -56,6 +56,7 @@
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
+            <version>4.0.1</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git 
a/src/main/java/org/apache/sling/scripting/core/JakartaScriptHelper.java 
b/src/main/java/org/apache/sling/scripting/core/JakartaScriptHelper.java
deleted file mode 100644
index 450fec4..0000000
--- a/src/main/java/org/apache/sling/scripting/core/JakartaScriptHelper.java
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * 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.scripting.core;
-
-import java.io.IOException;
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import jakarta.servlet.RequestDispatcher;
-import jakarta.servlet.ServletException;
-import org.apache.sling.api.SlingIOException;
-import org.apache.sling.api.SlingJakartaHttpServletRequest;
-import org.apache.sling.api.SlingJakartaHttpServletResponse;
-import org.apache.sling.api.SlingServletException;
-import org.apache.sling.api.request.RequestDispatcherOptions;
-import org.apache.sling.api.resource.Resource;
-import org.apache.sling.api.scripting.InvalidServiceFilterSyntaxException;
-import org.apache.sling.api.scripting.SlingJakartaScript;
-import org.apache.sling.api.scripting.SlingJakartaScriptHelper;
-import org.apache.sling.api.wrappers.SlingJakartaHttpServletRequestWrapper;
-import org.apache.sling.api.wrappers.SlingJakartaHttpServletResponseWrapper;
-import 
org.apache.sling.scripting.core.impl.helper.OnDemandReaderJakartaRequest;
-import 
org.apache.sling.scripting.core.impl.helper.OnDemandWriterJakartaResponse;
-import org.jetbrains.annotations.NotNull;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-import org.slf4j.LoggerFactory;
-
-/**
- * Simple script helper providing access to the (wrapped) response, the
- * on-demand writer and a simple API for request inclusion. Instances of this
- * class are made available to the scripts as the global <code>sling</code>
- * variable.
- *
- * Client code using this object should take care to call {@link #cleanup()}
- * when the object is not used anymore!
- * @since 2.2.0
- */
-public class JakartaScriptHelper implements SlingJakartaScriptHelper {
-
-    /** The corresponding script. */
-    private final SlingJakartaScript script;
-
-    /** The current request or <code>null</code>. */
-    private final SlingJakartaHttpServletRequest request;
-
-    /** The current response or <code>null</code>. */
-    private final SlingJakartaHttpServletResponse response;
-
-    /** The bundle context. */
-    protected final BundleContext bundleContext;
-
-    /**
-     * The list of references - we don't need to synchronize this as we are
-     * running in one single request.
-     */
-    protected List<ServiceReference<?>> references;
-
-    /** A map of found services. */
-    protected Map<String, Object> services;
-
-    /**
-     * Create a new script helper
-     * @param ctx Bundle context
-     * @param script The script
-     */
-    public JakartaScriptHelper(final BundleContext ctx, final 
SlingJakartaScript script) {
-        if (ctx == null) {
-            throw new IllegalArgumentException("Bundle context must not be 
null.");
-        }
-        this.request = null;
-        this.response = null;
-        this.script = script;
-        this.bundleContext = ctx;
-    }
-
-    /**
-     * Create a new script helper
-     * @param ctx Bundle context
-     * @param script The script
-     * @param request The request
-     * @param response The response
-     */
-    public JakartaScriptHelper(
-            final BundleContext ctx,
-            final SlingJakartaScript script,
-            final SlingJakartaHttpServletRequest request,
-            final SlingJakartaHttpServletResponse response) {
-        if (ctx == null) {
-            throw new IllegalArgumentException("Bundle context must not be 
null.");
-        }
-        this.script = script;
-        this.request = wrapIfNeeded(request);
-        this.response = wrapIfNeeded(response);
-        this.bundleContext = ctx;
-    }
-
-    /**
-     * @see org.apache.sling.api.scripting.SlingJakartaScriptHelper#getScript()
-     */
-    public SlingJakartaScript getScript() {
-        return script;
-    }
-
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingJakartaScriptHelper#getRequest()
-     */
-    public SlingJakartaHttpServletRequest getRequest() {
-        return request;
-    }
-
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingJakartaScriptHelper#getResponse()
-     */
-    public SlingJakartaHttpServletResponse getResponse() {
-        return response;
-    }
-
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingJakartaScriptHelper#include(java.lang.String)
-     */
-    public void include(String path) {
-        include(path, (RequestDispatcherOptions) null);
-    }
-
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingJakartaScriptHelper#include(java.lang.String,
 java.lang.String)
-     */
-    public void include(String path, String options) {
-        include(path, new RequestDispatcherOptions(options));
-    }
-
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingJakartaScriptHelper#include(java.lang.String,
 org.apache.sling.api.request.RequestDispatcherOptions)
-     */
-    public void include(String path, RequestDispatcherOptions options) {
-        final RequestDispatcher dispatcher = 
getRequest().getRequestDispatcher(path, options);
-
-        if (dispatcher != null) {
-            try {
-                dispatcher.include(getRequest(), getResponse());
-            } catch (IOException ioe) {
-                throw new SlingIOException(ioe);
-            } catch (ServletException se) {
-                throw new SlingServletException(se);
-            }
-        }
-    }
-
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingJakartaScriptHelper#forward(java.lang.String)
-     */
-    public void forward(String path) {
-        forward(path, (RequestDispatcherOptions) null);
-    }
-
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingJakartaScriptHelper#forward(java.lang.String,
 java.lang.String)
-     */
-    public void forward(String path, String options) {
-        forward(path, new RequestDispatcherOptions(options));
-    }
-
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingJakartaScriptHelper#forward(java.lang.String,
 org.apache.sling.api.request.RequestDispatcherOptions)
-     */
-    public void forward(String path, RequestDispatcherOptions options) {
-        final RequestDispatcher dispatcher = 
getRequest().getRequestDispatcher(path, options);
-
-        if (dispatcher != null) {
-            try {
-                dispatcher.forward(getRequest(), getResponse());
-            } catch (IOException ioe) {
-                throw new SlingIOException(ioe);
-            } catch (ServletException se) {
-                throw new SlingServletException(se);
-            }
-        }
-    }
-
-    /**
-     * @see org.apache.sling.api.scripting.SlingJakartaScriptHelper#dispose()
-     * @deprecated This method is deprecated and should never be called by 
clients!
-     */
-    @Deprecated
-    public void dispose() {
-        LoggerFactory.getLogger(this.getClass())
-                .error(
-                        "ScriptHelper#dispose has been called. This method is 
deprecated and should never be called by clients!");
-    }
-
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingJakartaScriptHelper#getService(java.lang.Class)
-     */
-    @SuppressWarnings("unchecked")
-    public <T> T getService(Class<T> type) {
-        T service = (this.services == null ? null : (T) 
this.services.get(type.getName()));
-        if (service == null) {
-            final ServiceReference<T> ref = 
this.bundleContext.getServiceReference(type);
-            if (ref != null) {
-                service = this.bundleContext.getService(ref);
-                if (service != null) {
-                    if (this.services == null) {
-                        this.services = new HashMap<>();
-                    }
-                    if (this.references == null) {
-                        this.references = new ArrayList<>();
-                    }
-                    this.references.add(ref);
-                    this.services.put(type.getName(), service);
-                }
-            }
-        }
-        return service;
-    }
-
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingJakartaScriptHelper#getServices(java.lang.Class,
 java.lang.String)
-     */
-    @SuppressWarnings("unchecked")
-    public <T> T[] getServices(Class<T> serviceType, String filter) throws 
InvalidServiceFilterSyntaxException {
-        try {
-            Collection<ServiceReference<T>> refsCollection =
-                    this.bundleContext.getServiceReferences(serviceType, 
filter);
-            T[] result = null;
-            if (refsCollection != null) {
-                // sort by service ranking (lowest first) (see 
ServiceReference#compareTo(Object))
-                List<ServiceReference<T>> refsList = new 
ArrayList<>(refsCollection);
-                Collections.sort(refsList);
-                // get the highest ranking first
-                Collections.reverse(refsList);
-
-                final List<T> objects = new ArrayList<>();
-                for (ServiceReference<T> reference : refsList) {
-                    final T service = this.bundleContext.getService(reference);
-                    if (service != null) {
-                        if (this.references == null) {
-                            this.references = new ArrayList<>();
-                        }
-                        this.references.add(reference);
-                        objects.add(service);
-                    }
-                }
-                if (!objects.isEmpty()) {
-                    T[] srv = (T[]) Array.newInstance(serviceType, 
objects.size());
-                    result = objects.toArray(srv);
-                }
-            }
-            return result;
-        } catch (InvalidSyntaxException ise) {
-            throw new InvalidServiceFilterSyntaxException(filter, "Invalid 
filter syntax", ise);
-        }
-    }
-
-    /**
-     * Clean up this instance.
-     */
-    public void cleanup() {
-        if (this.references != null) {
-            final Iterator<ServiceReference<?>> i = this.references.iterator();
-            while (i.hasNext()) {
-                final ServiceReference<?> ref = i.next();
-                this.bundleContext.ungetService(ref);
-            }
-            this.references.clear();
-        }
-        if (this.services != null) {
-            this.services.clear();
-        }
-    }
-
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingJakartaScriptHelper#forward(org.apache.sling.api.resource.Resource)
-     */
-    public void forward(Resource resource) {
-        forward(resource, (RequestDispatcherOptions) null);
-    }
-
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingJakartaScriptHelper#forward(org.apache.sling.api.resource.Resource,
 java.lang.String)
-     */
-    public void forward(Resource resource, String options) {
-        forward(resource, new RequestDispatcherOptions(options));
-    }
-
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingJakartaScriptHelper#forward(org.apache.sling.api.resource.Resource,
 org.apache.sling.api.request.RequestDispatcherOptions)
-     */
-    public void forward(Resource resource, RequestDispatcherOptions options) {
-        final RequestDispatcher dispatcher = 
getRequest().getRequestDispatcher(resource, options);
-
-        if (dispatcher != null) {
-            try {
-                dispatcher.forward(getRequest(), getResponse());
-            } catch (IOException ioe) {
-                throw new SlingIOException(ioe);
-            } catch (ServletException se) {
-                throw new SlingServletException(se);
-            }
-        }
-    }
-
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingJakartaScriptHelper#forward(org.apache.sling.api.resource.Resource)
-     */
-    public void include(Resource resource) {
-        include(resource, (RequestDispatcherOptions) null);
-    }
-
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingJakartaScriptHelper#include(org.apache.sling.api.resource.Resource,
 java.lang.String)
-     */
-    public void include(Resource resource, String options) {
-        include(resource, new RequestDispatcherOptions(options));
-    }
-
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingJakartaScriptHelper#include(org.apache.sling.api.resource.Resource,
 org.apache.sling.api.request.RequestDispatcherOptions)
-     */
-    public void include(Resource resource, RequestDispatcherOptions options) {
-        final RequestDispatcher dispatcher = 
getRequest().getRequestDispatcher(resource, options);
-
-        if (dispatcher != null) {
-            try {
-                dispatcher.include(getRequest(), getResponse());
-            } catch (IOException ioe) {
-                throw new SlingIOException(ioe);
-            } catch (ServletException se) {
-                throw new SlingServletException(se);
-            }
-        }
-    }
-
-    private SlingJakartaHttpServletRequest wrapIfNeeded(@NotNull 
SlingJakartaHttpServletRequest request) {
-        SlingJakartaHttpServletRequest initialRequest = request;
-        while (request instanceof SlingJakartaHttpServletRequestWrapper) {
-            if (request instanceof OnDemandReaderJakartaRequest) {
-                return initialRequest;
-            }
-            request = ((SlingJakartaHttpServletRequestWrapper) 
request).getSlingRequest();
-        }
-        return new OnDemandReaderJakartaRequest(initialRequest);
-    }
-
-    private SlingJakartaHttpServletResponse wrapIfNeeded(@NotNull 
SlingJakartaHttpServletResponse response) {
-        SlingJakartaHttpServletResponse initialResponse = response;
-        while (response instanceof SlingJakartaHttpServletResponseWrapper) {
-            if (response instanceof OnDemandWriterJakartaResponse) {
-                return initialResponse;
-            }
-            response = ((SlingJakartaHttpServletResponseWrapper) 
response).getSlingResponse();
-        }
-        return new OnDemandWriterJakartaResponse(initialResponse);
-    }
-}
diff --git a/src/main/java/org/apache/sling/scripting/core/ScriptHelper.java 
b/src/main/java/org/apache/sling/scripting/core/ScriptHelper.java
index b3fb97f..7f1bd18 100644
--- a/src/main/java/org/apache/sling/scripting/core/ScriptHelper.java
+++ b/src/main/java/org/apache/sling/scripting/core/ScriptHelper.java
@@ -18,9 +18,6 @@
  */
 package org.apache.sling.scripting.core;
 
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-
 import java.io.IOException;
 import java.lang.reflect.Array;
 import java.util.ArrayList;
@@ -31,18 +28,30 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import jakarta.servlet.RequestDispatcher;
+import jakarta.servlet.ServletException;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
 import org.apache.sling.api.SlingIOException;
+import org.apache.sling.api.SlingJakartaHttpServletRequest;
+import org.apache.sling.api.SlingJakartaHttpServletResponse;
 import org.apache.sling.api.SlingServletException;
 import org.apache.sling.api.request.RequestDispatcherOptions;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.scripting.InvalidServiceFilterSyntaxException;
 import org.apache.sling.api.scripting.SlingScript;
 import org.apache.sling.api.scripting.SlingScriptHelper;
+import org.apache.sling.api.wrappers.JakartaToJavaxRequestWrapper;
+import org.apache.sling.api.wrappers.JakartaToJavaxResponseWrapper;
+import org.apache.sling.api.wrappers.JavaxToJakartaRequestWrapper;
+import org.apache.sling.api.wrappers.JavaxToJakartaResponseWrapper;
 import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
 import org.apache.sling.api.wrappers.SlingHttpServletResponseWrapper;
+import org.apache.sling.api.wrappers.SlingJakartaHttpServletRequestWrapper;
+import org.apache.sling.api.wrappers.SlingJakartaHttpServletResponseWrapper;
+import 
org.apache.sling.scripting.core.impl.helper.OnDemandReaderJakartaRequest;
 import org.apache.sling.scripting.core.impl.helper.OnDemandReaderRequest;
+import 
org.apache.sling.scripting.core.impl.helper.OnDemandWriterJakartaResponse;
 import org.apache.sling.scripting.core.impl.helper.OnDemandWriterResponse;
 import org.jetbrains.annotations.NotNull;
 import org.osgi.framework.BundleContext;
@@ -58,19 +67,25 @@ import org.slf4j.LoggerFactory;
  *
  * Client code using this object should take care to call {@link #cleanup()}
  * when the object is not used anymore!
- * @deprecated Use {@link JakartaScriptHelper} instead.
  */
-@Deprecated
 public class ScriptHelper implements SlingScriptHelper {
 
     /** The corresponding script. */
     private final SlingScript script;
 
     /** The current request or <code>null</code>. */
-    private final SlingHttpServletRequest request;
+    @SuppressWarnings("deprecation")
+    private SlingHttpServletRequest request;
+
+    /** The current response or <code>null</code>. */
+    @SuppressWarnings("deprecation")
+    private SlingHttpServletResponse response;
+
+    /** The current request or <code>null</code>. */
+    private final SlingJakartaHttpServletRequest jakartaRequest;
 
     /** The current response or <code>null</code>. */
-    private final SlingHttpServletResponse response;
+    private final SlingJakartaHttpServletResponse jakartaResponse;
 
     /** The bundle context. */
     protected final BundleContext bundleContext;
@@ -88,12 +103,47 @@ public class ScriptHelper implements SlingScriptHelper {
         if (ctx == null) {
             throw new IllegalArgumentException("Bundle context must not be 
null.");
         }
-        this.request = null;
-        this.response = null;
+        this.jakartaRequest = null;
+        this.jakartaResponse = null;
+        this.script = script;
+        this.bundleContext = ctx;
+    }
+
+    /**
+     * Creates a new script helper instance.
+     *
+     * @param ctx The bundle context, must not be <code>null</code>.
+     * @param script The script, must not be <code>null</code>.
+     * @param request The request, may be <code>null</code>.
+     * @param response The response, may be <code>null</code>.
+     * @param jakartaRequest The Jakarta request, may be <code>null</code>.
+     * @param jakartaResponse The Jakarta response, may be <code>null</code>.
+     * @since 2.2.0
+     */
+    public ScriptHelper(
+            final BundleContext ctx,
+            final SlingScript script,
+            final SlingJakartaHttpServletRequest jakartaRequest,
+            final SlingJakartaHttpServletResponse jakartaResponse) {
+        if (ctx == null) {
+            throw new IllegalArgumentException("Bundle context must not be 
null.");
+        }
         this.script = script;
+        this.jakartaRequest = wrapIfNeeded(jakartaRequest);
+        this.jakartaResponse = wrapIfNeeded(jakartaResponse);
         this.bundleContext = ctx;
     }
 
+    /**
+     * Creates a new script helper instance.
+     *
+     * @param ctx The bundle context, must not be <code>null</code>.
+     * @param script The script, must not be <code>null</code>.
+     * @param request The request, may be <code>null</code>.
+     * @param response The response, may be <code>null</code>.
+     * @deprecated Use {@link #ScriptHelper(BundleContext, SlingScript, 
SlingHttpServletRequest, SlingHttpServletResponse, 
SlingJakartaHttpServletRequest, SlingJakartaHttpServletResponse)}
+     */
+    @Deprecated
     public ScriptHelper(
             final BundleContext ctx,
             final SlingScript script,
@@ -105,6 +155,8 @@ public class ScriptHelper implements SlingScriptHelper {
         this.script = script;
         this.request = wrapIfNeeded(request);
         this.response = wrapIfNeeded(response);
+        this.jakartaRequest = 
JavaxToJakartaRequestWrapper.toJakartaRequest(this.request);
+        this.jakartaResponse = 
JavaxToJakartaResponseWrapper.toJakartaResponse(this.response);
         this.bundleContext = ctx;
     }
 
@@ -115,17 +167,39 @@ public class ScriptHelper implements SlingScriptHelper {
         return script;
     }
 
+    /**
+     * @see 
org.apache.sling.api.scripting.SlingScriptHelper#getJakartaRequest()
+     */
+    public SlingJakartaHttpServletRequest getJakartaRequest() {
+        return jakartaRequest;
+    }
+
+    /**
+     * @see 
org.apache.sling.api.scripting.SlingScriptHelper#getJakartaResponse()
+     */
+    public SlingJakartaHttpServletResponse getJakartaResponse() {
+        return jakartaResponse;
+    }
+
     /**
      * @see org.apache.sling.api.scripting.SlingScriptHelper#getRequest()
      */
+    @SuppressWarnings("deprecation")
     public SlingHttpServletRequest getRequest() {
+        if (this.request == null && this.jakartaRequest != null) {
+            this.request = 
JakartaToJavaxRequestWrapper.toJavaxRequest(this.jakartaRequest);
+        }
         return request;
     }
 
     /**
      * @see org.apache.sling.api.scripting.SlingScriptHelper#getResponse()
      */
+    @SuppressWarnings("deprecation")
     public SlingHttpServletResponse getResponse() {
+        if (this.response == null && this.jakartaResponse != null) {
+            this.response = 
JakartaToJavaxResponseWrapper.toJavaxResponse(this.jakartaResponse);
+        }
         return response;
     }
 
@@ -147,11 +221,11 @@ public class ScriptHelper implements SlingScriptHelper {
      * @see 
org.apache.sling.api.scripting.SlingScriptHelper#include(java.lang.String, 
org.apache.sling.api.request.RequestDispatcherOptions)
      */
     public void include(String path, RequestDispatcherOptions options) {
-        final RequestDispatcher dispatcher = 
getRequest().getRequestDispatcher(path, options);
+        final RequestDispatcher dispatcher = 
getJakartaRequest().getRequestDispatcher(path, options);
 
         if (dispatcher != null) {
             try {
-                dispatcher.include(getRequest(), getResponse());
+                dispatcher.include(getJakartaRequest(), getJakartaResponse());
             } catch (IOException ioe) {
                 throw new SlingIOException(ioe);
             } catch (ServletException se) {
@@ -178,11 +252,11 @@ public class ScriptHelper implements SlingScriptHelper {
      * @see 
org.apache.sling.api.scripting.SlingScriptHelper#forward(java.lang.String, 
org.apache.sling.api.request.RequestDispatcherOptions)
      */
     public void forward(String path, RequestDispatcherOptions options) {
-        final RequestDispatcher dispatcher = 
getRequest().getRequestDispatcher(path, options);
+        final RequestDispatcher dispatcher = 
getJakartaRequest().getRequestDispatcher(path, options);
 
         if (dispatcher != null) {
             try {
-                dispatcher.forward(getRequest(), getResponse());
+                dispatcher.forward(getJakartaRequest(), getJakartaResponse());
             } catch (IOException ioe) {
                 throw new SlingIOException(ioe);
             } catch (ServletException se) {
@@ -300,11 +374,11 @@ public class ScriptHelper implements SlingScriptHelper {
      * @see 
org.apache.sling.api.scripting.SlingScriptHelper#forward(org.apache.sling.api.resource.Resource,
 org.apache.sling.api.request.RequestDispatcherOptions)
      */
     public void forward(Resource resource, RequestDispatcherOptions options) {
-        final RequestDispatcher dispatcher = 
getRequest().getRequestDispatcher(resource, options);
+        final RequestDispatcher dispatcher = 
getJakartaRequest().getRequestDispatcher(resource, options);
 
         if (dispatcher != null) {
             try {
-                dispatcher.forward(getRequest(), getResponse());
+                dispatcher.forward(getJakartaRequest(), getJakartaResponse());
             } catch (IOException ioe) {
                 throw new SlingIOException(ioe);
             } catch (ServletException se) {
@@ -331,11 +405,11 @@ public class ScriptHelper implements SlingScriptHelper {
      * @see 
org.apache.sling.api.scripting.SlingScriptHelper#include(org.apache.sling.api.resource.Resource,
 org.apache.sling.api.request.RequestDispatcherOptions)
      */
     public void include(Resource resource, RequestDispatcherOptions options) {
-        final RequestDispatcher dispatcher = 
getRequest().getRequestDispatcher(resource, options);
+        final RequestDispatcher dispatcher = 
getJakartaRequest().getRequestDispatcher(resource, options);
 
         if (dispatcher != null) {
             try {
-                dispatcher.include(getRequest(), getResponse());
+                dispatcher.include(getJakartaRequest(), getJakartaResponse());
             } catch (IOException ioe) {
                 throw new SlingIOException(ioe);
             } catch (ServletException se) {
@@ -344,25 +418,134 @@ public class ScriptHelper implements SlingScriptHelper {
         }
     }
 
-    private SlingHttpServletRequest wrapIfNeeded(@NotNull 
SlingHttpServletRequest request) {
-        SlingHttpServletRequest initialRequest = request;
+    @SuppressWarnings("deprecation")
+    private SlingHttpServletRequest findOnDemandReader(final @NotNull 
SlingHttpServletRequest initialRequest) {
+        SlingHttpServletRequest request = initialRequest;
         while (request instanceof SlingHttpServletRequestWrapper) {
             if (request instanceof OnDemandReaderRequest) {
-                return initialRequest;
+                return null;
             }
             request = ((SlingHttpServletRequestWrapper) 
request).getSlingRequest();
         }
-        return new OnDemandReaderRequest(initialRequest);
+        if (request instanceof JakartaToJavaxRequestWrapper) {
+            final SlingJakartaHttpServletRequest initialJakartaRequest =
+                    (SlingJakartaHttpServletRequest) 
((JakartaToJavaxRequestWrapper) request).getRequest();
+            final SlingJakartaHttpServletRequest entry = 
findOnDemandReader(initialJakartaRequest);
+            if (entry == null) {
+                return null;
+            }
+            if (entry instanceof JavaxToJakartaRequestWrapper) {
+                request = (SlingHttpServletRequest) 
((JavaxToJakartaRequestWrapper) entry).getRequest();
+                return this.findOnDemandReader(request);
+            }
+        }
+        return request;
+    }
+
+    private SlingJakartaHttpServletRequest findOnDemandReader(
+            final @NotNull SlingJakartaHttpServletRequest initialRequest) {
+        SlingJakartaHttpServletRequest request = initialRequest;
+        while (request instanceof SlingJakartaHttpServletRequestWrapper) {
+            if (request instanceof OnDemandReaderJakartaRequest) {
+                return null;
+            }
+            request = ((SlingJakartaHttpServletRequestWrapper) 
request).getSlingRequest();
+        }
+        if (request instanceof JavaxToJakartaRequestWrapper) {
+            @SuppressWarnings("deprecation")
+            final SlingHttpServletRequest initialJavaxRequest =
+                    (SlingHttpServletRequest) ((JavaxToJakartaRequestWrapper) 
request).getRequest();
+            @SuppressWarnings("deprecation")
+            final SlingHttpServletRequest entry = 
findOnDemandReader(initialJavaxRequest);
+            if (entry == null) {
+                return null;
+            }
+            if (entry instanceof JakartaToJavaxRequestWrapper) {
+                request = (SlingJakartaHttpServletRequest) 
((JakartaToJavaxRequestWrapper) entry).getRequest();
+                return this.findOnDemandReader(request);
+            }
+        }
+        return request;
     }
 
-    private SlingHttpServletResponse wrapIfNeeded(@NotNull 
SlingHttpServletResponse response) {
-        SlingHttpServletResponse initialResponse = response;
+    @SuppressWarnings("deprecation")
+    private SlingHttpServletResponse findOnDemandWriter(final @NotNull 
SlingHttpServletResponse initialResponse) {
+        SlingHttpServletResponse response = initialResponse;
         while (response instanceof SlingHttpServletResponseWrapper) {
             if (response instanceof OnDemandWriterResponse) {
-                return initialResponse;
+                return null;
             }
             response = ((SlingHttpServletResponseWrapper) 
response).getSlingResponse();
         }
+        if (response instanceof JakartaToJavaxResponseWrapper) {
+            final SlingJakartaHttpServletResponse initialJakartaResponse =
+                    (SlingJakartaHttpServletResponse) 
((JakartaToJavaxResponseWrapper) response).getResponse();
+            final SlingJakartaHttpServletResponse entry = 
findOnDemandWriter(initialJakartaResponse);
+            if (entry == null) {
+                return null;
+            }
+            if (entry instanceof JakartaToJavaxResponseWrapper) {
+                response = (SlingHttpServletResponse) 
((JakartaToJavaxResponseWrapper) entry).getResponse();
+                return this.findOnDemandWriter(response);
+            }
+        }
+        return response;
+    }
+
+    private SlingJakartaHttpServletResponse findOnDemandWriter(
+            final @NotNull SlingJakartaHttpServletResponse initialResponse) {
+        SlingJakartaHttpServletResponse response = initialResponse;
+        while (response instanceof SlingJakartaHttpServletResponseWrapper) {
+            if (response instanceof OnDemandWriterJakartaResponse) {
+                return null;
+            }
+            response = ((SlingJakartaHttpServletResponseWrapper) 
response).getSlingResponse();
+        }
+        if (response instanceof JavaxToJakartaResponseWrapper) {
+            @SuppressWarnings("deprecation")
+            final SlingHttpServletResponse initialJavaxResponse =
+                    (SlingHttpServletResponse) 
((JavaxToJakartaResponseWrapper) response).getResponse();
+            @SuppressWarnings("deprecation")
+            final SlingHttpServletResponse entry = 
findOnDemandWriter(initialJavaxResponse);
+            if (entry == null) {
+                return null;
+            }
+            if (entry instanceof JakartaToJavaxResponseWrapper) {
+                response = (SlingJakartaHttpServletResponse) 
((JakartaToJavaxResponseWrapper) entry).getResponse();
+                return this.findOnDemandWriter(response);
+            }
+        }
+        return response;
+    }
+
+    private SlingJakartaHttpServletRequest wrapIfNeeded(final @NotNull 
SlingJakartaHttpServletRequest initialRequest) {
+        if (this.findOnDemandReader(initialRequest) == null) {
+            return initialRequest;
+        }
+        return new OnDemandReaderJakartaRequest(initialRequest);
+    }
+
+    private SlingJakartaHttpServletResponse wrapIfNeeded(
+            final @NotNull SlingJakartaHttpServletResponse initialResponse) {
+        if (this.findOnDemandWriter(initialResponse) == null) {
+            return initialResponse;
+        }
+        return new OnDemandWriterJakartaResponse(initialResponse);
+    }
+
+    @SuppressWarnings("deprecation")
+    private SlingHttpServletRequest wrapIfNeeded(final @NotNull 
SlingHttpServletRequest initialRequest) {
+        if (this.findOnDemandReader(initialRequest) == null) {
+            return initialRequest;
+        }
+        return new OnDemandReaderRequest(initialRequest);
+    }
+
+    @SuppressWarnings("deprecation")
+    private SlingHttpServletResponse wrapIfNeeded(final @NotNull 
SlingHttpServletResponse initialResponse) {
+        if (this.findOnDemandWriter(initialResponse) == null) {
+            return initialResponse;
+        }
         return new OnDemandWriterResponse(initialResponse);
     }
 }
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 7a5a3a9..9fcf9c3 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
@@ -51,8 +51,6 @@ 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;
@@ -63,13 +61,9 @@ 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;
@@ -80,18 +74,19 @@ import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-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;
+import static org.apache.sling.api.scripting.SlingBindings.FLUSH;
+import static org.apache.sling.api.scripting.SlingBindings.JAKARTA_REQUEST;
+import static org.apache.sling.api.scripting.SlingBindings.JAKARTA_RESPONSE;
+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;
 
-@SuppressWarnings("deprecation")
-class DefaultSlingScript implements SlingScript, SlingJakartaScript, Servlet, 
ServletConfig {
+class DefaultSlingScript implements SlingScript, Servlet, ServletConfig {
 
     /** The logger. */
     private static final Logger LOGGER = 
LoggerFactory.getLogger(DefaultSlingScript.class);
@@ -108,8 +103,9 @@ class DefaultSlingScript implements SlingScript, 
SlingJakartaScript, Servlet, Se
     private static ThreadLocal<ResourceResolver> requestResourceResolver = new 
ThreadLocal<>();
 
     /** The set of protected keys. */
-    private static final Set<String> PROTECTED_KEYS =
-            new HashSet<>(Arrays.asList(REQUEST, RESPONSE, READER, SLING, 
RESOURCE, RESOLVER, OUT, LOG));
+    @SuppressWarnings("deprecation")
+    private static final Set<String> PROTECTED_KEYS = new 
HashSet<>(Arrays.asList(
+            REQUEST, RESPONSE, JAKARTA_REQUEST, JAKARTA_RESPONSE, READER, 
SLING, RESOURCE, RESOLVER, OUT, LOG));
 
     private static final Integer[] SCOPES = {
         SlingScriptConstants.SLING_SCOPE, Integer.valueOf(100), 
Integer.valueOf(200)
@@ -145,8 +141,6 @@ class DefaultSlingScript implements SlingScript, 
SlingJakartaScript, Servlet, Se
     /* The cache for compiled scripts. */
     private final ScriptCache scriptCache;
 
-    private final boolean isJakartaScriptEngine;
-
     /**
      * Constructor
      * @param bundleContext The bundle context
@@ -180,7 +174,6 @@ class DefaultSlingScript implements SlingScript, 
SlingJakartaScript, Servlet, Se
             encoding = "UTF-8";
         }
         this.scriptEncoding = encoding;
-        this.isJakartaScriptEngine = false;
     }
 
     // ---------- SlingScript interface 
----------------------------------------
@@ -204,9 +197,6 @@ class DefaultSlingScript implements SlingScript, 
SlingJakartaScript, Servlet, Se
 
     @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);
@@ -350,9 +340,9 @@ class DefaultSlingScript implements SlingScript, 
SlingJakartaScript, Servlet, Se
             };
 
             // set the current resource resolver if a request is available 
from the bindings
-            if (props.getRequest() != null) {
+            if (props.getJakartaRequest() != null) {
                 oldResolver = requestResourceResolver.get();
-                
requestResourceResolver.set(props.getRequest().getResourceResolver());
+                
requestResourceResolver.set(props.getJakartaRequest().getResourceResolver());
             }
 
             // set the script resource resolver as an attribute
@@ -415,248 +405,7 @@ class DefaultSlingScript implements SlingScript, 
SlingJakartaScript, Servlet, Se
             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);
-        ResourceResolver oldResolver = null;
-        try {
-            bindings = verifySlingBindings(props);
-
-            // 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) {
+            if (props.getJakartaRequest() != null) {
                 requestResourceResolver.set(oldResolver);
             }
 
@@ -701,9 +450,9 @@ class DefaultSlingScript implements SlingScript, 
SlingJakartaScript, Servlet, Se
 
         try {
             // prepare the properties for the script
-            final SlingJakartaBindings props = new SlingJakartaBindings();
-            props.setRequest(request);
-            props.setResponse((SlingJakartaHttpServletResponse) res);
+            final SlingBindings props = new SlingBindings();
+            props.setJakartaRequest(request);
+            props.setJakartaResponse((SlingJakartaHttpServletResponse) res);
 
             // try to set content type (unless included)
             if (request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH) 
== null) {
@@ -851,148 +600,12 @@ class DefaultSlingScript implements SlingScript, 
SlingJakartaScript, Servlet, Se
         };
     }
 
-    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;
-    }
-
+    @SuppressWarnings("deprecation")
     Bindings verifySlingBindings(final SlingBindings slingBindings) throws 
IOException {
 
         final Bindings bindings = new LazyBindings();
 
-        final SlingHttpServletRequest request = slingBindings.getRequest();
+        final SlingJakartaHttpServletRequest request = 
slingBindings.getJakartaRequest();
 
         // check sling object
         Object slingObject = slingBindings.get(SLING);
@@ -1000,20 +613,20 @@ class DefaultSlingScript implements SlingScript, 
SlingJakartaScript, Servlet, Se
 
             if (request != null) {
                 slingObject = new InternalScriptHelper(
-                        this.bundleContext, this, request, 
slingBindings.getResponse(), this.cache);
+                        this.bundleContext, this, request, 
slingBindings.getJakartaResponse(), this.cache);
             } else {
                 slingObject = new InternalScriptHelper(this.bundleContext, 
this, this.cache);
             }
-        } else if (!(slingObject instanceof SlingJakartaScriptHelper)) {
+        } else if (!(slingObject instanceof SlingScriptHelper)) {
             throw fail(SLING, "Wrong type");
         }
         final SlingScriptHelper sling = (SlingScriptHelper) slingObject;
         bindings.put(SLING, sling);
 
         if (request != null) {
-            final SlingHttpServletResponse response = 
slingBindings.getResponse();
+            final SlingJakartaHttpServletResponse response = 
slingBindings.getJakartaResponse();
             if (response == null) {
-                throw fail(RESPONSE, "Missing or wrong type");
+                throw fail(JAKARTA_RESPONSE, "Missing or wrong type");
             }
 
             Object resourceObject = slingBindings.get(RESOURCE);
@@ -1034,36 +647,38 @@ class DefaultSlingScript implements SlingScript, 
SlingJakartaScript, Servlet, Se
             // 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.getJakartaRequest() != request) {
+                    throw fail(JAKARTA_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 (sling.getJakartaResponse() != response) {
+                    throw fail(JAKARTA_RESPONSE, "Not the same as response 
field of SlingScriptHelper");
                 }
 
-                if (resourceObject != null && sling.getRequest().getResource() 
!= resourceObject) {
+                if (resourceObject != null && 
sling.getJakartaRequest().getResource() != resourceObject) {
                     throw fail(RESOURCE, "Not the same as resource of the 
SlingScriptHelper request");
                 }
 
-                if (resolverObject != null && 
sling.getRequest().getResourceResolver() != resolverObject) {
+                if (resolverObject != null && 
sling.getJakartaRequest().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) {
+                if (writerObject != null && 
sling.getJakartaResponse().getWriter() != writerObject) {
                     throw fail(OUT, "Not the same as writer of the 
SlingScriptHelper response");
                 }
             }
 
             // set base variables when executing inside a request
+            bindings.put(JAKARTA_REQUEST, sling.getJakartaRequest());
+            bindings.put(JAKARTA_RESPONSE, sling.getJakartaResponse());
             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());
+            bindings.put(READER, sling.getJakartaRequest().getReader());
+            bindings.put(RESOURCE, sling.getJakartaRequest().getResource());
+            bindings.put(RESOLVER, 
sling.getJakartaRequest().getResourceResolver());
+            bindings.put(OUT, sling.getJakartaResponse().getWriter());
         }
 
         Object logObject = slingBindings.get(LOG);
diff --git 
a/src/main/java/org/apache/sling/scripting/core/impl/InternalJakartaScriptHelper.java
 
b/src/main/java/org/apache/sling/scripting/core/impl/InternalJakartaScriptHelper.java
deleted file mode 100644
index 4a43a6f..0000000
--- 
a/src/main/java/org/apache/sling/scripting/core/impl/InternalJakartaScriptHelper.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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.scripting.core.impl;
-
-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.SlingJakartaScript;
-import org.apache.sling.scripting.core.JakartaScriptHelper;
-import org.osgi.framework.BundleContext;
-
-/**
- * Internal script helper
- */
-public class InternalJakartaScriptHelper extends JakartaScriptHelper {
-
-    private final ServiceCache serviceCache;
-
-    public InternalJakartaScriptHelper(
-            final BundleContext ctx,
-            final SlingJakartaScript script,
-            final SlingJakartaHttpServletRequest request,
-            final SlingJakartaHttpServletResponse response,
-            final ServiceCache cache) {
-        super(ctx, script, request, response);
-        this.serviceCache = cache;
-    }
-
-    public InternalJakartaScriptHelper(
-            final BundleContext ctx, final SlingJakartaScript script, final 
ServiceCache cache) {
-        super(ctx, script);
-        this.serviceCache = cache;
-    }
-
-    /**
-     * @see 
org.apache.sling.api.scripting.SlingScriptHelper#getService(java.lang.Class)
-     */
-    @Override
-    public <T> T getService(Class<T> type) {
-        return this.serviceCache.getService(type);
-    }
-
-    @Override
-    public <T> T[] getServices(Class<T> serviceType, String filter) throws 
InvalidServiceFilterSyntaxException {
-        return this.serviceCache.getServices(serviceType, filter);
-    }
-}
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 1a0449c..743e0ea 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
@@ -18,8 +18,8 @@
  */
 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;
@@ -28,7 +28,6 @@ import org.osgi.framework.BundleContext;
 /**
  * Internal script helper
  */
-@Deprecated
 public class InternalScriptHelper extends ScriptHelper {
 
     private final ServiceCache serviceCache;
@@ -36,10 +35,10 @@ public class InternalScriptHelper extends ScriptHelper {
     public InternalScriptHelper(
             final BundleContext ctx,
             final SlingScript script,
-            final SlingHttpServletRequest request,
-            final SlingHttpServletResponse response,
+            final SlingJakartaHttpServletRequest jakartaRequest,
+            final SlingJakartaHttpServletResponse jakartaResponse,
             final ServiceCache cache) {
-        super(ctx, script, request, response);
+        super(ctx, script, jakartaRequest, jakartaResponse);
         this.serviceCache = cache;
     }
 
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 e7d18cf..6615945 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
@@ -41,7 +41,7 @@ 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.SlingJakartaBindings;
+import org.apache.sling.api.scripting.SlingBindings;
 import org.apache.sling.api.scripting.SlingScriptConstants;
 import org.apache.sling.scripting.api.BindingsValuesProvider;
 import org.apache.sling.scripting.api.BindingsValuesProvidersByContext;
@@ -243,9 +243,9 @@ public class ScriptingVariablesConsolePlugin extends 
HttpServlet {
                 null);
 
         // prepare the bindings (similar as in DefaultSlingScript#service)
-        final SlingJakartaBindings initalBindings = new SlingJakartaBindings();
-        initalBindings.setRequest(request);
-        
initalBindings.setResponse(Builders.newResponseBuilder().buildJakartaResponseResult());
+        final SlingBindings initalBindings = new SlingBindings();
+        initalBindings.setJakartaRequest(request);
+        
initalBindings.setJakartaResponse(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/bundled/ScriptContextProvider.java
 
b/src/main/java/org/apache/sling/scripting/core/impl/bundled/ScriptContextProvider.java
index d1a31a8..a6d43d2 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
@@ -35,13 +35,13 @@ import java.util.Set;
 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.SlingJakartaBindings;
+import org.apache.sling.api.scripting.SlingBindings;
 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.JakartaScriptHelper;
-import org.apache.sling.scripting.core.impl.InternalJakartaScriptHelper;
+import org.apache.sling.scripting.core.ScriptHelper;
+import org.apache.sling.scripting.core.impl.InternalScriptHelper;
 import org.apache.sling.scripting.core.impl.helper.ProtectedBindings;
 import org.apache.sling.scripting.spi.bundle.BundledRenderUnit;
 import org.osgi.service.component.annotations.Component;
@@ -62,15 +62,18 @@ public class ScriptContextProvider {
                     + " limit of %s microseconds; if this message appears 
often it indicates that this BindingsValuesProvider has an impact on "
                     + "general page rendering performance.";
 
+    @SuppressWarnings("deprecation")
     private static final Set<String> PROTECTED_BINDINGS = 
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
-            SlingJakartaBindings.REQUEST,
-            SlingJakartaBindings.RESPONSE,
-            SlingJakartaBindings.READER,
-            SlingJakartaBindings.RESOURCE,
-            SlingJakartaBindings.RESOLVER,
-            SlingJakartaBindings.OUT,
-            SlingJakartaBindings.LOG,
-            SlingJakartaBindings.SLING,
+            SlingBindings.REQUEST,
+            SlingBindings.RESPONSE,
+            SlingBindings.JAKARTA_REQUEST,
+            SlingBindings.JAKARTA_RESPONSE,
+            SlingBindings.READER,
+            SlingBindings.RESOURCE,
+            SlingBindings.RESOLVER,
+            SlingBindings.OUT,
+            SlingBindings.LOG,
+            SlingBindings.SLING,
             ScriptEngine.FILENAME,
             BundledRenderUnit.VARIABLE)));
 
@@ -86,7 +89,7 @@ public class ScriptContextProvider {
     public ExecutableContext prepareScriptContext(
             SlingJakartaHttpServletRequest request, 
SlingJakartaHttpServletResponse response, ExecutableUnit executable)
             throws IOException {
-        InternalJakartaScriptHelper scriptHelper = new 
InternalJakartaScriptHelper(
+        InternalScriptHelper scriptHelper = new InternalScriptHelper(
                 executable.getBundleContext(),
                 new SlingScriptAdapter(request.getResourceResolver(), 
executable.getPath(), "sling/bundle/resource"),
                 request,
@@ -105,17 +108,16 @@ public class ScriptContextProvider {
         Bindings bindings = new LazyBindings();
         bindings.put("properties", (LazyBindings.Supplier)
                 () -> scriptHelper.getRequest().getResource().getValueMap());
-        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.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.RESOLVER,
-                scriptHelper.getRequest().getResource().getResourceResolver());
+                SlingBindings.RESOLVER, 
scriptHelper.getRequest().getResource().getResourceResolver());
         Logger scriptLogger = LoggerFactory.getLogger(executable.getName());
-        bindings.put(SlingJakartaBindings.LOG, scriptLogger);
-        bindings.put(SlingJakartaBindings.SLING, scriptHelper);
+        bindings.put(SlingBindings.LOG, scriptLogger);
+        bindings.put(SlingBindings.SLING, scriptHelper);
         bindings.put(BundledRenderUnit.VARIABLE, executable);
         bindings.put(ScriptEngine.FILENAME, executable.getPath());
         bindings.put(ScriptEngine.FILENAME.replace(".", "_"), 
executable.getPath());
@@ -188,10 +190,10 @@ public class ScriptContextProvider {
 
         void clean() {
             Bindings engineBindings = 
scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
-            if (engineBindings != null && 
engineBindings.containsKey(SlingJakartaBindings.SLING)) {
-                Object scriptHelper = 
engineBindings.get(SlingJakartaBindings.SLING);
-                if (scriptHelper instanceof JakartaScriptHelper) {
-                    ((JakartaScriptHelper) scriptHelper).cleanup();
+            if (engineBindings != null && 
engineBindings.containsKey(SlingBindings.SLING)) {
+                Object scriptHelper = engineBindings.get(SlingBindings.SLING);
+                if (scriptHelper instanceof ScriptHelper) {
+                    ((ScriptHelper) 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 05c964f..46fe9eb 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.SlingJakartaBindings;
-import org.apache.sling.api.scripting.SlingJakartaScript;
+import org.apache.sling.api.scripting.SlingBindings;
+import org.apache.sling.api.scripting.SlingScript;
 import org.jetbrains.annotations.NotNull;
 
-class SlingScriptAdapter extends SyntheticResource implements 
SlingJakartaScript {
+class SlingScriptAdapter extends SyntheticResource implements SlingScript {
     SlingScriptAdapter(ResourceResolver resolver, String path, String type) {
         super(resolver, path, type);
     }
@@ -36,12 +36,12 @@ class SlingScriptAdapter extends SyntheticResource 
implements SlingJakartaScript
     }
 
     @Override
-    public Object eval(@NotNull SlingJakartaBindings props) {
+    public Object eval(@NotNull SlingBindings props) {
         throw new IllegalStateException("Not implemented");
     }
 
     @Override
-    public Object call(@NotNull SlingJakartaBindings props, @NotNull String 
method, Object... args) {
+    public Object call(@NotNull SlingBindings props, @NotNull String method, 
Object... args) {
         throw new IllegalStateException("Not implemented");
     }
 }
diff --git 
a/src/test/java/org/apache/sling/scripting/core/JakartaScriptHelperTest.java 
b/src/test/java/org/apache/sling/scripting/core/JakartaScriptHelperTest.java
deleted file mode 100644
index 7aa3a3e..0000000
--- a/src/test/java/org/apache/sling/scripting/core/JakartaScriptHelperTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.scripting.core;
-
-import java.util.Dictionary;
-import java.util.Hashtable;
-
-import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.osgi.framework.Constants;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-
-public class JakartaScriptHelperTest {
-
-    @Rule
-    public OsgiContext sling = new OsgiContext();
-
-    private JakartaScriptHelper sh;
-    private final int[] RANKINGS = {42, 62, -12, 76, -123, 0, 7432, -21};
-
-    @Before
-    public void setup() {
-        sh = new JakartaScriptHelper(sling.bundleContext(), null);
-
-        for (int rank : RANKINGS) {
-            final Integer svc = rank;
-            final Dictionary<String, Object> props = new Hashtable<String, 
Object>();
-            props.put(Constants.SERVICE_RANKING, rank);
-            sling.bundleContext().registerService(Integer.class.getName(), 
svc, props);
-        }
-    }
-
-    private void assertHigherRankingComesFirst(Integer... values) {
-        Integer previous = null;
-        for (Integer current : values) {
-            if (previous != null && current > previous) {
-                fail("Ranking " + current + " is higher than previous " + 
previous);
-            }
-            previous = current;
-        }
-    }
-
-    @Test
-    public void testNullRefs() {
-        assertNull("Expecting null if no services found", 
sh.getService(JakartaScriptHelperTest.class));
-    }
-
-    @Test
-    public void testGetServicesOrdering() {
-        final Integer[] svc = sh.getServices(Integer.class, null);
-        assertNotNull(svc);
-        assertEquals(RANKINGS.length, svc.length);
-        assertHigherRankingComesFirst(svc);
-    }
-}
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 0fd6526..f0772c8 100644
--- a/src/test/java/org/apache/sling/scripting/core/ScriptHelperTest.java
+++ b/src/test/java/org/apache/sling/scripting/core/ScriptHelperTest.java
@@ -21,18 +21,36 @@ package org.apache.sling.scripting.core;
 import java.util.Dictionary;
 import java.util.Hashtable;
 
+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.wrappers.JakartaToJavaxRequestWrapper;
+import org.apache.sling.api.wrappers.JakartaToJavaxResponseWrapper;
+import org.apache.sling.api.wrappers.JavaxToJakartaRequestWrapper;
+import org.apache.sling.api.wrappers.JavaxToJakartaResponseWrapper;
+import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
+import org.apache.sling.api.wrappers.SlingHttpServletResponseWrapper;
+import org.apache.sling.api.wrappers.SlingJakartaHttpServletRequestWrapper;
+import org.apache.sling.api.wrappers.SlingJakartaHttpServletResponseWrapper;
+import 
org.apache.sling.scripting.core.impl.helper.OnDemandReaderJakartaRequest;
+import org.apache.sling.scripting.core.impl.helper.OnDemandReaderRequest;
+import 
org.apache.sling.scripting.core.impl.helper.OnDemandWriterJakartaResponse;
+import org.apache.sling.scripting.core.impl.helper.OnDemandWriterResponse;
 import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
+import org.mockito.Mockito;
 import org.osgi.framework.Constants;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-@SuppressWarnings("deprecation")
 public class ScriptHelperTest {
 
     @Rule
@@ -75,4 +93,390 @@ public class ScriptHelperTest {
         assertEquals(RANKINGS.length, svc.length);
         assertHigherRankingComesFirst(svc);
     }
+
+    @Test
+    public void testJakartaGetRequestResponseNoWrap() {
+        final SlingJakartaHttpServletRequest req1 = 
Mockito.mock(OnDemandReaderJakartaRequest.class);
+        final SlingJakartaHttpServletRequest request = new 
SlingJakartaHttpServletRequestWrapper(req1);
+        final SlingJakartaHttpServletResponse res1 = 
Mockito.mock(OnDemandWriterJakartaResponse.class);
+        final SlingJakartaHttpServletResponse response = new 
SlingJakartaHttpServletResponseWrapper(res1);
+
+        final ScriptHelper scriptHelper = new 
ScriptHelper(sling.bundleContext(), null, request, response);
+
+        assertNotNull(scriptHelper.getJakartaRequest());
+        assertSame(request, scriptHelper.getJakartaRequest());
+
+        assertNotNull(scriptHelper.getRequest());
+        assertTrue(scriptHelper.getRequest() instanceof 
JakartaToJavaxRequestWrapper);
+        assertSame(
+                scriptHelper.getJakartaRequest(),
+                ((JakartaToJavaxRequestWrapper) 
scriptHelper.getRequest()).getRequest());
+
+        assertNotNull(scriptHelper.getJakartaResponse());
+        assertSame(response, scriptHelper.getJakartaResponse());
+
+        assertNotNull(scriptHelper.getResponse());
+        assertTrue(scriptHelper.getResponse() instanceof 
JakartaToJavaxResponseWrapper);
+        assertSame(
+                scriptHelper.getJakartaResponse(),
+                ((JakartaToJavaxResponseWrapper) 
scriptHelper.getResponse()).getResponse());
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testGetRequestResponseNoWrap() {
+        final SlingHttpServletRequest req1 = 
Mockito.mock(OnDemandReaderRequest.class);
+        final SlingHttpServletRequest request = new 
SlingHttpServletRequestWrapper(req1);
+        final SlingHttpServletResponse res1 = 
Mockito.mock(OnDemandWriterResponse.class);
+        final SlingHttpServletResponse response = new 
SlingHttpServletResponseWrapper(res1);
+
+        final ScriptHelper scriptHelper = new 
ScriptHelper(sling.bundleContext(), null, request, response);
+
+        assertNotNull(scriptHelper.getRequest());
+        assertSame(request, scriptHelper.getRequest());
+
+        assertNotNull(scriptHelper.getJakartaRequest());
+        assertTrue(scriptHelper.getJakartaRequest() instanceof 
JavaxToJakartaRequestWrapper);
+        assertSame(
+                scriptHelper.getRequest(),
+                ((JavaxToJakartaRequestWrapper) 
scriptHelper.getJakartaRequest()).getRequest());
+
+        assertNotNull(scriptHelper.getResponse());
+        assertSame(response, scriptHelper.getResponse());
+
+        assertNotNull(scriptHelper.getJakartaResponse());
+        assertTrue(scriptHelper.getJakartaResponse() instanceof 
JavaxToJakartaResponseWrapper);
+        assertSame(
+                scriptHelper.getResponse(),
+                ((JavaxToJakartaResponseWrapper) 
scriptHelper.getJakartaResponse()).getResponse());
+    }
+
+    @Test
+    public void testJakartaGetRequestResponseWrap() {
+        final SlingJakartaHttpServletRequest request = 
Mockito.mock(SlingJakartaHttpServletRequest.class);
+        final SlingJakartaHttpServletResponse response = 
Mockito.mock(SlingJakartaHttpServletResponse.class);
+
+        final ScriptHelper scriptHelper = new 
ScriptHelper(sling.bundleContext(), null, request, response);
+
+        assertNotNull(scriptHelper.getJakartaRequest());
+        assertTrue(scriptHelper.getJakartaRequest() instanceof 
OnDemandReaderJakartaRequest);
+        assertSame(request, ((OnDemandReaderJakartaRequest) 
scriptHelper.getJakartaRequest()).getRequest());
+
+        assertNotNull(scriptHelper.getRequest());
+        assertTrue(scriptHelper.getRequest() instanceof 
JakartaToJavaxRequestWrapper);
+        assertSame(
+                scriptHelper.getJakartaRequest(),
+                ((JakartaToJavaxRequestWrapper) 
scriptHelper.getRequest()).getRequest());
+
+        assertNotNull(scriptHelper.getJakartaResponse());
+        assertTrue(scriptHelper.getJakartaResponse() instanceof 
OnDemandWriterJakartaResponse);
+        assertSame(response, ((OnDemandWriterJakartaResponse) 
scriptHelper.getJakartaResponse()).getResponse());
+
+        assertNotNull(scriptHelper.getResponse());
+        assertTrue(scriptHelper.getResponse() instanceof 
JakartaToJavaxResponseWrapper);
+        assertSame(
+                scriptHelper.getJakartaResponse(),
+                ((JakartaToJavaxResponseWrapper) 
scriptHelper.getResponse()).getResponse());
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testGetRequestResponseWrap() {
+        final SlingHttpServletRequest request = 
Mockito.mock(SlingHttpServletRequest.class);
+        final SlingHttpServletResponse response = 
Mockito.mock(SlingHttpServletResponse.class);
+
+        final ScriptHelper scriptHelper = new 
ScriptHelper(sling.bundleContext(), null, request, response);
+
+        assertNotNull(scriptHelper.getRequest());
+        assertTrue(scriptHelper.getRequest() instanceof OnDemandReaderRequest);
+        assertSame(request, ((OnDemandReaderRequest) 
scriptHelper.getRequest()).getRequest());
+
+        assertNotNull(scriptHelper.getJakartaRequest());
+        assertTrue(scriptHelper.getJakartaRequest() instanceof 
JavaxToJakartaRequestWrapper);
+        assertSame(
+                scriptHelper.getRequest(),
+                ((JavaxToJakartaRequestWrapper) 
scriptHelper.getJakartaRequest()).getRequest());
+
+        assertNotNull(scriptHelper.getResponse());
+        assertTrue(scriptHelper.getResponse() instanceof 
OnDemandWriterResponse);
+        assertSame(response, ((OnDemandWriterResponse) 
scriptHelper.getResponse()).getResponse());
+
+        assertNotNull(scriptHelper.getJakartaResponse());
+        assertTrue(scriptHelper.getJakartaResponse() instanceof 
JavaxToJakartaResponseWrapper);
+        assertSame(
+                scriptHelper.getResponse(),
+                ((JavaxToJakartaResponseWrapper) 
scriptHelper.getJakartaResponse()).getResponse());
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testJakartaGetRequestResponseCrossNoWrap() {
+        final SlingHttpServletRequest req1 = 
Mockito.mock(OnDemandReaderRequest.class);
+        final SlingJakartaHttpServletRequest req2 = 
JavaxToJakartaRequestWrapper.toJakartaRequest(req1);
+        final SlingJakartaHttpServletRequest request = new 
SlingJakartaHttpServletRequestWrapper(req2);
+        final SlingHttpServletResponse res1 = 
Mockito.mock(OnDemandWriterResponse.class);
+        final SlingJakartaHttpServletResponse res2 = 
JavaxToJakartaResponseWrapper.toJakartaResponse(res1);
+        final SlingJakartaHttpServletResponse response = new 
SlingJakartaHttpServletResponseWrapper(res2);
+
+        final ScriptHelper scriptHelper = new 
ScriptHelper(sling.bundleContext(), null, request, response);
+
+        assertNotNull(scriptHelper.getJakartaRequest());
+        assertSame(request, scriptHelper.getJakartaRequest());
+
+        assertNotNull(scriptHelper.getRequest());
+        assertTrue(scriptHelper.getRequest() instanceof 
JakartaToJavaxRequestWrapper);
+        assertSame(
+                scriptHelper.getJakartaRequest(),
+                ((JakartaToJavaxRequestWrapper) 
scriptHelper.getRequest()).getRequest());
+
+        assertNotNull(scriptHelper.getJakartaResponse());
+        assertSame(response, scriptHelper.getJakartaResponse());
+
+        assertNotNull(scriptHelper.getResponse());
+        assertTrue(scriptHelper.getResponse() instanceof 
JakartaToJavaxResponseWrapper);
+        assertSame(
+                scriptHelper.getJakartaResponse(),
+                ((JakartaToJavaxResponseWrapper) 
scriptHelper.getResponse()).getResponse());
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testGetRequestResponseCrossNoWrap() {
+        final SlingJakartaHttpServletRequest req1 = 
Mockito.mock(OnDemandReaderJakartaRequest.class);
+        final SlingHttpServletRequest req2 = 
JakartaToJavaxRequestWrapper.toJavaxRequest(req1);
+        final SlingHttpServletRequest request = new 
SlingHttpServletRequestWrapper(req2);
+        final SlingJakartaHttpServletResponse res1 = 
Mockito.mock(OnDemandWriterJakartaResponse.class);
+        final SlingHttpServletResponse res2 = 
JakartaToJavaxResponseWrapper.toJavaxResponse(res1);
+        final SlingHttpServletResponse response = new 
SlingHttpServletResponseWrapper(res2);
+
+        final ScriptHelper scriptHelper = new 
ScriptHelper(sling.bundleContext(), null, request, response);
+
+        assertNotNull(scriptHelper.getRequest());
+        assertSame(request, scriptHelper.getRequest());
+
+        assertNotNull(scriptHelper.getJakartaRequest());
+        assertTrue(scriptHelper.getJakartaRequest() instanceof 
JavaxToJakartaRequestWrapper);
+        assertSame(
+                scriptHelper.getRequest(),
+                ((JavaxToJakartaRequestWrapper) 
scriptHelper.getJakartaRequest()).getRequest());
+
+        assertNotNull(scriptHelper.getResponse());
+        assertSame(response, scriptHelper.getResponse());
+
+        assertNotNull(scriptHelper.getJakartaResponse());
+        assertTrue(scriptHelper.getJakartaResponse() instanceof 
JavaxToJakartaResponseWrapper);
+        assertSame(
+                scriptHelper.getResponse(),
+                ((JavaxToJakartaResponseWrapper) 
scriptHelper.getJakartaResponse()).getResponse());
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testJakartaGetRequestResponseCross2NoWrap() {
+        final SlingJakartaHttpServletRequest req1 = 
Mockito.mock(OnDemandReaderJakartaRequest.class);
+        final SlingHttpServletRequest req2 = 
JakartaToJavaxRequestWrapper.toJavaxRequest(req1);
+        final SlingJakartaHttpServletRequest req3 = 
JavaxToJakartaRequestWrapper.toJakartaRequest(req2);
+        final SlingJakartaHttpServletRequest request = new 
SlingJakartaHttpServletRequestWrapper(req3);
+        final SlingJakartaHttpServletResponse res1 = 
Mockito.mock(OnDemandWriterJakartaResponse.class);
+        final SlingHttpServletResponse res2 = 
JakartaToJavaxResponseWrapper.toJavaxResponse(res1);
+        final SlingJakartaHttpServletResponse res3 = 
JavaxToJakartaResponseWrapper.toJakartaResponse(res2);
+        final SlingJakartaHttpServletResponse response = new 
SlingJakartaHttpServletResponseWrapper(res3);
+
+        final ScriptHelper scriptHelper = new 
ScriptHelper(sling.bundleContext(), null, request, response);
+
+        assertNotNull(scriptHelper.getJakartaRequest());
+        assertSame(request, scriptHelper.getJakartaRequest());
+
+        assertNotNull(scriptHelper.getRequest());
+        assertTrue(scriptHelper.getRequest() instanceof 
JakartaToJavaxRequestWrapper);
+        assertSame(
+                scriptHelper.getJakartaRequest(),
+                ((JakartaToJavaxRequestWrapper) 
scriptHelper.getRequest()).getRequest());
+
+        assertNotNull(scriptHelper.getJakartaResponse());
+        assertSame(response, scriptHelper.getJakartaResponse());
+
+        assertNotNull(scriptHelper.getResponse());
+        assertTrue(scriptHelper.getResponse() instanceof 
JakartaToJavaxResponseWrapper);
+        assertSame(
+                scriptHelper.getJakartaResponse(),
+                ((JakartaToJavaxResponseWrapper) 
scriptHelper.getResponse()).getResponse());
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testGetRequestResponseCross2NoWrap() {
+        final SlingHttpServletRequest req1 = 
Mockito.mock(OnDemandReaderRequest.class);
+        final SlingJakartaHttpServletRequest req2 = 
JavaxToJakartaRequestWrapper.toJakartaRequest(req1);
+        final SlingHttpServletRequest req3 = 
JakartaToJavaxRequestWrapper.toJavaxRequest(req2);
+        final SlingHttpServletRequest request = new 
SlingHttpServletRequestWrapper(req3);
+        final SlingHttpServletResponse res1 = 
Mockito.mock(OnDemandWriterResponse.class);
+        final SlingJakartaHttpServletResponse res2 = 
JavaxToJakartaResponseWrapper.toJakartaResponse(res1);
+        final SlingHttpServletResponse res3 = 
JakartaToJavaxResponseWrapper.toJavaxResponse(res2);
+        final SlingHttpServletResponse response = new 
SlingHttpServletResponseWrapper(res3);
+
+        final ScriptHelper scriptHelper = new 
ScriptHelper(sling.bundleContext(), null, request, response);
+
+        assertNotNull(scriptHelper.getRequest());
+        assertSame(request, scriptHelper.getRequest());
+
+        assertNotNull(scriptHelper.getJakartaRequest());
+        assertTrue(scriptHelper.getJakartaRequest() instanceof 
JavaxToJakartaRequestWrapper);
+        assertSame(
+                scriptHelper.getRequest(),
+                ((JavaxToJakartaRequestWrapper) 
scriptHelper.getJakartaRequest()).getRequest());
+
+        assertNotNull(scriptHelper.getResponse());
+        assertSame(response, scriptHelper.getResponse());
+
+        assertNotNull(scriptHelper.getJakartaResponse());
+        assertTrue(scriptHelper.getJakartaResponse() instanceof 
JavaxToJakartaResponseWrapper);
+        assertSame(
+                scriptHelper.getResponse(),
+                ((JavaxToJakartaResponseWrapper) 
scriptHelper.getJakartaResponse()).getResponse());
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testJakartaGetRequestResponseCross3NoWrap() {
+        final SlingHttpServletRequest req1 = 
Mockito.mock(OnDemandReaderRequest.class);
+        final SlingJakartaHttpServletRequest req2 = 
JavaxToJakartaRequestWrapper.toJakartaRequest(req1);
+        final SlingHttpServletRequest req3 = 
JakartaToJavaxRequestWrapper.toJavaxRequest(req2);
+        final SlingJakartaHttpServletRequest req4 = 
JavaxToJakartaRequestWrapper.toJakartaRequest(req3);
+        final SlingJakartaHttpServletRequest request = new 
SlingJakartaHttpServletRequestWrapper(req4);
+        final SlingHttpServletResponse res1 = 
Mockito.mock(OnDemandWriterResponse.class);
+        final SlingJakartaHttpServletResponse res2 = 
JavaxToJakartaResponseWrapper.toJakartaResponse(res1);
+        final SlingHttpServletResponse res3 = 
JakartaToJavaxResponseWrapper.toJavaxResponse(res2);
+        final SlingJakartaHttpServletResponse res4 = 
JavaxToJakartaResponseWrapper.toJakartaResponse(res3);
+        final SlingJakartaHttpServletResponse response = new 
SlingJakartaHttpServletResponseWrapper(res4);
+
+        final ScriptHelper scriptHelper = new 
ScriptHelper(sling.bundleContext(), null, request, response);
+
+        assertNotNull(scriptHelper.getJakartaRequest());
+        assertSame(request, scriptHelper.getJakartaRequest());
+
+        assertNotNull(scriptHelper.getRequest());
+        assertTrue(scriptHelper.getRequest() instanceof 
JakartaToJavaxRequestWrapper);
+        assertSame(
+                scriptHelper.getJakartaRequest(),
+                ((JakartaToJavaxRequestWrapper) 
scriptHelper.getRequest()).getRequest());
+
+        assertNotNull(scriptHelper.getJakartaResponse());
+        assertSame(response, scriptHelper.getJakartaResponse());
+
+        assertNotNull(scriptHelper.getResponse());
+        assertTrue(scriptHelper.getResponse() instanceof 
JakartaToJavaxResponseWrapper);
+        assertSame(
+                scriptHelper.getJakartaResponse(),
+                ((JakartaToJavaxResponseWrapper) 
scriptHelper.getResponse()).getResponse());
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testGetRequestResponseCross3NoWrap() {
+        final SlingJakartaHttpServletRequest req1 = 
Mockito.mock(OnDemandReaderJakartaRequest.class);
+        final SlingHttpServletRequest req2 = 
JakartaToJavaxRequestWrapper.toJavaxRequest(req1);
+        final SlingJakartaHttpServletRequest req3 = 
JavaxToJakartaRequestWrapper.toJakartaRequest(req2);
+        final SlingHttpServletRequest req4 = 
JakartaToJavaxRequestWrapper.toJavaxRequest(req3);
+        final SlingHttpServletRequest request = new 
SlingHttpServletRequestWrapper(req4);
+        final SlingJakartaHttpServletResponse res1 = 
Mockito.mock(OnDemandWriterJakartaResponse.class);
+        final SlingHttpServletResponse res2 = 
JakartaToJavaxResponseWrapper.toJavaxResponse(res1);
+        final SlingJakartaHttpServletResponse res3 = 
JavaxToJakartaResponseWrapper.toJakartaResponse(res2);
+        final SlingHttpServletResponse res4 = 
JakartaToJavaxResponseWrapper.toJavaxResponse(res3);
+        final SlingHttpServletResponse response = new 
SlingHttpServletResponseWrapper(res4);
+
+        final ScriptHelper scriptHelper = new 
ScriptHelper(sling.bundleContext(), null, request, response);
+
+        assertNotNull(scriptHelper.getRequest());
+        assertSame(request, scriptHelper.getRequest());
+
+        assertNotNull(scriptHelper.getJakartaRequest());
+        assertTrue(scriptHelper.getJakartaRequest() instanceof 
JavaxToJakartaRequestWrapper);
+        assertSame(
+                scriptHelper.getRequest(),
+                ((JavaxToJakartaRequestWrapper) 
scriptHelper.getJakartaRequest()).getRequest());
+
+        assertNotNull(scriptHelper.getResponse());
+        assertSame(response, scriptHelper.getResponse());
+
+        assertNotNull(scriptHelper.getJakartaResponse());
+        assertTrue(scriptHelper.getJakartaResponse() instanceof 
JavaxToJakartaResponseWrapper);
+        assertSame(
+                scriptHelper.getResponse(),
+                ((JavaxToJakartaResponseWrapper) 
scriptHelper.getJakartaResponse()).getResponse());
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testJakartaGetRequestResponseCross3Wrap() {
+        final SlingHttpServletRequest req1 = 
Mockito.mock(SlingHttpServletRequest.class);
+        final SlingJakartaHttpServletRequest req2 = 
JavaxToJakartaRequestWrapper.toJakartaRequest(req1);
+        final SlingHttpServletRequest req3 = 
JakartaToJavaxRequestWrapper.toJavaxRequest(req2);
+        final SlingJakartaHttpServletRequest req4 = 
JavaxToJakartaRequestWrapper.toJakartaRequest(req3);
+        final SlingJakartaHttpServletRequest request = new 
SlingJakartaHttpServletRequestWrapper(req4);
+        final SlingHttpServletResponse res1 = 
Mockito.mock(SlingHttpServletResponse.class);
+        final SlingJakartaHttpServletResponse res2 = 
JavaxToJakartaResponseWrapper.toJakartaResponse(res1);
+        final SlingHttpServletResponse res3 = 
JakartaToJavaxResponseWrapper.toJavaxResponse(res2);
+        final SlingJakartaHttpServletResponse res4 = 
JavaxToJakartaResponseWrapper.toJakartaResponse(res3);
+        final SlingJakartaHttpServletResponse response = new 
SlingJakartaHttpServletResponseWrapper(res4);
+
+        final ScriptHelper scriptHelper = new 
ScriptHelper(sling.bundleContext(), null, request, response);
+
+        assertNotNull(scriptHelper.getJakartaRequest());
+        assertTrue(scriptHelper.getJakartaRequest() instanceof 
OnDemandReaderJakartaRequest);
+        assertSame(request, ((OnDemandReaderJakartaRequest) 
scriptHelper.getJakartaRequest()).getRequest());
+
+        assertNotNull(scriptHelper.getRequest());
+        assertTrue(scriptHelper.getRequest() instanceof 
JakartaToJavaxRequestWrapper);
+        assertSame(
+                scriptHelper.getJakartaRequest(),
+                ((JakartaToJavaxRequestWrapper) 
scriptHelper.getRequest()).getRequest());
+
+        assertNotNull(scriptHelper.getJakartaResponse());
+        assertTrue(scriptHelper.getJakartaResponse() instanceof 
OnDemandWriterJakartaResponse);
+        assertSame(response, ((OnDemandWriterJakartaResponse) 
scriptHelper.getJakartaResponse()).getResponse());
+
+        assertNotNull(scriptHelper.getResponse());
+        assertTrue(scriptHelper.getResponse() instanceof 
JakartaToJavaxResponseWrapper);
+        assertSame(
+                scriptHelper.getJakartaResponse(),
+                ((JakartaToJavaxResponseWrapper) 
scriptHelper.getResponse()).getResponse());
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testGetRequestResponseCross3Wrap() {
+        final SlingJakartaHttpServletRequest req1 = 
Mockito.mock(SlingJakartaHttpServletRequest.class);
+        final SlingHttpServletRequest req2 = 
JakartaToJavaxRequestWrapper.toJavaxRequest(req1);
+        final SlingJakartaHttpServletRequest req3 = 
JavaxToJakartaRequestWrapper.toJakartaRequest(req2);
+        final SlingHttpServletRequest req4 = 
JakartaToJavaxRequestWrapper.toJavaxRequest(req3);
+        final SlingHttpServletRequest request = new 
SlingHttpServletRequestWrapper(req4);
+        final SlingJakartaHttpServletResponse res1 = 
Mockito.mock(SlingJakartaHttpServletResponse.class);
+        final SlingHttpServletResponse res2 = 
JakartaToJavaxResponseWrapper.toJavaxResponse(res1);
+        final SlingJakartaHttpServletResponse res3 = 
JavaxToJakartaResponseWrapper.toJakartaResponse(res2);
+        final SlingHttpServletResponse res4 = 
JakartaToJavaxResponseWrapper.toJavaxResponse(res3);
+        final SlingHttpServletResponse response = new 
SlingHttpServletResponseWrapper(res4);
+
+        final ScriptHelper scriptHelper = new 
ScriptHelper(sling.bundleContext(), null, request, response);
+
+        assertNotNull(scriptHelper.getRequest());
+        assertTrue(scriptHelper.getRequest() instanceof OnDemandReaderRequest);
+        assertSame(request, ((OnDemandReaderRequest) 
scriptHelper.getRequest()).getRequest());
+
+        assertNotNull(scriptHelper.getJakartaRequest());
+        assertTrue(scriptHelper.getJakartaRequest() instanceof 
JavaxToJakartaRequestWrapper);
+        assertSame(
+                scriptHelper.getRequest(),
+                ((JavaxToJakartaRequestWrapper) 
scriptHelper.getJakartaRequest()).getRequest());
+
+        assertNotNull(scriptHelper.getResponse());
+        assertTrue(scriptHelper.getResponse() instanceof 
OnDemandWriterResponse);
+        assertSame(response, ((OnDemandWriterResponse) 
scriptHelper.getResponse()).getResponse());
+
+        assertNotNull(scriptHelper.getJakartaResponse());
+        assertTrue(scriptHelper.getJakartaResponse() instanceof 
JavaxToJakartaResponseWrapper);
+        assertSame(
+                scriptHelper.getResponse(),
+                ((JavaxToJakartaResponseWrapper) 
scriptHelper.getJakartaResponse()).getResponse());
+    }
 }

Reply via email to