[MASSEMBLY-988] Use newer plexus-archiver methods, code cleanup
diff --git a/src/main/java/org/apache/maven/plugins/assembly/archive/AssemblyArchiver.java b/src/main/java/org/apache/maven/plugins/assembly/archive/AssemblyArchiver.java
index efadb58..e90b2c7 100644
--- a/src/main/java/org/apache/maven/plugins/assembly/archive/AssemblyArchiver.java
+++ b/src/main/java/org/apache/maven/plugins/assembly/archive/AssemblyArchiver.java
@@ -19,7 +19,7 @@
 package org.apache.maven.plugins.assembly.archive;
 
 import java.io.File;
-import java.util.Date;
+import java.nio.file.attribute.FileTime;
 
 import org.apache.maven.plugins.assembly.AssemblerConfigurationSource;
 import org.apache.maven.plugins.assembly.InvalidAssemblerConfigurationException;
@@ -65,6 +65,6 @@
             AssemblerConfigurationSource configSource,
             boolean recompressZippedFiles,
             String mergeManifestMode,
-            Date sourceDateEpoch)
+            FileTime sourceDateEpoch)
             throws ArchiveCreationException, AssemblyFormattingException, InvalidAssemblerConfigurationException;
 }
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 a112870..9e54cdd 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
@@ -26,9 +26,9 @@
 import java.io.StringReader;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.nio.file.attribute.FileTime;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -128,7 +128,7 @@
             final AssemblerConfigurationSource configSource,
             boolean recompressZippedFiles,
             String mergeManifestMode,
-            Date outputTimestamp)
+            FileTime outputTimestamp)
             throws ArchiveCreationException, AssemblyFormattingException, InvalidAssemblerConfigurationException {
         validate(assembly);
 
@@ -271,21 +271,25 @@
             final List<ContainerDescriptorHandler> containerHandlers,
             boolean recompressZippedFiles,
             String mergeManifestMode,
-            Date outputTimestamp)
+            FileTime outputTimestamp)
             throws NoSuchArchiverException {
         Archiver archiver;
-        if ("txz".equals(format)
-                || "tgz".equals(format)
-                || "tbz2".equals(format)
-                || "tzst".equals(format)
-                || format.startsWith("tar")) {
-            archiver = createTarArchiver(format, TarLongFileMode.valueOf(configSource.getTarLongFileMode()));
-        } else if ("war".equals(format)) {
-            archiver = createWarArchiver();
+
+        // one missing alias in plexus-archiver
+        if ("tzst".equals(format)) {
+            archiver = createTarZstArchiver();
         } else {
             archiver = archiverManager.getArchiver(format);
         }
 
+        if (archiver instanceof TarArchiver) {
+            ((TarArchiver) archiver).setLongfile(TarLongFileMode.valueOf(configSource.getTarLongFileMode()));
+        }
+
+        if (archiver instanceof WarArchiver) {
+            ((WarArchiver) archiver).setExpectWebXml(false);
+        }
+
         if (archiver instanceof AbstractZipArchiver) {
             ((AbstractZipArchiver) archiver).setRecompressAddedZips(recompressZippedFiles);
         }
@@ -323,13 +327,12 @@
             archiver = new DryRunArchiver(archiver, LOGGER);
         }
 
-        archiver.setUseJvmChmod(configSource.isUpdateOnly());
         archiver.setIgnorePermissions(configSource.isIgnorePermissions());
         archiver.setForced(!configSource.isUpdateOnly());
 
         // configure for Reproducible Builds based on outputTimestamp value
         if (outputTimestamp != null) {
-            archiver.configureReproducible(outputTimestamp);
+            archiver.configureReproducibleBuild(outputTimestamp);
         }
 
         if (configSource.getOverrideUid() != null) {
@@ -460,49 +463,9 @@
         }
     }
 
