Adding JMCR-Stable version
[Benchmarks_CSolver.git] / JMCR-Stable / real-world application / jigsaw / WWW / Doc / Programmer / samples / GZIPFilter.html
diff --git a/JMCR-Stable/real-world application/jigsaw/WWW/Doc/Programmer/samples/GZIPFilter.html b/JMCR-Stable/real-world application/jigsaw/WWW/Doc/Programmer/samples/GZIPFilter.html
new file mode 100644 (file)
index 0000000..7e941aa
--- /dev/null
@@ -0,0 +1,174 @@
+<!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>GZIPFilter.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">// GZIPFilter.java\r
+// $Id: GZIPFilter.html,v 1.1 2010/06/15 12:20:02 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">java</span>.<span class="reference">io</span>.*;\r
+<span class="keyword">import</span> <span class="reference">java</span>.<span class="reference">util</span>.<span class="reference">zip</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">www</span>.<span class="reference">mime</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="keyword">class</span> <span class="function-name">GZIPDataMover</span> <span class="keyword">extends</span> <span class="type">Thread</span> {\r
+    <span class="type">InputStream</span> <span class="variable-name">in</span> = <span class="keyword">null</span>;\r
+    <span class="type">OutputStream</span> <span class="variable-name">out</span> = <span class="keyword">null</span>;\r
+\r
+    <span class="reference">public</span> <span class="type">void</span> <span class="function-name">run</span>() {\r
+       <span class="keyword">try</span> {\r
+           <span class="type">byte</span> <span class="variable-name">buf</span>[] = <span class="keyword">new</span> <span class="type">byte</span>[1024];\r
+           <span class="type">int</span>  <span class="variable-name">got</span>   = -1;\r
+           <span class="keyword">while</span> ((got = in.read(buf)) > 0) \r
+               out.write(buf, 0, got);\r
+       } <span class="keyword">catch</span> (<span class="type">IOException</span> <span class="variable-name">ex</span>) {\r
+           ex.printStackTrace();\r
+       } <span class="keyword">finally</span> {\r
+           <span class="keyword">try</span> { in.close(); } <span class="keyword">catch</span> (<span class="type">Exception</span> <span class="variable-name">ex</span>) {};\r
+           <span class="keyword">try</span> { out.close(); } <span class="keyword">catch</span> (<span class="type">Exception</span> <span class="variable-name">ex</span>) {} ;\r
+       }\r
+    }\r
+\r
+    <span class="function-name">GZIPDataMover</span>(<span class="type">InputStream</span> <span class="variable-name">in</span>, <span class="type">OutputStream</span> <span class="variable-name">out</span>) {\r
+       <span class="reference">this</span>.in  = in;\r
+       <span class="reference">this</span>.out = out;\r
+       setName("<span class="string">GZIPDataMover</span>");\r
+       start();\r
+    }\r
+}\r
+\r
+<span class="comment">/**\r
+ * This filter will compress the content of replies using GZIP.\r
+ * Compression is done &lt;em&gt;on the fly&lt;/em&gt;. This assumes that you're really\r
+ * on a slow link, where you have lots of CPU, but not much bandwidth.\r
+ * &lt;p&gt;A nifty usage for that filter, is to plug it on top of a\r
+ * &lt;code&gt;org.w3c.jigsaw.proxy.ProxyDirectory&lt;/code&gt;, in which case it\r
+ * will compress the data when it flies out of the proxy.\r
+ */</span>\r
+\r
+<span class="reference">public</span> <span class="keyword">class</span> <span class="function-name">GZIPFilter</span> <span class="keyword">extends</span> <span class="type">ResourceFilter</span> {\r
+    <span class="comment">/**\r
+     * Attribute index - List of MIME type that we can compress\r
+     */</span>\r
+    <span class="preprocessor">protected</span> <span class="type">static</span> <span class="type">int</span> <span class="variable-name">ATTR_MIME_TYPES</span> = -1;\r
+\r
+    <span class="type">static</span> {\r
+       <span class="type">Class</span>     <span class="variable-name">c</span> = <span class="keyword">null</span>;\r
+       <span class="type">Attribute</span> <span class="variable-name">a</span> = <span class="keyword">null</span>;\r
+       <span class="keyword">try</span> {\r
+           c = Class.forName("<span class="string">org.w3c.jigsaw.filters.GZIPFilter</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">// Register the MIME types attribute:\r
+</span>        a = <span class="keyword">new</span> <span class="type">StringArrayAttribute</span>("<span class="string">mime-types</span>"\r
+                                    , <span class="keyword">null</span>\r
+                                    , Attribute.EDITABLE);\r
+       ATTR_MIME_TYPES = AttributeRegistry.registerAttribute(c, a);\r
+    }\r
+    \r
+    <span class="comment">/**\r
+     * The set of MIME types we are allowed to compress.\r
+     */</span>\r
+    <span class="preprocessor">protected</span> <span class="type">MimeType</span> <span class="variable-name">types</span>[] = <span class="keyword">null</span>;\r
+\r
+    <span class="comment">/**\r
+     * Catch the setting of mime types to compress.\r
+     * </span><span class="keyword">@param </span><span class="variable-name">idx</span><span class="comment"> The attribute being set.\r
+     * </span><span class="keyword">@param </span><span class="variable-name">val</span><span class="comment"> The new attribute value.\r
+     */</span>\r
+    \r
+    <span class="reference">public</span> <span class="type">void</span> <span class="function-name">setValue</span>(<span class="type">int</span> <span class="variable-name">idx</span>, <span class="type">Object</span> <span class="variable-name">value</span>) {\r
+       <span class="reference">super</span>.setValue(idx, value);\r
+       <span class="keyword">if</span> ( idx == ATTR_MIME_TYPES ) {\r
+           <span class="type">synchronized</span> (<span class="reference">this</span>) {\r
+               types = <span class="keyword">null</span>;\r
+           }\r
+       }\r
+    }\r
+\r
+     \r
+    <span class="comment">/**\r
+     * Get the set of MIME types to match:\r
+     * </span><span class="keyword">@return </span><span class="comment">An array of MimeType instances.\r
+     */</span>\r
+\r
+    <span class="reference">public</span> <span class="type">synchronized</span> <span class="type">MimeType</span>[] <span class="function-name">getMimeTypes</span>() {\r
+       <span class="keyword">if</span> ( types == <span class="keyword">null</span> ) {\r
+           <span class="type">String</span> <span class="variable-name">strtypes</span>[] = (<span class="type">String</span>[]) getValue(ATTR_MIME_TYPES, <span class="keyword">null</span>);\r
+           <span class="keyword">if</span> ( strtypes == <span class="keyword">null</span> )\r
+               <span class="keyword">return</span> <span class="keyword">null</span>;\r
+           types = <span class="keyword">new</span> <span class="type">MimeType</span>[strtypes.length];\r
+           <span class="keyword">for</span> (<span class="type">int</span> <span class="variable-name">i</span> = 0 ; i < types.length ; i++) {\r
+               <span class="keyword">try</span> {\r
+                   types[i] = <span class="keyword">new</span> <span class="type">MimeType</span>(strtypes[i]);\r
+               } <span class="keyword">catch</span> (<span class="type">Exception</span> <span class="variable-name">ex</span>) {\r
+                   types[i] = <span class="keyword">null</span>;\r
+               }\r
+           }\r
+       }\r
+       <span class="keyword">return</span> types;\r
+    }\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">// Anything to compress ?\r
+</span>        <span class="keyword">if</span> ( ! reply.hasStream() )\r
+           <span class="keyword">return</span> <span class="keyword">null</span>;\r
+       <span class="comment">// Match possible mime types:\r
+</span>        <span class="type">MimeType</span> <span class="variable-name">t</span>[]     = getMimeTypes();\r
+       <span class="type">boolean</span>  <span class="variable-name">matched</span> = <span class="keyword">false</span>;\r
+       <span class="keyword">if</span> ( t != <span class="keyword">null</span> ) {\r
+           <span class="keyword">for</span> (<span class="type">int</span> <span class="variable-name">i</span> = 0 ; i < t.length ; i++) {\r
+               <span class="keyword">if</span> ( t[i] == <span class="keyword">null</span> )\r
+                   <span class="keyword">continue</span>;\r
+               <span class="keyword">if</span> ( t[i].match(reply.getContentType()) > 0 ) {\r
+                   matched = <span class="keyword">true</span>;\r
+                   <span class="keyword">break</span>;\r
+               }\r
+           }\r
+       }\r
+       <span class="keyword">if</span> ( ! matched ) \r
+           <span class="keyword">return</span> <span class="keyword">null</span>;\r
+       <span class="comment">// Compress:\r
+</span>        <span class="keyword">try</span> {\r
+           <span class="type">PipedOutputStream</span> <span class="variable-name">pout</span> = <span class="keyword">new</span> <span class="type">PipedOutputStream</span>();\r
+           <span class="type">PipedInputStream</span>  <span class="variable-name">pin</span>  = <span class="keyword">new</span> <span class="type">PipedInputStream</span>(pout);\r
+           <span class="keyword">new</span> <span class="type">GZIPDataMover</span>(reply.openStream()\r
+                             , <span class="keyword">new</span> <span class="type">GZIPOutputStream</span>(pout));\r
+           reply.addContentEncoding("<span class="string">gzip</span>");\r
+           reply.setContentLength(-1);\r
+           reply.setStream(pin);\r
+       } <span class="keyword">catch</span> (<span class="type">Exception</span> <span class="variable-name">ex</span>) {\r
+           ex.printStackTrace();\r
+       }\r
+       <span class="keyword">return</span> <span class="keyword">null</span>;\r
+    }\r
+    \r
+\r
+}\r
+\r
+    </pre>\r
+  </body>\r
+</html>\r