Author: bentmann
Date: Fri Apr 9 13:35:20 2010
New Revision: 932406
URL: http://svn.apache.org/viewvc?rev=932406&view=rev
Log:
[MNG-1751] merging metadata doesn't fail when timestamp is in the future
Modified:
maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManager.java
Modified:
maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManager.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManager.java?rev=932406&r1=932405&r2=932406&view=diff
==============================================================================
---
maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManager.java
(original)
+++
maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManager.java
Fri Apr 9 13:35:20 2010
@@ -19,6 +19,7 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Reader;
+import java.io.Writer;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
@@ -32,6 +33,7 @@ import org.apache.maven.artifact.reposit
import org.apache.maven.artifact.repository.RepositoryCache;
import org.apache.maven.artifact.repository.RepositoryRequest;
import
org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
+import
org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Writer;
import org.apache.maven.repository.legacy.UpdateCheckManager;
import org.apache.maven.repository.legacy.WagonManager;
import org.apache.maven.wagon.ResourceDoesNotExistException;
@@ -41,6 +43,7 @@ import org.codehaus.plexus.component.ann
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.ReaderFactory;
+import org.codehaus.plexus.util.WriterFactory;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
/**
@@ -452,7 +455,7 @@ public class DefaultRepositoryMetadataMa
}
/** @todo share with DefaultPluginMappingManager. */
- protected static Metadata readMetadata( File mappingFile )
+ protected Metadata readMetadata( File mappingFile )
throws RepositoryMetadataReadException
{
Metadata result;
@@ -482,9 +485,68 @@ public class DefaultRepositoryMetadataMa
{
IOUtil.close( reader );
}
+
return result;
}
+ /**
+ * Ensures the last updated timestamp of the specified metadata does not
refer to the future and fixes the local metadata if necessary to allow
+ * proper merging/updating of metadata during deployment.
+ */
+ private void fixTimestamp( File metadataFile, Metadata metadata, Metadata
reference )
+ {
+ boolean changed = false;
+
+ if ( metadata != null && reference != null )
+ {
+ Versioning versioning = metadata.getVersioning();
+ Versioning versioningRef = reference.getVersioning();
+ if ( versioning != null && versioningRef != null )
+ {
+ String lastUpdated = versioning.getLastUpdated();
+ String now = versioningRef.getLastUpdated();
+ if ( lastUpdated != null && now != null && now.compareTo(
lastUpdated ) < 0 )
+ {
+ getLogger().warn(
+ "The last updated timestamp in " +
metadataFile + " refers to the future (now = "
+ + now + ", lastUpdated = " +
lastUpdated
+ + "). Please verify that the clocks
of all"
+ + " deploying machines are
reasonably synchronized." );
+ versioning.setLastUpdated( now );
+ changed = true;
+ }
+ }
+ }
+
+ if ( changed )
+ {
+ getLogger().debug( "Repairing metadata in " + metadataFile );
+
+ Writer writer = null;
+ try
+ {
+ writer = WriterFactory.newXmlWriter( metadataFile );
+ new MetadataXpp3Writer().write( writer, metadata );
+ }
+ catch ( IOException e )
+ {
+ String msg = "Could not write fixed metadata to " +
metadataFile + ": " + e.getMessage();
+ if ( getLogger().isDebugEnabled() )
+ {
+ getLogger().warn( msg, e );
+ }
+ else
+ {
+ getLogger().warn( msg );
+ }
+ }
+ finally
+ {
+ IOUtil.close( writer );
+ }
+ }
+ }
+
public void resolveAlways( RepositoryMetadata metadata, ArtifactRepository
localRepository, ArtifactRepository remoteRepository )
throws RepositoryMetadataResolutionException
{
@@ -556,6 +618,18 @@ public class DefaultRepositoryMetadataMa
{
throw new RepositoryMetadataDeploymentException( metadata + "
could not be retrieved from repository: " + deploymentRepository.getId() + "
due to an error: " + e.getMessage(), e );
}
+
+ if ( file.isFile() )
+ {
+ try
+ {
+ fixTimestamp( file, readMetadata( file ), (
(RepositoryMetadata) metadata ).getMetadata() );
+ }
+ catch ( RepositoryMetadataReadException e )
+ {
+ // will be reported via storeInlocalRepository
+ }
+ }
}
else
{