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

Reply via email to