[MRELEASE-1029] update project.build.outputTimestamp property

to get an up-to-date timestamp value for Reproducible Builds during
releases
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
index 6b1dfc2..4da8199 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
@@ -20,11 +20,15 @@
  */
 
 import java.io.File;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.TimeZone;
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.ArtifactUtils;
@@ -105,6 +109,13 @@
         this.modelETL = modelETL;
     }
 
+    private long startTime = -1 * 1000;
+
+    public void setStartTime( long startTime )
+    {
+        this.startTime = startTime;
+    }
+
     protected abstract String getPomSuffix();
 
     @Override
@@ -166,6 +177,8 @@
                             List<MavenProject> reactorProjects, boolean simulate, ReleaseResult result )
         throws ReleaseExecutionException, ReleaseFailureException
     {
+        result.setStartTime( ( startTime >= 0 ) ? startTime : System.currentTimeMillis() );
+
         for ( MavenProject project : reactorProjects )
         {
             logInfo( result, "Transforming '" + project.getName() + "'..." );
@@ -325,6 +338,40 @@
         }
 
         transformScm( project, modelTarget, releaseDescriptor, projectId, scmRepository, result );
+
+        if ( properties != null )
+        {
+            rewriteBuildOutputTimestampProperty( properties, result );
+        }
+    }
+
+    private void rewriteBuildOutputTimestampProperty( Properties properties, ReleaseResult result )
+    {
+        String buildOutputTimestamp = properties.getProperty( "project.build.outputTimestamp" );
+        if ( buildOutputTimestamp == null )
+        {
+            // no Reproducible Builds output timestamp defined
+            return;
+        }
+        if ( buildOutputTimestamp.length() <= 1 )
+        {
+            // value length == 1 means disable Reproducible Builds
+            return;
+        }
+
+        if ( StringUtils.isNumeric( buildOutputTimestamp ) )
+        {
+            // int representing seconds since the epoch, like SOURCE_DATE_EPOCH
+            buildOutputTimestamp = String.valueOf( result.getStartTime() / 1000 );
+        }
+        else
+        {
+            // ISO-8601
+            DateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss'Z'" );
+            df.setTimeZone( TimeZone.getTimeZone( "UTC" ) );
+            buildOutputTimestamp = df.format( new Date( result.getStartTime() ) );
+        }
+        properties.setProperty( "project.build.outputTimestamp", buildOutputTimestamp );
     }
 
     private void rewriteVersion( Model modelTarget, ReleaseDescriptor releaseDescriptor, String projectId,
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractRewritingReleasePhaseTestCase.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractRewritingReleasePhaseTestCase.java
index 0f72873..0cba62b 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractRewritingReleasePhaseTestCase.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractRewritingReleasePhaseTestCase.java
@@ -87,6 +87,7 @@
         if( phase instanceof AbstractRewritePomsPhase)
         {
             ((AbstractRewritePomsPhase) phase).setModelETL( modelETL );
+            ((AbstractRewritePomsPhase) phase).setStartTime( 0 );
         }
     }
 
diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-development/basic-pom/expected-pom-with-schema.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-development/basic-pom/expected-pom-with-schema.xml
index f565d93..495a718 100644
--- a/maven-release-manager/src/test/resources/projects/rewrite-for-development/basic-pom/expected-pom-with-schema.xml
+++ b/maven-release-manager/src/test/resources/projects/rewrite-for-development/basic-pom/expected-pom-with-schema.xml
@@ -32,6 +32,15 @@
     <url>file://localhost/tmp/scm-repo/trunk</url>
   </scm>
 
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <project.build.outputTimestamp>1970-01-01T00:00:00Z</project.build.outputTimestamp>
+    <javaVersion>7</javaVersion>
+    <maven.compiler.source>1.${javaVersion}</maven.compiler.source>
+    <maven.compiler.target>1.${javaVersion}</maven.compiler.target>    
+  </properties>
+
   <!--
   a multi-line
   comment
diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-development/basic-pom/expected-pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-development/basic-pom/expected-pom.xml
index 557e405..80b0386 100644
--- a/maven-release-manager/src/test/resources/projects/rewrite-for-development/basic-pom/expected-pom.xml
+++ b/maven-release-manager/src/test/resources/projects/rewrite-for-development/basic-pom/expected-pom.xml
@@ -32,6 +32,15 @@
     <url>file://localhost/tmp/scm-repo/trunk</url>
   </scm>
 
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <project.build.outputTimestamp>1970-01-01T00:00:00Z</project.build.outputTimestamp>
+    <javaVersion>7</javaVersion>
+    <maven.compiler.source>1.${javaVersion}</maven.compiler.source>
+    <maven.compiler.target>1.${javaVersion}</maven.compiler.target>    
+  </properties>
+
   <!--
   a multi-line
   comment
diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-development/basic-pom/pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-development/basic-pom/pom.xml
index 8a89516..a267436 100644
--- a/maven-release-manager/src/test/resources/projects/rewrite-for-development/basic-pom/pom.xml
+++ b/maven-release-manager/src/test/resources/projects/rewrite-for-development/basic-pom/pom.xml
@@ -32,6 +32,15 @@
     <url>file://localhost/tmp/scm-repo/tags/release-label</url>
   </scm>
 
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <project.build.outputTimestamp>1970-01-01T00:00:00Z</project.build.outputTimestamp>
+    <javaVersion>7</javaVersion>
+    <maven.compiler.source>1.${javaVersion}</maven.compiler.source>
+    <maven.compiler.target>1.${javaVersion}</maven.compiler.target>    
+  </properties>
+
   <!--
   a multi-line
   comment
diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom/expected-pom-with-schema.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom/expected-pom-with-schema.xml
index b89e5f4..774b129 100644
--- a/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom/expected-pom-with-schema.xml
+++ b/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom/expected-pom-with-schema.xml
@@ -32,6 +32,15 @@
     <url>file://localhost/tmp/scm-repo/tags/release-label</url>
   </scm>
 
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <project.build.outputTimestamp>1970-01-01T00:00:00Z</project.build.outputTimestamp>
+    <javaVersion>7</javaVersion>
+    <maven.compiler.source>1.${javaVersion}</maven.compiler.source>
+    <maven.compiler.target>1.${javaVersion}</maven.compiler.target>    
+  </properties>
+
   <!--
   a multi-line
   comment
diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom/expected-pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom/expected-pom.xml
index 8a89516..a267436 100644
--- a/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom/expected-pom.xml
+++ b/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom/expected-pom.xml
@@ -32,6 +32,15 @@
     <url>file://localhost/tmp/scm-repo/tags/release-label</url>
   </scm>
 
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <project.build.outputTimestamp>1970-01-01T00:00:00Z</project.build.outputTimestamp>
+    <javaVersion>7</javaVersion>
+    <maven.compiler.source>1.${javaVersion}</maven.compiler.source>
+    <maven.compiler.target>1.${javaVersion}</maven.compiler.target>    
+  </properties>
+
   <!--
   a multi-line
   comment
diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom/pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom/pom.xml
index db3aeab..90bbf9e 100644
--- a/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom/pom.xml
+++ b/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom/pom.xml
@@ -32,6 +32,15 @@
     <url>file://localhost/tmp/scm-repo/trunk</url>
   </scm>
 
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <project.build.outputTimestamp>initial</project.build.outputTimestamp>
+    <javaVersion>7</javaVersion>
+    <maven.compiler.source>1.${javaVersion}</maven.compiler.source>
+    <maven.compiler.target>1.${javaVersion}</maven.compiler.target>    
+  </properties>
+
   <!--
   a multi-line
   comment
diff --git a/pom.xml b/pom.xml
index b11c1e6..37d7dfd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -88,6 +88,7 @@
     <javaVersion>7</javaVersion>
     <mavenVersion>3.0</mavenVersion>
     <maven.site.path>maven-release-archives/maven-release-LATEST</maven.site.path>
+    <project.build.outputTimestamp>2019-11-23T17:28:05Z</project.build.outputTimestamp>
   </properties>
 
   <build>