You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jd...@apache.org on 2008/03/03 18:33:31 UTC

svn commit: r633190 - in /maven/artifact/trunk/src: main/java/org/apache/maven/artifact/manager/ test/java/org/apache/maven/artifact/manager/ test/java/org/apache/maven/artifact/repository/metadata/

Author: jdcasey
Date: Mon Mar  3 09:33:29 2008
New Revision: 633190

URL: http://svn.apache.org/viewvc?rev=633190&view=rev
Log:
[MNG-3421] Applying another patch, to track artifacts separately instead of grouping by artifactId, and remove tracking files for artifacts that become available.

Submitted by: Igor Fedorenko

Modified:
    maven/artifact/trunk/src/main/java/org/apache/maven/artifact/manager/DefaultUpdateCheckManager.java
    maven/artifact/trunk/src/test/java/org/apache/maven/artifact/manager/DefaultUpdateCheckManagerTest.java
    maven/artifact/trunk/src/test/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManagerTest.java

Modified: maven/artifact/trunk/src/main/java/org/apache/maven/artifact/manager/DefaultUpdateCheckManager.java
URL: http://svn.apache.org/viewvc/maven/artifact/trunk/src/main/java/org/apache/maven/artifact/manager/DefaultUpdateCheckManager.java?rev=633190&r1=633189&r2=633190&view=diff
==============================================================================
--- maven/artifact/trunk/src/main/java/org/apache/maven/artifact/manager/DefaultUpdateCheckManager.java (original)
+++ maven/artifact/trunk/src/main/java/org/apache/maven/artifact/manager/DefaultUpdateCheckManager.java Mon Mar  3 09:33:29 2008
@@ -38,7 +38,7 @@
 
     public static final String LAST_UPDATE_TAG = ".lastUpdated";
 
-    public static final String TOUCHFILE_NAME = "resolver-status.properties";
+    private static final String TOUCHFILE_NAME = "resolver-status.properties";
 
     public boolean isUpdateRequired( Artifact artifact, ArtifactRepository repository )
     {
@@ -65,7 +65,8 @@
         }
         else
         {
-            lastCheckDate = getLastModifiedFromTouchfile( file, repository.getId() );
+            File touchfile = getTouchfile( artifact );
+            lastCheckDate = readLastUpdated( touchfile, repository.getId() );
         }
 
         return lastCheckDate == null || policy.checkOutOfDate( lastCheckDate );
@@ -86,35 +87,58 @@
             return true;
         }
 
-        Date lastCheckDate = getLastModifiedFromTouchfile( file, repository.getId() );
+        Date lastCheckDate = readLastUpdated( metadata, repository, file );
 
         return lastCheckDate == null || policy.checkOutOfDate( lastCheckDate );
     }
 
+    public Date readLastUpdated( RepositoryMetadata metadata, ArtifactRepository repository, File file )
+    {
+        File touchfile = getTouchfile( metadata, file );
+        
+        String key = getMetadataKey( repository, file );
+        
+        return readLastUpdated( touchfile, key );
+    }
+
     public void touch( Artifact artifact, ArtifactRepository repository )
     {
         File file = artifact.getFile();
 
-        touch( file, repository, false );
+        File touchfile = getTouchfile( artifact );
+        
+        if ( file.exists() )
+        {
+            touchfile.delete();
+        }
+        else
+        {
+            writeLastUpdated( touchfile, repository.getId() );
+        }
+
     }
 
     public void touch( RepositoryMetadata metadata, ArtifactRepository repository, File file )
     {
-        touch( file, repository, true );
+        File touchfile = getTouchfile( metadata, file );
+
+        String key = getMetadataKey( repository, file );
+
+        writeLastUpdated( touchfile, key );
     }
 
-    private void touch( File file, ArtifactRepository repository, boolean forceTouchFile )
+    public String getMetadataKey( ArtifactRepository repository, File file )
     {
-        String name = file.getName();
-
-        File touchfile = getTouchfile( file );
+        return repository.getId() + "." + file.getName() + LAST_UPDATE_TAG;
+    }
 
