[MASSEMBLY-711] Add support for generating XZ compressed tarballs (.tar.xz)

Submitted-by: Mat Booth <mat.booth@redhat.com>

This closes #99

git-svn-id: https://svn.apache.org/repos/asf/maven/plugins/trunk@1773447 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/it/projects/basic-features/formats/src/assemblies/format-test.xml b/src/it/projects/basic-features/formats/src/assemblies/format-test.xml
index 16aa45a..e37f556 100644
--- a/src/it/projects/basic-features/formats/src/assemblies/format-test.xml
+++ b/src/it/projects/basic-features/formats/src/assemblies/format-test.xml
@@ -32,6 +32,8 @@
     <format>jar</format>
     <format>war</format>
     <format>tar.snappy</format>
+    <format>tar.xz</format>
+    <format>txz</format>
   </formats>
   <includeBaseDirectory>false</includeBaseDirectory>
   <files>
diff --git a/src/it/projects/basic-features/formats/verify.bsh b/src/it/projects/basic-features/formats/verify.bsh
index e3557a0..a7330fb 100644
--- a/src/it/projects/basic-features/formats/verify.bsh
+++ b/src/it/projects/basic-features/formats/verify.bsh
@@ -144,4 +144,28 @@
     result = false;
 }
 
+try
+{
+    File assembly = new File( basedir, "target/assemblies/format-test-1.0.tar.xz" );
+    result = result && assembly.exists();
+    result = result && assembly.isFile();
+}
+catch( IOException e )
+{
+    e.printStackTrace();
+    result = false;
+}
+
+try
+{
+    File assembly = new File( basedir, "target/assemblies/format-test-1.0.txz" );
+    result = result && assembly.exists();
+    result = result && assembly.isFile();
+}
+catch( IOException e )
+{
+    e.printStackTrace();
+    result = false;
+}
+
 return result;
