You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kh...@apache.org on 2016/05/05 20:49:13 UTC

svn commit: r1742471 - in /maven/plugins/trunk/maven-resources-plugin/src: it/MRESOURCES-99/ it/MRESOURCES-99/src/ it/MRESOURCES-99/src/main/ it/MRESOURCES-99/src/main/resources/ main/java/org/apache/maven/plugins/resources/

Author: khmarbaise
Date: Thu May  5 20:49:13 2016
New Revision: 1742471

URL: http://svn.apache.org/viewvc?rev=1742471&view=rev
Log:
[MRESOURCES-99] ${project.baseUri} and ${maven.build.timestamp} are not expanded by resource filtering
 o Support maven.build.timestamp and project.baseUri
   which can be used during filtering of resources
   as in model.
   o Added MavenBuildTimestamp which is duplicated from
     maven-model-builder.
   o Those properties have been added as supplemental
     properties which solves the issue.

Added:
    maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/
    maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/pom.xml
    maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/src/
    maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/src/main/
    maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/src/main/resources/
    maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/src/main/resources/SomeResource.txt
    maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/verify.groovy
    maven/plugins/trunk/maven-resources-plugin/src/main/java/org/apache/maven/plugins/resources/MavenBuildTimestamp.java
Modified:
    maven/plugins/trunk/maven-resources-plugin/src/main/java/org/apache/maven/plugins/resources/ResourcesMojo.java

Added: maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/pom.xml
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/pom.xml?rev=1742471&view=auto
==============================================================================
--- maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/pom.xml (added)
+++ maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/pom.xml Thu May  5 20:49:13 2016
@@ -0,0 +1,49 @@
+<?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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.plugins</groupId>
+  <artifactId>maven-resources-plugin-it-filter</artifactId>
+  <packaging>jar</packaging>
+  <version>1.0-SNAPSHOT</version>
+
+  <properties>
+    <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ss'Z'</maven.build.timestamp.format>
+  </properties>
+  <build>
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>true</filtering>        
+      </resource>
+    </resources>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <artifactId>maven-resources-plugin</artifactId>
+          <version>@project.version@</version>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+
+</project>

Added: maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/src/main/resources/SomeResource.txt
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/src/main/resources/SomeResource.txt?rev=1742471&view=auto
==============================================================================
--- maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/src/main/resources/SomeResource.txt (added)
+++ maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/src/main/resources/SomeResource.txt Thu May  5 20:49:13 2016
@@ -0,0 +1,28 @@
+# 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.
+
+timestamp=${maven.build.timestamp}
+at.timestamp=@maven.build.timestamp@
+build.timestamp=${build.timestamp}
+project.build.timestamp=${project.build.timestamp}
+baseUri=${baseUri}
+project.baseUri=${project.baseUri}
+pom.baseUri=${pom.baseUri}
+at.baseUri=@baseUri@
+groupId=${project.groupId}
+basedir=${basedir}
+project.basedir=${project.basedir}

