JCRVLT-699 don't use fix date for SNAPSHOT versions (#91)

diff --git a/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/GenerateMetadataMojo.java b/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/GenerateMetadataMojo.java
index d9296f2..5cb909d 100644
--- a/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/GenerateMetadataMojo.java
+++ b/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/GenerateMetadataMojo.java
@@ -88,6 +88,7 @@
 import org.apache.maven.archiver.MavenArchiveConfiguration;
 import org.apache.maven.archiver.MavenArchiver;
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.artifact.DependencyResolutionRequiredException;
 import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
 import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
@@ -933,7 +934,7 @@
         return archive;
     }
 
-    private Properties computeProperties(String dependenciesString, String dependenciesLocations) {
+    Properties computeProperties(String dependenciesString, String dependenciesLocations) {
         final Properties props = new Properties();
 
         // find the description of the content package (bug #30546)
@@ -979,7 +980,12 @@
         }
 
         MavenArchiver archiver = new MavenArchiver();
-        Date createdDate = archiver.parseOutputTimestamp(outputTimestamp);
+        Date createdDate = null;
+        if (!ArtifactUtils.isSnapshot(version)) {
+            createdDate = archiver.parseOutputTimestamp(outputTimestamp);
+        } else {
+            getLog().debug("Disabling reproducible builds as the version is a SNAPSHOT, therefore a dynamic created date is used");
+        }
         if (createdDate == null) {
             createdDate = new Date();
         }
diff --git a/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/DefaultProjectIT.java b/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/DefaultProjectIT.java
index 9db4db2..6f7c314 100644
--- a/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/DefaultProjectIT.java
+++ b/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/DefaultProjectIT.java
@@ -52,6 +52,7 @@
         // the created date is fixed in the pom, as this is a reproducible build
         projectBuilder
             .setTestProjectDir(TEST_PROJECT_NAME + "generic")
+            .setTestPackageFile("target/package-plugin-test-pkg-1.0.0.zip")
             .build()
             .verifyExpectedFiles()
             .verifyExpectedFilesOrder()
@@ -71,6 +72,7 @@
     public void generic_project_is_reproducible(ProjectBuilder projectBuilder) throws Exception {
         projectBuilder
             .setTestProjectDir(TEST_PROJECT_NAME + "generic")
+            .setTestPackageFile("target/package-plugin-test-pkg-1.0.0.zip")
             .build();
         // MD5
         MessageDigest md = MessageDigest.getInstance("MD5");
@@ -81,6 +83,7 @@
         byte[] digest1 = md.digest();
         projectBuilder
             .setTestProjectDir(TEST_PROJECT_NAME + "generic")
+            .setTestPackageFile("target/package-plugin-test-pkg-1.0.0.zip")
             .build();
         // MD5
         md = MessageDigest.getInstance("MD5");
diff --git a/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/GenerateMetadataMojoTest.java b/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/GenerateMetadataMojoTest.java
index 3542264..9da556b 100644
--- a/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/GenerateMetadataMojoTest.java
+++ b/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/GenerateMetadataMojoTest.java
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.filevault.maven.packaging.mojo;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.ByteArrayInputStream;
@@ -27,6 +28,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
@@ -38,6 +40,7 @@
 import org.apache.jackrabbit.filevault.maven.packaging.Filters;
 import org.apache.jackrabbit.filevault.maven.packaging.MavenBasedPackageDependency;
 import org.apache.jackrabbit.filevault.maven.packaging.SubPackage;
+import org.apache.jackrabbit.util.ISO8601;
 import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
 import org.apache.jackrabbit.vault.fs.config.ConfigurationException;
 import org.apache.jackrabbit.vault.fs.filter.DefaultPathFilter;
@@ -48,6 +51,7 @@
 import org.hamcrest.MatcherAssert;
 import org.hamcrest.Matchers;
 import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
 
 class GenerateMetadataMojoTest {
 
@@ -226,4 +230,55 @@
     private static String unescapeContinuations(String value) {
         return value.replaceAll("\r ", "");
     }
+
+    @Test
+    void testComputeProperties() {
+        // first test with SNAPSHOT version
+        MavenProject project = Mockito.mock(MavenProject.class);
+        Mockito.when(project.getArtifactId()).thenReturn("myartifactid");
+        Mockito.when(project.getGroupId()).thenReturn("mygroupid");
+        Mockito.when(project.getVersion()).thenReturn("1.0.0-SNAPSHOT");
+        Mockito.when(project.getDescription()).thenReturn("my description");
+        GenerateMetadataMojo mojo = new GenerateMetadataMojo();
+        mojo.project = project;
+        mojo.group = "mygroup";
+        mojo.name = "myname";
+        mojo.version = "1.0.0-SNAPSHOT";
+        mojo.allowIndexDefinitions = true;
+        mojo.packageType = PackageType.MIXED;
+        mojo.outputTimestamp = "1";
+        Properties properties = mojo.computeProperties(null, null);
+        Properties expectedProperties = new Properties();
+        expectedProperties.put("allowIndexDefinitions", "true");
+        expectedProperties.put("name", "myname");
+        expectedProperties.put("group", "mygroup");
+        expectedProperties.put("description", "my description");
+        expectedProperties.put("groupId", "mygroupid");
+        expectedProperties.put("artifactId", "myartifactid");
+        expectedProperties.put("version", "1.0.0-SNAPSHOT");
+        expectedProperties.put("packageType", "mixed");
+        expectedProperties.put("requiresRoot", "false");
+        String expectedDate = ISO8601.format(new Date());
+        expectedDate = expectedDate.substring(0, expectedDate.lastIndexOf("."));
+        expectedProperties.put("created", expectedDate);
+        for (Object key : properties.keySet()) {
+            if (key.equals("created")) {
+                // only compare on seconds level
+                assertTrue(properties.get(key).toString().startsWith(expectedProperties.get(key).toString()), "Key " + key + "=" +  properties.get(key) + " does not start with " +  expectedProperties.get(key));
+            } else {
+                assertEquals(expectedProperties.get(key), properties.get(key), "Key " + key + " is not as expected");
+            }
+        }
+        // test with release version
+        mojo.version = "1.0.0";
+        expectedDate = ISO8601.format(new Date(1l));
+        for (Object key : properties.keySet()) {
+            if (key.equals("created")) {
+                // only compare on seconds level
+                assertTrue(properties.get(key).toString().startsWith(expectedProperties.get(key).toString()), "Key " + key + "=" +  properties.get(key) + " does not start with " +  expectedProperties.get(key));
+            } else {
+                assertEquals(expectedProperties.get(key), properties.get(key), "Key " + key + " is not as expected");
+            }
+        }
+    }
 }
diff --git a/src/test/resources/test-projects/default-test-projects/generic/expected-manifest.txt b/src/test/resources/test-projects/default-test-projects/generic/expected-manifest.txt
index c681ffb..4316311 100644
--- a/src/test/resources/test-projects/default-test-projects/generic/expected-manifest.txt
+++ b/src/test/resources/test-projects/default-test-projects/generic/expected-manifest.txt
@@ -1,7 +1,7 @@
 Content-Package-Description:Packaging test
-Content-Package-Id:org.apache.jackrabbit.filevault:package-plugin-test-pkg:1.0.0-SNAPSHOT
+Content-Package-Id:org.apache.jackrabbit.filevault:package-plugin-test-pkg:1.0.0
 Content-Package-Roots:/apps/install/org.apache.jackrabbit.vault-3.1.40.jar,/apps/some-thirdparty-libs,/apps/wcm/core/content,/etc/cloudservices,/etc/designs/some-thirdparty-libs,/etc/packages/apache/consulting,/libs/install/jcr-2.0.jar,/rep:policy
 Content-Package-Type:mixed
 Implementation-Title:Packaging test
-Implementation-Version:1.0.0-SNAPSHOT
+Implementation-Version:1.0.0
 Manifest-Version:1.0
\ No newline at end of file
diff --git a/src/test/resources/test-projects/default-test-projects/generic/pom.xml b/src/test/resources/test-projects/default-test-projects/generic/pom.xml
index e013075..cbcb2b3 100755
--- a/src/test/resources/test-projects/default-test-projects/generic/pom.xml
+++ b/src/test/resources/test-projects/default-test-projects/generic/pom.xml
@@ -22,7 +22,7 @@
     <!-- ====================================================================== -->
     <groupId>org.apache.jackrabbit.filevault</groupId>
     <artifactId>package-plugin-test-pkg</artifactId>
-    <version>1.0.0-SNAPSHOT</version>
+    <version>1.0.0</version><!-- no SNAPSHOT to enable reproducible builds -->
     <packaging>content-package</packaging>
     <name>Packaging test</name>