add support for the raw snappy format

git-svn-id: https://svn.apache.org/repos/asf/ant/antlibs/compress/trunk@1553669 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/docs/compresource.html b/docs/compresource.html
index 0c2ff9c..09d77b4 100644
--- a/docs/compresource.html
+++ b/docs/compresource.html
@@ -138,6 +138,24 @@
   <a href="http://code.google.com/p/snappy/">Snappy</a>
   compression.</p>
 
+<h4>Parameters</h4>
+  <p>In addition to the attributes supported by all uncompressing resources
+    this resource also supports.</p>
+  <table border="1" cellpadding="2" cellspacing="0">
+    <tr>
+      <td valign="top"><b>Attribute</b></td>
+      <td valign="top"><b>Description</b></td>
+      <td align="center" valign="top"><b>Required</b></td>
+    </tr>
+    <tr>
+      <td valign="top">framed</td>
+      <td valign="top">Whether the input is expected to use
+      the <a href="http://code.google.com/p/snappy/source/browse/trunk/framing_format.txt">framing
+     format</a>.</td>
+      <td align="center" valign="top">No, defaults to true.</td>
+    </tr>
+  </table>
+
 <h4>Examples</h4>
 
 <pre>
diff --git a/docs/unpack.html b/docs/unpack.html
index c03f1fb..1487a73 100644
--- a/docs/unpack.html
+++ b/docs/unpack.html
@@ -105,7 +105,7 @@
   compression algorithm.</p>
 
 <p>This task does not work on defalted archives, you need to wrap
-  defalted archives into <code>gunzipresource</code>s in order to use
+  deflated archives into <code>gunzipresource</code>s in order to use
   them.
 
   <h4>Parameters</h4>
@@ -160,6 +160,26 @@
   the <a href="http://code.google.com/p/snappy/">Snappy</a>
   compression algorithm.</p>
 
+<p><em>Since Apache Compress Antlib 1.4</em>.</p>
+
+<h4>Parameters</h4>
+  <p>In addition to the attributes supported by all uncompressing task
+    this task also supports.</p>
+  <table border="1" cellpadding="2" cellspacing="0">
+    <tr>
+      <td valign="top"><b>Attribute</b></td>
+      <td valign="top"><b>Description</b></td>
+      <td align="center" valign="top"><b>Required</b></td>
+    </tr>
+    <tr>
+      <td valign="top">framed</td>
+      <td valign="top">Whether the input is expected to use
+      the <a href="http://code.google.com/p/snappy/source/browse/trunk/framing_format.txt">framing
+     format</a>.</td>
+      <td align="center" valign="top">No, defaults to true.</td>
+    </tr>
+  </table>
+
 <h3><a name="unxz">UnXZ</a></h3>
 
 <p>Is an <a href="#unpack">uncompressing task</a> that uses the XZ
@@ -174,6 +194,8 @@
 <p>Is an <a href="#unpack">uncompressing task</a> that uses the .Z
   compression algorithm.</p>
 
+<p><em>Since Apache Compress Antlib 1.4</em>.</p>
+
 <h3>Examples</h3>
 <blockquote><pre>
 &lt;cmp:gunzip src=&quot;test.tar.gz&quot; xmlns:cmp="antlib:org.apache.ant.compress"/&gt;