-    protected Archiver createWarArchiver() throws NoSuchArchiverException {
-        final WarArchiver warArchiver = (WarArchiver) archiverManager.getArchiver("war");
-        warArchiver.setIgnoreWebxml(false); // See MNG-1274
-
-        return warArchiver;
-    }
-
-    protected Archiver createTarArchiver(final String format, final TarLongFileMode tarLongFileMode)
-            throws NoSuchArchiverException {
+    protected Archiver createTarZstArchiver() throws NoSuchArchiverException {
         final TarArchiver tarArchiver = (TarArchiver) archiverManager.getArchiver("tar");
-        final int index = format.indexOf('.');
-        if (index >= 0) {
-            TarArchiver.TarCompressionMethod tarCompressionMethod;
-            // TODO: this should accept gz and bz2 as well so we can skip
-            // TODO: over the switch
-            final String compression = format.substring(index + 1);
-            if ("gz".equals(compression)) {
-                tarCompressionMethod = TarArchiver.TarCompressionMethod.gzip;
-            } else if ("bz2".equals(compression)) {
-                tarCompressionMethod = TarArchiver.TarCompressionMethod.bzip2;
-            } else if ("xz".equals(compression)) {
-                tarCompressionMethod = TarArchiver.TarCompressionMethod.xz;
-            } else if ("snappy".equals(compression)) {
-                tarCompressionMethod = TarArchiver.TarCompressionMethod.snappy;
-            } else if ("zst".equals(compression)) {
-                tarCompressionMethod = TarArchiver.TarCompressionMethod.zstd;
-            } else {
-                // TODO: better handling
-                throw new IllegalArgumentException("Unknown compression format: " + compression);
-            }
-            tarArchiver.setCompression(tarCompressionMethod);
-        } else if ("tgz".equals(format)) {
-            tarArchiver.setCompression(TarArchiver.TarCompressionMethod.gzip);
-        } else if ("tbz2".equals(format)) {
-            tarArchiver.setCompression(TarArchiver.TarCompressionMethod.bzip2);
-        } else if ("txz".equals(format)) {
-            tarArchiver.setCompression(TarArchiver.TarCompressionMethod.xz);
-        } else if ("tzst".equals(format)) {
-            tarArchiver.setCompression(TarArchiver.TarCompressionMethod.zstd);
-        }
-
-        tarArchiver.setLongfile(tarLongFileMode);
-
+        tarArchiver.setCompression(TarArchiver.TarCompressionMethod.zstd);
         return tarArchiver;
     }
 }
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 466234d..d5eeea7 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
@@ -19,8 +19,8 @@
 package org.apache.maven.plugins.assembly.mojos;
 
 import java.io.File;
+import java.nio.file.attribute.FileTime;
 import java.util.Collections;
-import java.util.Date;
 import java.util.List;
 import java.util.Properties;
 
@@ -475,8 +475,9 @@
         // TODO: include dependencies marked for distribution under certain formats
         // TODO: how, might we plug this into an installer, such as NSIS?
 
-        MavenArchiver mavenArchiver = new MavenArchiver();
-        Date outputDate = mavenArchiver.parseOutputTimestamp(outputTimestamp);
+        FileTime outputDate = MavenArchiver.parseBuildOutputTimestamp(outputTimestamp)
+                .map(FileTime::from)
+                .orElse(null);
 
         boolean warnedAboutMainProjectArtifact = false;
         for (final Assembly assembly : assemblies) {
@@ -484,10 +485,10 @@
                 final String fullName = AssemblyFormatUtils.getDistributionName(assembly, this);
 
                 List<String> effectiveFormats = formats;
-                if (effectiveFormats == null || effectiveFormats.size() == 0) {
+                if (effectiveFormats == null || effectiveFormats.isEmpty()) {
                     effectiveFormats = assembly.getFormats();
                 }
-                if (effectiveFormats == null || effectiveFormats.size() == 0) {
+                if (effectiveFormats == null || effectiveFormats.isEmpty()) {
                     throw new MojoFailureException(
                             "No formats specified in the execution parameters or the assembly descriptor.");
                 }
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 83267c5..4c52231 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
@@ -31,6 +31,7 @@
 import org.apache.maven.plugins.assembly.filter.ContainerDescriptorHandler;
 import org.apache.maven.plugins.assembly.model.Assembly;
 import org.apache.maven.plugins.assembly.mojos.AbstractAssemblyMojo;
+import org.apache.maven.plugins.assembly.testutils.PojoConfigSource;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.DefaultPlexusContainer;
 import org.codehaus.plexus.PlexusContainer;
@@ -39,6 +40,7 @@
 import org.codehaus.plexus.archiver.ArchiverException;
 import org.codehaus.plexus.archiver.diags.NoOpArchiver;
 import org.codehaus.plexus.archiver.manager.ArchiverManager;
+import org.codehaus.plexus.archiver.manager.NoSuchArchiverException;
 import org.codehaus.plexus.archiver.tar.TarArchiver;
 import org.codehaus.plexus.archiver.tar.TarLongFileMode;
 import org.codehaus.plexus.archiver.war.WarArchiver;
@@ -53,6 +55,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.any;
@@ -137,7 +140,7 @@
         verify(configSource).isDryRun();
         verify(configSource).isIgnoreDirFormatExtensions();
         verify(configSource).isIgnorePermissions();
-        verify(configSource, times(2)).isUpdateOnly();
+        verify(configSource).isUpdateOnly();
 
         verify(phase).execute(eq(assembly), any(Archiver.class), eq(configSource));
 
@@ -179,7 +182,7 @@
         when(configSource.getOverrideGid()).thenReturn(0);
         when(configSource.getOverrideGroupName()).thenReturn("root");
 
-        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<AssemblyArchiverPhase>());
+        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<>());
 
         subject.createArchiver("dummy", false, "finalName", configSource, null, false, null, null);
 
@@ -204,7 +207,7 @@
         when(configSource.getOverrideGid()).thenReturn(0);
         when(configSource.getOverrideGroupName()).thenReturn("root");
 
-        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<AssemblyArchiverPhase>());
+        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<>());
 
         subject.createArchiver("tar", false, "finalName", configSource, null, false, null, null);
 