+    private void writeLastUpdated( File touchfile, String key )
+    {
         synchronized ( touchfile.getAbsolutePath().intern() )
         {
             if ( !touchfile.getParentFile().exists() && !touchfile.getParentFile().mkdirs() )
             {
-                getLogger().debug(
-                                   "Failed to create directory: " + touchfile.getParent() +
+                getLogger().debug( "Failed to create directory: " + touchfile.getParent() +
                                        " for tracking artifact metadata resolution." );
                 return;
             }
@@ -140,42 +164,25 @@
                     props.load( stream );
                 }
 
-                String key = getKey( name, repository.getId() );
+                props.setProperty( key, Long.toString( System.currentTimeMillis() ) );
 
-                boolean modified = false;
+                ByteArrayOutputStream stream = new ByteArrayOutputStream();
 
-                if ( !forceTouchFile && file.exists() )
-                {
-                    modified = props.remove( key ) != null;
-                }
-                else
-                {
-                    props.setProperty( key, Long.toString( System.currentTimeMillis() ) );
+                getLogger().debug( "Writing resolution-state to: " + touchfile );
+                props.store( stream, "Last modified on: " + new Date() );
 
-                    modified = true;
-                }
-
-                if ( modified )
-                {
-                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
+                byte[] data = stream.toByteArray();
+                ByteBuffer buffer = ByteBuffer.allocate( data.length );
+                buffer.put( data );
+                buffer.flip();
 
-                    getLogger().debug( "Writing resolution-state to: " + touchfile );
-                    props.store( stream, "Last modified on: " + new Date() );
-
-                    byte[] data = stream.toByteArray();
-                    ByteBuffer buffer = ByteBuffer.allocate( data.length );
-                    buffer.put( data );
-                    buffer.flip();
-
-                    channel.position( 0 );
-                    channel.write( buffer );
-                }
+                channel.position( 0 );
+                channel.write( buffer );
             }
             catch ( IOException e )
             {
-                getLogger().debug(
-                                   "Failed to record lastUpdated information for metadata resolution.\nMetadata type: " +
-                                       name, e );
+                getLogger().debug( "Failed to record lastUpdated information for metadata resolution.\nMetadata type: " +
+                                       touchfile.toString() + "; key: " + key, e );
             }
             finally
             {
@@ -187,8 +194,7 @@
                     }
                     catch ( IOException e )
                     {
-                        getLogger().debug(
-                                           "Error releasing exclusive lock for metadata resolution tracking file: " +
+                        getLogger().debug( "Error releasing exclusive lock for metadata resolution tracking file: " +
                                                touchfile, e );
                     }
                 }
@@ -201,8 +207,7 @@
                     }
                     catch ( IOException e )
                     {
-                        getLogger().debug(
-                                           "Error closing FileChannel for metadata resolution tracking file: " +
+                        getLogger().debug( "Error closing FileChannel for metadata resolution tracking file: " +
                                                touchfile, e );
                     }
                 }
@@ -210,26 +215,15 @@
         }
     }
 
-    private String getKey( String name, String repositoryId )
-    {
-        return repositoryId + "." + name + LAST_UPDATE_TAG;
-    }
-
-    public Date getLastModifiedFromTouchfile( File file, String repositoryId )
+    public Date readLastUpdated( File touchfile, String key )
     {
-        File touchfile = getTouchfile( file );
-
         if ( !touchfile.canRead() )
         {
             return null;
         }
 
-        String name = file.getName();
-
         synchronized ( touchfile.getAbsolutePath().intern() )
         {
-            String key = getKey( name, repositoryId );
-
             getLogger().debug( "Searching for: " + key + " in touchfile." );
 
             Date result = null;
@@ -239,35 +233,31 @@
             {
                 Properties props = new Properties();
 
-                if ( touchfile.exists() )
-                {
-                    stream = new FileInputStream( touchfile );
-                    FileChannel channel = stream.getChannel();
-                    lock = channel.lock( 0, channel.size(), true );
+                stream = new FileInputStream( touchfile );
+                FileChannel channel = stream.getChannel();
+                lock = channel.lock( 0, channel.size(), true );
 
-                    getLogger().debug( "Reading resolution-state from: " + touchfile );
-                    props.load( stream );
+                getLogger().debug( "Reading resolution-state from: " + touchfile );
+                props.load( stream );
 
-                    String rawVal = props.getProperty( key );
-                    if ( rawVal != null )
+                String rawVal = props.getProperty( key );
+                if ( rawVal != null )
+                {
+                    try
                     {
-                        try
-                        {
-                            result = new Date( Long.parseLong( rawVal ) );
-                        }
-                        catch ( NumberFormatException e )
-                        {
-                            getLogger().debug( "Cannot parse lastUpdated date: \'" + rawVal + "\'. Ignoring.", e );
-                            result = null;
-                        }
+                        result = new Date( Long.parseLong( rawVal ) );
+                    }
+                    catch ( NumberFormatException e )
+                    {
+                        getLogger().debug( "Cannot parse lastUpdated date: \'" + rawVal + "\'. Ignoring.", e );
+                        result = null;
                     }
                 }
             }
             catch ( IOException e )
             {
-                getLogger().debug(
-                                   "Failed to read lastUpdated information for metadata resolution.\nMetadata type: " +
-                                       name, e );
+                getLogger().debug( "Failed to read lastUpdated information.\nFile: " +
+                                       touchfile.toString() + "; key: " + key, e );
             }
             finally
             {
@@ -279,8 +269,7 @@
                     }
                     catch ( IOException e )
                     {
-                        getLogger().debug(
-                                           "Error releasing shared lock for metadata resolution tracking file: " +
+                        getLogger().debug( "Error releasing shared lock for metadata resolution tracking file: " +
                                                touchfile, e );
                     }
                 }
@@ -292,8 +281,23 @@
         }
     }
 
-    private File getTouchfile( File file )
+    public File getTouchfile( Artifact artifact )
+    {
+        StringBuffer sb = new StringBuffer();
+        sb.append( artifact.getArtifactId() );
+        sb.append( '-' ).append( artifact.getBaseVersion() );
+        if ( artifact.getClassifier() != null )
+        {
+            sb.append( '-' ).append( artifact.getClassifier() );
+        }
+        sb.append( '.' ).append( artifact.getType() ).append( LAST_UPDATE_TAG );
+        File touchfile = new File( artifact.getFile().getParentFile(), sb.toString() );
+        return touchfile;
+    }
+
+    public File getTouchfile( RepositoryMetadata metadata, File file )
     {
         return new File( file.getParent(), TOUCHFILE_NAME );
     }
+
 }

