Index: src/test/java/org/apache/maven/artifact/manager/WagonNoOp.java =================================================================== --- src/test/java/org/apache/maven/artifact/manager/WagonNoOp.java (revision 0) +++ src/test/java/org/apache/maven/artifact/manager/WagonNoOp.java (revision 0) @@ -0,0 +1,69 @@ +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" }; + } +} Index: src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java =================================================================== --- src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java (revision 537498) +++ src/test/java/org/apache/maven/artifact/manager/DefaultWagonManagerTest.java (working copy) @@ -19,8 +19,20 @@ * 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.repository.layout.DefaultRepositoryLayout; +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; @@ -33,7 +45,26 @@ extends PlexusTestCase { + private final class MockArtifactRepositoryLayout 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"; + } + } + private WagonManager wagonManager; + TransferListener transferListener = new Debug(); protected void setUp() throws Exception @@ -53,6 +84,8 @@ assertWagon( "b2" ); assertWagon( "c" ); + + assertWagon( "noop" ); try { @@ -110,6 +143,43 @@ assertTrue( true ); } } + + /* Check that transfer listeners are properly removed after putRemoteFile */ + public void testWagonTransferListenerPutRemoteFile() + throws Exception + { + Artifact artifact = new DefaultArtifact("sample.group", "sample-art", + VersionRange.createFromVersion( "1.0" ), + "scope", "type", "classifier", null); + ArtifactRepository repo = new DefaultArtifactRepository("id", "noop://url", new MockArtifactRepositoryLayout()); + WagonNoOp wagon = (WagonNoOp) wagonManager.getWagon( "noop" ); + 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 )); + } + + /* Check that transfer listeners are properly removed after putRemoteFile */ + public void testWagonTransferListenerGetArtifact() + throws Exception + { + File tmpFile = File.createTempFile( "mvn-test", ".temp") ; + 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 MockArtifactRepositoryLayout()); + WagonNoOp wagon = (WagonNoOp) wagonManager.getWagon( "noop" ); + 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 )); + } private void assertWagon( String protocol ) throws Exception Index: src/test/resources/org/apache/maven/artifact/manager/DefaultWagonManagerTest.xml =================================================================== --- src/test/resources/org/apache/maven/artifact/manager/DefaultWagonManagerTest.xml (revision 537498) +++ src/test/resources/org/apache/maven/artifact/manager/DefaultWagonManagerTest.xml (working copy) @@ -40,6 +40,11 @@ org.apache.maven.artifact.manager.WagonC + org.apache.maven.wagon.Wagon + noop + org.apache.maven.artifact.manager.WagonNoOp + + org.apache.maven.artifact.repository.authentication.AuthenticationInfoProvider org.apache.maven.artifact.repository.authentication.DummyAuthenticationInfoProvider Index: src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java =================================================================== --- src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java (revision 537498) +++ src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java (working copy) @@ -201,6 +201,10 @@ } catch ( NoSuchAlgorithmException e ) { + // Remove transfer listeners + wagon.removeTransferListener( (TransferListener) checksums.get( "md5" ) ); + wagon.removeTransferListener( (TransferListener) checksums.get( "sha1" ) ); + throw new TransferFailedException( "Unable to add checksum methods: " + e.getMessage(), e ); } @@ -271,6 +275,14 @@ } finally { + // Remove every transfer listener + wagon.removeTransferListener( (TransferListener) checksums.get( "md5" ) ); + wagon.removeTransferListener( (TransferListener) checksums.get( "sha1" ) ); + if (null != downloadMonitor) + { + wagon.removeTransferListener( downloadMonitor ); + } + disconnectWagon( wagon ); releaseWagon( protocol, wagon ); @@ -385,8 +397,8 @@ } // TODO: configure on repository - ChecksumObserver md5ChecksumObserver; - ChecksumObserver sha1ChecksumObserver; + ChecksumObserver md5ChecksumObserver = null; + ChecksumObserver sha1ChecksumObserver = null; try { md5ChecksumObserver = new ChecksumObserver( "MD5" ); @@ -397,6 +409,9 @@ } catch ( NoSuchAlgorithmException e ) { + // Remove transfer listeners + wagon.removeTransferListener( md5ChecksumObserver ); + wagon.removeTransferListener( sha1ChecksumObserver ); throw new TransferFailedException( "Unable to add checksum methods: " + e.getMessage(), e ); } @@ -531,6 +546,15 @@ } finally { + // Remove every TransferListener + wagon.removeTransferListener( md5ChecksumObserver ); + wagon.removeTransferListener( sha1ChecksumObserver ); + if (null != downloadMonitor) + { + wagon.removeTransferListener( downloadMonitor ); + } + + disconnectWagon( wagon ); releaseWagon( protocol, wagon );