diff --git a/src/main/java/org/apache/maven/plugins/assembly/archive/DefaultAssemblyArchiver.java b/src/main/java/org/apache/maven/plugins/assembly/archive/DefaultAssemblyArchiver.java
index c5e9a1d..e54fc01 100644
--- a/src/main/java/org/apache/maven/plugins/assembly/archive/DefaultAssemblyArchiver.java
+++ b/src/main/java/org/apache/maven/plugins/assembly/archive/DefaultAssemblyArchiver.java
@@ -293,7 +293,7 @@
         throws NoSuchArchiverException
     {
         Archiver archiver;
-        if ( "tgz".equals( format ) || "tbz2".equals( format ) || format.startsWith( "tar" ) )
+        if ( "txz".equals( format ) || "tgz".equals( format ) || "tbz2".equals( format ) || format.startsWith( "tar" ) )
         {
             archiver = createTarArchiver( format, TarLongFileMode.valueOf( configSource.getTarLongFileMode() ) );
         }
@@ -514,6 +514,10 @@
             {
                 tarCompressionMethod = TarArchiver.TarCompressionMethod.bzip2;
             }
+            else if ( "xz".equals( compression ) )
+            {
+                tarCompressionMethod = TarArchiver.TarCompressionMethod.xz;
+            }
             else if ( "snappy".equals( compression ) )
             {
                 tarCompressionMethod = TarArchiver.TarCompressionMethod.snappy;
@@ -533,6 +537,10 @@
         {
             tarArchiver.setCompression( TarArchiver.TarCompressionMethod.bzip2 );
         }
+        else if ( "txz".equals( format ) )
+        {
+            tarArchiver.setCompression( TarArchiver.TarCompressionMethod.xz );
+        }
 
         tarArchiver.setLongfile( tarLongFileMode );
 
diff --git a/src/main/java/org/apache/maven/plugins/assembly/mojos/AbstractAssemblyMojo.java b/src/main/java/org/apache/maven/plugins/assembly/mojos/AbstractAssemblyMojo.java
index 0660bbc..c6a00ff 100644
--- a/src/main/java/org/apache/maven/plugins/assembly/mojos/AbstractAssemblyMojo.java
+++ b/src/main/java/org/apache/maven/plugins/assembly/mojos/AbstractAssemblyMojo.java
@@ -163,6 +163,7 @@
      * <li><em>tar.gz</em> or <em>tgz</em> - Creates a gzip'd TAR format</li>
      * <li><em>tar.bz2</em> or <em>tbz2</em> - Creates a bzip'd TAR format</li>
      * <li><em>tar.snappy</em> - Creates a snappy'd TAR format</li>
+     * <li><em>tar.xz</em> or <em>txz</em> - Creates a xz'd TAR format</li>
      * </ul>
      */
     @Parameter
diff --git a/src/main/mdo/assembly.mdo b/src/main/mdo/assembly.mdo
index cb3c9de..a91081a 100644
--- a/src/main/mdo/assembly.mdo
+++ b/src/main/mdo/assembly.mdo
@@ -109,6 +109,7 @@
               <li><b>"tar.gz"</b> or <b>"tgz"</b> - Creates a gzip'd TAR format</li>
               <li><b>"tar.bz2"</b> or <b>"tbz2"</b> - Creates a bzip'd TAR format</li>
               <li><b>"tar.snappy"</b> - Creates a snappy'd TAR format</li>
+              <li><b>"tar.xz"</b> or <b>"txz"</b> - Creates a xz'd TAR format</li>
               <li><b>"jar"</b> - Creates a JAR format</li>
               <li><b>"dir"</b> - Creates an exploded directory format</li>
               <li><b>"war"</b> - Creates a WAR format</li>
diff --git a/src/site/apt/index.apt.vm b/src/site/apt/index.apt.vm
index 74c29f9..0139eef 100644
--- a/src/site/apt/index.apt.vm
+++ b/src/site/apt/index.apt.vm
@@ -56,6 +56,8 @@
 
     * tar.snappy
 
+    * tar.xz (or txz)
+
     * jar
 
     * dir
diff --git a/src/test/java/org/apache/maven/plugins/assembly/archive/DefaultAssemblyArchiverTest.java b/src/test/java/org/apache/maven/plugins/assembly/archive/DefaultAssemblyArchiverTest.java
index 3ccf4ee..b404ab3 100644
--- a/src/test/java/org/apache/maven/plugins/assembly/archive/DefaultAssemblyArchiverTest.java
+++ b/src/test/java/org/apache/maven/plugins/assembly/archive/DefaultAssemblyArchiverTest.java
@@ -19,7 +19,6 @@
  * under the License.
  */
 
-import junit.framework.Assert;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.model.Model;
 import org.apache.maven.plugins.assembly.AssemblerConfigurationSource;
@@ -50,6 +49,7 @@
 import org.codehaus.plexus.util.FileUtils;
 import org.easymock.classextension.EasyMockSupport;
 import org.junit.AfterClass;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -482,6 +482,42 @@
     }
 
     @Test
+    public void testCreateTarArchiver_TarXzFormat_ShouldInitializeXzCompression()
+        throws NoSuchArchiverException, ArchiverException
+    {
+        final EasyMockSupport mm = new EasyMockSupport();
+
+        final TestTarArchiver ttArchiver = new TestTarArchiver();
+
+        final DefaultAssemblyArchiver subject = createSubject( mm, ttArchiver );
+
+        subject.createTarArchiver( "tar.xz", TarLongFileMode.fail );
+
+        assertEquals( TarArchiver.TarCompressionMethod.xz, ttArchiver.compressionMethod );
+        assertEquals( TarLongFileMode.fail, ttArchiver.longFileMode );
+
+        mm.verifyAll();
+    }
+
+    @Test
+    public void testCreateTarArchiver_TXzFormat_ShouldInitializeXzCompression()
+        throws NoSuchArchiverException, ArchiverException
+    {
+        final EasyMockSupport mm = new EasyMockSupport();
+
+        final TestTarArchiver ttArchiver = new TestTarArchiver();
+
+        final DefaultAssemblyArchiver subject = createSubject( mm, ttArchiver );
+
+        subject.createTarArchiver( "txz", TarLongFileMode.fail );
+
+        assertEquals( TarArchiver.TarCompressionMethod.xz, ttArchiver.compressionMethod );
+        assertEquals( TarLongFileMode.fail, ttArchiver.longFileMode );
+
+        mm.verifyAll();
+    }
+
+    @Test
     public void testCreateTarArchiver_InvalidFormat_ShouldFailWithInvalidCompression()
         throws NoSuchArchiverException, ArchiverException
     {