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
         {


Reply via email to