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);
}