]> source.dussan.org Git - archiva.git/commitdiff
[MRM-1353] Build number is always 1 for SNAPSHOT artifacts uploaded via web upload...
authorMaria Odea B. Ching <oching@apache.org>
Sat, 3 Apr 2010 15:01:22 +0000 (15:01 +0000)
committerMaria Odea B. Ching <oching@apache.org>
Sat, 3 Apr 2010 15:01:22 +0000 (15:01 +0000)
o get latest build number from version-level metadata when deploying artifacts from webapp
o for snapshot artifacts deployed, generate or update the version-level metadata
o added unit test for this scenario
o refactored some parts of the tests for upload artifact

git-svn-id: https://svn.apache.org/repos/asf/archiva/branches/archiva-1.3.x@930528 13f79535-47bb-0310-9956-ffa450edef68

archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/UploadAction.java
archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/UploadActionTest.java

index 57f71d6126d8395048c5202793ed14dcc07f19bf..fcf3d54feb32494ac40809a9baaa7504d28e8000 100644 (file)
@@ -76,6 +76,7 @@ import com.opensymphony.xwork2.Validateable;
  *
  * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="uploadAction" instantiation-strategy="per-lookup"
  */
+@SuppressWarnings( "serial" )
 public class UploadAction
     extends PlexusActionSupport
     implements Validateable, Preparable, Auditable
@@ -307,17 +308,15 @@ public class UploadAction
             ManagedRepositoryContent repository = repositoryFactory.getManagedRepositoryContent( repositoryId );
 
             String artifactPath = repository.toPath( artifactReference );
-
             int lastIndex = artifactPath.lastIndexOf( '/' );
-
             File targetPath = new File( repoConfig.getLocation(), artifactPath.substring( 0, lastIndex ) );
-
+            
             Date lastUpdatedTimestamp = Calendar.getInstance().getTime();
             int newBuildNumber = -1;
             String timestamp = null;
 
-            File metadataFile = getMetadata( targetPath.getAbsolutePath() );
-            ArchivaRepositoryMetadata metadata = getMetadata( metadataFile );
+            File versionMetadataFile = getMetadata( targetPath.getAbsolutePath() );
+            ArchivaRepositoryMetadata versionMetadata = getMetadata( versionMetadataFile );
 
             if ( VersionUtil.isSnapshot( version ) )
             {
@@ -325,13 +324,13 @@ public class UploadAction
                 DateFormat fmt = new SimpleDateFormat( "yyyyMMdd.HHmmss" );
                 fmt.setTimeZone( timezone );
                 timestamp = fmt.format( lastUpdatedTimestamp );
-                if ( metadata.getSnapshotVersion() != null )
+
+                if ( versionMetadata.getSnapshotVersion() != null )
                 {
-                    newBuildNumber = metadata.getSnapshotVersion().getBuildNumber() + 1;
+                    newBuildNumber = versionMetadata.getSnapshotVersion().getBuildNumber() + 1;
                 }
                 else
                 {
-                    metadata.setSnapshotVersion( new SnapshotVersion() );
                     newBuildNumber = 1;
                 }
             }
@@ -346,7 +345,7 @@ public class UploadAction
             {
                 filename = filename.replaceAll( "SNAPSHOT", timestamp + "-" + newBuildNumber );
             }
-
+            
             boolean fixChecksums = !( config.getRepositoryScanning().getKnownContentConsumers().contains( "create-missing-checksums" ) );
             
             try
@@ -411,13 +410,19 @@ public class UploadAction
                     addActionError( "Error encountered while uploading pom file: " + ie.getMessage() );
                     return ERROR;
                 }
-
             }
 
             // explicitly update only if metadata-updater consumer is not enabled!
-            if( !config.getRepositoryScanning().getKnownContentConsumers().contains( "metadata-updater" ) )
+            if ( !config.getRepositoryScanning().getKnownContentConsumers().contains( "metadata-updater" ) )
             {
-                updateMetadata( metadata, metadataFile, lastUpdatedTimestamp, timestamp, newBuildNumber, fixChecksums );
+                updateProjectMetadata( targetPath.getAbsolutePath(), lastUpdatedTimestamp, timestamp, newBuildNumber,
+                                       fixChecksums );
+
+                if ( VersionUtil.isSnapshot( version ) )
+                {
+                    updateVersionMetadata( versionMetadata, versionMetadataFile, lastUpdatedTimestamp, timestamp,
+                                           newBuildNumber, fixChecksums );
+                }
             }
 
             String msg = "Artifact \'" + groupId + ":" + artifactId + ":" + version +
@@ -492,9 +497,7 @@ public class UploadAction
 
     private File getMetadata( String targetPath )
     {
-        String artifactPath = targetPath.substring( 0, targetPath.lastIndexOf( File.separatorChar ) );
-
-        return new File( artifactPath, MetadataTools.MAVEN_METADATA );
+        return new File( targetPath, MetadataTools.MAVEN_METADATA );
     }
 
     private ArchivaRepositoryMetadata getMetadata( File metadataFile )
@@ -507,21 +510,57 @@ public class UploadAction
         }
         return metadata;
     }
