--- /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>CounterFilter.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">// CounterFilter.java\r
+// $Id: CounterFilter.html,v 1.1 2010/06/15 12:20:09 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">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
+\r
+<span class="comment">/**\r
+ * Count the number of hits to the target.\r
+ * This resource maintains the number of hits to some target resource, as\r
+ * one of its persistent attribute.\r
+ * It will decorate the request on the way in with a fake field\r
+ * <code>org.w3c.jigsaw.filters.CounterFilter.count</code>, that will\r
+ * hold the current hit counts for the target resource to use.\r
+ */</span>\r
+\r
+<span class="reference">public</span> <span class="keyword">class</span> <span class="function-name">CounterFilter</span> <span class="keyword">extends</span> <span class="type">ResourceFilter</span> {\r
+ <span class="comment">/**\r
+ * The name of the piece if state that receives the hit count value.\r
+ * To get to the hit-count, use the <code>getState</code> method of \r
+ * Request, with the following key.\r
+ */</span>\r
+ <span class="reference">public</span> <span class="type">static</span> <span class="type">final</span> \r
+ <span class="type">String</span> <span class="variable-name">STATE_COUNT</span> = "<span class="doc-string">org.w3c.jigsaw.filters.CounterFilter.count</span>";\r
+\r
+ <span class="comment">/**\r
+ * Attribute index - The counter attribute.\r
+ */</span>\r
+ <span class="preprocessor">protected</span> <span class="type">static</span> <span class="type">int</span> <span class="variable-name">ATTR_COUNTER</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.CounterFilter</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 counter attribute\r
+</span> a = <span class="keyword">new</span> <span class="type">IntegerAttribute</span>("<span class="string">counter</span>"\r
+ , <span class="keyword">new</span> <span class="type">Integer</span>(0)\r
+ , Attribute.EDITABLE) ;\r
+ ATTR_COUNTER = AttributeRegistry.registerAttribute(cls, a) ;\r
+ }\r
+\r
+ <span class="comment">/**\r
+ * We count all accesses, even the one that failed.\r
+ * We also define the \r
+ * <code>org.w3c.jigsaw.filters.CounterFilter.count</code>\r
+ * request state as the number of hits on that resource (stored as\r
+ * an Integer instance).\r
+ * </span><span class="keyword">@param </span><span class="variable-name">request</span><span class="comment"> The request being processed.\r
+ * </span><span class="keyword">@return </span><span class="comment">Always <strong>null</strong>.\r
+ */</span>\r
+\r
+ <span class="reference">public</span> <span class="type">synchronized</span> <span class="type">ReplyInterface</span> <span class="function-name">ingoingFilter</span>(<span class="type">RequestInterface</span> <span class="variable-name">req</span>) {\r
+ <span class="type">Request</span> <span class="variable-name">request</span> = (<span class="type">Request</span>) req;\r
+ <span class="type">int</span> <span class="variable-name">i</span> = getInt (ATTR_COUNTER, 0) + 1;\r
+ setInt(ATTR_COUNTER, i) ;\r
+ <span class="keyword">if</span>(! request.hasState(STATE_COUNT))\r
+ request.setState(STATE_COUNT, <span class="keyword">new</span> <span class="type">Integer</span>(i)) ;\r
+ <span class="keyword">return</span> <span class="keyword">null</span>;\r
+ }\r
+\r
+}\r
+\r
+\r
+ </pre>\r
+ </body>\r
+</html>\r