--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN"\r
+ "http://www.w3.org/TR/REC-html40/strict.dtd">\r
+<html>\r
+ <head>\r
+ <title>ErrorFilter.java</title>\r
+ <meta name="Author" content="Benoit Mahe">\r
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">\r
+ <meta name="Generator" content="*emacs: emacs-css">\r
+\r
+ <link rel="Stylesheet" media="screen" type="text/css" href="default-html.css">\r
+ </head>\r
+ <body>\r
+\r
+ <pre>\r
+<span class="comment">// ErrorFilter.java\r
+// $Id: ErrorFilter.html,v 1.1 2010/06/15 12:20:07 smhuang Exp $\r
+// (c) COPYRIGHT MIT and INRIA, 1996.\r
+// Please first read the full copyright statement in file COPYRIGHT.html\r
+</span>\r
+\r
+<span class="keyword">package</span> <span class="reference">org</span>.<span class="reference">w3c</span>.<span class="reference">jigsaw</span>.<span class="type">filters</span>;\r
+\r
+<span class="keyword">import</span> <span class="reference">org</span>.<span class="reference">w3c</span>.<span class="reference">tools</span>.<span class="reference">resources</span>.*;\r
+<span class="keyword">import</span> <span class="reference">org</span>.<span class="reference">w3c</span>.<span class="reference">jigsaw</span>.<span class="reference">http</span>.*;\r
+<span class="keyword">import</span> <span class="reference">org</span>.<span class="reference">w3c</span>.<span class="reference">jigsaw</span>.<span class="reference">resources</span>.*;\r
+<span class="keyword">import</span> <span class="reference">org</span>.<span class="reference">w3c</span>.<span class="reference">www</span>.<span class="reference">http</span>.*;\r
+\r
+<span class="comment">/**\r
+ * The ErroFilter class allows you to customize and enhance error messages.\r
+ * This filter will catch all errors on their way back to the client, and\r
+ * use internal requests to provide a nice customizable error message.\r
+ * <p>You can use any resources (including server side includes, content\r
+ * negotiated resources, etc) to deliver error messages.\r
+ */</span>\r
+\r
+<span class="reference">public</span> <span class="keyword">class</span> <span class="function-name">ErrorFilter</span> <span class="keyword">extends</span> <span class="type">ResourceFilter</span> {\r
+ <span class="comment">/**\r
+ * A request state, to avoid looping on errors about errors.\r
+ */</span>\r
+ <span class="preprocessor">protected</span> <span class="type">static</span> <span class="type">final</span> <span class="type">String</span> <span class="variable-name">ERRED</span> = "<span class="doc-string">org.w3c.jigsaw.filters.ErrorFilter</span>";\r
+\r
+ <span class="comment">/**\r
+ * Attribute index - The base URL for error messages.\r
+ */</span>\r
+ <span class="preprocessor">protected</span> <span class="type">static</span> <span class="type">int</span> <span class="variable-name">ATTR_BASEURL</span> = -1;\r
+ <span class="comment">/**\r
+ * Attribute index - The common extension for error messages (can be null).\r
+ */</span>\r
+ <span class="preprocessor">protected</span> <span class="type">static</span> <span class="type">int</span> <span class="variable-name">ATTR_EXTENSION</span> = -1;\r
+\r
+ <span class="type">static</span> {\r
+ <span class="type">Attribute</span> <span class="variable-name">a</span> = <span class="keyword">null</span>;\r
+ <span class="type">Class</span> <span class="variable-name">cls</span> = <span class="keyword">null</span>;\r
+\r
+ <span class="keyword">try</span> {\r
+ cls = Class.forName("<span class="string">org.w3c.jigsaw.filters.ErrorFilter</span>");\r
+ } <span class="keyword">catch</span> (<span class="type">Exception</span> <span class="variable-name">ex</span>) {\r
+ ex.printStackTrace();\r
+ System.exit(1);\r
+ }\r
+ <span class="comment">// Declare the error base URL attribute:\r
+</span> a = <span class="keyword">new</span> <span class="type">StringAttribute</span>("<span class="string">base-url</span>"\r
+ , "<span class="string">/errors</span>"\r
+ , Attribute.EDITABLE);\r
+ ATTR_BASEURL = AttributeRegistry.registerAttribute(cls, a);\r
+ <span class="comment">// Declare the extension attribute:\r
+</span> a = <span class="keyword">new</span> <span class="type">StringAttribute</span>("<span class="string">extension</span>"\r
+ , "<span class="string">html</span>"\r
+ , Attribute.EDITABLE);\r
+ ATTR_EXTENSION = AttributeRegistry.registerAttribute(cls, a);\r
+ }\r
+\r
+ <span class="comment">/**\r
+ * Get the base URL describing the error directory.\r
+ * </span><span class="keyword">@return </span><span class="comment">The base URL.\r
+ */</span>\r
+\r
+ <span class="reference">public</span> <span class="type">String</span> <span class="function-name">getBaseURL</span>() {\r
+ <span class="keyword">return</span> (<span class="type">String</span>) getValue(ATTR_BASEURL, <span class="keyword">null</span>);\r
+ }\r
+\r
+ <span class="comment">/**\r
+ * Get the value of the extension attribute.\r
+ * </span><span class="keyword">@return </span><span class="comment">A String, for the common extension to error messages, or \r
+ * <strong>null</strong> if undefined.\r
+ */</span>\r
+\r
+ <span class="reference">public</span> <span class="type">String</span> <span class="function-name">getExtension</span>() {\r
+ <span class="keyword">return</span> (<span class="type">String</span>) getValue(ATTR_EXTENSION, <span class="keyword">null</span>);\r
+ }\r
+\r
+ <span class="comment">/**\r
+ * Compute the path for the given status code.\r
+ * </span><span class="keyword">@return </span><span class="comment">A path leading to the customizable error message for the \r
+ * given status code.\r
+ */</span>\r
+\r
+ <span class="reference">public</span> <span class="type">String</span> <span class="function-name">getErrorResource</span>(<span class="type">int</span> <span class="variable-name">status</span>) {\r
+ <span class="type">String</span> <span class="variable-name">ext</span> = getExtension() ;\r
+ <span class="keyword">if</span> ( ext != <span class="keyword">null</span> ) {\r
+ <span class="keyword">return</span> getBaseURL()+"<span class="string">/</span>"+Integer.toString(status)+"<span class="string">.</span>"+ext;\r
+ } <span class="keyword">else</span> {\r
+ <span class="keyword">return</span> getBaseURL()+"<span class="string">/</span>"+Integer.toString(status);\r
+ }\r
+ }\r
+\r
+ <span class="comment">/**\r
+ * This one just makes sure the outgoing filter gets called.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">request</span><span class="comment"> The original request to be handled.\r
+ */</span>\r
+\r
+ <span class="reference">public</span> <span class="type">ReplyInterface</span> <span class="function-name">ingoingFilter</span>(<span class="type">RequestInterface</span> <span class="variable-name">request</span>) \r
+ <span class="keyword">throws</span> <span class="type">ProtocolException</span>\r
+ {\r
+ <span class="keyword">return</span> <span class="keyword">null</span>;\r
+ }\r
+\r
+ <span class="comment">/**\r
+ * Re-compute error message.\r
+ * This filter uses internal redirection to get the error message body.\r
+ * In case of failure, the original reply is returned, otherwise, a new\r
+ * reply is gotten from the appropriate error resource, and is returned.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">request</span><span class="comment"> The request that has been handled.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">reply</span><span class="comment"> The reply, as emited by the original resource.\r
+ * </span><span class="keyword">@return </span><span class="comment">A new error reply, having the same status code, and \r
+ * authentication information then the given reply, but enhanced\r
+ * with the error resource body.\r
+ */</span>\r
+\r
+ <span class="reference">public</span> <span class="type">ReplyInterface</span> <span class="function-name">outgoingFilter</span>(<span class="type">RequestInterface</span> <span class="variable-name">req</span>, \r
+ <span class="type">ReplyInterface</span> <span class="variable-name">rep</span>) \r
+ <span class="keyword">throws</span> <span class="type">ProtocolException</span>\r
+ {\r
+ <span class="type">Request</span> <span class="variable-name">request</span> = (<span class="type">Request</span>) req;\r
+ <span class="type">Reply</span> <span class="variable-name">reply</span> = (<span class="type">Reply</span>) rep;\r
+ <span class="comment">// Filter valid replies:\r
+</span> <span class="type">int</span> <span class="variable-name">status</span> = reply.getStatus();\r
+ <span class="keyword">switch</span> (status/100) {\r
+ <span class="keyword">case</span> <span class="reference">1</span>:\r
+ <span class="keyword">case</span> <span class="reference">2</span>:\r
+ <span class="keyword">case</span> <span class="reference">3</span>:\r
+ <span class="keyword">case</span> <span class="reference">10</span>:\r
+ <span class="keyword">return</span> <span class="keyword">null</span>;\r
+ }\r
+ <span class="comment">// Filter replies that are already taken care of:\r
+</span> <span class="keyword">if</span> ( request.hasState(ERRED) )\r
+ <span class="keyword">return</span> <span class="keyword">null</span>;\r
+ <span class="comment">// Hack error replies:\r
+</span> <span class="type">Request</span> <span class="variable-name">ereq</span> = (<span class="type">Request</span>) request.getClone();\r
+ <span class="type">Reply</span> <span class="variable-name">erep</span> = <span class="keyword">null</span>;\r
+ <span class="keyword">try</span> {\r
+ ereq.setState(ERRED, Boolean.TRUE);\r
+ ereq.setURLPath(getErrorResource(status));\r
+ ereq.setMethod("<span class="string">GET</span>");\r
+ erep = (<span class="type">Reply</span>) getServer().perform(ereq);\r
+ <span class="comment">// Hack back the original reply into the new reply:\r
+</span> <span class="comment">// - Put back the status\r
+</span> <span class="type">HeaderValue</span> <span class="variable-name">v</span> = <span class="keyword">null</span>;\r
+ erep.setStatus(reply.getStatus());\r
+ <span class="comment">// - Put back the authenticate informations\r
+</span> v = reply.getHeaderValue(reply.H_WWW_AUTHENTICATE);\r
+ erep.setHeaderValue(reply.H_WWW_AUTHENTICATE, v);\r
+ <span class="comment">// - Put back the proxy authenticate informations\r
+</span> v = reply.getHeaderValue(reply.H_PROXY_AUTHENTICATE);\r
+ erep.setHeaderValue(reply.H_PROXY_AUTHENTICATE, v);\r
+ } <span class="keyword">catch</span> (<span class="type">Exception</span> <span class="variable-name">ex</span>) {\r
+ <span class="keyword">return</span> reply;\r
+ }\r
+ <span class="keyword">return</span> erep;\r
+ }\r
+\r
+ <span class="comment">/**\r
+ * We do catch exceptions, just in case we can customize the error.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">request</span><span class="comment"> The request tha triggered the exception.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">ex</span><span class="comment"> The exception.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">filters</span><span class="comment"> Remaining filters to be called.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">idx</span><span class="comment"> Current filter index within above array.\r
+ */</span>\r
+ \r
+ <span class="reference">public</span> <span class="type">ReplyInterface</span> <span class="function-name">exceptionFilter</span>(<span class="type">RequestInterface</span> <span class="variable-name">request</span>,\r
+ <span class="type">ProtocolException</span> <span class="variable-name">ex</span>,\r
+ <span class="type">FilterInterface</span> <span class="variable-name">filters</span>[],\r
+ <span class="type">int</span> <span class="variable-name">idx</span>) \r
+ {\r
+ <span class="type">Reply</span> <span class="variable-name">reply</span> = (<span class="type">Reply</span>) ex.getReply();\r
+ <span class="keyword">if</span> ( reply != <span class="keyword">null</span> ) {\r
+ <span class="keyword">try</span> {\r
+ <span class="keyword">return</span> outgoingFilter(request, reply, filters, idx);\r
+ } <span class="keyword">catch</span> (<span class="type">ProtocolException</span> <span class="variable-name">exx</span>) {\r
+ }\r
+ }\r
+ <span class="keyword">return</span> <span class="keyword">null</span>;\r
+ }\r
+ \r
+ <span class="reference">public</span> <span class="type">void</span> <span class="function-name">initialize</span>(<span class="type">Object</span> <span class="variable-name">values</span>[]) {\r
+ <span class="reference">super</span>.initialize(values);\r
+ }\r
+ \r
+}\r
+\r
+ </pre>\r
+ </body>\r
+</html>\r