+    
+    /**
+     * Update version level metadata for snapshot artifacts. If it does not exist, create the metadata and fix checksums
+     * if necessary.
+     */
+    private void updateVersionMetadata( ArchivaRepositoryMetadata metadata, File metadataFile,
+                                        Date lastUpdatedTimestamp, String timestamp, int buildNumber,
+                                        boolean fixChecksums )
+        throws RepositoryMetadataException
+    {
+        if ( !metadataFile.exists() )
+        {
+            metadata.setGroupId( groupId );
+            metadata.setArtifactId( artifactId );
+            metadata.setVersion( version );
+        }
+
+        if ( metadata.getSnapshotVersion() == null )
+        {
+            metadata.setSnapshotVersion( new SnapshotVersion() );
+        }
+
+        metadata.getSnapshotVersion().setBuildNumber( buildNumber );
+        metadata.getSnapshotVersion().setTimestamp( timestamp );
+        metadata.setLastUpdatedTimestamp( lastUpdatedTimestamp );
+
+        RepositoryMetadataWriter.write( metadata, metadataFile );
+
+        if ( fixChecksums )
+        {
+            fixChecksums( metadataFile );
+        }
+    }
 
     /**
-     * Update artifact level metadata. If it does not exist, create the metadata and 
-     * fix checksums if necessary.
+     * Update artifact level metadata. If it does not exist, create the metadata and fix checksums if necessary.
      */
-    private void updateMetadata( ArchivaRepositoryMetadata metadata, File metadataFile, Date lastUpdatedTimestamp,
-                                 String timestamp, int buildNumber, boolean fixChecksums )
+    private void updateProjectMetadata( String targetPath, Date lastUpdatedTimestamp, String timestamp,
+                                        int buildNumber, boolean fixChecksums )
         throws RepositoryMetadataException
     {
         List<String> availableVersions = new ArrayList<String>();
         String latestVersion = version;
 
-        if ( metadataFile.exists() )
+        String projectPath = targetPath.substring( 0, targetPath.lastIndexOf( File.separatorChar ) );
+        File projectMetadataFile = getMetadata( projectPath );
+        ArchivaRepositoryMetadata projectMetadata = getMetadata( projectMetadataFile );
+
+        if ( projectMetadataFile.exists() )
         {
-            availableVersions = metadata.getAvailableVersions();
+            availableVersions = projectMetadata.getAvailableVersions();
 
             Collections.sort( availableVersions, VersionComparator.getInstance() );
 
@@ -536,39 +575,34 @@ public class UploadAction
         {
             availableVersions.add( version );
 
-            metadata.setGroupId( groupId );
-            metadata.setArtifactId( artifactId );
+            projectMetadata.setGroupId( groupId );
+            projectMetadata.setArtifactId( artifactId );
         }
 
-        if ( metadata.getGroupId() == null )
+        if ( projectMetadata.getGroupId() == null )
         {
-            metadata.setGroupId( groupId );
+            projectMetadata.setGroupId( groupId );
         }
-        if ( metadata.getArtifactId() == null )
+        
+        if ( projectMetadata.getArtifactId() == null )
         {
-            metadata.setArtifactId( artifactId );
+            projectMetadata.setArtifactId( artifactId );
         }
 
-        metadata.setLatestVersion( latestVersion );
-        metadata.setLastUpdatedTimestamp( lastUpdatedTimestamp );
-        metadata.setAvailableVersions( availableVersions );
+        projectMetadata.setLatestVersion( latestVersion );
+        projectMetadata.setLastUpdatedTimestamp( lastUpdatedTimestamp );
+        projectMetadata.setAvailableVersions( availableVersions );
 
         if ( !VersionUtil.isSnapshot( version ) )
         {
-            metadata.setReleasedVersion( latestVersion );
+            projectMetadata.setReleasedVersion( latestVersion );
         }
-        else
-        {
-            metadata.getSnapshotVersion().setBuildNumber( buildNumber );
 
-            metadata.getSnapshotVersion().setTimestamp( timestamp );
-        }
+        RepositoryMetadataWriter.write( projectMetadata, projectMetadataFile );
 
-        RepositoryMetadataWriter.write( metadata, metadataFile );
-        
-        if( fixChecksums )
+        if ( fixChecksums )
         {
-            fixChecksums( metadataFile );
+            fixChecksums( projectMetadataFile );
         }
     }
 
index 4ffa8e1b7b6c240de19f4c556c994b871d3c050e..52683e87a6e112aa522347213248c8f3c79ef287 100644 (file)
@@ -33,11 +33,14 @@ import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
 import org.apache.maven.archiva.configuration.RepositoryScanningConfiguration;
 import org.apache.maven.archiva.database.ArchivaAuditLogsDao;
 import org.apache.maven.archiva.model.ArchivaAuditLogs;
+import org.apache.maven.archiva.model.ArchivaRepositoryMetadata;
+import org.apache.maven.archiva.model.SnapshotVersion;
 import org.apache.maven.archiva.repository.ManagedRepositoryContent;
 import org.apache.maven.archiva.repository.RepositoryContentFactory;
 import org.apache.maven.archiva.repository.RepositoryNotFoundException;
 import org.apache.maven.archiva.repository.content.ManagedDefaultRepositoryContent;
 import org.apache.maven.archiva.repository.metadata.MetadataTools;
+import org.apache.maven.archiva.repository.metadata.RepositoryMetadataReader;
 import org.apache.maven.archiva.scheduled.ArchivaTaskScheduler;
 import org.codehaus.plexus.spring.PlexusInSpringTestCase;
 import org.easymock.MockControl;
@@ -64,14 +67,14 @@ public class UploadActionTest
     private RepositoryContentFactory repoFactory;
 
     private MockControl repoFactoryControl;
-    
+
     private ArchivaAuditLogsDao auditLogsDao;
 
     private MockControl auditLogsDaoControl;
 
     private static final String REPOSITORY_ID = "test-repo";
 
-    private Configuration config;    
+    private Configuration config;
 
     public void setUp()
         throws Exception
@@ -86,7 +89,7 @@ public class UploadActionTest
 
         repoFactoryControl = MockClassControl.createControl( RepositoryContentFactory.class );
         repoFactory = (RepositoryContentFactory) repoFactoryControl.getMock();
-        
+
         auditLogsDaoControl = MockControl.createControl( ArchivaAuditLogsDao.class );
         auditLogsDaoControl.setDefaultMatcher( MockControl.ALWAYS_MATCHER );
         auditLogsDao = (ArchivaAuditLogsDao) auditLogsDaoControl.getMock();
@@ -99,9 +102,9 @@ public class UploadActionTest
 
         File testRepo = new File( getBasedir(), "target/test-classes/test-repo" );
         testRepo.mkdirs();
-        
+
         assertTrue( testRepo.exists() );
-        
+
         config = new Configuration();
         ManagedRepositoryConfiguration repoConfig = new ManagedRepositoryConfiguration();
         repoConfig.setId( REPOSITORY_ID );
@@ -110,7 +113,7 @@ public class UploadActionTest
         repoConfig.setName( REPOSITORY_ID );
         repoConfig.setBlockRedeployments( true );
         config.addManagedRepository( repoConfig );
-        
+
         RepositoryScanningConfiguration repoScanning = new RepositoryScanningConfiguration();
         repoScanning.setKnownContentConsumers( new ArrayList<String>() );
         config.setRepositoryScanning( repoScanning );
@@ -142,78 +145,131 @@ public class UploadActionTest
         uploadAction.setGeneratePom( generatePom );
     }
 