Added: maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/verify.groovy
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/verify.groovy?rev=1742471&view=auto
==============================================================================
--- maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/verify.groovy (added)
+++ maven/plugins/trunk/maven-resources-plugin/src/it/MRESOURCES-99/verify.groovy Thu May  5 20:49:13 2016
@@ -0,0 +1,147 @@
+/*
+ * 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.
+ */
+
+import java.io.*;
+
+import java.util.List;
+import java.util.Collections;
+import java.util.Arrays;
+
+import org.codehaus.plexus.util.*;
+
+boolean result = true;
+
+File target = new File( basedir, "target" );
+if ( !target.exists() || !target.isDirectory() )
+{
+    System.err.println( "target folder is missing or not a directory." );
+    return false;
+}
+
+File someResource = new File( target, "/classes/SomeResource.txt" );
+if ( !someResource.exists() || someResource.isDirectory() )
+{
+    System.err.println( "SomeResource.txt is missing or not a file." );
+    return false;
+}
+
+Properties props = new Properties();
+
+FileInputStream fis = null;
+try
+{
+    fis = new FileInputStream( someResource );
+    props.load( fis );
+    fis.close();
+    fis = null;
+}
+catch ( IOException ex )
+{
+  System.err.println( "Failure during reading the properties " + someResource.getAbsolutePath() );
+  return false;
+}
+finally
+{
+    IOUtil.close( fis );
+}
+
+def keysWhichHaveToExist = [
+    "timestamp", 
+    "at.timestamp", 
+    "build.timestamp",
+    "project.build.timestamp", 
+    "baseUri", 
+    "project.baseUri",
+    "pom.baseUri", 
+    "at.baseUri", 
+    "groupId", 
+    "basedir",
+    "project.basedir",
+]
+
+ 
+keysWhichHaveToExist.each { key ->
+  if (!props.containsKey(key)) {
+      println "Missing the key '" + key + "'"
+      return false
+  }
+}
+
+currentTimestamp = props.get("timestamp") 
+currentAtTimeStamp = props.get("at.timestamp")
+if (  !currentTimestamp.equals (currentAtTimeStamp) 
+    && !currentTimestamp.equals('${maven.build.timestamp}') 
+    && !currentAtTimeStamp.equals('@maven.build.timestamp@') ) {
+  println 'The ${maven.build.timestamp} has not correctly being replaced.'
+  return false
+} 
+
+buildTimeStamp = props.get("build.timestamp") 
+if ( !buildTimeStamp.equals ('${build.timestamp}') ) {
+  println 'The ${build.timestamp} has been replaced.'
+  return false
+}
+
+currentProjectBuildTimeStamp = props.get('project.build.timestamp')
+if ( !currentProjectBuildTimeStamp.equals ('${project.build.timestamp}') ) {
+  println 'The ${project.build.timestamp} has been replaced.'
+  return false
+}
+
+currentBaseUri = props.get('baseUri')
+if ( !currentBaseUri.equals ('${baseUri}') ) {
+  println 'The ${baseUri} has been replaced.'
+  return false
+}
+
+currentProjectBaseUri = props.get('project.baseUri')
+if ( currentProjectBaseUri.equals ('${project.baseUri}') ) {
+  println 'The ${project.baseUri} has not been replaced.'
+  return false
+}
+
+currentPomBaseUri = props.get('pom.baseUri')
+if ( !currentPomBaseUri.equals ('${pom.baseUri}') ) {
+  println 'The ${pom.baseUri} has been replaced.'
+  return false
+}
+
+currentAtBaseUri = props.get('at.baseUri')
+if ( !currentAtBaseUri.equals ('@baseUri@') ) {
+  println 'The @baseUri@ has been replaced.'
+  return false
+}
+
+currentGroupId = props.get('project.groupId')
+if ( currentGroupId.equals ('${project.groupId}') ) {
+  println 'The ${project.groupId} has not been replaced.'
+  return false
+}
+currentBaseDir = props.get('basedir')
+if ( currentBaseDir.equals ('${basedir}') ) {
+  println 'The ${basedir} has not been replaced.'
+  return false
+}
+currentProjectBaseDir = props.get('project.basedir')
+if ( currentBaseDir.equals ('${project.basedir}') ) {
+  println 'The ${project.basedir} has not been replaced.'
+  return false
+}
+
+return result;

