You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jv...@apache.org on 2007/11/06 06:25:21 UTC

svn commit: r592286 - /maven/artifact/trunk/src/main/java/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java

Author: jvanzyl
Date: Mon Nov  5 21:25:20 2007
New Revision: 592286

URL: http://svn.apache.org/viewvc?rev=592286&view=rev
Log:
MARTIFACT-6 Deployments of previously deployed versions will be stopped.

Modified:
    maven/artifact/trunk/src/main/java/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java

Modified: maven/artifact/trunk/src/main/java/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java
URL: http://svn.apache.org/viewvc/maven/artifact/trunk/src/main/java/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java?rev=592286&r1=592285&r2=592286&view=diff
==============================================================================
--- maven/artifact/trunk/src/main/java/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java (original)
+++ maven/artifact/trunk/src/main/java/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java Mon Nov  5 21:25:20 2007
@@ -22,28 +22,40 @@
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.manager.WagonManager;
 import org.apache.maven.artifact.metadata.ArtifactMetadata;
+import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.repository.metadata.RepositoryMetadataDeploymentException;
 import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
 import org.apache.maven.artifact.transform.ArtifactTransformationManager;
+import org.apache.maven.artifact.versioning.ArtifactVersion;
+import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
 import org.apache.maven.wagon.TransferFailedException;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.util.FileUtils;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.Iterator;
+import java.util.List;
 
 public class DefaultArtifactDeployer
     extends AbstractLogEnabled
     implements ArtifactDeployer
 {
+    /** @plexus.component */
     private WagonManager wagonManager;
 
+    /** @plexuxs.component */
     private ArtifactTransformationManager transformationManager;
 
+    /** @plexus.component */
     private RepositoryMetadataManager repositoryMetadataManager;
 
+    /** @plexus.component */
+    private ArtifactMetadataSource metadataSource;
+
     /** @deprecated we want to use the artifact method only, and ensure artifact.file is set correctly. */
     public void deploy( String basedir,
                         String finalName,
@@ -69,40 +81,74 @@
             throw new ArtifactDeploymentException( "System is offline. Cannot deploy artifact: " + artifact + "." );
         }
 
-        try
+        if ( !artifactHasBeenDeployed( artifact, localRepository, deploymentRepository ) )
         {
-            transformationManager.transformForDeployment( artifact, deploymentRepository, localRepository );
+            try
+            {
+                transformationManager.transformForDeployment( artifact, deploymentRepository, localRepository );
 
-            // Copy the original file to the new one if it was transformed
-            File artifactFile = new File( localRepository.getBasedir(), localRepository.pathOf( artifact ) );
-            if ( !artifactFile.equals( source ) )
+                // Copy the original file to the new one if it was transformed
+                File artifactFile = new File( localRepository.getBasedir(), localRepository.pathOf( artifact ) );
+                if ( !artifactFile.equals( source ) )
+                {
+                    FileUtils.copyFile( source, artifactFile );
+                }
+
+                wagonManager.putArtifact( source, artifact, deploymentRepository );
+
+                // must be after the artifact is installed
+                for ( Iterator i = artifact.getMetadataList().iterator(); i.hasNext(); )
+                {
+                    ArtifactMetadata metadata = (ArtifactMetadata) i.next();
+                    repositoryMetadataManager.deploy( metadata, localRepository, deploymentRepository );
+                }
+            }
+            catch ( TransferFailedException e )
             {
-                FileUtils.copyFile( source, artifactFile );
+                throw new ArtifactDeploymentException( "Error deploying artifact: " + e.getMessage(), e );
             }
-
-            wagonManager.putArtifact( source, artifact, deploymentRepository );
-
-            // must be after the artifact is installed
-            for ( Iterator i = artifact.getMetadataList().iterator(); i.hasNext(); )
+            catch ( IOException e )
             {
-                ArtifactMetadata metadata = (ArtifactMetadata) i.next();
-                repositoryMetadataManager.deploy( metadata, localRepository, deploymentRepository );
+                throw new ArtifactDeploymentException( "Error deploying artifact: " + e.getMessage(), e );
+            }
+            catch ( RepositoryMetadataDeploymentException e )
+            {
+                throw new ArtifactDeploymentException( "Error installing artifact's metadata: " + e.getMessage(), e );
             }
-            // TODO: would like to flush this, but the plugin metadata is added in advance, not as an install/deploy transformation
-            // This would avoid the need to merge and clear out the state during deployment
-//            artifact.getMetadataList().clear();
-        }
-        catch ( TransferFailedException e )
-        {
-            throw new ArtifactDeploymentException( "Error deploying artifact: " + e.getMessage(), e );
         }
-        catch ( IOException e )
+    }
+
+    private boolean artifactHasBeenDeployed( Artifact artifact,
+                                             ArtifactRepository localRepository,
+                                             ArtifactRepository remoteRepository  )
+        throws ArtifactDeploymentException
+    {
+        try
         {
-            throw new ArtifactDeploymentException( "Error deploying artifact: " + e.getMessage(), e );
+            ArtifactVersion artifactVersion = new DefaultArtifactVersion( artifact.getVersion() );
+
+            List versions = metadataSource.retrieveAvailableVersions( artifact, localRepository,
+                Arrays.asList( new ArtifactRepository[]{remoteRepository} ) );
+
+            for ( Iterator i = versions.iterator(); i.hasNext(); )
+            {
+                ArtifactVersion deployedArtifactVersion = (ArtifactVersion) i.next();
+
+                if ( artifactVersion.compareTo( deployedArtifactVersion ) == 0 )
+                {
+                    getLogger().warn( "The artifact " + artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + artifact.getVersion() + " has already been deployed. Not deploying again." );
+
+                    return true;
+                }
+            }
         }
-        catch ( RepositoryMetadataDeploymentException e )
+        catch ( ArtifactMetadataRetrievalException e )
         {
-            throw new ArtifactDeploymentException( "Error installing artifact's metadata: " + e.getMessage(), e );
+            getLogger().warn( "We cannot retrieve the artifact metadata, or it does not exist. We will assume this artifact needs to be deployed." );
+
+            return false;
         }
+
+        return false;
     }
 }