-    private void assertAllArtifactsIncludingSupportArtifactsArePresent( String repoLocation )
+    private void assertAllArtifactsIncludingSupportArtifactsArePresent( String repoLocation, String artifact,
+                                                                        String version )
     {
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0/artifact-upload-1.0.jar" ).exists() );
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0/artifact-upload-1.0.jar.sha1" ).exists() );
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0/artifact-upload-1.0.jar.md5" ).exists() );
-
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0/artifact-upload-1.0.pom" ).exists() );
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0/artifact-upload-1.0.pom.sha1" ).exists() );
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0/artifact-upload-1.0.pom.md5" ).exists() );
+        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + version + "/" + artifact + ".jar" ).exists() );
+        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + version + "/" + artifact
+            + ".jar.sha1" ).exists() );
+        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + version + "/" + artifact
+            + ".jar.md5" ).exists() );
+
+        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + version + "/" + artifact + ".pom" ).exists() );
+        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + version + "/" + artifact
+            + ".pom.sha1" ).exists() );
+        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + version + "/" + artifact
+            + ".pom.md5" ).exists() );
 
         assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + MetadataTools.MAVEN_METADATA ).exists() );
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + MetadataTools.MAVEN_METADATA +
-            ".sha1" ).exists() );
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + MetadataTools.MAVEN_METADATA +
-            ".md5" ).exists() );
+        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + MetadataTools.MAVEN_METADATA
+            ".sha1" ).exists() );
+        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + MetadataTools.MAVEN_METADATA
+            ".md5" ).exists() );
     }
 
-    private void verifyChecksums( String repoLocation )
+    private void verifyVersionMetadataChecksums( String repoLocation, String version )
         throws IOException
     {
-        // verify checksums of jar file
         ChecksummedFile checksum =
-            new ChecksummedFile( new File( repoLocation,
-                                           "/org/apache/archiva/artifact-upload/1.0/artifact-upload-1.0.jar" ) );
+            new ChecksummedFile( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + version + "/"
+                + MetadataTools.MAVEN_METADATA ) );
         String sha1 = checksum.calculateChecksum( ChecksumAlgorithm.SHA1 );
         String md5 = checksum.calculateChecksum( ChecksumAlgorithm.MD5 );
 
         String contents =
-            FileUtils.readFileToString( new File( repoLocation,
-                                                  "/org/apache/archiva/artifact-upload/1.0/artifact-upload-1.0.jar.sha1" ) );
+            FileUtils.readFileToString( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + version + "/"
+                + MetadataTools.MAVEN_METADATA + ".sha1" ) );
         assertTrue( StringUtils.contains( contents, sha1 ) );
 
         contents =
