Author: carlos
Date: Mon May 14 19:14:25 2007
New Revision: 538041

URL: http://svn.apache.org/viewvc?view=rev&rev=538041
Log:
[MNG-2985] DefaultWagonManager does not safely remove TransferListeners from 
the wagon
Submitted By: Abel MuiƱo

Added:
    
maven/components/trunk/maven-artifact/src/test/java/org/apache/maven/artifact/manager/WagonNoOp.java
   (with props)
Modified:
    
maven/components/trunk/maven-artifact/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java
    
maven/components/trunk/maven-artifact/src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java
    
maven/components/trunk/maven-artifact/src/test/resources/org/apache/maven/artifact/manager/DefaultWagonManagerTest.xml

Modified: 
maven/components/trunk/maven-artifact/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-artifact/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java?view=diff&rev=538041&r1=538040&r2=538041
==============================================================================
--- 
maven/components/trunk/maven-artifact/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java
 (original)
+++ 
maven/components/trunk/maven-artifact/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java
 Mon May 14 19:14:25 2007
@@ -1,4 +1,4 @@
-        package org.apache.maven.artifact.manager;
+package org.apache.maven.artifact.manager;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -69,6 +69,11 @@
 {
     private static final String WILDCARD = "*";
 
+    private static final String[] CHECKSUM_IDS = { "md5", "sha1" };
+
+    /** have to match the CHECKSUM_IDS */
+    private static final String[] CHECKSUM_ALGORITHMS = { "MD5", "SHA-1" };
+
     private PlexusContainer container;
 
     // TODO: proxies, authentication and mirrors are via settings, and should 
come in via an alternate method - perhaps
@@ -190,43 +195,42 @@
         Map sums = new HashMap( 2 );
 
         // TODO: configure these on the repository
-        try
+        for ( int i = 0; i < CHECKSUM_IDS.length; i++ )
         {
-            ChecksumObserver checksumObserver = new ChecksumObserver( "MD5" );
-            wagon.addTransferListener( checksumObserver );
-            checksums.put( "md5", checksumObserver );
-            checksumObserver = new ChecksumObserver( "SHA-1" );
-            wagon.addTransferListener( checksumObserver );
-            checksums.put( "sha1", checksumObserver );
-        }
-        catch ( NoSuchAlgorithmException e )
-        {
-            throw new TransferFailedException( "Unable to add checksum 
methods: " + e.getMessage(), e );
+            checksums.put( CHECKSUM_IDS[i], addChecksumObserver( wagon, 
CHECKSUM_ALGORITHMS[i] ) );
         }
 
         try
         {
-            Repository artifactRepository = new Repository( 
repository.getId(), repository.getUrl() );
-
-            if ( serverPermissionsMap.containsKey( repository.getId() ) )
+            try
             {
-                RepositoryPermissions perms = (RepositoryPermissions) 
serverPermissionsMap.get( repository.getId() );
+                Repository artifactRepository = new Repository( 
repository.getId(), repository.getUrl() );
 
-                getLogger().debug(
-                    "adding permissions to wagon connection: " + 
perms.getFileMode() + " " + perms.getDirectoryMode() );
+                if ( serverPermissionsMap.containsKey( repository.getId() ) )
+                {
+                    RepositoryPermissions perms = (RepositoryPermissions) 
serverPermissionsMap.get( repository.getId() );
 
-                artifactRepository.setPermissions( perms );
-            }
-            else
-            {
-                getLogger().debug( "not adding permissions to wagon 
connection" );
-            }
+                    getLogger().debug( 
+                        "adding permissions to wagon connection: " + 
perms.getFileMode() + " " + perms.getDirectoryMode() );
 
-            wagon.connect( artifactRepository, getAuthenticationInfo( 
repository.getId() ), getProxy( protocol ) );
+                    artifactRepository.setPermissions( perms );
+                }
+                else
+                {
+                    getLogger().debug( "not adding permissions to wagon 
connection" );
+                }
 
-            wagon.put( source, remotePath );
+                wagon.connect( artifactRepository, getAuthenticationInfo( 
repository.getId() ), getProxy( protocol ) );
 
-            wagon.removeTransferListener( downloadMonitor );
+                wagon.put( source, remotePath );
+            }
+            finally
+            {
+                if ( downloadMonitor != null )
+                {
+                    wagon.removeTransferListener( downloadMonitor );
+                }
+            }
 
             // Pre-store the checksums as any future puts will overwrite them
             for ( Iterator i = checksums.keySet().iterator(); i.hasNext(); )
@@ -271,12 +275,37 @@
         }
         finally
         {
+            // Remove every checksum listener
+            for ( int i = 0; i < CHECKSUM_IDS.length; i++ )
+            {
+                TransferListener checksumListener = (TransferListener) 
checksums.get( CHECKSUM_IDS[i] );
+                if ( checksumListener != null )
+                {
+                    wagon.removeTransferListener( checksumListener );
+                }
+            }
+
             disconnectWagon( wagon );
 
             releaseWagon( protocol, wagon );
         }
     }
 
+    private ChecksumObserver addChecksumObserver( Wagon wagon, String 
algorithm )
+        throws TransferFailedException
+    {
+        try
+        {
+            ChecksumObserver checksumObserver = new ChecksumObserver( 
algorithm );
+            wagon.addTransferListener( checksumObserver );
+            return checksumObserver;
+        }
+        catch ( NoSuchAlgorithmException e )
+        {
+            throw new TransferFailedException( "Unable to add checksum for 
unsupported algorithm " + algorithm, e );
+        }
+    }
+
     public void getArtifact( Artifact artifact, List remoteRepositories )
         throws TransferFailedException, ResourceDoesNotExistException
     {
@@ -385,20 +414,9 @@
         }
 
         // TODO: configure on repository
-        ChecksumObserver md5ChecksumObserver;
-        ChecksumObserver sha1ChecksumObserver;
-        try
-        {
-            md5ChecksumObserver = new ChecksumObserver( "MD5" );
-            wagon.addTransferListener( md5ChecksumObserver );
-
-            sha1ChecksumObserver = new ChecksumObserver( "SHA-1" );
-            wagon.addTransferListener( sha1ChecksumObserver );
-        }
-        catch ( NoSuchAlgorithmException e )
-        {
-            throw new TransferFailedException( "Unable to add checksum 
methods: " + e.getMessage(), e );
-        }
+        int i = 0;
+        ChecksumObserver md5ChecksumObserver = addChecksumObserver( wagon, 
CHECKSUM_ALGORITHMS[i++] );
+        ChecksumObserver sha1ChecksumObserver = addChecksumObserver( wagon, 
CHECKSUM_ALGORITHMS[i++] );
 
         File temp = new File( destination + ".tmp" );
         temp.deleteOnExit();
@@ -531,6 +549,14 @@
         }
         finally
         {
+            // Remove every TransferListener
+            wagon.removeTransferListener( md5ChecksumObserver );
+            wagon.removeTransferListener( sha1ChecksumObserver );
+            if ( downloadMonitor != null )
+            {
+                wagon.removeTransferListener( downloadMonitor );
+            }
+
             disconnectWagon( wagon );
 
             releaseWagon( protocol, wagon );

Modified: 
maven/components/trunk/maven-artifact/src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-artifact/src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java?view=diff&rev=538041&r1=538040&r2=538041
==============================================================================
--- 
maven/components/trunk/maven-artifact/src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java
 (original)
+++ 
maven/components/trunk/maven-artifact/src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java
 Mon May 14 19:14:25 2007
@@ -19,8 +19,19 @@
  * under the License.
  */
 
+import java.io.File;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.metadata.ArtifactMetadata;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.DefaultArtifactRepository;
+import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
+import org.apache.maven.artifact.versioning.VersionRange;
 import org.apache.maven.wagon.UnsupportedProtocolException;
 import org.apache.maven.wagon.Wagon;
+import org.apache.maven.wagon.events.TransferListener;
+import org.apache.maven.wagon.observers.Debug;
 import org.apache.maven.wagon.repository.Repository;
 import org.codehaus.plexus.PlexusTestCase;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
@@ -35,6 +46,8 @@
 
     private WagonManager wagonManager;
 
+    private TransferListener transferListener = new Debug();
+
     protected void setUp()
         throws Exception
     {
@@ -54,6 +67,8 @@
 
         assertWagon( "c" );
 
+        assertWagon( "noop" );
+
         try
         {
             assertWagon( "d" );
@@ -111,6 +126,46 @@
         }
     }
 
+    /**
+     * Check that transfer listeners are properly removed after getArtifact 
and putArtifact
+     */
+    public void 
testWagonTransferListenerRemovedAfterGetArtifactAndPutArtifact()
+        throws Exception
+    {
+        File tmpFile = File.createTempFile( "mvn-test", ".temp" );
+
+        try
+        {
+            tmpFile.deleteOnExit();
+            Artifact artifact = new DefaultArtifact( "sample.group", 
"sample-art", VersionRange
+                .createFromVersion( "1.0" ), "scope", "type", "classifier", 
null );
+            artifact.setFile( tmpFile );
+            ArtifactRepository repo = new DefaultArtifactRepository( "id", 
"noop://url",
+                                                                     new 
ArtifactRepositoryLayoutStub() );
+            WagonNoOp wagon = (WagonNoOp) wagonManager.getWagon( "noop" );
+
+            /* getArtifact */
+            assertFalse( "Transfer listener is registered before test", 
wagon.getTransferEventSupport()
+                .hasTransferListener( transferListener ) );
+            wagonManager.setDownloadMonitor( transferListener );
+            wagonManager.getArtifact( artifact, repo );
+            assertFalse( "Transfer listener still registered after 
getArtifact", wagon.getTransferEventSupport()
+                .hasTransferListener( transferListener ) );
+
+            /* putArtifact */
+            assertFalse( "Transfer listener is registered before test", 
wagon.getTransferEventSupport()
+                .hasTransferListener( transferListener ) );
+            wagonManager.setDownloadMonitor( transferListener );
+            wagonManager.putArtifact( new File( "sample file" ), artifact, 
repo );
+            assertFalse( "Transfer listener still registered after 
putArtifact", wagon.getTransferEventSupport()
+                .hasTransferListener( transferListener ) );
+        }
+        finally
+        {
+            tmpFile.delete();
+        }
+    }
+
     private void assertWagon( String protocol )
         throws Exception
     {
@@ -145,6 +200,25 @@
         assertNotNull( "Check wagon, protocol=" + protocol, wagon );
 
         assertEquals( "Check configuration for wagon, protocol=" + protocol, 
s, wagon.getConfigurableField() );
+    }
+
+    private final class ArtifactRepositoryLayoutStub
+        implements ArtifactRepositoryLayout
+    {
+        public String pathOfRemoteRepositoryMetadata( ArtifactMetadata 
metadata )
+        {
+            return "path";
+        }
+
+        public String pathOfLocalRepositoryMetadata( ArtifactMetadata 
metadata, ArtifactRepository repository )
+        {
+            return "path";
+        }
+
+        public String pathOf( Artifact artifact )
+        {
+            return "path";
+        }
     }
 
 }

Added: 
maven/components/trunk/maven-artifact/src/test/java/org/apache/maven/artifact/manager/WagonNoOp.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-artifact/src/test/java/org/apache/maven/artifact/manager/WagonNoOp.java?view=auto&rev=538041
==============================================================================
--- 
maven/components/trunk/maven-artifact/src/test/java/org/apache/maven/artifact/manager/WagonNoOp.java
 (added)
+++ 
maven/components/trunk/maven-artifact/src/test/java/org/apache/maven/artifact/manager/WagonNoOp.java
 Mon May 14 19:14:25 2007
@@ -0,0 +1,73 @@
+package org.apache.maven.artifact.manager;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+
+import org.apache.maven.wagon.AbstractWagon;
+import org.apache.maven.wagon.ResourceDoesNotExistException;
+import org.apache.maven.wagon.TransferFailedException;
+import org.apache.maven.wagon.authorization.AuthorizationException;
+import org.apache.maven.wagon.resource.Resource;
+
+public class WagonNoOp
+    extends AbstractWagon
+{
+
+    public void closeConnection()
+    {
+        // NO-OP
+    }
+
+    public void get( String resourceName, File destination )
+        throws TransferFailedException, ResourceDoesNotExistException, 
AuthorizationException
+    {
+        Resource resource = new Resource( resourceName );
+        fireGetInitiated( resource, destination );
+        fireGetStarted( resource, destination );
+        fireGetCompleted( resource, destination );
+    }
+
+    public boolean getIfNewer( String resourceName, File destination, long 
timestamp )
+        throws TransferFailedException, ResourceDoesNotExistException, 
AuthorizationException
+    {
+        // NO-OP
+        return false;
+    }
+
+    public void openConnection()
+    {
+        // NO-OP
+    }
+
+    public void put( File source, String destination )
+        throws TransferFailedException, ResourceDoesNotExistException, 
AuthorizationException
+    {
+        Resource resource = new Resource( destination );
+        firePutInitiated( resource, source );
+        firePutStarted( resource, source );
+        firePutCompleted( resource, source );
+    }
+
+    public String[] getSupportedProtocols()
+    {
+        return new String[] { "noop" };
+    }
+}

Propchange: 
maven/components/trunk/maven-artifact/src/test/java/org/apache/maven/artifact/manager/WagonNoOp.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/components/trunk/maven-artifact/src/test/java/org/apache/maven/artifact/manager/WagonNoOp.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Modified: 
maven/components/trunk/maven-artifact/src/test/resources/org/apache/maven/artifact/manager/DefaultWagonManagerTest.xml
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-artifact/src/test/resources/org/apache/maven/artifact/manager/DefaultWagonManagerTest.xml?view=diff&rev=538041&r1=538040&r2=538041
==============================================================================
--- 
maven/components/trunk/maven-artifact/src/test/resources/org/apache/maven/artifact/manager/DefaultWagonManagerTest.xml
 (original)
+++ 
maven/components/trunk/maven-artifact/src/test/resources/org/apache/maven/artifact/manager/DefaultWagonManagerTest.xml
 Mon May 14 19:14:25 2007
@@ -40,6 +40,11 @@
       <implementation>org.apache.maven.artifact.manager.WagonC</implementation>
     </component>
     <component>
+      <role>org.apache.maven.wagon.Wagon</role>
+      <role-hint>noop</role-hint>
+      
<implementation>org.apache.maven.artifact.manager.WagonNoOp</implementation>
+    </component>
+    <component>
       
<role>org.apache.maven.artifact.repository.authentication.AuthenticationInfoProvider</role>
       
<implementation>org.apache.maven.artifact.repository.authentication.DummyAuthenticationInfoProvider</implementation>
     </component>


Reply via email to