@@ -221,13 +224,13 @@
         verify(configSource).getWorkingDirectory();
         verify(configSource).isDryRun();
         verify(configSource).isIgnorePermissions();
-        verify(configSource, times(2)).isUpdateOnly();
+        verify(configSource).isUpdateOnly();
 
         verify(archiverManager).getArchiver("tar");
     }
 
     @Test
-    public void testCreateArchiver_ShouldCreateWarArchiverWithIgnoreWebxmlSetToFalse() throws Exception {
+    public void testCreateArchiver_ShouldCreateWarArchiverWitEexpectWebXmlSetToFalse() throws Exception {
         final TestWarArchiver twArchiver = new TestWarArchiver();
 
         when(archiverManager.getArchiver("war")).thenReturn(twArchiver);
@@ -241,11 +244,12 @@
         when(configSource.getWorkingDirectory()).thenReturn(new File("."));
         when(configSource.isIgnorePermissions()).thenReturn(true);
 
-        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<AssemblyArchiverPhase>());
+        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<>());
 
         subject.createArchiver("war", false, null, configSource, null, false, null, null);
 
-        assertFalse(twArchiver.ignoreWebxml);
+        assertNotNull(twArchiver.expectWebXml);
+        assertFalse(twArchiver.expectWebXml);
 
         // result of easymock migration, should be assert of expected result instead of verifying methodcalls
         verify(configSource).getArchiverConfig();
@@ -259,7 +263,7 @@
         verify(configSource).getWorkingDirectory();
         verify(configSource).isDryRun();
         verify(configSource).isIgnorePermissions();
-        verify(configSource, times(2)).isUpdateOnly();
+        verify(configSource).isUpdateOnly();
 
         verify(archiverManager).getArchiver("war");
     }
@@ -278,7 +282,7 @@
         when(configSource.getWorkingDirectory()).thenReturn(new File("."));
         when(configSource.isIgnorePermissions()).thenReturn(true);
 
-        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<AssemblyArchiverPhase>());
+        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<>());
 
         subject.createArchiver("zip", false, null, configSource, null, false, null, null);
 
@@ -291,36 +295,24 @@
         verify(configSource).getWorkingDirectory();
         verify(configSource).isDryRun();
         verify(configSource).isIgnorePermissions();
-        verify(configSource, times(2)).isUpdateOnly();
+        verify(configSource).isUpdateOnly();
 
         verify(archiverManager).getArchiver("zip");
     }
 
     @Test
-    public void testCreateWarArchiver_ShouldDisableIgnoreWebxmlOption() throws Exception {
-        final TestWarArchiver twArchiver = new TestWarArchiver();
-
-        when(archiverManager.getArchiver("war")).thenReturn(twArchiver);
-
-        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<AssemblyArchiverPhase>());
-
-        subject.createWarArchiver();
-
-        assertFalse(twArchiver.ignoreWebxml);
-
-        // result of easymock migration, should be assert of expected result instead of verifying methodcalls
-        verify(archiverManager).getArchiver("war");
-    }
-
-    @Test
     public void testCreateTarArchiver_ShouldNotInitializeCompression() throws Exception {
         final TestTarArchiver archiver = new TestTarArchiver();
 
         when(archiverManager.getArchiver("tar")).thenReturn(archiver);
 
-        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<AssemblyArchiverPhase>());
+        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<>());
 
