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>

Reply via email to