--- /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>ResourceFilter.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">// ResourceFilter.java\r
+// $Id: ResourceFilter.html,v 1.1 2010/06/15 12:20:03 smhuang Exp $\r
+// (c) COPYRIGHT MIT and INRIA, 1996.\r
+// Please first read the full copyright statement in file COPYRIGHT.html\r
+</span>\r
+<span class="keyword">package</span> <span class="reference">org</span>.<span class="reference">w3c</span>.<span class="reference">tools</span>.<span class="type">resources</span> ;\r
+\r
+<span class="keyword">import</span> <span class="reference">java</span>.<span class="reference">util</span>.*;\r
+<span class="keyword">import</span> <span class="reference">java</span>.<span class="reference">io</span>.*;\r
+\r
+<span class="reference">public</span> <span class="keyword">class</span> <span class="function-name">ResourceFilter</span> <span class="keyword">extends</span> <span class="type">ResourceFrame</span> \r
+ <span class="keyword">implements</span> <span class="type">FilterInterface</span> {\r
+\r
+ <span class="comment">/**\r
+ * Get our target resource.\r
+ */</span>\r
+ \r
+ <span class="reference">public</span> <span class="type">Resource</span> <span class="function-name">getTargetResource</span>() {\r
+ <span class="type">Resource</span> <span class="variable-name">target</span> = (<span class="type">Resource</span>) getResource();\r
+ <span class="keyword">while</span> (target <span class="keyword">instanceof</span> <span class="type">ResourceFrame</span>) {\r
+ target = ((<span class="type">ResourceFrame</span>)target).getResource();\r
+ }\r
+ <span class="keyword">return</span> target;\r
+ }\r
+ \r
+ <span class="comment">/**\r
+ * Lookup time filtering.\r
+ * This method is called while Jigsaw performs resource lookup. Each time\r
+ * a lookup end up on the target resource of that filter, this method\r
+ * will be called.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">ls</span><span class="comment"> The current lookup state.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">lr</span><span class="comment"> The current lookup result.\r
+ * </span><span class="keyword">@return </span><span class="comment">A boolean, <strong>true</strong> if this filter has performed\r
+ * the whole lookup, and side-effect the lookup result appropriatelly,\r
+ * <strong>false</strong> otherwise.\r
+ */</span>\r
+ \r
+ <span class="reference">public</span> <span class="type">boolean</span> <span class="function-name">lookup</span>(<span class="type">LookupState</span> <span class="variable-name">ls</span>, <span class="type">LookupResult</span> <span class="variable-name">lr</span>) \r
+ <span class="keyword">throws</span> <span class="type">ProtocolException</span>\r
+ {\r
+ <span class="keyword">return</span> <span class="keyword">false</span>;\r
+ }\r
+ \r
+ <span class="comment">/**\r
+ * Simplified ingoingFilter API.\r
+ * This is a default, simplified API to the ingoing filter method.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">request</span><span class="comment"> The request to filter.\r
+ * </span><span class="keyword">@return </span><span class="comment">A Reply instance, or <strong>null</strong> if processing\r
+ * should continue normally.\r
+ * </span><span class="keyword">@exception </span><span class="type">HTTPException</span><span class="comment"> If processing should be interrupted, because\r
+ * an abnormal situation occured.\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
+ * The ingoingFilter method.\r
+ * This is the method that really gets called by Jigsaw core. By default\r
+ * it will invoke the simpler <code>ingoingFilter</code> method,\r
+ * taking only the request has a parameter.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">request</span><span class="comment"> The request that is about to be handled.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">filters</span><span class="comment"> The whole filter list to be applied to the resource.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">i</span><span class="comment"> A pointer into the above array, indicating which filters\r
+ * have already been triggered (the one whose index are lower than \r
+ * <strong>i</strong>), and what filters have to be triggered (the one\r
+ * whose index are greater or equal to <strong>i+1</strong>).\r
+ * </span><span class="keyword">@return </span><span class="comment">A Reply instance, if the filter did know how to answer\r
+ * the request without further processing, <strong>null</strong>\r
+ * otherwise.\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="type">FilterInterface</span> <span class="variable-name">filters</span>[], \r
+ <span class="type">int</span> <span class="variable-name">i</span>)\r
+ <span class="keyword">throws</span> <span class="type">ProtocolException</span>\r
+ {\r
+ <span class="keyword">return</span> ingoingFilter(request);\r
+ }\r
+ \r
+\r
+ <span class="comment">/**\r
+ * Simplified API to the outgoing filter metho.\r
+ * This is a simplified API to the ougoing filter method, you can either\r
+ * overide this method, or the more powerfull one.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">request</span><span class="comment"> The original request.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">reply</span><span class="comment"> It's original reply.\r
+ * </span><span class="keyword">@return </span><span class="comment">A Reply instance, or <strong>null</strong> if processing\r
+ * should continue normally.\r
+ * </span><span class="keyword">@exception </span><span class="type">HTTPException</span><span class="comment"> If processing should be interrupted, because\r
+ * an abnormal situation occured.\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">request</span>,\r
+ <span class="type">ReplyInterface</span> <span class="variable-name">reply</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="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">i</span>) {\r
+ <span class="keyword">return</span> <span class="keyword">null</span>;\r
+ }\r
+ \r
+ <span class="comment">/**\r
+ * The outgoingFilter method.\r
+ * This method is the one that gets called by Jigsaw core. By default it\r
+ * will call the simpler <code>outgoingFilter</code> method that takes\r
+ * only the request and the reply as parameters.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">request</span><span class="comment"> The request that has been processed.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">reply</span><span class="comment"> The original reply as emitted by the resource.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">filters</span><span class="comment"> The whole filter that applies to the resource.\r
+ * </span><span class="keyword">@param </span><span class="variable-name">i</span><span class="comment"> The current index of filters. The <em>i</em> filter is ourself,\r
+ * filters with lower indexes have already been applied, and filters with\r
+ * greater indexes are still to be applied.\r
+ * </span><span class="keyword">@return </span><span class="comment">A Reply instance, if that filter know how to complete the\r
+ * request processing, or <strong>null</strong> if reminaing filters\r
+ * are to be called by Jigsaw engine.\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">request</span>,\r
+ <span class="type">ReplyInterface</span> <span class="variable-name">reply</span>,\r
+ <span class="type">FilterInterface</span> <span class="variable-name">filters</span>[],\r
+ <span class="type">int</span> <span class="variable-name">fidx</span>) \r
+ <span class="keyword">throws</span> <span class="type">ProtocolException</span>\r
+ {\r
+ <span class="type">ReplyInterface</span> <span class="variable-name">fr</span> = outgoingFilter(request, reply);\r
+ <span class="keyword">return</span> (fr != reply) ? fr : <span class="keyword">null</span>;\r
+ }\r
+\r
+ <span class="reference">public</span> <span class="type">OutputStream</span> <span class="function-name">outputFilter</span>(<span class="type">RequestInterface</span> <span class="variable-name">request</span>,\r
+ <span class="type">ReplyInterface</span> <span class="variable-name">reply</span>,\r
+ <span class="type">OutputStream</span> <span class="variable-name">output</span>) {\r
+ <span class="keyword">return</span> output;\r
+ }\r
+}\r
+\r
+ </pre>\r
+ </body>\r
+</html>\r