Modified: maven/artifact/trunk/src/test/java/org/apache/maven/artifact/manager/DefaultUpdateCheckManagerTest.java
URL: http://svn.apache.org/viewvc/maven/artifact/trunk/src/test/java/org/apache/maven/artifact/manager/DefaultUpdateCheckManagerTest.java?rev=633190&r1=633189&r2=633190&view=diff
==============================================================================
--- maven/artifact/trunk/src/test/java/org/apache/maven/artifact/manager/DefaultUpdateCheckManagerTest.java (original)
+++ maven/artifact/trunk/src/test/java/org/apache/maven/artifact/manager/DefaultUpdateCheckManagerTest.java Mon Mar  3 09:33:29 2008
@@ -4,6 +4,7 @@
 
 import org.apache.maven.artifact.AbstractArtifactComponentTestCase;
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
 import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
@@ -43,7 +44,7 @@
         file.delete();
         a.setFile( file );
 
-        File touchFile = new File ( file.getParent(), DefaultUpdateCheckManager.TOUCHFILE_NAME );
+        File touchFile = updateCheckManager.getTouchfile( a );
         touchFile.delete();
 
         assertTrue( updateCheckManager.isUpdateRequired( a, remoteRepository ) );
@@ -54,7 +55,9 @@
 
         assertFalse( updateCheckManager.isUpdateRequired( a, remoteRepository ) );
 
-        assertNull( updateCheckManager.getLastModifiedFromTouchfile( file, remoteRepository.getId() ) );
+        assertNull( updateCheckManager.readLastUpdated( touchFile, remoteRepository.getId() ) );
+        
+        assertFalse( updateCheckManager.getTouchfile( a ).exists() );
     }
 
     public void testMissingArtifact()
@@ -70,7 +73,7 @@
         file.delete();
         a.setFile( file );
 
-        File touchFile = new File ( file.getParent(), DefaultUpdateCheckManager.TOUCHFILE_NAME );
+        File touchFile = updateCheckManager.getTouchfile( a );
         touchFile.delete();
 
         assertTrue( updateCheckManager.isUpdateRequired( a, remoteRepository ) );
@@ -80,7 +83,7 @@
         assertFalse( updateCheckManager.isUpdateRequired( a, remoteRepository ) );
 
         assertFalse( file.exists() );
-        assertNotNull( updateCheckManager.getLastModifiedFromTouchfile( file, remoteRepository.getId() ) );
+        assertNotNull( updateCheckManager.readLastUpdated( touchFile, remoteRepository.getId() ) );
     }
 
     public void testMetadata() throws Exception
@@ -96,7 +99,7 @@
                               localRepository.pathOfLocalRepositoryMetadata( metadata, localRepository ) );
         file.delete();
 
-        File touchFile = new File ( file.getParent(), DefaultUpdateCheckManager.TOUCHFILE_NAME );
+        File touchFile = updateCheckManager.getTouchfile( metadata, file );
         touchFile.delete();
 
         assertTrue( updateCheckManager.isUpdateRequired( metadata, remoteRepository, file ) );
@@ -107,7 +110,7 @@
 
         assertFalse( updateCheckManager.isUpdateRequired( metadata, remoteRepository, file ) );
 
-        assertNotNull( updateCheckManager.getLastModifiedFromTouchfile( file, remoteRepository.getId() ) );
+        assertNotNull( updateCheckManager.readLastUpdated( touchFile, updateCheckManager.getMetadataKey( remoteRepository, file ) ) );
     }
 
     public void testMissingMetadata() throws Exception