diff --git a/src/main/org/apache/ant/compress/resources/CommonsCompressCompressorResource.java b/src/main/org/apache/ant/compress/resources/CommonsCompressCompressorResource.java
index 34f6628..6cc6f68 100644
--- a/src/main/org/apache/ant/compress/resources/CommonsCompressCompressorResource.java
+++ b/src/main/org/apache/ant/compress/resources/CommonsCompressCompressorResource.java
@@ -39,14 +39,27 @@
     extends ContentTransformingResource {
 
     private final String name;
-    private final CompressorStreamFactory factory;
+    private CompressorStreamFactory factory;
     private boolean decompressConcatenated = false;
 
-    /** A no-arg constructor */
+    protected CommonsCompressCompressorResource(String name) {
+        this.name = name;
+    }
+
     protected CommonsCompressCompressorResource(String name,
                                                 CompressorStreamFactory factory) {
+        this(name);
+        setFactory(factory);
+    }
+
+    /**
+     * Constructor with another resource to wrap.
+     * @param other the resource to wrap.
+     */
+    protected CommonsCompressCompressorResource(String name,
+                                                ResourceCollection other) {
+        super(other);
         this.name = name;
-        this.factory = factory;
     }
 
     /**
@@ -56,8 +69,14 @@
     protected CommonsCompressCompressorResource(String name,
                                                 CompressorStreamFactory factory,
                                                 ResourceCollection other) {
-        super(other);
-        this.name = name;
+        this(name, other);
+        setFactory(factory);
+    }
+
+    /**
+     * @since Apache Compress Antlib 1.4
+     */
+    protected final void setFactory(CompressorStreamFactory factory) {
         this.factory = factory;
     }
 
diff --git a/src/main/org/apache/ant/compress/resources/SnappyResource.java b/src/main/org/apache/ant/compress/resources/SnappyResource.java
index 4b51d9f..de5136e 100644
--- a/src/main/org/apache/ant/compress/resources/SnappyResource.java
+++ b/src/main/org/apache/ant/compress/resources/SnappyResource.java
@@ -27,11 +27,24 @@
 public final class SnappyResource extends CommonsCompressCompressorResource {
     private static final String NAME = "Snappy";
 
+    private final SnappyStreamFactory factory;
+
     public SnappyResource() {
-        super(NAME, new SnappyStreamFactory());
+        super(NAME);
+        setFactory(factory = new SnappyStreamFactory());
     }
 
     public SnappyResource(ResourceCollection other) {
-        super(NAME, new SnappyStreamFactory(), other);
+        super(NAME, other);
+        setFactory(factory = new SnappyStreamFactory());
+    }
+
+    /**
+     * Whether to use the "framing format".
+     *
+     * <p>Defaults to true.</p>
+     */
+    public void setFramed(boolean framed) {
+        factory.setFramed(framed);
     }
 }
diff --git a/src/main/org/apache/ant/compress/taskdefs/UnSnappy.java b/src/main/org/apache/ant/compress/taskdefs/UnSnappy.java
index 792d41a..d090dfb 100644
--- a/src/main/org/apache/ant/compress/taskdefs/UnSnappy.java
+++ b/src/main/org/apache/ant/compress/taskdefs/UnSnappy.java
@@ -26,8 +26,20 @@
  */
 public final class UnSnappy extends UnpackBase {
 
+    private final SnappyStreamFactory factory;
+
     public UnSnappy() {
-        super(".sz", new SnappyStreamFactory());
+        super(".sz");
+        setFactory(factory = new SnappyStreamFactory());
+    }
+
+    /**
+     * Whether to use the "framing format".
+     *
+     * <p>Defaults to true.</p>
+     */
+    public void setFramed(boolean framed) {
+        factory.setFramed(framed);
     }
 
 }
diff --git a/src/main/org/apache/ant/compress/util/SnappyStreamFactory.java b/src/main/org/apache/ant/compress/util/SnappyStreamFactory.java
index 1ee5636..1b763d0 100644
--- a/src/main/org/apache/ant/compress/util/SnappyStreamFactory.java
+++ b/src/main/org/apache/ant/compress/util/SnappyStreamFactory.java
@@ -25,6 +25,7 @@
 import org.apache.commons.compress.compressors.CompressorInputStream;
 import org.apache.commons.compress.compressors.CompressorOutputStream;
 import org.apache.commons.compress.compressors.snappy.FramedSnappyCompressorInputStream;
+import org.apache.commons.compress.compressors.snappy.SnappyCompressorInputStream;
 
 /**
  * Creates streams for the standalone Snappy format.
@@ -33,12 +34,24 @@
  */
 public class SnappyStreamFactory implements CompressorStreamFactory {
 
+    private boolean framed = true;
+
+    /**
+     * Whether to use the "framing format".
+     *
+     * <p>Defaults to true.</p>
+     */
+    public void setFramed(boolean framed) {
+        this.framed = framed;
+    }
+
     /**
      * @param stream the stream to read from, should be buffered
      */
     public CompressorInputStream getCompressorStream(InputStream stream)
         throws IOException {
-        return new FramedSnappyCompressorInputStream(stream);
+        return framed ? new FramedSnappyCompressorInputStream(stream)
+            : (CompressorInputStream) new SnappyCompressorInputStream(stream);
     }
 
     /**
diff --git a/src/tests/antunit/snappyresource-test.xml b/src/tests/antunit/snappyresource-test.xml
index 7818428..a7d0ea0 100644
--- a/src/tests/antunit/snappyresource-test.xml
+++ b/src/tests/antunit/snappyresource-test.xml
@@ -38,4 +38,15 @@
                          actual="${output}/asf-logo.gif"/>
   </target>
 
+  <target name="testNativeSnappyUnframed" depends="setUp">
+    <copy todir="${output}">
+      <cmp:snappyresource framed="false">
+        <file file="../resources/asf-logo.gif.snappy"/>
+      </cmp:snappyresource>
+      <globmapper from="*.snappy" to="*"/>
+    </copy>
+    <au:assertFilesMatch expected="../resources/asf-logo.gif"
+                         actual="${output}/asf-logo.gif"/>
+  </target>
+
 </project>
diff --git a/src/tests/antunit/unsnappy-test.xml b/src/tests/antunit/unsnappy-test.xml
index 252b787..d8f87db 100644
--- a/src/tests/antunit/unsnappy-test.xml
+++ b/src/tests/antunit/unsnappy-test.xml
@@ -54,5 +54,20 @@
                          actual="${output}/asf-logo.gif"/>
   </target>
 
+  <target name="testNativeSnappyUnframed" depends="setUp">
+    <cmp:unsnappy src="../resources/asf-logo.gif.snappy"
+                  dest="${output}/asf-logo.gif"
+                  framed="false"/>
+    <au:assertFilesMatch expected="../resources/asf-logo.gif"
+                         actual="${output}/asf-logo.gif"/>
+  </target>
+
+  <target name="testWithResourceUnframed" depends="setUp">
+    <cmp:unsnappy dest="${output}/asf-logo.gif" framed="false">
+      <file file="../resources/asf-logo.gif.snappy"/>
+    </cmp:unsnappy>
+    <au:assertFilesMatch expected="../resources/asf-logo.gif"
+                         actual="${output}/asf-logo.gif"/>
+  </target>
 
 </project>
diff --git a/src/tests/resources/asf-logo.gif.snappy b/src/tests/resources/asf-logo.gif.snappy
new file mode 100644
index 0000000..8e7b02c
--- /dev/null
+++ b/src/tests/resources/asf-logo.gif.snappy
Binary files differ