-        subject.createTarArchiver("tar", TarLongFileMode.fail);
+        PojoConfigSource configSource = new PojoConfigSource();
+        configSource.setTarLongFileMode(TarLongFileMode.fail.name());
+        configSource.setWorkingDirectory(new File(""));
+
+        subject.createArchiver("tar", true, "", configSource, null, false, null, null);
 
         assertNull(new TestTarArchiver().compressionMethod);
         assertEquals(TarLongFileMode.fail, archiver.longFileMode);
@@ -330,133 +322,18 @@
     }
 
     @Test
-    public void testCreateTarArchiver_TarGzFormat_ShouldInitializeGZipCompression() throws Exception {
-        final TestTarArchiver archiver = new TestTarArchiver();
-
-        when(archiverManager.getArchiver("tar")).thenReturn(archiver);
-
-        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<AssemblyArchiverPhase>());
-
-        subject.createTarArchiver("tar.gz", TarLongFileMode.fail);
-
-        assertEquals(TarArchiver.TarCompressionMethod.gzip, archiver.compressionMethod);
-        assertEquals(TarLongFileMode.fail, archiver.longFileMode);
-
-        // result of easymock migration, should be assert of expected result instead of verifying methodcalls
-        verify(archiverManager).getArchiver("tar");
-    }
-
-    @Test
-    public void testCreateTarArchiver_TgzFormat_ShouldInitializeGZipCompression() throws Exception {
-        final TestTarArchiver archiver = new TestTarArchiver();
-
-        when(archiverManager.getArchiver("tar")).thenReturn(archiver);
-
-        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<AssemblyArchiverPhase>());
-
-        subject.createTarArchiver("tgz", TarLongFileMode.fail);
-
-        assertEquals(TarArchiver.TarCompressionMethod.gzip, archiver.compressionMethod);
-        assertEquals(TarLongFileMode.fail, archiver.longFileMode);
-
-        // result of easymock migration, should be assert of expected result instead of verifying methodcalls
-        verify(archiverManager).getArchiver("tar");
-    }
-
-    @Test
-    public void testCreateTarArchiver_TarBz2Format_ShouldInitializeBZipCompression() throws Exception {
-        final TestTarArchiver archiver = new TestTarArchiver();
-
-        when(archiverManager.getArchiver("tar")).thenReturn(archiver);
-
-        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<AssemblyArchiverPhase>());
-
-        subject.createTarArchiver("tar.bz2", TarLongFileMode.fail);
-
-        assertEquals(TarArchiver.TarCompressionMethod.bzip2, archiver.compressionMethod);
-        assertEquals(TarLongFileMode.fail, archiver.longFileMode);
-
-        // result of easymock migration, should be assert of expected result instead of verifying methodcalls
-        verify(archiverManager).getArchiver("tar");
-    }
-
-    @Test
-    public void testCreateTarArchiver_Tbz2Format_ShouldInitializeBZipCompression() throws Exception {
-        final TestTarArchiver archiver = new TestTarArchiver();
-
-        when(archiverManager.getArchiver("tar")).thenReturn(archiver);
-
-        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<AssemblyArchiverPhase>());
-
-        subject.createTarArchiver("tbz2", TarLongFileMode.fail);
-
-        assertEquals(TarArchiver.TarCompressionMethod.bzip2, archiver.compressionMethod);
-        assertEquals(TarLongFileMode.fail, archiver.longFileMode);
-
-        // result of easymock migration, should be assert of expected result instead of verifying methodcalls
-        verify(archiverManager).getArchiver("tar");
-    }
-
-    @Test
-    public void testCreateTarArchiver_TarXzFormat_ShouldInitializeXzCompression() throws Exception {
-        final TestTarArchiver archiver = new TestTarArchiver();
-
-        when(archiverManager.getArchiver("tar")).thenReturn(archiver);
-
-        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<AssemblyArchiverPhase>());
-
-        subject.createTarArchiver("tar.xz", TarLongFileMode.fail);
-
-        assertEquals(TarArchiver.TarCompressionMethod.xz, archiver.compressionMethod);
-        assertEquals(TarLongFileMode.fail, archiver.longFileMode);
-
-        // result of easymock migration, should be assert of expected result instead of verifying methodcalls
-        verify(archiverManager).getArchiver("tar");
-    }
-
-    @Test
-    public void testCreateTarArchiver_TXzFormat_ShouldInitializeXzCompression() throws Exception {
-        final TestTarArchiver archiver = new TestTarArchiver();
-
-        when(archiverManager.getArchiver("tar")).thenReturn(archiver);
-
-        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<AssemblyArchiverPhase>());
-
-        subject.createTarArchiver("txz", TarLongFileMode.fail);
-
-        assertEquals(TarArchiver.TarCompressionMethod.xz, archiver.compressionMethod);
-        assertEquals(TarLongFileMode.fail, archiver.longFileMode);
-
-        // result of easymock migration, should be assert of expected result instead of verifying methodcalls
-        verify(archiverManager).getArchiver("tar");
-    }
-
-    @Test
-    public void testCreateTarArchiver_TarZstFormat_ShouldInitializeZstCompression() throws Exception {
-        final TestTarArchiver archiver = new TestTarArchiver();
-
-        when(archiverManager.getArchiver("tar")).thenReturn(archiver);
-
-        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<AssemblyArchiverPhase>());
-
-        subject.createTarArchiver("tar.zst", TarLongFileMode.fail);
-
-        assertEquals(TarArchiver.TarCompressionMethod.zstd, archiver.compressionMethod);
-        assertEquals(TarLongFileMode.fail, archiver.longFileMode);
-
-        // result of easymock migration, should be assert of expected result instead of verifying methodcalls
-        verify(archiverManager).getArchiver("tar");
-    }
-
-    @Test
     public void testCreateTarArchiver_TZstFormat_ShouldInitializeZstCompression() throws Exception {
         final TestTarArchiver archiver = new TestTarArchiver();
 
         when(archiverManager.getArchiver("tar")).thenReturn(archiver);
 
-        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<AssemblyArchiverPhase>());
+        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<>());
 
