SLING-10615 DefaultErrorHandlerServlet may throw a ClassCastException (#18)

Handle ERROR_EXCEPTION_TYPE attribute value that is either a String or
Class object
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 @@
                 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 @@
  */
 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 @@
             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 @@
     /**
      * 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) {