add write-support for LZMA
diff --git a/changes.xml b/changes.xml
index 1fe9e6c..ec80e1f 100644
--- a/changes.xml
+++ b/changes.xml
@@ -40,7 +40,8 @@
     <release version="1.5" date="unreleased">
       <action type="update" breaks-bwc="true">
         The Apache Compress Antlib now requires Apache Commons
-        Compress 1.8 or later for 7z, XZ for Java 1.5 is recommeded.
+        Compress 1.13 or later for 7z and write support for LZMA, XZ
+        for Java 1.6 is equired for write support for LZMA.
       </action>
       <action type="add">
         A new keepCompression flag can be used to keep the content
@@ -55,6 +56,9 @@
         The gzip task has a new attribute that controls the level of
         compression.
       </action>
+      <action type="add">
+        Added write support for the LZMA format.
+      </action>
     </release>
 
     <release version="1.4" date="2014-01-29">
diff --git a/docs/pack.html b/docs/pack.html
index f878a16..89c3f52 100644
--- a/docs/pack.html
+++ b/docs/pack.html
@@ -121,6 +121,13 @@
     </tr>
   </table>
 
+  <h3><a name="lzma">LZMA</a></h3>
+
+  <p>Is a <a href="#pack">compressing task</a> that uses the LZMA
+    compression algorithm.</p>
+
+  <p><em>Since Compress Antlib 1.5</em>
+
   <h3><a name="pack200">Pack200</a></h3>
 
   <p>Is a <a href="#pack">compressing task</a> that uses
diff --git a/ivy.xml b/ivy.xml
index 7f9284e..87c0722 100644
--- a/ivy.xml
+++ b/ivy.xml
@@ -55,8 +55,8 @@
               e:classifier="ivy"/>
   </publications>
   <dependencies>
-    <dependency org="org.apache.commons" name="commons-compress" rev="1.8" conf="default"/>
-    <dependency org="org.tukaani" name="xz" rev="1.5" conf="default"/>
+    <dependency org="org.apache.commons" name="commons-compress" rev="1.13" conf="default"/>
+    <dependency org="org.tukaani" name="xz" rev="1.6" conf="default"/>
     <dependency org="junit" name="junit" rev="4.11" conf="test->default"/>
   </dependencies>
 </ivy-module>
diff --git a/src/main/org/apache/ant/compress/antlib.xml b/src/main/org/apache/ant/compress/antlib.xml
index b2e03d4..57392e9 100644
--- a/src/main/org/apache/ant/compress/antlib.xml
+++ b/src/main/org/apache/ant/compress/antlib.xml
@@ -112,6 +112,10 @@
      name="xz"
      classname="org.apache.ant.compress.taskdefs.XZ"
      />
+  <taskdef
+     name="lzma"
+     classname="org.apache.ant.compress.taskdefs.LZMA"
+     />
 
   <typedef
      name="arentry"
diff --git a/src/main/org/apache/ant/compress/taskdefs/LZMA.java b/src/main/org/apache/ant/compress/taskdefs/LZMA.java
new file mode 100644
index 0000000..ca98412
--- /dev/null
+++ b/src/main/org/apache/ant/compress/taskdefs/LZMA.java
@@ -0,0 +1,41 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.apache.ant.compress.taskdefs;
+
+import org.apache.ant.compress.resources.CommonsCompressCompressorResource;
+import org.apache.ant.compress.resources.LZMAResource;
+import org.apache.ant.compress.util.LZMAStreamFactory;
+import org.apache.tools.ant.types.Resource;
+
+/**
+ * Compresses using LZMA.
+ * @since Apache Compress Antlib 1.5
+ */
+public final class LZMA extends PackBase {
+
+    public LZMA() {
+        super(new LZMAStreamFactory(),
+              new PackBase.ResourceWrapper() {
+                public CommonsCompressCompressorResource wrap(Resource dest) {
+                    return new LZMAResource(dest);
+                }
+            });
+    }
+
+}
diff --git a/src/main/org/apache/ant/compress/util/LZMAStreamFactory.java b/src/main/org/apache/ant/compress/util/LZMAStreamFactory.java
index b96cd9b..d55cbcc 100644
--- a/src/main/org/apache/ant/compress/util/LZMAStreamFactory.java
+++ b/src/main/org/apache/ant/compress/util/LZMAStreamFactory.java
@@ -25,10 +25,11 @@
 import org.apache.commons.compress.compressors.CompressorInputStream;
 import org.apache.commons.compress.compressors.CompressorOutputStream;
 import org.apache.commons.compress.compressors.lzma.LZMACompressorInputStream;
+import org.apache.commons.compress.compressors.lzma.LZMACompressorOutputStream;
 
 /**
  * Creates streams for the standalone LZMA format.
- * @since Apache Compress Antlib 1.3
+ * @since Apache Compress Antlib 1.3, write support added with 1.4
  */
 public class LZMAStreamFactory implements CompressorStreamFactory {
 
@@ -42,11 +43,11 @@
     }
 
     /**
-     * Not implemented.
+     * @param stream the stream to write to, should be buffered
      */
     @Override
     public CompressorOutputStream getCompressorStream(OutputStream stream)
         throws IOException {
-        throw new UnsupportedOperationException();
+        return new LZMACompressorOutputStream(stream);
     }
 }
