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) {