-            FileUtils.readFileToString( new File( repoLocation,
-                                                  "/org/apache/archiva/artifact-upload/1.0/artifact-upload-1.0.jar.md5" ) );
+            FileUtils.readFileToString( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + version + "/"
+                + MetadataTools.MAVEN_METADATA + ".md5" ) );
         assertTrue( StringUtils.contains( contents, md5 ) );
+    }
 
-        // verify checksums of pom file
-        checksum =
-            new ChecksummedFile( new File( repoLocation,
-                                           "/org/apache/archiva/artifact-upload/1.0/artifact-upload-1.0.pom" ) );
-        sha1 = checksum.calculateChecksum( ChecksumAlgorithm.SHA1 );
-        md5 = checksum.calculateChecksum( ChecksumAlgorithm.MD5 );
+    private void verifyProjectMetadataChecksums( String repoLocation )
+        throws IOException
+    {
+        ChecksummedFile checksum =
+            new ChecksummedFile( new File( repoLocation, "/org/apache/archiva/artifact-upload/"
+                + MetadataTools.MAVEN_METADATA ) );
+        String sha1 = checksum.calculateChecksum( ChecksumAlgorithm.SHA1 );
+        String md5 = checksum.calculateChecksum( ChecksumAlgorithm.MD5 );
 
-        contents =
-            FileUtils.readFileToString( new File( repoLocation,
-                                                  "/org/apache/archiva/artifact-upload/1.0/artifact-upload-1.0.pom.sha1" ) );
+        String contents =
+            FileUtils.readFileToString( new File( repoLocation, "/org/apache/archiva/artifact-upload/"
+                + MetadataTools.MAVEN_METADATA + ".sha1" ) );
         assertTrue( StringUtils.contains( contents, sha1 ) );
 
         contents =
-            FileUtils.readFileToString( new File( repoLocation,
-                                                  "/org/apache/archiva/artifact-upload/1.0/artifact-upload-1.0.pom.md5" ) );
+            FileUtils.readFileToString( new File( repoLocation, "/org/apache/archiva/artifact-upload/"
+                + MetadataTools.MAVEN_METADATA + ".md5" ) );
         assertTrue( StringUtils.contains( contents, md5 ) );
+    }
 
-        // verify checksums of metadata file
+    private void verifyPomChecksums( String repoLocation, String artifact, String version )
+        throws IOException
+    {
+        ChecksummedFile checksum;
+        String sha1;
+        String md5;
+        String contents;
         checksum =
-            new ChecksummedFile( new File( repoLocation, "/org/apache/archiva/artifact-upload/" +
-                MetadataTools.MAVEN_METADATA ) );
+            new ChecksummedFile( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + version + "/"
+                + artifact + ".pom" ) );
         sha1 = checksum.calculateChecksum( ChecksumAlgorithm.SHA1 );
         md5 = checksum.calculateChecksum( ChecksumAlgorithm.MD5 );
 
         contents =
-            FileUtils.readFileToString( new File( repoLocation, "/org/apache/archiva/artifact-upload/" +
-                MetadataTools.MAVEN_METADATA + ".sha1" ) );
+            FileUtils.readFileToString( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + version + "/"
+                + artifact + ".pom.sha1" ) );
+        assertTrue( StringUtils.contains( contents, sha1 ) );
+
+        contents =
+            FileUtils.readFileToString( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + version + "/"
+                + artifact + ".pom.md5" ) );
+        assertTrue( StringUtils.contains( contents, md5 ) );
+    }
+
+    private void verifyArtifactChecksums( String repoLocation, String artifact, String version )
+        throws IOException
+    {
+        ChecksummedFile checksum =
+            new ChecksummedFile( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + version + "/"
+                + artifact + ".jar" ) );
+        String sha1 = checksum.calculateChecksum( ChecksumAlgorithm.SHA1 );
+        String md5 = checksum.calculateChecksum( ChecksumAlgorithm.MD5 );
+
+        String contents =
+            FileUtils.readFileToString( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + version + "/"
+                + artifact + ".jar.sha1" ) );
         assertTrue( StringUtils.contains( contents, sha1 ) );
 
         contents =
-            FileUtils.readFileToString( new File( repoLocation, "/org/apache/archiva/artifact-upload/" +
-                MetadataTools.MAVEN_METADATA + ".md5" ) );
+            FileUtils.readFileToString( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + version + "/"
+                + artifact + ".jar.md5" ) );
         assertTrue( StringUtils.contains( contents, md5 ) );
     }
 
+    private String getTimestamp( String[] artifactsList, int startIndex, int index )
+    {
+        int endIndex = -1;
+        String timestamp;
+
+        if ( artifactsList[index].contains( "jar" ) )
+        {
+            endIndex = artifactsList[index].indexOf( ".jar" );
+        }
+        else
+        {
+            endIndex = artifactsList[index].indexOf( ".pom" );
+        }
+
+        timestamp = artifactsList[index].substring( startIndex, endIndex );
+
+        return timestamp;
+    }
+
     public void testArtifactUploadWithPomSuccessful()
         throws Exception
     {
@@ -239,11 +295,13 @@ public class UploadActionTest
         archivaConfigControl.verify();
         repoFactoryControl.verify();
         auditLogsDaoControl.verify();
-        
+
         String repoLocation = config.findManagedRepositoryById( REPOSITORY_ID ).getLocation();
-        assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation );
+        assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation, "artifact-upload-1.0", "1.0" );
 
