This is an automated email from the ASF dual-hosted git repository.
enorman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-api.git
The following commit(s) were added to refs/heads/master by this push:
new 9285f1b SLING-12877 don't re-wrap the request/response if already
wrapped (#66)
9285f1b is described below
commit 9285f1baca058fc3ae7c68be09cd2a70ef918d5d
Author: Eric Norman <[email protected]>
AuthorDate: Fri Sep 12 10:52:29 2025 -0700
SLING-12877 don't re-wrap the request/response if already wrapped (#66)
---
.../apache/sling/api/scripting/SlingBindings.java | 38 +++++++--
.../sling/api/scripting/SlingBindingsTest.java | 89 ++++++++++++++++++++++
2 files changed, 120 insertions(+), 7 deletions(-)
diff --git a/src/main/java/org/apache/sling/api/scripting/SlingBindings.java
b/src/main/java/org/apache/sling/api/scripting/SlingBindings.java
index 373bf69..84489ea 100644
--- a/src/main/java/org/apache/sling/api/scripting/SlingBindings.java
+++ b/src/main/java/org/apache/sling/api/scripting/SlingBindings.java
@@ -215,26 +215,50 @@ public class SlingBindings extends LazyBindings {
@Override
public Object put(final String key, final Object value) {
final Object result = super.put(key, value);
+ // also put the alternate wrapper if it is not already wrapping the
same value
if (REQUEST.equals(key)) {
- if (value instanceof SlingHttpServletRequest) {
+ if (shouldWrapJavaxRequest(value)) {
super.put(JAKARTA_REQUEST,
JavaxToJakartaRequestWrapper.toJakartaRequest(getRequest()));
}
} else if (JAKARTA_REQUEST.equals(key)) {
- if (value instanceof SlingJakartaHttpServletRequest) {
+ if (shouldWrapJakartaRequest(value)) {
super.put(REQUEST,
JakartaToJavaxRequestWrapper.toJavaxRequest(getJakartaRequest()));
}
} else if (RESPONSE.equals(key)) {
- if (value instanceof SlingHttpServletResponse) {
+ if (shouldWrapJavaxResponse(value)) {
super.put(JAKARTA_RESPONSE,
JavaxToJakartaResponseWrapper.toJakartaResponse(getResponse()));
}
- } else if (JAKARTA_RESPONSE.equals(key)) {
- if (value instanceof SlingJakartaHttpServletResponse) {
- super.put(RESPONSE,
JakartaToJavaxResponseWrapper.toJavaxResponse(getJakartaResponse()));
- }
+ } else if (JAKARTA_RESPONSE.equals(key) &&
shouldWrapJakartaResponse(value)) {
+ super.put(RESPONSE,
JakartaToJavaxResponseWrapper.toJavaxResponse(getJakartaResponse()));
}
return result;
}
+ @SuppressWarnings("deprecation")
+ private boolean shouldWrapJavaxRequest(final Object value) {
+ return value instanceof SlingHttpServletRequest
+ && !(getJakartaRequest() instanceof
JavaxToJakartaRequestWrapper rw && rw.getRequest() == value);
+ }
+
+ @SuppressWarnings("deprecation")
+ private boolean shouldWrapJakartaRequest(final Object value) {
+ return value instanceof SlingJakartaHttpServletRequest
+ && !(getRequest() instanceof JakartaToJavaxRequestWrapper rw
&& rw.getRequest() == value);
+ }
+
+ @SuppressWarnings("deprecation")
+ private boolean shouldWrapJavaxResponse(final Object value) {
+ return value instanceof SlingHttpServletResponse
+ && !(getJakartaResponse() instanceof
JavaxToJakartaResponseWrapper rw && rw.getResponse() == value);
+ }
+
+ @SuppressWarnings("deprecation")
+ private boolean shouldWrapJakartaResponse(final Object value) {
+ return value instanceof SlingJakartaHttpServletResponse
+ && !(getResponse() instanceof JakartaToJavaxResponseWrapper rw
&& rw.getResponse() == value);
+ }
+
+ @SuppressWarnings("deprecation")
@Override
public Object remove(final Object key) {
if (REQUEST.equals(key)) {
diff --git
a/src/test/java/org/apache/sling/api/scripting/SlingBindingsTest.java
b/src/test/java/org/apache/sling/api/scripting/SlingBindingsTest.java
index d453644..0ad78b5 100644
--- a/src/test/java/org/apache/sling/api/scripting/SlingBindingsTest.java
+++ b/src/test/java/org/apache/sling/api/scripting/SlingBindingsTest.java
@@ -29,6 +29,8 @@ import
org.apache.sling.api.wrappers.JavaxToJakartaResponseWrapper;
import org.junit.Test;
import org.mockito.Mockito;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
@@ -63,16 +65,91 @@ public class SlingBindingsTest {
assertTrue(bindings.getRequest() instanceof
JakartaToJavaxRequestWrapper);
assertSame(r, ((JakartaToJavaxRequestWrapper)
bindings.getRequest()).getRequest());
+ // call the set again with the same param to make sure we are not
creating
+ // a new wrapper object
+ SlingHttpServletRequest original = bindings.getRequest();
+ bindings.setJakartaRequest(r);
+ assertSame(original, bindings.getRequest());
+
bindings.setRequest(r2);
assertSame(r2, bindings.getRequest());
assertTrue(bindings.getJakartaRequest() instanceof
JavaxToJakartaRequestWrapper);
assertSame(r2, ((JavaxToJakartaRequestWrapper)
bindings.getJakartaRequest()).getRequest());
+ // call the set again with the same param to make sure we are not
creating
+ // a new wrapper object
+ SlingJakartaHttpServletRequest original2 =
bindings.getJakartaRequest();
+ bindings.setRequest(r2);
+ assertSame(original2, bindings.getJakartaRequest());
+
bindings.remove(SlingBindings.JAKARTA_REQUEST);
assertNull(bindings.getRequest());
assertNull(bindings.getJakartaRequest());
}
+ @SuppressWarnings("deprecation")
+ @Test
+ public void testPutWithoutWrapping() {
+ final SlingBindings bindings = new SlingBindings();
+ bindings.put(SlingBindings.REQUEST, new Object());
+ assertFalse(bindings.containsKey(SlingBindings.JAKARTA_REQUEST));
+
+ bindings.clear();
+ bindings.put(SlingBindings.JAKARTA_REQUEST, new Object());
+ assertFalse(bindings.containsKey(SlingBindings.REQUEST));
+
+ bindings.clear();
+ bindings.put(SlingBindings.RESPONSE, new Object());
+ assertFalse(bindings.containsKey(SlingBindings.JAKARTA_RESPONSE));
+
+ bindings.clear();
+ bindings.put(SlingBindings.JAKARTA_RESPONSE, new Object());
+ assertFalse(bindings.containsKey(SlingBindings.RESPONSE));
+ }
+
+ @SuppressWarnings("deprecation")
+ @Test
+ public void testPutWithReWrapping() {
+ final SlingBindings bindings = new SlingBindings();
+ // for code coverage to not match any of the cases
+ bindings.put("other", new Object());
+
+ final SlingJakartaHttpServletRequest jakartaRequest =
Mockito.mock(SlingJakartaHttpServletRequest.class);
+ bindings.put(SlingBindings.JAKARTA_REQUEST, jakartaRequest);
+ final SlingJakartaHttpServletResponse jakartaResponse =
Mockito.mock(SlingJakartaHttpServletResponse.class);
+ bindings.put(SlingBindings.JAKARTA_RESPONSE, jakartaResponse);
+
+ SlingHttpServletRequest wrappedJavaxRequest1 = bindings.getRequest();
+ final SlingJakartaHttpServletRequest jakartaRequest2 =
Mockito.mock(SlingJakartaHttpServletRequest.class);
+ bindings.put(SlingBindings.JAKARTA_REQUEST, jakartaRequest2);
+ SlingHttpServletRequest wrappedJavaxRequest2 = bindings.getRequest();
+ assertNotSame(wrappedJavaxRequest2, wrappedJavaxRequest1);
+
+ SlingHttpServletResponse wrappedJavaxResponse1 =
bindings.getResponse();
+ final SlingJakartaHttpServletResponse jakartaResponse2 =
Mockito.mock(SlingJakartaHttpServletResponse.class);
+ bindings.put(SlingBindings.JAKARTA_RESPONSE, jakartaResponse2);
+ SlingHttpServletResponse wrappedJavaxResponse2 =
bindings.getResponse();
+ assertNotSame(wrappedJavaxResponse2, wrappedJavaxResponse1);
+
+ bindings.clear();
+ final SlingHttpServletRequest javaxRequest =
Mockito.mock(SlingHttpServletRequest.class);
+ bindings.put(SlingBindings.REQUEST, javaxRequest);
+ final SlingHttpServletResponse javaxResponse =
Mockito.mock(SlingHttpServletResponse.class);
+ bindings.put(SlingBindings.RESPONSE, javaxResponse);
+
+ SlingJakartaHttpServletRequest wrappedJakartaRequest1 =
bindings.getJakartaRequest();
+ final SlingHttpServletRequest javaxRequest2 =
Mockito.mock(SlingHttpServletRequest.class);
+ bindings.put(SlingBindings.REQUEST, javaxRequest2);
+ SlingJakartaHttpServletRequest wrappedJakartaRequest2 =
bindings.getJakartaRequest();
+ assertNotSame(wrappedJakartaRequest2, wrappedJakartaRequest1);
+
+ SlingJakartaHttpServletResponse wrappedJakartaResponse1 =
bindings.getJakartaResponse();
+ final SlingHttpServletResponse javaxResponse2 =
Mockito.mock(SlingHttpServletResponse.class);
+ bindings.put(SlingBindings.RESPONSE, javaxResponse2);
+ SlingJakartaHttpServletResponse wrappedJakartaResponse2 =
bindings.getJakartaResponse();
+ assertNotSame(wrappedJakartaResponse2, wrappedJakartaResponse1);
+ }
+
@SuppressWarnings("deprecation")
@Test
public void testGetResponse() {
@@ -101,11 +178,23 @@ public class SlingBindingsTest {
assertTrue(bindings.getResponse() instanceof
JakartaToJavaxResponseWrapper);
assertSame(r, ((JakartaToJavaxResponseWrapper)
bindings.getResponse()).getResponse());
+ // call the set again with the same param to make sure we are not
creating
+ // a new wrapper object
+ SlingHttpServletResponse original = bindings.getResponse();
+ bindings.setJakartaResponse(r);
+ assertSame(original, bindings.getResponse());
+
bindings.setResponse(r2);
assertSame(r2, bindings.getResponse());
assertTrue(bindings.getJakartaResponse() instanceof
JavaxToJakartaResponseWrapper);
assertSame(r2, ((JavaxToJakartaResponseWrapper)
bindings.getJakartaResponse()).getResponse());
+ // call the set again with the same param to make sure we are not
creating
+ // a new wrapper object
+ SlingJakartaHttpServletResponse original2 =
bindings.getJakartaResponse();
+ bindings.setResponse(r2);
+ assertSame(original2, bindings.getJakartaResponse());
+
bindings.remove(SlingBindings.JAKARTA_RESPONSE);
assertNull(bindings.getResponse());
assertNull(bindings.getJakartaResponse());