-        subject.createTarArchiver("tzst", TarLongFileMode.fail);
+        PojoConfigSource configSource = new PojoConfigSource();
+        configSource.setTarLongFileMode(TarLongFileMode.fail.name());
+        configSource.setWorkingDirectory(new File(""));
+
+        subject.createArchiver("tzst", true, "", configSource, null, false, null, null);
 
         assertEquals(TarArchiver.TarCompressionMethod.zstd, archiver.compressionMethod);
         assertEquals(TarLongFileMode.fail, archiver.longFileMode);
@@ -469,20 +346,20 @@
     public void testCreateTarArchiver_InvalidFormat_ShouldFailWithInvalidCompression() throws Exception {
         final TestTarArchiver ttArchiver = new TestTarArchiver();
 
-        when(archiverManager.getArchiver("tar")).thenReturn(ttArchiver);
+        when(archiverManager.getArchiver("tar.ZZZ")).thenThrow(new NoSuchArchiverException("no archiver"));
 
-        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<AssemblyArchiverPhase>());
+        final DefaultAssemblyArchiver subject = createSubject(new ArrayList<>());
 
         try {
-            subject.createTarArchiver("tar.Z", null);
+            subject.createArchiver("tar.ZZZ", true, "", null, null, false, null, null);
 
             fail("Invalid compression formats should throw an error.");
-        } catch (final IllegalArgumentException e) {
+        } catch (final NoSuchArchiverException e) {
             // expected.
         }
 
         // result of easymock migration, should be assert of expected result instead of verifying methodcalls
-        verify(archiverManager).getArchiver("tar");
+        verify(archiverManager).getArchiver("tar.ZZZ");
     }
 
     private DefaultAssemblyArchiver createSubject(final List<AssemblyArchiverPhase> phases) {
@@ -516,12 +393,12 @@
 
     private static final class TestWarArchiver extends WarArchiver {
 
-        boolean ignoreWebxml;
+        Boolean expectWebXml;
 
         @Override
-        public void setIgnoreWebxml(final boolean ignore) {
-            ignoreWebxml = ignore;
-            super.setIgnoreWebxml(ignore);
+        public void setExpectWebXml(boolean expectWebXml) {
+            this.expectWebXml = expectWebXml;
+            super.setExpectWebXml(expectWebXml);
         }
     }