Added: maven/plugins/trunk/maven-resources-plugin/src/main/java/org/apache/maven/plugins/resources/MavenBuildTimestamp.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-resources-plugin/src/main/java/org/apache/maven/plugins/resources/MavenBuildTimestamp.java?rev=1742471&view=auto
==============================================================================
--- maven/plugins/trunk/maven-resources-plugin/src/main/java/org/apache/maven/plugins/resources/MavenBuildTimestamp.java (added)
+++ maven/plugins/trunk/maven-resources-plugin/src/main/java/org/apache/maven/plugins/resources/MavenBuildTimestamp.java Thu May  5 20:49:13 2016
@@ -0,0 +1,79 @@
+package org.apache.maven.plugins.resources;
+
+/*
+ * 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.
+ */
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.Properties;
+import java.util.TimeZone;
+
+/**
+ * This class is duplicated from maven-model-builder from
+ * maven core. (See MRESOURCES-99).
+ *
+ */
+public class MavenBuildTimestamp
+{
+    // ISO 8601-compliant timestamp for machine readability
+    public static final String DEFAULT_BUILD_TIMESTAMP_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
+
+    public static final String BUILD_TIMESTAMP_FORMAT_PROPERTY = "maven.build.timestamp.format";
+
+    public static final TimeZone DEFAULT_BUILD_TIME_ZONE = TimeZone.getTimeZone( "Etc/UTC" );
+
+    private String formattedTimestamp;
+
+    public MavenBuildTimestamp()
+    {
+        this( new Date() );
+    }
+
+    public MavenBuildTimestamp( Date time )
+    {
+        this( time, DEFAULT_BUILD_TIMESTAMP_FORMAT );
+    }
+
+    public MavenBuildTimestamp( Date time, Properties properties )
+    {
+        this( time, properties != null ? properties.getProperty( BUILD_TIMESTAMP_FORMAT_PROPERTY ) : null );
+    }
+
+    public MavenBuildTimestamp( Date time, String timestampFormat )
+    {
+        if ( timestampFormat == null )
+        {
+            timestampFormat = DEFAULT_BUILD_TIMESTAMP_FORMAT;
+        }
+        if ( time == null )
+        {
+            time = new Date();
+        }
+        SimpleDateFormat dateFormat = new SimpleDateFormat( timestampFormat );
+        dateFormat.setCalendar( new GregorianCalendar() );
+        dateFormat.setTimeZone( DEFAULT_BUILD_TIME_ZONE );
+        formattedTimestamp = dateFormat.format( time );
+    }
+
+    public String formattedTimestamp()
+    {
+        return formattedTimestamp;
+    }
+}

Modified: maven/plugins/trunk/maven-resources-plugin/src/main/java/org/apache/maven/plugins/resources/ResourcesMojo.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-resources-plugin/src/main/java/org/apache/maven/plugins/resources/ResourcesMojo.java?rev=1742471&r1=1742470&r2=1742471&view=diff
==============================================================================
--- maven/plugins/trunk/maven-resources-plugin/src/main/java/org/apache/maven/plugins/resources/ResourcesMojo.java (original)
+++ maven/plugins/trunk/maven-resources-plugin/src/main/java/org/apache/maven/plugins/resources/ResourcesMojo.java Thu May  5 20:49:13 2016
@@ -25,6 +25,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Properties;
 
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.model.Resource;
@@ -323,6 +324,10 @@ public class ResourcesMojo
             mavenResourcesExecution.setFilterFilenames( fileNameFiltering );
             mavenResourcesExecution.setAddDefaultExcludes( addDefaultExcludes );
 
+            // Handle subject of MRESOURCES-99
+            Properties additionalProperties = addSeveralSpecialProperties();
+            mavenResourcesExecution.setAdditionalProperties( additionalProperties );
+
             // if these are NOT set, just use the defaults, which are '${*}' and '@'.
             mavenResourcesExecution.setDelimiters( delimiters, useDefaultDelimiters );
 
@@ -341,6 +346,33 @@ public class ResourcesMojo
     }
 
     /**
+     * This solves https://issues.apache.org/jira/browse/MRESOURCES-99.<br/>
+     * BUT:<br/>
+     * This should be done different than defining those properties a second time, cause they have already being defined
+     * in Maven Model Builder (package org.apache.maven.model.interpolation) via BuildTimestampValueSource. But those
+     * can't be found in the context which can be got from the maven core.<br/>
+     * A solution could be to put those values into the context by Maven core so they are accessible everywhere. (I'm
+     * not sure if this is a good idea). Better ideas are always welcome.
+     * 
+     * The problem at the moment is that maven core handles usage of properties and replacements in 
+     * the model, but does not the resource filtering which needed some of the properties.
+     * 
+     * @return the new instance with those properties.
+     */
+    private Properties addSeveralSpecialProperties()
+    {
+        String timeStamp = new MavenBuildTimestamp().formattedTimestamp();
+        Properties additionalProperties = new Properties();
+        additionalProperties.put( "maven.build.timestamp", timeStamp );
+        if ( project.getBasedir() != null )
+        {
+            additionalProperties.put( "project.baseUri", project.getBasedir().getAbsoluteFile().toURI().toString() );
+        }
+
+        return additionalProperties;
+    }
+
+    /**
      * @since 2.5
      */
     protected void executeUserFilterComponents( MavenResourcesExecution mavenResourcesExecution )