You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ra...@apache.org on 2021/08/04 16:23:19 UTC

[sling-org-apache-sling-scripting-core] branch master updated: SLING-10701 - Avoid unnecessary wrapping of the request and response objects

This is an automated email from the ASF dual-hosted git repository.

radu 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 4010fe3  SLING-10701 - Avoid unnecessary wrapping of the request and response objects
4010fe3 is described below

commit 4010fe3d1e732c0ef8e79ee7603df50ec1b2f8b6
Author: Radu Cotescu <ra...@apache.org>
AuthorDate: Wed Aug 4 18:21:29 2021 +0200

    SLING-10701 - Avoid unnecessary wrapping of the request and response objects
    
    * conditionally wrap the request and response objects in ScriptHelper
    * stopped wrapping the request and the response in AbstractBundledRenderUnit
    and rather rely on the ScriptHelper in the ScriptContextProvider
---
 .../apache/sling/scripting/core/ScriptHelper.java  | 29 ++++++++++++++++++++--
 .../impl/bundled/AbstractBundledRenderUnit.java    |  3 +--
 .../core/impl/bundled/ScriptContextProvider.java   | 28 +++++++++++----------
 3 files changed, 43 insertions(+), 17 deletions(-)

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 790d73a..ce6b8f1 100644
--- a/src/main/java/org/apache/sling/scripting/core/ScriptHelper.java
+++ b/src/main/java/org/apache/sling/scripting/core/ScriptHelper.java
@@ -40,8 +40,11 @@ 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.SlingHttpServletRequestWrapper;
+import org.apache.sling.api.wrappers.SlingHttpServletResponseWrapper;
 import org.apache.sling.scripting.core.impl.helper.OnDemandReaderRequest;
 import org.apache.sling.scripting.core.impl.helper.OnDemandWriterResponse;
+import org.jetbrains.annotations.NotNull;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
@@ -97,8 +100,8 @@ public class ScriptHelper implements SlingScriptHelper {
             throw new IllegalArgumentException("Bundle context must not be null.");
         }
         this.script = script;
-        this.request = new OnDemandReaderRequest(request);
-        this.response = new OnDemandWriterResponse(response);
+        this.request = wrapIfNeeded(request);
+        this.response = wrapIfNeeded(response);
         this.bundleContext = ctx;
     }
 
@@ -342,4 +345,26 @@ public class ScriptHelper implements SlingScriptHelper {
             }
         }
     }