-        verifyChecksums( repoLocation );
+        verifyArtifactChecksums( repoLocation, "artifact-upload-1.0", "1.0" );
+        verifyPomChecksums( repoLocation, "artifact-upload-1.0", "1.0" );
+        verifyProjectMetadataChecksums( repoLocation );
     }
 
     public void testArtifactUploadWithClassifier()
@@ -264,7 +322,7 @@ public class UploadActionTest
         archivaConfigControl.replay();
         repoFactoryControl.replay();
         auditLogsDaoControl.replay();
-        
+
         String returnString = uploadAction.doUpload();
         assertEquals( Action.SUCCESS, returnString );
 
@@ -283,44 +341,13 @@ public class UploadActionTest
         assertFalse( new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0/artifact-upload-1.0.pom.md5" ).exists() );
 
         assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + MetadataTools.MAVEN_METADATA ).exists() );
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + MetadataTools.MAVEN_METADATA +
-            ".sha1" ).exists() );
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + MetadataTools.MAVEN_METADATA +
-            ".md5" ).exists() );
-
-        // verify checksums of jar file
-        ChecksummedFile checksum =
-            new ChecksummedFile( new File( repoLocation,
-                                           "/org/apache/archiva/artifact-upload/1.0/artifact-upload-1.0-tests.jar" ) );
-        String sha1 = checksum.calculateChecksum( ChecksumAlgorithm.SHA1 );
-        String md5 = checksum.calculateChecksum( ChecksumAlgorithm.MD5 );
+        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + MetadataTools.MAVEN_METADATA
+            + ".sha1" ).exists() );
+        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + MetadataTools.MAVEN_METADATA
+            + ".md5" ).exists() );
 
-        String contents =
-            FileUtils.readFileToString( new File( repoLocation,
-                                                  "/org/apache/archiva/artifact-upload/1.0/artifact-upload-1.0-tests.jar.sha1" ) );
-        assertTrue( StringUtils.contains( contents, sha1 ) );
-
-        contents =
-            FileUtils.readFileToString( new File( repoLocation,
-                                                  "/org/apache/archiva/artifact-upload/1.0/artifact-upload-1.0-tests.jar.md5" ) );
-        assertTrue( StringUtils.contains( contents, md5 ) );
-
-        // verify checksums of metadata file
-        checksum =
-            new ChecksummedFile( new File( repoLocation, "/org/apache/archiva/artifact-upload/" +
-                MetadataTools.MAVEN_METADATA ) );
-        sha1 = checksum.calculateChecksum( ChecksumAlgorithm.SHA1 );
-        md5 = checksum.calculateChecksum( ChecksumAlgorithm.MD5 );
-
-        contents =
-            FileUtils.readFileToString( new File( repoLocation, "/org/apache/archiva/artifact-upload/" +
-                MetadataTools.MAVEN_METADATA + ".sha1" ) );
-        assertTrue( StringUtils.contains( contents, sha1 ) );
-
-        contents =
-            FileUtils.readFileToString( new File( repoLocation, "/org/apache/archiva/artifact-upload/" +
-                MetadataTools.MAVEN_METADATA + ".md5" ) );
-        assertTrue( StringUtils.contains( contents, md5 ) );
+        verifyArtifactChecksums( repoLocation, "artifact-upload-1.0-tests", "1.0" );
+        verifyProjectMetadataChecksums( repoLocation );
     }
 
     public void testArtifactUploadGeneratePomSuccessful()
@@ -350,14 +377,16 @@ public class UploadActionTest
         auditLogsDaoControl.verify();
 
         String repoLocation = config.findManagedRepositoryById( REPOSITORY_ID ).getLocation();
-        assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation );
+        assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation, "artifact-upload-1.0", "1.0" );
 
-        verifyChecksums( repoLocation );
+        verifyArtifactChecksums( repoLocation, "artifact-upload-1.0", "1.0" );
+        verifyPomChecksums( repoLocation, "artifact-upload-1.0", "1.0" );
+        verifyProjectMetadataChecksums( repoLocation );
     }
 
     public void testArtifactUploadFailedRepositoryNotFound()
         throws Exception
