[MDEP-655] - The unpack integration test fails intermittent.
diff --git a/src/main/java/org/apache/maven/plugins/dependency/utils/filters/DestFileFilter.java b/src/main/java/org/apache/maven/plugins/dependency/utils/filters/DestFileFilter.java
index b19fb21..0801210 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/utils/filters/DestFileFilter.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/utils/filters/DestFileFilter.java
@@ -19,10 +19,6 @@
* under the License.
*/
-import java.io.File;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugins.dependency.fromConfiguration.ArtifactItem;
import org.apache.maven.plugins.dependency.utils.DependencyUtil;
@@ -30,6 +26,12 @@
import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException;
import org.codehaus.plexus.util.StringUtils;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
/**
* @author <a href="mailto:brianf@apache.org">Brian Fox</a>
*/
@@ -266,7 +268,7 @@
}
@Override
- public boolean isArtifactIncluded( ArtifactItem item )
+ public boolean isArtifactIncluded( ArtifactItem item ) throws ArtifactFilterException
{
Artifact artifact = item.getArtifact();
@@ -294,7 +296,28 @@
destFile = new File( destFolder, item.getDestFileName() );
}
- return overWrite || !destFile.exists()
- || ( overWriteIfNewer && artifact.getFile().lastModified() > destFile.lastModified() );
+ return overWrite || !destFile.exists() || ( overWriteIfNewer && getLastModified(
+ artifact.getFile() ) > getLastModified( destFile ) );
+ }
+
+ /**
+ * Using simply {@code File.getLastModified} will return sometimes a wrong value see JDK bug for details.
+ *
+ * https://bugs.openjdk.java.net/browse/JDK-8177809
+ *
+ * @param file {@link File}
+ * @return the last modification time in milliseconds.
+ * @throws ArtifactFilterException in case of a IO Exception.
+ */
+ private long getLastModified( File file ) throws ArtifactFilterException
+ {
+ try
+ {
+ return Files.getLastModifiedTime( file.toPath() ).toMillis();
+ }
+ catch ( IOException e )
+ {
+ throw new ArtifactFilterException( "IO Exception", e );
+ }
}
}
diff --git a/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestUnpackMojo.java b/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestUnpackMojo.java
index 5a27484..c9ba0eb 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestUnpackMojo.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestUnpackMojo.java
@@ -19,13 +19,6 @@
* under the License.
*/
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.versioning.VersionRange;
@@ -39,6 +32,14 @@
import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager;
import org.sonatype.aether.util.DefaultRepositorySystemSession;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
public class TestUnpackMojo
extends AbstractDependencyMojoTestCase
{
@@ -527,6 +528,12 @@
assertUnpacked( item, true );
}
+ /**
+ * The following code has been modified to prevent the
+ * JDK bug which is described in detail
+ * https://bugs.openjdk.java.net/browse/JDK-8177809
+ *
+ */
public void testUnpackOverWriteIfNewer()
throws Exception
{
@@ -567,16 +574,25 @@
displayFile( "unpackedFile", unpackedFile );
displayFile( "artifact ", artifact.getFile() );
displayFile( "marker ", marker );
+
+ long markerLastModifiedMillis = Files.getLastModifiedTime( marker.toPath() ).toMillis();
+ long unpackedFileLastModifiedMillis = Files.getLastModifiedTime( unpackedFile.toPath() ).toMillis();
+
System.out.println( "marker.lastModified() = " + marker.lastModified() );
System.out.println( "unpackedFile.lastModified() = " + unpackedFile.lastModified() );
- assertTrue( "unpackedFile '" + unpackedFile + "' lastModified() == " + marker.lastModified()
- + ": should be different", marker.lastModified() != unpackedFile.lastModified() );
+ System.out.println( "markerLastModifiedMillis = " + markerLastModifiedMillis );
+ System.out.println( "unpackedFileLastModifiedMillis = " + unpackedFileLastModifiedMillis );
+
+ assertTrue( "unpackedFile '" + unpackedFile + "' lastModified() == " + markerLastModifiedMillis
+ + ": should be different", markerLastModifiedMillis != unpackedFileLastModifiedMillis );
}
- private void displayFile( String description, File file )
+ private void displayFile( String description, File file ) throws IOException
{
- System.out.println( description + ' ' + DateFormatUtils.ISO_DATETIME_FORMAT.format( file.lastModified() ) + ' '
- + file.getPath().substring( getBasedir().length() ) );
+ long toMillis = Files.getLastModifiedTime( file.toPath() ).toMillis();
+ System.out.println( description + ' ' + DateFormatUtils.ISO_DATETIME_FORMAT.format(
+ file.lastModified() ) + ' ' + toMillis + ' ' + file.getPath().substring(
+ getBasedir().length() ) );
}
public void assertUnpacked( ArtifactItem item, boolean overWrite )