+
+    private SlingHttpServletRequest wrapIfNeeded(@NotNull SlingHttpServletRequest request) {
+        SlingHttpServletRequest initialRequest = request;
+        while (request instanceof SlingHttpServletRequestWrapper) {
+            if (request instanceof OnDemandReaderRequest) {
+                return initialRequest;
+            }
+            request = ((SlingHttpServletRequestWrapper) request).getSlingRequest();
+        }
+        return new OnDemandReaderRequest(initialRequest);
+    }
+
+    private SlingHttpServletResponse wrapIfNeeded(@NotNull SlingHttpServletResponse response) {
+        SlingHttpServletResponse initialResponse = response;
+        while (response instanceof SlingHttpServletResponseWrapper) {
+            if (response instanceof OnDemandWriterResponse) {
+                return initialResponse;
+            }
+            response = ((SlingHttpServletResponseWrapper) response).getSlingResponse();
+        }
+        return new OnDemandWriterResponse(initialResponse);
+    }
 }
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/bundled/AbstractBundledRenderUnit.java b/src/main/java/org/apache/sling/scripting/core/impl/bundled/AbstractBundledRenderUnit.java
index a4c6777..7c8ae4d 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/bundled/AbstractBundledRenderUnit.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/bundled/AbstractBundledRenderUnit.java
@@ -184,8 +184,7 @@ abstract class AbstractBundledRenderUnit implements ExecutableUnit {
     public void eval(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response) throws ScriptException {
         try {
             ScriptContextProvider.ExecutableContext executableContext = scriptContextProvider
-                .prepareScriptContext(new OnDemandReaderRequest((SlingHttpServletRequest) request),
-                    new OnDemandWriterResponse((SlingHttpServletResponse) response), this);
+                .prepareScriptContext((SlingHttpServletRequest) request, (SlingHttpServletResponse) response, this);
             try {
                 executableContext.eval();
             }
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 4e8dd0d..43aba63 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
@@ -91,8 +91,12 @@ public class ScriptContextProvider implements BundleListener {
 
     private final ConcurrentHashMap<BundleContext, ServiceCache> perContextServiceCache = new ConcurrentHashMap<>();
 
-    public ExecutableContext prepareScriptContext(SlingHttpServletRequest request, SlingHttpServletResponse response, ExecutableUnit executable)
+    public ExecutableContext prepareScriptContext(SlingHttpServletRequest request, SlingHttpServletResponse response,
+                                                  ExecutableUnit executable)
             throws IOException {
+        InternalScriptHelper scriptHelper = new InternalScriptHelper(executable.getBundleContext(), new SlingScriptAdapter(request.getResourceResolver(),
+                executable.getPath(), "sling/bundle/resource"), request, response,
+                perContextServiceCache.computeIfAbsent(executable.getBundleContext(), ServiceCache::new));
         ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(executable.getScriptEngineName());
         if (scriptEngine == null) {
             scriptEngine = scriptEngineManager.getEngineByExtension(executable.getScriptExtension());
@@ -103,18 +107,16 @@ public class ScriptContextProvider implements BundleListener {
         }
         // prepare the SlingBindings
         Bindings bindings = new LazyBindings();
-        bindings.put("properties", (LazyBindings.Supplier) () -> request.getResource().getValueMap());
-        bindings.put(SlingBindings.REQUEST, request);
-        bindings.put(SlingBindings.RESPONSE, response);
-        bindings.put(SlingBindings.READER, request.getReader());
-        bindings.put(SlingBindings.RESOURCE, request.getResource());
-        bindings.put(SlingBindings.RESOLVER, request.getResource().getResourceResolver());
-        bindings.put(SlingBindings.OUT, response.getWriter());
+        bindings.put("properties", (LazyBindings.Supplier) () -> scriptHelper.getRequest().getResource().getValueMap());
+        bindings.put(SlingBindings.REQUEST, scriptHelper.getRequest());
+        bindings.put(SlingBindings.RESPONSE, scriptHelper.getResponse());
+        bindings.put(SlingBindings.READER, scriptHelper.getRequest().getReader());
+        bindings.put(SlingBindings.OUT, scriptHelper.getResponse().getWriter());
+        bindings.put(SlingBindings.RESOURCE, scriptHelper.getRequest().getResource());
+        bindings.put(SlingBindings.RESOLVER, scriptHelper.getRequest().getResource().getResourceResolver());
         Logger scriptLogger = LoggerFactory.getLogger(executable.getName());
         bindings.put(SlingBindings.LOG, scriptLogger);
-        bindings.put(SlingBindings.SLING, new InternalScriptHelper(executable.getBundleContext(), new SlingScriptAdapter(request.getResourceResolver(),
-                executable.getPath(), "sling/bundle/resource"), request, response,
-                perContextServiceCache.computeIfAbsent(executable.getBundleContext(), ServiceCache::new)));
+        bindings.put(SlingBindings.SLING, scriptHelper);
         bindings.put(BundledRenderUnit.VARIABLE, executable);
         bindings.put(ScriptEngine.FILENAME, executable.getPath());
         bindings.put(ScriptEngine.FILENAME.replaceAll("\\.", "_"), executable.getPath());
@@ -140,9 +142,9 @@ public class ScriptContextProvider implements BundleListener {
         LazyBindings slingScopeBindings = new LazyBindings(slingBindingsSuppliers);
         scriptContext.setBindings(slingScopeBindings, SlingScriptConstants.SLING_SCOPE);
         scriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
-        scriptContext.setWriter(response.getWriter());
         scriptContext.setErrorWriter(new LogWriter(scriptLogger));
-        scriptContext.setReader(request.getReader());
+        scriptContext.setWriter(scriptHelper.getResponse().getWriter());
+        scriptContext.setReader(scriptHelper.getRequest().getReader());
         return new ExecutableContext(scriptContext, executable, scriptEngine);
     }