-    {        
+    {
         setUploadParameters( "1.0", null,
                              new File( getBasedir(),
                                        "target/test-classes/upload-artifact-test/artifact-to-be-uploaded.jar" ), null,
@@ -398,11 +427,11 @@ public class UploadActionTest
         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
         repoFactoryControl.expectAndReturn( repoFactory.getManagedRepositoryContent( REPOSITORY_ID ), content );
         auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null );
-        
+
         archivaConfigControl.replay();
         repoFactoryControl.replay();
         auditLogsDaoControl.replay();
-       
+
         String returnString = uploadAction.doUpload();
         assertEquals( Action.SUCCESS, returnString );
 
@@ -413,86 +442,92 @@ public class UploadActionTest
         String repoLocation = config.findManagedRepositoryById( REPOSITORY_ID ).getLocation();
         String[] artifactsList = new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/" ).list();
 
-        assertEquals( 6, artifactsList.length );
-
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + MetadataTools.MAVEN_METADATA ).exists() );
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + MetadataTools.MAVEN_METADATA +
-            ".sha1" ).exists() );
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/" + MetadataTools.MAVEN_METADATA +
-            ".md5" ).exists() );
+        assertEquals( 9, artifactsList.length );
+        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/"
+            + MetadataTools.MAVEN_METADATA ).exists() );
+        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/"
+            + MetadataTools.MAVEN_METADATA + ".sha1" ).exists() );
+        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/"
+            + MetadataTools.MAVEN_METADATA + ".md5" ).exists() );
 
         int startIndex = "artifact-upload-1.0-".length();
-        int endIndex = -1; 
+        String timestamp = getTimestamp( artifactsList, startIndex, 0 );
 
-        if ( artifactsList[0].contains( "jar" ) )
-        {
-            endIndex = artifactsList[0].indexOf( ".jar" );
-        }
-        else
-        {
-            endIndex = artifactsList[0].indexOf( ".pom" );
-        }
+        assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation, "artifact-upload-1.0-" + timestamp,
+                                                               "1.0-SNAPSHOT" );
+        verifyArtifactChecksums( repoLocation, "artifact-upload-1.0-" + timestamp, "1.0-SNAPSHOT" );
+        verifyPomChecksums( repoLocation, "artifact-upload-1.0-" + timestamp, "1.0-SNAPSHOT" );
+        verifyProjectMetadataChecksums( repoLocation );
+        verifyVersionMetadataChecksums( repoLocation, "1.0-SNAPSHOT" );
 
-        String timestamp = artifactsList[0].substring( startIndex, endIndex );
+        // verify build number
+        File metadataFile =
+            new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/" + MetadataTools.MAVEN_METADATA );
+        ArchivaRepositoryMetadata artifactMetadata = RepositoryMetadataReader.read( metadataFile );
 
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/artifact-upload-1.0-" + timestamp + ".jar" ).exists()  );
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/artifact-upload-1.0-" + timestamp + ".jar.md5" ).exists()  );
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/artifact-upload-1.0-" + timestamp + ".jar.sha1" ).exists()  );
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/artifact-upload-1.0-" + timestamp + ".pom" ).exists()  );
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/artifact-upload-1.0-" + timestamp + ".pom.md5" ).exists()  );
-        assertTrue( new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/artifact-upload-1.0-" + timestamp + ".pom.sha1" ).exists()  );
+        SnapshotVersion snapshotVersion = artifactMetadata.getSnapshotVersion();
+        assertEquals( "Incorrect build number set in artifact metadata.", 1, snapshotVersion.getBuildNumber() );
 
-        // verify checksums of jar file
-        ChecksummedFile checksum =
-            new ChecksummedFile( new File( repoLocation,
-                                           "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/artifact-upload-1.0-" + timestamp + ".jar" ) );
-        String sha1 = checksum.calculateChecksum( ChecksumAlgorithm.SHA1 );
-        String md5 = checksum.calculateChecksum( ChecksumAlgorithm.MD5 );
+        String timestampPart = StringUtils.substringBeforeLast( timestamp, "-" );
+        assertEquals( "Incorrect timestamp set in artifact metadata.", timestampPart, snapshotVersion.getTimestamp() );
 
-        String contents =
-            FileUtils.readFileToString( new File( repoLocation,
-                                                  "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/artifact-upload-1.0-" + timestamp + ".jar.sha1" ) );
-        assertTrue( StringUtils.contains( contents, sha1 ) );
+        String buildnumber = StringUtils.substringAfterLast( timestamp, "-" );
+        assertEquals( "Incorrect build number in filename.", "1", buildnumber );
 
-        contents =
-            FileUtils.readFileToString( new File( repoLocation,
-                                                  "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/artifact-upload-1.0-" + timestamp + ".jar.md5" ) );
-        assertTrue( StringUtils.contains( contents, md5 ) );
+        archivaConfigControl.reset();
+        repoFactoryControl.reset();
+        auditLogsDaoControl.reset();
 
-        // verify checksums of pom file
-        checksum =
-            new ChecksummedFile( new File( repoLocation,
-                                           "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/artifact-upload-1.0-" + timestamp + ".pom" ) );
-        sha1 = checksum.calculateChecksum( ChecksumAlgorithm.SHA1 );
-        md5 = checksum.calculateChecksum( ChecksumAlgorithm.MD5 );
+        auditLogsDaoControl.setDefaultMatcher( MockControl.ALWAYS_MATCHER );
 
-        contents =
-            FileUtils.readFileToString( new File( repoLocation,
-                                                  "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/artifact-upload-1.0-" + timestamp + ".pom.sha1" ) );
-        assertTrue( StringUtils.contains( contents, sha1 ) );
+        // MRM-1353
+        // upload snapshot artifact again and check if build number was incremented
+        setUploadParameters( "1.0-SNAPSHOT", null,
+                             new File( getBasedir(),
+                                       "target/test-classes/upload-artifact-test/artifact-to-be-uploaded.jar" ), null,
+                             true );
 
-        contents =
-            FileUtils.readFileToString( new File( repoLocation,
-                                                  "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/artifact-upload-1.0-" + timestamp + ".pom.md5" ) );
-        assertTrue( StringUtils.contains( contents, md5 ) );
+        archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
+        repoFactoryControl.expectAndReturn( repoFactory.getManagedRepositoryContent( REPOSITORY_ID ), content );
+        auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null );
 