diff --git a/src/tests/antunit/lzma-test.xml b/src/tests/antunit/lzma-test.xml
new file mode 100644
index 0000000..ce2721c
--- /dev/null
+++ b/src/tests/antunit/lzma-test.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+  -->
+<project default="antunit"
+         xmlns:au="antlib:org.apache.ant.antunit"
+         xmlns:cond="antlib:org.apache.tools.ant.types.conditions"
+         xmlns:cmp="antlib:org.apache.ant.compress">
+
+  <import file="antunit-base.xml" />
+
+  <target name="setUp">
+    <mkdir dir="${output}" />
+    <mkdir dir="${output}/empty" />
+    <touch file="${output}/fileone" />
+    <touch file="${output}/filetwo" />
+  </target>
+
+  <target name="testFailNone" depends="setUp">
+    <au:expectfailure expectedmessage="source is required.">
+      <cmp:lzma destfile="${output}/file.lzma">
+        <fileset dir="${output}/empty" />
+      </cmp:lzma>
+    </au:expectfailure>
+  </target>
+
+  <target name="testFailTwo" depends="setUp">
+    <au:expectfailure expectedmessage="Can only have one source.">
+      <cmp:lzma destfile="${output}/file.lzma">
+        <fileset dir="${output}" />
+      </cmp:lzma>
+    </au:expectfailure>
+  </target>
+
+  <target name="testFailNoDest" depends="setUp">
+    <au:expectfailure expectedmessage="dest resource is required.">
+      <cmp:lzma src="${output}/fileone">
+        <dest>
+          <fileset dir="${output}/empty" />
+        </dest>
+      </cmp:lzma>
+    </au:expectfailure>
+  </target>
+
+  <target name="testFailTwoDests" depends="setUp">
+    <au:expectfailure expectedmessage="Can only have one destination resource.">
+      <cmp:lzma src="${output}/fileone">
+        <dest>
+          <fileset dir="${output}" />
+        </dest>
+      </cmp:lzma>
+    </au:expectfailure>
+  </target>
+
+  <target name="testRealTest" depends="setUp">
+    <cmp:lzma src="../resources/asf-logo.gif"
+              destfile="${output}/asf-logo.gif.lzma" />
+    <au:assertLogContains text="Building: asf-logo.gif.lzma"/>
+    <au:assertFileExists file="${output}/asf-logo.gif.lzma"/>
+  </target>
+
+  <target name="testRealTestWithResource" depends="setUp">
+    <cmp:lzma destfile="${output}/asf-logo.gif.lzma">
+      <file file="../resources/asf-logo.gif"/>
+    </cmp:lzma>
+    <au:assertLogContains text="Building: asf-logo.gif.lzma"/>
+    <au:assertFileExists file="${output}/asf-logo.gif.lzma"/>
+  </target>
+
+  <target name="testDateCheck" depends="setUp">
+    <touch file="${output}/asf-logo.gif.lzma"/>
+    <cmp:lzma src="../resources/asf-logo.gif"
+              destfile="${output}/asf-logo.gif.lzma" />
+    <au:assertLogContains text="Nothing to do: asf-logo.gif.lzma is up to date."/>
+  </target>
+
+  <!-- re-enable once we upgrade to CC 1.14, see
+       https://issues.apache.org/jira/browse/COMPRESS-393 -->
+  <target name="XtestNestedTask" depends="setUp">
+    <cmp:lzma destfile="${output}/asf-logo.tar.lzma">
+      <cmp:tar>
+        <cmp:cpiofileset src="../resources/asf-logo.gif.bin.cpio"
+                         includes="asf-logo.gif"/>
+      </cmp:tar>
+    </cmp:lzma>
+    <au:assertFileExists file="${output}/asf-logo.tar.lzma"/>
+    <au:assertTrue>
+      <cond:islastmodified datetime="2009-07-31-20:11:13 +0200"
+                           pattern="yyyy-MM-dd-HH:mm:ss Z">
+        <cmp:tarentry name="asf-logo.gif">
+          <cmp:lzmaresource>
+            <file file="${output}/asf-logo.tar.lzma"/>
+          </cmp:lzmaresource>
+        </cmp:tarentry>
+      </cond:islastmodified>
+    </au:assertTrue>
+  </target>
+</project>
diff --git a/src/tests/antunit/unlzma-test.xml b/src/tests/antunit/unlzma-test.xml
index 5f25046..2fde762 100644
--- a/src/tests/antunit/unlzma-test.xml
+++ b/src/tests/antunit/unlzma-test.xml
@@ -39,6 +39,14 @@
     </au:expectfailure>
   </target>
 
+  <target name="testLZMATask" depends="setUp">
+    <cmp:lzma src="../resources/asf-logo.gif"
+              destfile="${output}/asf-logo.gif.lzma"/>
+    <cmp:unlzma src="${output}/asf-logo.gif.lzma" dest="${output}/asf-logo.gif" />
+    <au:assertFilesMatch expected="../resources/asf-logo.gif"
+                         actual="${output}/asf-logo.gif"/>
+  </target>
+
   <target name="testNativeLZMA" depends="setUp">
     <cmp:unlzma src="../resources/asf-logo.gif.lzma"
                 dest="${output}/asf-logo.gif" />