Adding JMCR-Stable version
[Benchmarks_CSolver.git] / JMCR-Stable / mcr-test / WWW / Doc / Programmer / samples / ErrorFilter.html
diff --git a/JMCR-Stable/mcr-test/WWW/Doc/Programmer/samples/ErrorFilter.html b/JMCR-Stable/mcr-test/WWW/Doc/Programmer/samples/ErrorFilter.html
new file mode 100644 (file)
index 0000000..1d21632
--- /dev/null
@@ -0,0 +1,203 @@
+<!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
+ * &lt;p&gt;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
+     * &lt;strong&gt;null&lt;/strong&gt; 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