-        
-        // verify checksums of metadata file
-        checksum =
-            new ChecksummedFile( new File( repoLocation, "/org/apache/archiva/artifact-upload/" +
-                MetadataTools.MAVEN_METADATA ) );
-        sha1 = checksum.calculateChecksum( ChecksumAlgorithm.SHA1 );
-        md5 = checksum.calculateChecksum( ChecksumAlgorithm.MD5 );
+        archivaConfigControl.replay();
+        repoFactoryControl.replay();
+        auditLogsDaoControl.replay();
 
-        contents =
-            FileUtils.readFileToString( new File( repoLocation, "/org/apache/archiva/artifact-upload/" +
-                MetadataTools.MAVEN_METADATA + ".sha1" ) );
-        assertTrue( StringUtils.contains( contents, sha1 ) );
+        returnString = uploadAction.doUpload();
+        assertEquals( Action.SUCCESS, returnString );
 
-        contents =
-            FileUtils.readFileToString( new File( repoLocation, "/org/apache/archiva/artifact-upload/" +
-                MetadataTools.MAVEN_METADATA + ".md5" ) );
-        assertTrue( StringUtils.contains( contents, md5 ) );
+        archivaConfigControl.verify();
+        repoFactoryControl.verify();
+        auditLogsDaoControl.verify();
+
+        artifactsList = new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/" ).list();
+
+        assertEquals( 15, artifactsList.length );
+
+        timestamp = getTimestamp( artifactsList, startIndex, 6 );
+
+        assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation, "artifact-upload-1.0-" + timestamp,
+                                                               "1.0-SNAPSHOT" );
+        verifyArtifactChecksums( repoLocation, "artifact-upload-1.0-" + timestamp, "1.0-SNAPSHOT" );
+        verifyPomChecksums( repoLocation, "artifact-upload-1.0-" + timestamp, "1.0-SNAPSHOT" );
+        verifyProjectMetadataChecksums( repoLocation );
+        verifyVersionMetadataChecksums( repoLocation, "1.0-SNAPSHOT" );
+
+        // verify build number set in metadata and in filename
+        metadataFile =
+            new File( repoLocation, "/org/apache/archiva/artifact-upload/1.0-SNAPSHOT/" + MetadataTools.MAVEN_METADATA );
+        artifactMetadata = RepositoryMetadataReader.read( metadataFile );
+
+        snapshotVersion = artifactMetadata.getSnapshotVersion();
+        assertEquals( "Incorrect build number set in artifact metadata.", 2, snapshotVersion.getBuildNumber() );
+
+        timestampPart = StringUtils.substringBeforeLast( timestamp, "-" );
+        assertEquals( "Incorrect timestamp set in artifact metadata.", timestampPart, snapshotVersion.getTimestamp() );
+
+        buildnumber = StringUtils.substringAfterLast( timestamp, "-" );
+        assertEquals( "Incorrect build number in filename.", "2", buildnumber );
     }
 
     public void testChecksumIsCorrectWhenArtifactIsReUploaded()
@@ -505,13 +540,13 @@ public class UploadActionTest
 
         ManagedRepositoryContent content = new ManagedDefaultRepositoryContent();
         ManagedRepositoryConfiguration repoConfig = config.findManagedRepositoryById( REPOSITORY_ID );
-        repoConfig.setBlockRedeployments( false );        
-        content.setRepository( repoConfig );      
-        
+        repoConfig.setBlockRedeployments( false );
+        content.setRepository( repoConfig );
+
         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
         repoFactoryControl.expectAndReturn( repoFactory.getManagedRepositoryContent( REPOSITORY_ID ), content );
         auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null );
-        
+
         archivaConfigControl.replay();
         repoFactoryControl.replay();
         auditLogsDaoControl.replay();
@@ -529,9 +564,11 @@ public class UploadActionTest
         auditLogsDaoControl.setDefaultMatcher( MockControl.ALWAYS_MATCHER );
 
         String repoLocation = config.findManagedRepositoryById( REPOSITORY_ID ).getLocation();
-        assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation );
+        assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation, "artifact-upload-1.0", "1.0" );
 