@@ -123,7 +126,7 @@
                               localRepository.pathOfLocalRepositoryMetadata( metadata, localRepository ) );
         file.delete();
 
-        File touchFile = new File ( file.getParent(), DefaultUpdateCheckManager.TOUCHFILE_NAME );
+        File touchFile = updateCheckManager.getTouchfile( metadata, file );
         touchFile.delete();
 
         assertTrue( updateCheckManager.isUpdateRequired( metadata, remoteRepository, file ) );
@@ -132,7 +135,28 @@
 
         assertFalse( updateCheckManager.isUpdateRequired( metadata, remoteRepository, file ) );
 
-        assertNotNull( updateCheckManager.getLastModifiedFromTouchfile( file, remoteRepository.getId() ) );
+        assertNotNull( updateCheckManager.readLastUpdated( touchFile, updateCheckManager.getMetadataKey( remoteRepository, file ) ) );
+    }
+
+    public void testArtifactTouchFileName() throws Exception
+    {
+        ArtifactFactory artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.ROLE );
+
+        ArtifactRepository localRepository = localRepository();
+
+        Artifact a = artifactFactory.createArtifactWithClassifier( "groupdId", "a", "0.0.1-SNAPSHOT", "jar", null );
+        File file = new File( localRepository.getBasedir(), 
+                              localRepository.pathOf( a ) );
+        a.setFile( file );
+
+        assertEquals( "a-0.0.1-SNAPSHOT.jar.lastUpdated", updateCheckManager.getTouchfile( a ).getName() );
+
+        a = artifactFactory.createArtifactWithClassifier( "groupdId", "a", "0.0.1-SNAPSHOT", "jar", "classifier" );
+        file = new File( localRepository.getBasedir(), 
+                              localRepository.pathOf( a ) );
+        a.setFile( file );
+
+        assertEquals( "a-0.0.1-SNAPSHOT-classifier.jar.lastUpdated", updateCheckManager.getTouchfile( a ).getName() );
     }
 
 }

Modified: maven/artifact/trunk/src/test/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManagerTest.java
URL: http://svn.apache.org/viewvc/maven/artifact/trunk/src/test/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManagerTest.java?rev=633190&r1=633189&r2=633190&view=diff
==============================================================================
--- maven/artifact/trunk/src/test/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManagerTest.java (original)
+++ maven/artifact/trunk/src/test/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManagerTest.java Mon Mar  3 09:33:29 2008
@@ -138,7 +138,7 @@
 
         Date end = new Date();
 
-        Date checkDate = updateCheckManager.getLastModifiedFromTouchfile( new File( dir, path ), localRepo.getId() );
+        Date checkDate = updateCheckManager.readLastUpdated( metadata, localRepo, new File( dir, path ) );
 
         assertNotNull( checkDate );
         assertTrue( checkDate.after( start ) );
@@ -228,7 +228,7 @@
 
         Date end = new Date();
 
-        Date checkDate = updateCheckManager.getLastModifiedFromTouchfile( new File( dir, path ), localRepo.getId() );
+        Date checkDate = updateCheckManager.readLastUpdated( metadata, localRepo, new File( dir, path ) );
 
         assertNotNull( checkDate );
         assertTrue( checkDate.after( start ) );
@@ -315,7 +315,7 @@
 
         Date end = new Date();
 
-        Date checkDate = updateCheckManager.getLastModifiedFromTouchfile( new File( dir, path ), localRepo.getId() );
+        Date checkDate = updateCheckManager.readLastUpdated( metadata, localRepo, new File( dir, path ) );
 
         assertNotNull( checkDate );
         assertTrue( checkDate.after( start ) );
@@ -426,13 +426,13 @@
         RepositoryMetadataManager mgr = new DefaultRepositoryMetadataManager( wagonManager, updateCheckManager, logger );
         mgr.resolve( metadata, Collections.singletonList( remoteRepo ), localRepo );
 
-        Date checkDate = updateCheckManager.getLastModifiedFromTouchfile( new File( dir, path ), remoteRepo.getId() );
+        Date checkDate = updateCheckManager.readLastUpdated( metadata, remoteRepo, new File( dir, path ) );
 
         assertNotNull( checkDate );
 
         mgr.resolve( metadata, Collections.singletonList( remoteRepo ), localRepo );
 
-        checkDate = updateCheckManager.getLastModifiedFromTouchfile( new File( dir, path ), remoteRepo.getId() );
+        checkDate = updateCheckManager.readLastUpdated( metadata, remoteRepo, new File( dir, path ) );
 
         assertNotNull( checkDate );