Repository: oozie Updated Branches: refs/heads/master 5d9c6a5c9 -> 4e02bfa88
OOZIE-3101 Oozie should add error message to the response body (satishsaley) Project: http://git-wip-us.apache.org/repos/asf/oozie/repo Commit: http://git-wip-us.apache.org/repos/asf/oozie/commit/4e02bfa8 Tree: http://git-wip-us.apache.org/repos/asf/oozie/tree/4e02bfa8 Diff: http://git-wip-us.apache.org/repos/asf/oozie/diff/4e02bfa8 Branch: refs/heads/master Commit: 4e02bfa880733b2c27187d0369bdfeeea288177c Parents: 5d9c6a5 Author: satishsaley <[email protected]> Authored: Fri Nov 10 15:36:42 2017 -0800 Committer: satishsaley <[email protected]> Committed: Fri Nov 10 15:36:42 2017 -0800 ---------------------------------------------------------------------- .../org/apache/oozie/client/rest/JsonTags.java | 2 + core/pom.xml | 7 ++ .../org/apache/oozie/servlet/ErrorServlet.java | 71 ++++++++++++++++++++ .../apache/oozie/servlet/JsonRestServlet.java | 3 +- .../oozie/test/EmbeddedServletContainer.java | 33 +++++++-- .../apache/oozie/servlet/TestErrorServlet.java | 54 +++++++++++++++ .../oozie/servlet/TestJsonRestServlet.java | 44 ++++++++---- pom.xml | 4 ++ release-log.txt | 1 + .../oozie/server/EmbeddedOozieServer.java | 13 +++- .../org/apache/oozie/server/FilterMapper.java | 2 +- .../org/apache/oozie/server/ServletMapper.java | 3 +- webapp/src/main/webapp/WEB-INF/web.xml | 56 +++++++++++++++ 13 files changed, 271 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/oozie/blob/4e02bfa8/client/src/main/java/org/apache/oozie/client/rest/JsonTags.java ---------------------------------------------------------------------- diff --git a/client/src/main/java/org/apache/oozie/client/rest/JsonTags.java b/client/src/main/java/org/apache/oozie/client/rest/JsonTags.java index d684799..e041354 100644 --- a/client/src/main/java/org/apache/oozie/client/rest/JsonTags.java +++ b/client/src/main/java/org/apache/oozie/client/rest/JsonTags.java @@ -199,6 +199,8 @@ public interface JsonTags { String ERROR_CODE = "code"; String ERROR_MESSAGE = "message"; + String HTTP_STATUS_CODE = "httpStatusCode"; + String INSTR_TIMERS = "timers"; String INSTR_VARIABLES = "variables"; String INSTR_SAMPLERS = "samplers"; http://git-wip-us.apache.org/repos/asf/oozie/blob/4e02bfa8/core/pom.xml ---------------------------------------------------------------------- diff --git a/core/pom.xml b/core/pom.xml index f2e5af4..12e426e 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -317,6 +317,13 @@ </dependency> <dependency> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + <scope>provided</scope> + <version>${javax.servlet.api.version}</version> + </dependency> + + <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <scope>compile</scope> http://git-wip-us.apache.org/repos/asf/oozie/blob/4e02bfa8/core/src/main/java/org/apache/oozie/servlet/ErrorServlet.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/servlet/ErrorServlet.java b/core/src/main/java/org/apache/oozie/servlet/ErrorServlet.java new file mode 100644 index 0000000..94e93bf --- /dev/null +++ b/core/src/main/java/org/apache/oozie/servlet/ErrorServlet.java @@ -0,0 +1,71 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.oozie.servlet; + +import org.apache.oozie.client.rest.JsonTags; +import org.json.simple.JSONObject; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +import static org.apache.oozie.servlet.JsonRestServlet.JSON_UTF8; + +/** + * Servlet to show error response in JSON + */ +public class ErrorServlet extends HttpServlet{ + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + handleError(request, response); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + handleError(request, response); + } + + @Override + protected void doPut(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + handleError(request, response); + } + + /** + * Writes error message as JSON to response + * @param request + * @param response + * @throws IOException + */ + private void handleError(HttpServletRequest request, HttpServletResponse response) throws IOException { + Object errorMsg = request.getAttribute("javax.servlet.error.message"); + Object statusCode = request.getAttribute("javax.servlet.error.status_code"); + JSONObject json = new JSONObject(); + json.put(JsonTags.HTTP_STATUS_CODE, statusCode); + json.put(JsonTags.WORKFLOW_ACTION_ERROR_MESSAGE, errorMsg); + response.setContentType(JSON_UTF8); + json.writeJSONString(response.getWriter()); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/oozie/blob/4e02bfa8/core/src/main/java/org/apache/oozie/servlet/JsonRestServlet.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/servlet/JsonRestServlet.java b/core/src/main/java/org/apache/oozie/servlet/JsonRestServlet.java index 10307d1..03cf35c 100644 --- a/core/src/main/java/org/apache/oozie/servlet/JsonRestServlet.java +++ b/core/src/main/java/org/apache/oozie/servlet/JsonRestServlet.java @@ -18,6 +18,7 @@ package org.apache.oozie.servlet; +import org.apache.commons.lang.StringEscapeUtils; import org.apache.oozie.client.OozieClient.SYSTEM_MODE; import org.apache.oozie.client.rest.JsonBean; import org.apache.oozie.client.rest.RestConstants; @@ -401,7 +402,7 @@ public abstract class JsonRestServlet extends HttpServlet { throws IOException { response.setHeader(RestConstants.OOZIE_ERROR_CODE, error); response.setHeader(RestConstants.OOZIE_ERROR_MESSAGE, message); - response.sendError(statusCode); + response.sendError(statusCode, StringEscapeUtils.escapeHtml(message)); } protected void sendJsonResponse(HttpServletResponse response, int statusCode, JSONStreamAware json) http://git-wip-us.apache.org/repos/asf/oozie/blob/4e02bfa8/core/src/main/java/org/apache/oozie/test/EmbeddedServletContainer.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/test/EmbeddedServletContainer.java b/core/src/main/java/org/apache/oozie/test/EmbeddedServletContainer.java index f14f663..59d20b5 100644 --- a/core/src/main/java/org/apache/oozie/test/EmbeddedServletContainer.java +++ b/core/src/main/java/org/apache/oozie/test/EmbeddedServletContainer.java @@ -18,22 +18,24 @@ package org.apache.oozie.test; +import org.apache.oozie.servlet.ErrorServlet; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.servlet.ErrorPageErrorHandler; import org.eclipse.jetty.servlet.FilterHolder; -import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.ServletContextHandler; - -import java.net.InetAddress; -import java.util.EnumSet; -import java.util.Map; +import org.eclipse.jetty.servlet.ServletHolder; import javax.servlet.DispatcherType; import javax.servlet.Filter; import javax.servlet.Servlet; +import javax.servlet.http.HttpServletResponse; +import java.net.InetAddress; +import java.util.EnumSet; +import java.util.Map; /** * An embedded servlet container for testing purposes. <p> It provides reduced functionality, it supports only @@ -57,6 +59,8 @@ public class EmbeddedServletContainer { server = new Server(0); context = new ServletContextHandler(); context.setContextPath("/" + contextPath); + context.setErrorHandler(getErrorHandler()); + this.addServletEndpoint("/error/*", ErrorServlet.class); server.setHandler(context); } @@ -187,4 +191,23 @@ public class EmbeddedServletContainer { host = null; port = -1; } + + /** + * Returns an error page handler + * @return + */ + private ErrorPageErrorHandler getErrorHandler() { + ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler(); + errorHandler.addErrorPage(HttpServletResponse.SC_BAD_REQUEST, "/error"); + errorHandler.addErrorPage(HttpServletResponse.SC_UNAUTHORIZED, "/error"); + errorHandler.addErrorPage(HttpServletResponse.SC_FORBIDDEN, "/error"); + errorHandler.addErrorPage(HttpServletResponse.SC_NOT_FOUND, "/error"); + errorHandler.addErrorPage(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "/error"); + errorHandler.addErrorPage(HttpServletResponse.SC_CONFLICT, "/error"); + errorHandler.addErrorPage(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "/error"); + errorHandler.addErrorPage(HttpServletResponse.SC_NOT_IMPLEMENTED, "/error"); + errorHandler.addErrorPage(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "/error"); + errorHandler.addErrorPage("java.lang.Throwable", "/error"); + return errorHandler; + } } http://git-wip-us.apache.org/repos/asf/oozie/blob/4e02bfa8/core/src/test/java/org/apache/oozie/servlet/TestErrorServlet.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/oozie/servlet/TestErrorServlet.java b/core/src/test/java/org/apache/oozie/servlet/TestErrorServlet.java new file mode 100644 index 0000000..cf5547b --- /dev/null +++ b/core/src/test/java/org/apache/oozie/servlet/TestErrorServlet.java @@ -0,0 +1,54 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.oozie.servlet; + +import org.apache.oozie.client.rest.JsonTags; +import org.json.JSONObject; +import org.junit.Test; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; +import java.io.StringWriter; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class TestErrorServlet { + + @Test + public void testServlet() throws Exception { + String testErrorMsg = "test-error"; + int testErrorCode = 400; + StringWriter stringWriter = new StringWriter(); + + HttpServletRequest request = mock(HttpServletRequest.class); + HttpServletResponse response = mock(HttpServletResponse.class); + + when(request.getAttribute("javax.servlet.error.message")).thenReturn(testErrorMsg); + when(request.getAttribute("javax.servlet.error.status_code")).thenReturn(testErrorCode); + when(response.getWriter()).thenReturn(new PrintWriter(stringWriter)); + + new ErrorServlet().doGet(request, response); + JSONObject json = new JSONObject(stringWriter.toString().trim()); + assertEquals("Error message is different.", testErrorMsg, json.getString(JsonTags.WORKFLOW_ACTION_ERROR_MESSAGE)); + assertEquals("Http code is different", testErrorCode, json.getInt(JsonTags.HTTP_STATUS_CODE)); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/oozie/blob/4e02bfa8/core/src/test/java/org/apache/oozie/servlet/TestJsonRestServlet.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/oozie/servlet/TestJsonRestServlet.java b/core/src/test/java/org/apache/oozie/servlet/TestJsonRestServlet.java index 5d915cc..60eadbb 100644 --- a/core/src/test/java/org/apache/oozie/servlet/TestJsonRestServlet.java +++ b/core/src/test/java/org/apache/oozie/servlet/TestJsonRestServlet.java @@ -18,16 +18,21 @@ package org.apache.oozie.servlet; +import org.apache.commons.io.IOUtils; +import org.apache.oozie.client.rest.JsonTags; +import org.apache.oozie.service.Services; import org.apache.oozie.test.EmbeddedServletContainer; import org.apache.oozie.test.XTestCase; -import org.apache.oozie.service.Services; +import org.json.JSONException; +import org.json.JSONObject; import javax.servlet.http.HttpServletResponse; -import java.net.URL; -import java.net.HttpURLConnection; -import java.util.concurrent.Callable; import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.concurrent.Callable; public class TestJsonRestServlet extends XTestCase { @@ -38,10 +43,10 @@ public class TestJsonRestServlet extends XTestCase { EmbeddedServletContainer container; private int invoke(String method, String resource, String queryString) throws Exception { - return invoke(method, resource, queryString, "dummy"); + return invoke(method, resource, queryString, "dummy").getResponseCode(); } - private int invoke(String method, String resource, String queryString, String contentType) throws Exception { + private HttpURLConnection invoke(String method, String resource, String queryString, String contentType) throws Exception { String s = container.getServletURL("/dummy"); if (resource != null) { s += resource; @@ -53,7 +58,7 @@ public class TestJsonRestServlet extends XTestCase { conn.setRequestProperty("content-type", contentType); conn.setRequestMethod(method); conn.connect(); - return conn.getResponseCode(); + return conn; } private String invokeAndGetResponse(String method, String resource, String queryString, String contentType) @@ -80,7 +85,9 @@ public class TestJsonRestServlet extends XTestCase { } private void runTest(JsonRestServlet.ResourceInfo[] resourceInfo, Callable<Void> assertions) throws Exception { + container = new EmbeddedServletContainer("test"); + Services services = new Services(); try { services.init(); @@ -180,7 +187,10 @@ public class TestJsonRestServlet extends XTestCase { public void testInvalidResource() throws Exception { runTest(MyJsonRestServlet.WILDCARD_RESOURCE, new Callable<Void>() { public Void call() throws Exception { - assertEquals(HttpServletResponse.SC_BAD_REQUEST, invoke("GET", "/any/any", "")); + HttpURLConnection conn = invoke("GET", "/any/any", "dummy", "dummy"); + assertEquals(HttpServletResponse.SC_BAD_REQUEST, conn.getResponseCode()); + assertEquals("E0301: Invalid resource [any/any]", conn.getResponseMessage()); + checkErrorResponse(conn, HttpServletResponse.SC_BAD_REQUEST, "E0301: Invalid resource [any/any]"); return null; } }); @@ -238,10 +248,12 @@ public class TestJsonRestServlet extends XTestCase { public void testContentTypeJsonCron() throws Exception { runTest(MyJsonRestServlet.CONTENT_TYPE_JSON_CRON_TEST, new Callable<Void>() { public Void call() throws Exception { - assertEquals(HttpServletResponse.SC_OK, invoke("GET", "", "json=object", "application/xml")); - assertEquals(HttpServletResponse.SC_OK, invoke("GET", "", "json=object", "application/xml; param=x")); - assertEquals(HttpServletResponse.SC_BAD_REQUEST, invoke("GET", "", "json=object", "")); - assertEquals(HttpServletResponse.SC_BAD_REQUEST, invoke("GET", "", "json=object", "application/json")); + assertEquals(HttpServletResponse.SC_OK, invoke("GET", "", "json=object", "application/xml").getResponseCode()); + assertEquals(HttpServletResponse.SC_OK, invoke("GET", "", "json=object", "application/xml; param=x") + .getResponseCode()); + assertEquals(HttpServletResponse.SC_BAD_REQUEST, invoke("GET", "", "json=object", "").getResponseCode()); + assertEquals(HttpServletResponse.SC_BAD_REQUEST, invoke("GET", "", "json=object", "application/json") + .getResponseCode()); String response = invokeAndGetResponse("GET", "", "json=object", "application/xml"); assertTrue(response.contains("object")); response = invokeAndGetResponse("GET", "", "json=array", "application/xml"); @@ -251,5 +263,13 @@ public class TestJsonRestServlet extends XTestCase { }); } + private void checkErrorResponse(HttpURLConnection conn, int responseCode, String responseMessage) throws JSONException, + IOException { + JSONObject json = new JSONObject(IOUtils.toString(conn.getErrorStream()).trim()); + assertEquals("Error message is different.", responseMessage, + json.getString(JsonTags.WORKFLOW_ACTION_ERROR_MESSAGE)); + assertEquals("Error code is different", responseCode, + json.getInt(JsonTags.HTTP_STATUS_CODE)); + } } http://git-wip-us.apache.org/repos/asf/oozie/blob/4e02bfa8/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 2893ba4..65ebdea 100644 --- a/pom.xml +++ b/pom.xml @@ -116,6 +116,7 @@ <httpcore.version>4.3.3</httpcore.version> <httpclient.version>4.3.6</httpclient.version> <kyro.version>2.22</kyro.version> + <javax.servlet.api.version>3.0.1</javax.servlet.api.version> </properties> <modules> @@ -1883,6 +1884,9 @@ <parallel>classes</parallel> <threadCount>1</threadCount> <perCoreThreadCount>1</perCoreThreadCount> + <classpathDependencyExcludes> + <classpathDependencyExclude>javax.servlet:servlet-api</classpathDependencyExclude> + </classpathDependencyExcludes> </configuration> </plugin> <plugin> http://git-wip-us.apache.org/repos/asf/oozie/blob/4e02bfa8/release-log.txt ---------------------------------------------------------------------- diff --git a/release-log.txt b/release-log.txt index 7ed42ff..c058df0 100644 --- a/release-log.txt +++ b/release-log.txt @@ -1,5 +1,6 @@ -- Oozie 5.0.0 release (trunk - unreleased) +OOZIE-3101 Oozie should add error message to the response body (satishsaley) OOZIE-2964 Add -Xdoclint:all to javadoc opts (dbist13 via andras.piros) OOZIE-3022 Fix for warning has no file and won't be listed in dependency files details (dbist13 via gezapeti and andras.piros) OOZIE-3001 Core has many Javadoc warnings (lines with trailing spaces and longer than 132 chars) (dbist13 via andras.piros) http://git-wip-us.apache.org/repos/asf/oozie/blob/4e02bfa8/server/src/main/java/org/apache/oozie/server/EmbeddedOozieServer.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/oozie/server/EmbeddedOozieServer.java b/server/src/main/java/org/apache/oozie/server/EmbeddedOozieServer.java index ab0d7ea..620b62f 100644 --- a/server/src/main/java/org/apache/oozie/server/EmbeddedOozieServer.java +++ b/server/src/main/java/org/apache/oozie/server/EmbeddedOozieServer.java @@ -41,6 +41,7 @@ import org.eclipse.jetty.webapp.WebAppContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URISyntaxException; @@ -145,8 +146,16 @@ public class EmbeddedOozieServer { private void addErrorHandler() { ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler(); - errorHandler.addErrorPage(404, "/404.html"); - errorHandler.addErrorPage(403, "/403.html"); + errorHandler.addErrorPage(HttpServletResponse.SC_BAD_REQUEST, "/error"); + errorHandler.addErrorPage(HttpServletResponse.SC_UNAUTHORIZED, "/error"); + errorHandler.addErrorPage(HttpServletResponse.SC_FORBIDDEN, "/error"); + errorHandler.addErrorPage(HttpServletResponse.SC_NOT_FOUND, "/error"); + errorHandler.addErrorPage(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "/error"); + errorHandler.addErrorPage(HttpServletResponse.SC_CONFLICT, "/error"); + errorHandler.addErrorPage(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "/error"); + errorHandler.addErrorPage(HttpServletResponse.SC_NOT_IMPLEMENTED, "/error"); + errorHandler.addErrorPage(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "/error"); + errorHandler.addErrorPage("java.lang.Throwable", "/error"); servletContextHandler.setErrorHandler(errorHandler); } http://git-wip-us.apache.org/repos/asf/oozie/blob/4e02bfa8/server/src/main/java/org/apache/oozie/server/FilterMapper.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/oozie/server/FilterMapper.java b/server/src/main/java/org/apache/oozie/server/FilterMapper.java index bd78617..9e14f39 100644 --- a/server/src/main/java/org/apache/oozie/server/FilterMapper.java +++ b/server/src/main/java/org/apache/oozie/server/FilterMapper.java @@ -23,7 +23,6 @@ import com.google.inject.Inject; import org.apache.oozie.servlet.AuthFilter; import org.apache.oozie.servlet.HostnameFilter; import org.eclipse.jetty.servlet.FilterHolder; -import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.webapp.WebAppContext; import javax.servlet.DispatcherType; @@ -53,6 +52,7 @@ public class FilterMapper { mapFilter(authFilter, "/*.js"); mapFilter(authFilter, "/ext-2.2/*"); mapFilter(authFilter, "/docs/*"); + mapFilter(authFilter, "/error/*"); } private void mapFilter(FilterHolder authFilter, String pathSpec) { http://git-wip-us.apache.org/repos/asf/oozie/blob/4e02bfa8/server/src/main/java/org/apache/oozie/server/ServletMapper.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/oozie/server/ServletMapper.java b/server/src/main/java/org/apache/oozie/server/ServletMapper.java index c6d0b5b..e0a1358 100644 --- a/server/src/main/java/org/apache/oozie/server/ServletMapper.java +++ b/server/src/main/java/org/apache/oozie/server/ServletMapper.java @@ -21,6 +21,7 @@ package org.apache.oozie.server; import com.google.common.base.Preconditions; import com.google.inject.Inject; import org.apache.oozie.servlet.CallbackServlet; +import org.apache.oozie.servlet.ErrorServlet; import org.apache.oozie.servlet.SLAServlet; import org.apache.oozie.servlet.V0AdminServlet; import org.apache.oozie.servlet.V0JobServlet; @@ -42,7 +43,6 @@ import org.slf4j.LoggerFactory; import javax.servlet.Servlet; - public class ServletMapper { private final WebAppContext servletContextHandler; private static final Logger LOG = LoggerFactory.getLogger(ServletMapper.class); @@ -90,6 +90,7 @@ public class ServletMapper { mapServlet(SLAServlet.class, "/v1/sla/*"); mapServlet(V2SLAServlet.class, "/v2/sla/*"); mapServlet(V2ValidateServlet.class, "/v2/validate/*"); + mapServlet(ErrorServlet.class, "/error/*"); } private void mapServlet(final Class<? extends Servlet> servletClass, final String servletPath) { http://git-wip-us.apache.org/repos/asf/oozie/blob/4e02bfa8/webapp/src/main/webapp/WEB-INF/web.xml ---------------------------------------------------------------------- diff --git a/webapp/src/main/webapp/WEB-INF/web.xml b/webapp/src/main/webapp/WEB-INF/web.xml index 89f15f3..c021092 100644 --- a/webapp/src/main/webapp/WEB-INF/web.xml +++ b/webapp/src/main/webapp/WEB-INF/web.xml @@ -129,6 +129,13 @@ <load-on-startup>1</load-on-startup> </servlet> + <servlet> + <servlet-name>error</servlet-name> + <display-name>Errors</display-name> + <servlet-class>org.apache.oozie.servlet.ErrorServlet</servlet-class> + <load-on-startup>1</load-on-startup> + </servlet> + <!-- servlet-mapping --> <servlet-mapping> <servlet-name>versions</servlet-name> @@ -200,6 +207,55 @@ <url-pattern>/v2/validate</url-pattern> </servlet-mapping> + <servlet-mapping> + <servlet-name>error</servlet-name> + <url-pattern>/error</url-pattern> + </servlet-mapping> + + <error-page> + <exception-type>java.lang.Throwable</exception-type> + <location>/error</location> + </error-page> + + <error-page> + <error-code>400</error-code> + <location>/error</location> + </error-page> + + <error-page> + <error-code>401</error-code> + <location>/error</location> + </error-page> + + <error-page> + <error-code>403</error-code> + <location>/error</location> + </error-page> + + <error-page> + <error-code>404</error-code> + <location>/error</location> + </error-page> + + <error-page> + <error-code>405</error-code> + <location>/error</location> + </error-page> + + <error-page> + <error-code>409</error-code> + <location>/error</location> + </error-page> + + <error-page> + <error-code>500</error-code> + <location>/error</location> + </error-page> + + <error-page> + <error-code>501</error-code> + <location>/error</location> + </error-page> <!-- welcome-file --> <welcome-file-list> <welcome-file>index.jsp</welcome-file>