-        verifyChecksums( repoLocation );
+        verifyArtifactChecksums( repoLocation, "artifact-upload-1.0", "1.0" );
+        verifyPomChecksums( repoLocation, "artifact-upload-1.0", "1.0" );
+        verifyProjectMetadataChecksums( repoLocation );
 
         // RE-upload artifact
         setUploadParameters( "1.0", null,
@@ -542,7 +579,7 @@ public class UploadActionTest
         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
         repoFactoryControl.expectAndReturn( repoFactory.getManagedRepositoryContent( REPOSITORY_ID ), content );
         auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null );
-        
+
         archivaConfigControl.replay();
         repoFactoryControl.replay();
         auditLogsDaoControl.replay();
@@ -555,14 +592,16 @@ public class UploadActionTest
         auditLogsDaoControl.verify();
 
         repoLocation = config.findManagedRepositoryById( REPOSITORY_ID ).getLocation();
-        assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation );
+        assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation, "artifact-upload-1.0", "1.0" );
 
-        verifyChecksums( repoLocation );
+        verifyArtifactChecksums( repoLocation, "artifact-upload-1.0", "1.0" );
+        verifyPomChecksums( repoLocation, "artifact-upload-1.0", "1.0" );
+        verifyProjectMetadataChecksums( repoLocation );
     }
-    
+
     public void testUploadArtifactAlreadyExistingRedeploymentsBlocked()
         throws Exception
-    {   
+    {
         setUploadParameters( "1.0", null,
                              new File( getBasedir(),
                                        "target/test-classes/upload-artifact-test/artifact-to-be-uploaded.jar" ), null,
@@ -574,19 +613,19 @@ public class UploadActionTest
         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config, 2 );
         repoFactoryControl.expectAndReturn( repoFactory.getManagedRepositoryContent( REPOSITORY_ID ), content, 2 );
         auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null );
-        
+
         archivaConfigControl.replay();
         repoFactoryControl.replay();
         auditLogsDaoControl.replay();
 
         String returnString = uploadAction.doUpload();
         assertEquals( Action.SUCCESS, returnString );
-        
+
         setUploadParameters( "1.0", null,
                              new File( getBasedir(),
                                        "target/test-classes/upload-artifact-test/artifact-to-be-uploaded.jar" ), null,
                              true );
-        
+
         returnString = uploadAction.doUpload();
         assertEquals( Action.ERROR, returnString );
 
@@ -595,50 +634,54 @@ public class UploadActionTest
         auditLogsDaoControl.verify();
 
         String repoLocation = config.findManagedRepositoryById( REPOSITORY_ID ).getLocation();
-        assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation );
+        assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation, "artifact-upload-1.0", "1.0" );
 
-        verifyChecksums( repoLocation );
+        verifyArtifactChecksums( repoLocation, "artifact-upload-1.0", "1.0" );
+        verifyPomChecksums( repoLocation, "artifact-upload-1.0", "1.0" );
+        verifyProjectMetadataChecksums( repoLocation );
     }
-    
+
     public void testUploadArtifactAlreadyExistingRedeploymentsAllowed()
         throws Exception
-    {                
+    {
         setUploadParameters( "1.0", null,
                              new File( getBasedir(),
                                        "target/test-classes/upload-artifact-test/artifact-to-be-uploaded.jar" ), null,
                              true );
-    
+
         ManagedRepositoryContent content = new ManagedDefaultRepositoryContent();
         ManagedRepositoryConfiguration repoConfig = config.findManagedRepositoryById( REPOSITORY_ID );
-        repoConfig.setBlockRedeployments( false );        
-        content.setRepository( repoConfig );        
-    
+        repoConfig.setBlockRedeployments( false );
+        content.setRepository( repoConfig );
+
         archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config, 2 );
         repoFactoryControl.expectAndReturn( repoFactory.getManagedRepositoryContent( REPOSITORY_ID ), content, 2 );
         auditLogsDaoControl.expectAndReturn( auditLogsDao.saveAuditLogs( new ArchivaAuditLogs() ), null, 2 );
-    
+
         archivaConfigControl.replay();
         repoFactoryControl.replay();
         auditLogsDaoControl.replay();
-    
+
         String returnString = uploadAction.doUpload();
         assertEquals( Action.SUCCESS, returnString );
-    
+
         setUploadParameters( "1.0", null,
                              new File( getBasedir(),
                                        "target/test-classes/upload-artifact-test/artifact-to-be-uploaded.jar" ), null,
                              true );
-        
+
         returnString = uploadAction.doUpload();
         assertEquals( Action.SUCCESS, returnString );
-        
+
         archivaConfigControl.verify();
         repoFactoryControl.verify();
         auditLogsDaoControl.verify();
-    
+
         String repoLocation = config.findManagedRepositoryById( REPOSITORY_ID ).getLocation();
-        assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation );
-    
-        verifyChecksums( repoLocation );
+        assertAllArtifactsIncludingSupportArtifactsArePresent( repoLocation, "artifact-upload-1.0", "1.0" );
+
+        verifyArtifactChecksums( repoLocation, "artifact-upload-1.0", "1.0" );
+        verifyPomChecksums( repoLocation, "artifact-upload-1.0", "1.0" );
+        verifyProjectMetadataChecksums( repoLocation );
     }
-}
+}
\ No newline at end of file