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-servlets-resolver.git


The following commit(s) were added to refs/heads/master by this push:
     new fc1d22f  SLING-10615 DefaultErrorHandlerServlet may throw a 
ClassCastException (#18)
fc1d22f is described below

commit fc1d22f79c31aa2e6eb91ef12b21c4af386242de
Author: Eric Norman <[email protected]>
AuthorDate: Sat Jul 17 15:19:26 2021 -0700

    SLING-10615 DefaultErrorHandlerServlet may throw a ClassCastException (#18)
    
    Handle ERROR_EXCEPTION_TYPE attribute value that is either a String or
    Class object
---
 .../defaults/DefaultErrorHandlerServlet.java       | 10 ++++++-
 .../defaults/DefaultErrorHandlerServletTest.java   | 34 ++++++++++++++++++----
 2 files changed, 38 insertions(+), 6 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java
 
b/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java
index 12044bb..a4e9498 100644
--- 
a/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java
+++ 
b/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java
@@ -164,7 +164,15 @@ public class DefaultErrorHandlerServlet extends 
GenericServlet {
                 jsonGenerator.write("servletName", servletName);
             }
 
-            String exceptionType = 
(String)req.getAttribute(SlingConstants.ERROR_EXCEPTION_TYPE);
+            // SLING-10615 - for backward compatibility check for either a
+            // String or Class value
+            Object exceptionTypeObj = 
req.getAttribute(SlingConstants.ERROR_EXCEPTION_TYPE);
+            String exceptionType = null;
+            if (exceptionTypeObj instanceof String) {
+                exceptionType = (String)exceptionTypeObj;
+            } else if (exceptionTypeObj instanceof Class) {
+                exceptionType = ((Class<?>)exceptionTypeObj).getName();
+            }
             if (exceptionType != null && !exceptionType.isEmpty()) {
                 jsonGenerator.write("exceptionType", exceptionType);
             }
diff --git 
a/src/test/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServletTest.java
 
b/src/test/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServletTest.java
index 1ec9f7c..4a91034 100644
--- 
a/src/test/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServletTest.java
+++ 
b/src/test/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServletTest.java
@@ -44,10 +44,7 @@ import org.junit.Test;
  */
 public class DefaultErrorHandlerServletTest {
 
-    @Test
-    public void testJsonErrorResponse() throws IOException, ServletException {
-        // mock a request that accepts a json response
-        MockSlingHttpServletRequest req = new 
MockErrorSlingHttpServletRequest("application/json,*/*;q=0.9");
+    protected void assertJsonErrorResponse(MockSlingHttpServletRequest req) 
throws ServletException, IOException {
         MockSlingHttpServletResponse res = new 
MockErrorSlingHttpServletResponse(false);
 
         DefaultErrorHandlerServlet errorServlet = new 
DefaultErrorHandlerServlet();
@@ -69,7 +66,34 @@ public class DefaultErrorHandlerServletTest {
             assertTrue(jsonObj.getString("exception").contains("Test 
Exception"));
             assertEquals(Exception.class.getName(), 
jsonObj.getString("exceptionType"));
         }
+    }
+
+    @Test
+    public void testJsonErrorResponse() throws IOException, ServletException {
+        // mock a request that accepts a json response
+        MockSlingHttpServletRequest req = new 
MockErrorSlingHttpServletRequest("application/json,*/*;q=0.9");
+        assertJsonErrorResponse(req);
+    }
+
+    /**
+     * SLING-10615 - Verify that if the SlingConstants.ERROR_EXCEPTION_TYPE 
happens to be a
+     * Class object instead of a String, it still produces a valid error 
response
+     */
+    @Test
+    public void testJsonErrorResponseWithClassExceptionTypeAttributeValue() 
throws IOException, ServletException {
+        // mock a request that accepts a json response
+        MockSlingHttpServletRequest req = new 
MockErrorSlingHttpServletRequest("application/json,*/*;q=0.9") {
+
+            @Override
+            public Object getAttribute(String name) {
+                if (SlingConstants.ERROR_EXCEPTION_TYPE.equals(name)) {
+                    return Exception.class;
+                }
+                return super.getAttribute(name);
+            }
 
+        };
+        assertJsonErrorResponse(req);
     }
 
     @Test
@@ -172,7 +196,7 @@ public class DefaultErrorHandlerServletTest {
     /**
      * Mock impl to simulate an error request
      */
-    private static final class MockErrorSlingHttpServletRequest extends 
MockSlingHttpServletRequest {
+    private static class MockErrorSlingHttpServletRequest extends 
MockSlingHttpServletRequest {
         private String accept;
 
         private MockErrorSlingHttpServletRequest(String accept) {

Reply via email to