* Test the configuration store.
*
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ * @noinspection JavaDoc
*/
public class ConfigurationStoreTest
extends PlexusTestCase
assertEquals( "check value", "index-path", configuration.getIndexPath() );
}
+ /**
+ * @noinspection JUnitTestMethodWithNoAssertions
+ */
public void testChangeListeners()
throws Exception
{
<groupId>org.apache.maven.wagon</groupId>\r
<artifactId>wagon-provider-api</artifactId>\r
</dependency>\r
+ <dependency>\r
+ <groupId>easymock</groupId>\r
+ <artifactId>easymock</artifactId>\r
+ <version>1.2_Java1.3</version>\r
+ <scope>test</scope>\r
+ </dependency>\r
</dependencies>\r
<build>\r
<plugins>\r
*/
import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.manager.ChecksumFailedException;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.repository.discovery.ArtifactDiscoverer;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
-import java.util.HashMap;
import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
* @plexus.component
* @todo this currently duplicates a lot of the wagon manager, and doesn't do things like snapshot resolution, etc.
+ * The checksum handling is inconsistent with that of the wagon manager.
* Should we have a more artifact based one? This will merge metadata so should behave correctly, and it is able to
* correct some limitations of the wagon manager (eg, it can retrieve newer SNAPSHOT files without metadata)
*/
public File getAlways( String path, List proxiedRepositories, ArtifactRepository managedRepository,
ProxyInfo wagonProxy )
- throws ProxyException, ResourceDoesNotExistException
+ throws ResourceDoesNotExistException, ProxyException
{
File target = new File( managedRepository.getBasedir(), path );
}
else
{
- if ( path.endsWith( ".md5" ) || path.endsWith( ".sha1" ) )
- {
- // always read from the managed repository, no need to make remote request
- }
- else if ( path.endsWith( "maven-metadata.xml" ) )
- {
- // TODO: this is not always!
- if ( !target.exists() || isOutOfDate( repository.getRepository().getReleases(), target ) )
- {
- getFileFromRepository( path, repository, managedRepository.getBasedir(), wagonProxy, target );
- }
- }
- else
+ try
{
- Artifact artifact = null;
- try
- {
- artifact = defaultArtifactDiscoverer.buildArtifact( path );
- }
- catch ( DiscovererException e )
- {
- getLogger().debug(
- "Failed to build artifact using default layout with message: " + e.getMessage() );
- }
-
- if ( artifact == null )
- {
- try
- {
- artifact = legacyArtifactDiscoverer.buildArtifact( path );
- }
- catch ( DiscovererException e )
- {
- getLogger().debug(
- "Failed to build artifact using legacy layout with message: " + e.getMessage() );
- }
- }
+ get( path, target, repository, managedRepository, wagonProxy );
- if ( artifact != null )
+ if ( !target.exists() )
{
- getArtifactFromRepository( artifact, repository, managedRepository, wagonProxy, target );
+ repository.addFailure( path );
}
else
{
- // Some other unknown file in the repository, proxy as is
- // TODO: this is not always!
- if ( !target.exists() )
- {
- getFileFromRepository( path, repository, managedRepository.getBasedir(), wagonProxy,
- target );
- }
+ // in case it previously failed and we've since found it
+ repository.clearFailure( path );
}
}
-
- if ( !target.exists() )
+ catch ( ProxyException e )
{
repository.addFailure( path );
- }
- else
- {
- // in case it previously failed and we've since found it
- repository.clearFailure( path );
+ throw e;
}
}
}
return target;
}
+ private void get( String path, File target, ProxiedArtifactRepository repository,
+ ArtifactRepository managedRepository, ProxyInfo wagonProxy )
+ throws ProxyException
+ {
+ if ( path.endsWith( ".md5" ) || path.endsWith( ".sha1" ) )
+ {
+ // always read from the managed repository, no need to make remote request
+ }
+ else if ( path.endsWith( "maven-metadata.xml" ) )
+ {
+ // TODO: this is not always!
+ if ( !target.exists() || isOutOfDate( repository.getRepository().getReleases(), target ) )
+ {
+ getFileFromRepository( path, repository, managedRepository.getBasedir(), wagonProxy, target );
+ }
+ }
+ else
+ {
+ Artifact artifact = null;
+ try
+ {
+ artifact = defaultArtifactDiscoverer.buildArtifact( path );
+ }
+ catch ( DiscovererException e )
+ {
+ getLogger().debug( "Failed to build artifact using default layout with message: " + e.getMessage() );
+ }
+
+ if ( artifact == null )
+ {
+ try
+ {
+ artifact = legacyArtifactDiscoverer.buildArtifact( path );
+ }
+ catch ( DiscovererException e )
+ {
+ getLogger().debug( "Failed to build artifact using legacy layout with message: " + e.getMessage() );
+ }
+ }
+
+ if ( artifact != null )
+ {
+ getArtifactFromRepository( artifact, repository, managedRepository, wagonProxy, target );
+ }
+ else
+ {
+ // Some other unknown file in the repository, proxy as is
+ // TODO: this is not always!
+ if ( !target.exists() )
+ {
+ getFileFromRepository( path, repository, managedRepository.getBasedir(), wagonProxy, target );
+ }
+ }
+ }
+ }
+
private void getFileFromRepository( String path, ProxiedArtifactRepository repository, String repositoryCachePath,
ProxyInfo httpProxy, File target )
- throws ProxyException, ResourceDoesNotExistException
+ throws ProxyException
{
boolean connected = false;
Map checksums = null;
{
tries++;
- getLogger().info( "Trying " + path + " from " + repository.getName() + "..." );
+ getLogger().debug( "Trying " + path + " from " + repository.getName() + "..." );
if ( !target.exists() )
{
wagon.getIfNewer( path, temp, target.lastModified() );
}
- success = doChecksumCheck( checksums, path, wagon, repositoryCachePath );
+ success = checkChecksum( checksums, path, wagon, repositoryCachePath );
if ( tries > 1 && !success )
{
- throw new ProxyException( "Checksum failures occurred while downloading " + path );
+ //noinspection ThrowCaughtLocally
+ throw new TransferFailedException( "Checksum failures occurred while downloading " + path );
}
- }
- while ( !success );
- disconnectWagon( wagon );
-
- if ( temp.exists() )
- {
- moveTempToTarget( temp, target );
+ // temp won't exist if we called getIfNewer and it was older, but its still a successful return
+ if ( temp.exists() )
+ {
+ moveTempToTarget( temp, target );
+ }
}
+ while ( !success );
}
//try next repository
}
String message = "Skipping repository " + repository.getName() + ": " + e.getMessage();
processRepositoryFailure( repository, message, e );
}
+ catch ( ResourceDoesNotExistException e )
+ {
+ // hard failure setting doesn't affect "not found".
+ getLogger().debug( "Artifact not found in repository: " + repository.getName() + ": " + e.getMessage() );
+ }
finally
{
if ( wagon != null && checksums != null )
*/
private Map prepareChecksumListeners( Wagon wagon )
{
- Map checksums = new HashMap();
+ Map checksums = new LinkedHashMap();
try
{
ChecksumObserver checksum = new ChecksumObserver( "SHA-1" );
return connected;
}
- private boolean doChecksumCheck( Map checksumMap, String path, Wagon wagon, String repositoryCachePath )
+ private boolean checkChecksum( Map checksumMap, String path, Wagon wagon, String repositoryCachePath )
throws ProxyException
{
releaseChecksumListeners( wagon, checksumMap );
remoteChecksum = remoteChecksum.substring( 0, remoteChecksum.indexOf( ' ' ) );
}
- boolean checksumCheck = false;
- if ( remoteChecksum.toUpperCase().equals( checksum.getActualChecksum().toUpperCase() ) )
+ String actualChecksum = checksum.getActualChecksum().toUpperCase();
+ remoteChecksum = remoteChecksum.toUpperCase();
+
+ boolean checksumCheck;
+ if ( remoteChecksum.equals( actualChecksum ) )
{
moveTempToTarget( tempChecksumFile, checksumFile );
checksumCheck = true;
}
+ else
+ {
+ getLogger().warn(
+ "The checksum '" + actualChecksum + "' did not match the remote value: " + remoteChecksum );
+ checksumCheck = false;
+ }
return checksumCheck;
}
- catch ( ChecksumFailedException e )
- {
- return false;
- }
catch ( TransferFailedException e )
{
- getLogger().debug( "An error occurred during the download of " + checksumPath + ": " + e.getMessage(),
- e );
+ getLogger().warn( "An error occurred during the download of " + checksumPath + ": " + e.getMessage(),
+ e );
// do nothing try the next checksum
}
catch ( ResourceDoesNotExistException e )
{
- getLogger().debug( "An error occurred during the download of " + checksumPath + ": " + e.getMessage(),
- e );
+ getLogger().debug( "The checksum did not exist: " + checksumPath, e );
// do nothing try the next checksum
}
catch ( AuthorizationException e )
{
- getLogger().debug( "An error occurred during the download of " + checksumPath + ": " + e.getMessage(),
- e );
+ getLogger().warn( "An error occurred during the download of " + checksumPath + ": " + e.getMessage(),
+ e );
// do nothing try the next checksum
}
catch ( IOException e )
{
- getLogger().debug( "An error occurred while reading the temporary checksum file.", e );
+ getLogger().warn( "An error occurred while reading the temporary checksum file.", e );
return false;
}
}
- getLogger().debug( "Skipping checksum validation for " + path + ": No remote checksums available." );
+ getLogger().debug( "No remote checksums available." );
return true;
}
}
else
{
- getLogger().error( message, t );
+ getLogger().warn( message );
+ getLogger().debug( message, t );
}
}
private void getArtifactFromRepository( Artifact artifact, ProxiedArtifactRepository repository,
ArtifactRepository managedRepository, ProxyInfo httpProxy, File remoteFile )
- throws ProxyException, ResourceDoesNotExistException
+ throws ProxyException
{
ArtifactRepository artifactRepository = repository.getRepository();
ArtifactRepositoryPolicy policy =
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.wagon.ResourceDoesNotExistException;
+import org.apache.maven.wagon.TransferFailedException;
+import org.apache.maven.wagon.Wagon;
+import org.apache.maven.wagon.authorization.AuthorizationException;
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.util.FileUtils;
+import org.easymock.MockControl;
import java.io.File;
import java.io.IOException;
+import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
/**
* @author Brett Porter
* @todo! tests to do vvv
- * @todo test when >1 repo has the artifact
- * @todo test when >1 repo has the artifact but one fails
- * @todo test hard failure on repo1
* @todo test when failure is cached
+ * @todo test when failure is cached and repo is hard fail
* @todo test when failure should be cached but caching is disabled
* @todo test snapshots - general
* @todo test snapshots - newer version on repo2 is pulled down
* @todo test metadata - general
* @todo test metadata - multiple repos are merged
* @todo test metadata - update interval
+ * @todo test metadata - looking for an update and file has been removed remotely
* @todo test when managed repo is m1 layout (proxy is m2), including metadata
* @todo test when one proxied repo is m1 layout (managed is m2), including metadata
* @todo test when one proxied repo is m1 layout (managed is m1), including metadata
* @todo test get always
+ * @todo test get always when resource is present locally but not in any proxied repos (should fail)
+ * @todo test remote checksum only md5
+ * @todo test remote checksum only sha1
+ * @todo test remote checksum missing
+ * @todo test remote checksum present and correct
+ * @todo test remote checksum present and incorrect
+ * @todo test remote checksum transfer failed
*/
public class ProxyRequestHandlerTest
extends PlexusTestCase
private ArtifactRepository proxiedRepository2;
+ private ArtifactRepositoryLayout defaultLayout;
+
+ private ArtifactRepositoryFactory factory;
+
+ private MockControl wagonMockControl;
+
+ private Wagon wagonMock;
+
protected void setUp()
throws Exception
{
FileUtils.deleteDirectory( repoLocation );
copyDirectoryStructure( getTestFile( "src/test/repositories/managed" ), repoLocation );
- ArtifactRepositoryFactory factory = (ArtifactRepositoryFactory) lookup( ArtifactRepositoryFactory.ROLE );
- ArtifactRepositoryLayout defaultLayout =
- (ArtifactRepositoryLayout) lookup( ArtifactRepositoryLayout.ROLE, "default" );
- defaultManagedRepository = factory.createArtifactRepository( "managed-repository",
- repoLocation.toURI().toURL().toExternalForm(),
- defaultLayout, null, null );
+ defaultLayout = (ArtifactRepositoryLayout) lookup( ArtifactRepositoryLayout.ROLE, "default" );
+ factory = (ArtifactRepositoryFactory) lookup( ArtifactRepositoryFactory.ROLE );
+
+ defaultManagedRepository = createRepository( "managed-repository", repoLocation );
File location = getTestFile( "src/test/repositories/proxied1" );
- proxiedRepository1 = factory.createArtifactRepository( "proxied1", location.toURI().toURL().toExternalForm(),
- defaultLayout, null, null );
+ proxiedRepository1 = createRepository( "proxied1", location );
location = getTestFile( "src/test/repositories/proxied2" );
- proxiedRepository2 = factory.createArtifactRepository( "proxied2", location.toURI().toURL().toExternalForm(),
- defaultLayout, null, null );
+ proxiedRepository2 = createRepository( "proxied2", location );
proxiedRepositories = new ArrayList( 2 );
proxiedRepositories.add( createProxiedRepository( proxiedRepository1 ) );
proxiedRepositories.add( createProxiedRepository( proxiedRepository2 ) );
+
+ wagonMockControl = MockControl.createNiceControl( Wagon.class );
+ wagonMock = (Wagon) wagonMockControl.getMock();
+ WagonDelegate delegate = (WagonDelegate) lookup( Wagon.ROLE, "test" );
+ delegate.setDelegate( wagonMock );
}
public void testGetDefaultLayoutNotPresent()
file.lastModified() );
}
+ public void testGetWhenInBothProxiedRepos()
+ throws ResourceDoesNotExistException, ProxyException, IOException
+ {
+ String path = "org/apache/maven/test/get-in-both-proxies/1.0/get-in-both-proxies-1.0.jar";
+ File expectedFile = new File( defaultManagedRepository.getBasedir(), path );
+
+ assertFalse( expectedFile.exists() );
+
+ File file = requestHandler.get( path, proxiedRepositories, defaultManagedRepository );
+
+ assertEquals( "Check file matches", expectedFile, file );
+ assertTrue( "Check file created", file.exists() );
+
+ File proxiedFile = new File( proxiedRepository1.getBasedir(), path );
+ String expectedContents = FileUtils.fileRead( proxiedFile );
+ assertEquals( "Check file contents", expectedContents, FileUtils.fileRead( file ) );
+
+ proxiedFile = new File( proxiedRepository2.getBasedir(), path );
+ String unexpectedContents = FileUtils.fileRead( proxiedFile );
+ assertFalse( "Check file contents", unexpectedContents.equals( FileUtils.fileRead( file ) ) );
+ }
+
+ public void testGetInSecondProxiedRepo()
+ throws ResourceDoesNotExistException, ProxyException, IOException
+ {
+ String path = "org/apache/maven/test/get-in-second-proxy/1.0/get-in-second-proxy-1.0.jar";
+ File expectedFile = new File( defaultManagedRepository.getBasedir(), path );
+
+ assertFalse( expectedFile.exists() );
+
+ File file = requestHandler.get( path, proxiedRepositories, defaultManagedRepository );
+
+ assertEquals( "Check file matches", expectedFile, file );
+ assertTrue( "Check file created", file.exists() );
+ File proxiedFile = new File( proxiedRepository2.getBasedir(), path );
+ String expectedContents = FileUtils.fileRead( proxiedFile );
+ assertEquals( "Check file contents", expectedContents, FileUtils.fileRead( file ) );
+ }
+
+ public void testNotFoundInAnyProxies()
+ throws ResourceDoesNotExistException, ProxyException, IOException
+ {
+ String path = "org/apache/maven/test/does-not-exist/1.0/does-not-exist-1.0.jar";
+ File expectedFile = new File( defaultManagedRepository.getBasedir(), path );
+
+ assertFalse( expectedFile.exists() );
+
+ try
+ {
+ File file = requestHandler.get( path, proxiedRepositories, defaultManagedRepository );
+ fail( "File returned was: " + file + "; should have got a not found exception" );
+ }
+ catch ( ResourceDoesNotExistException e )
+ {
+ // expected, but check file was not created
+ assertFalse( expectedFile.exists() );
+ }
+ }
+
+ public void testGetInSecondProxiedRepoFirstFails()
+ throws ResourceDoesNotExistException, ProxyException, IOException, TransferFailedException,
+ AuthorizationException
+ {
+ String path = "org/apache/maven/test/get-in-second-proxy/1.0/get-in-second-proxy-1.0.jar";
+ File expectedFile = new File( defaultManagedRepository.getBasedir(), path ).getAbsoluteFile();
+
+ assertFalse( expectedFile.exists() );
+
+ proxiedRepository1 = createRepository( "proxied1", "test://..." );
+ proxiedRepositories.clear();
+ ProxiedArtifactRepository proxiedArtifactRepository = createProxiedRepository( proxiedRepository1 );
+ proxiedRepositories.add( proxiedArtifactRepository );
+ proxiedRepositories.add( createProxiedRepository( proxiedRepository2 ) );
+
+ wagonMock.get( path, new File( expectedFile.getParentFile(), expectedFile.getName() + ".tmp" ) );
+ wagonMockControl.setThrowable( new TransferFailedException( "transfer failed" ) );
+
+ wagonMockControl.replay();
+
+ File file = requestHandler.get( path, proxiedRepositories, defaultManagedRepository );
+
+ wagonMockControl.verify();
+
+ assertEquals( "Check file matches", expectedFile, file );
+ assertTrue( "Check file created", file.exists() );
+ File proxiedFile = new File( proxiedRepository2.getBasedir(), path );
+ String expectedContents = FileUtils.fileRead( proxiedFile );
+ assertEquals( "Check file contents", expectedContents, FileUtils.fileRead( file ) );
+
+ assertTrue( "Check failure", proxiedArtifactRepository.isCachedFailure( path ) );
+ }
+
+ public void testGetButAllRepositoriesFail()
+ throws ResourceDoesNotExistException, ProxyException, IOException, TransferFailedException,
+ AuthorizationException
+ {
+ String path = "org/apache/maven/test/get-in-second-proxy/1.0/get-in-second-proxy-1.0.jar";
+ File expectedFile = new File( defaultManagedRepository.getBasedir(), path ).getAbsoluteFile();
+
+ assertFalse( expectedFile.exists() );
+
+ proxiedRepository1 = createRepository( "proxied1", "test://..." );
+ proxiedRepository2 = createRepository( "proxied2", "test://..." );
+ proxiedRepositories.clear();
+ ProxiedArtifactRepository proxiedArtifactRepository1 = createProxiedRepository( proxiedRepository1 );
+ proxiedRepositories.add( proxiedArtifactRepository1 );
+ ProxiedArtifactRepository proxiedArtifactRepository2 = createProxiedRepository( proxiedRepository2 );
+ proxiedRepositories.add( proxiedArtifactRepository2 );
+
+ wagonMock.get( path, new File( expectedFile.getParentFile(), expectedFile.getName() + ".tmp" ) );
+ wagonMockControl.setThrowable( new TransferFailedException( "transfer failed" ) );
+
+ wagonMock.get( path, new File( expectedFile.getParentFile(), expectedFile.getName() + ".tmp" ) );
+ wagonMockControl.setThrowable( new TransferFailedException( "transfer failed" ) );
+
+ wagonMockControl.replay();
+
+ try
+ {
+ File file = requestHandler.get( path, proxiedRepositories, defaultManagedRepository );
+ fail( "Found file: " + file + "; but was expecting a failure" );
+ }
+ catch ( ResourceDoesNotExistException e )
+ {
+ // as expected
+ wagonMockControl.verify();
+ assertTrue( "Check failure", proxiedArtifactRepository1.isCachedFailure( path ) );
+ assertTrue( "Check failure", proxiedArtifactRepository2.isCachedFailure( path ) );
+
+ // TODO: do we really want failures to present as a not found?
+ // TODO: How much information on each failure should we pass back to the user vs. logging in the proxy?
+ }
+ }
+
+ public void testGetInSecondProxiedRepoFirstHardFails()
+ throws ResourceDoesNotExistException, ProxyException, IOException, TransferFailedException,
+ AuthorizationException
+ {
+ String path = "org/apache/maven/test/get-in-second-proxy/1.0/get-in-second-proxy-1.0.jar";
+ File expectedFile = new File( defaultManagedRepository.getBasedir(), path ).getAbsoluteFile();
+
+ assertFalse( expectedFile.exists() );
+
+ proxiedRepository1 = createRepository( "proxied1", "test://..." );
+ proxiedRepositories.clear();
+ ProxiedArtifactRepository proxiedArtifactRepository = createHardFailProxiedRepository( proxiedRepository1 );
+ proxiedRepositories.add( proxiedArtifactRepository );
+ proxiedRepositories.add( createProxiedRepository( proxiedRepository2 ) );
+
+ wagonMock.get( path, new File( expectedFile.getParentFile(), expectedFile.getName() + ".tmp" ) );
+ TransferFailedException failedException = new TransferFailedException( "transfer failed" );
+ wagonMockControl.setThrowable( failedException );
+
+ wagonMockControl.replay();
+
+ try
+ {
+ File file = requestHandler.get( path, proxiedRepositories, defaultManagedRepository );
+ fail( "Found file: " + file + "; but was expecting a failure" );
+ }
+ catch ( ProxyException e )
+ {
+ // expect a failure
+ wagonMockControl.verify();
+
+ assertEquals( "Check cause", failedException, e.getCause() );
+ assertTrue( "Check failure", proxiedArtifactRepository.isCachedFailure( path ) );
+ }
+ }
+
/**
* A faster recursive copy that omits .svn directories.
*
* @param sourceDirectory the source directory to copy
* @param destDirectory the target location
- * @throws java.io.IOException if there is a copying problemt
+ * @throws java.io.IOException if there is a copying problem
+ * @todo get back into plexus-utils, share with indexing module
*/
private static void copyDirectoryStructure( File sourceDirectory, File destDirectory )
throws IOException
{
ProxiedArtifactRepository proxiedArtifactRepository = new ProxiedArtifactRepository( repository );
proxiedArtifactRepository.setName( repository.getId() );
+ proxiedArtifactRepository.setCacheFailures( true );
return proxiedArtifactRepository;
}
+
+ private static ProxiedArtifactRepository createHardFailProxiedRepository( ArtifactRepository repository )
+ {
+ ProxiedArtifactRepository proxiedArtifactRepository = createProxiedRepository( repository );
+ proxiedArtifactRepository.setHardFail( true );
+ return proxiedArtifactRepository;
+ }
+
+ private ArtifactRepository createRepository( String id, File repoLocation )
+ throws MalformedURLException
+ {
+ return createRepository( id, repoLocation.toURI().toURL().toExternalForm() );
+ }
+
+ private ArtifactRepository createRepository( String id, String url )
+ {
+ return createRepository( id, url, defaultLayout );
+ }
+
+ private ArtifactRepository createRepository( String id, String url, ArtifactRepositoryLayout repositoryLayout )
+ {
+ return factory.createArtifactRepository( id, url, repositoryLayout, null, null );
+ }
}
--- /dev/null
+package org.apache.maven.repository.proxy;
+
+/*
+ * Copyright 2005-2006 The Apache Software Foundation.
+ *
+ * Licensed 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 org.apache.maven.wagon.Wagon;
+import org.apache.maven.wagon.TransferFailedException;
+import org.apache.maven.wagon.ResourceDoesNotExistException;
+import org.apache.maven.wagon.ConnectionException;
+import org.apache.maven.wagon.events.SessionListener;
+import org.apache.maven.wagon.events.TransferListener;
+import org.apache.maven.wagon.proxy.ProxyInfo;
+import org.apache.maven.wagon.authentication.AuthenticationException;
+import org.apache.maven.wagon.authentication.AuthenticationInfo;
+import org.apache.maven.wagon.repository.Repository;
+import org.apache.maven.wagon.authorization.AuthorizationException;
+
+import java.io.File;
+
+/**
+ * A dummy wagon implementation
+ *
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ */
+public class WagonDelegate
+ implements Wagon
+{
+ private Wagon delegate;
+
+ public void get( String resourceName, File destination )
+ throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
+ {
+ delegate.get( resourceName, destination );
+ }
+
+ public boolean getIfNewer( String resourceName, File destination, long timestamp )
+ throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
+ {
+ return delegate.getIfNewer( resourceName, destination, timestamp );
+ }
+
+ public void put( File source, String destination )
+ throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
+ {
+ delegate.put( source, destination );
+ }
+
+ public void putDirectory( File sourceDirectory, String destinationDirectory )
+ throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
+ {
+ delegate.putDirectory( sourceDirectory, destinationDirectory );
+ }
+
+ public boolean supportsDirectoryCopy()
+ {
+ return delegate.supportsDirectoryCopy();
+ }
+
+ public Repository getRepository()
+ {
+ return delegate.getRepository();
+ }
+
+ public void connect( Repository source )
+ throws ConnectionException, AuthenticationException
+ {
+ delegate.connect( source );
+ }
+
+ public void connect( Repository source, ProxyInfo proxyInfo )
+ throws ConnectionException, AuthenticationException
+ {
+ delegate.connect( source, proxyInfo );
+ }
+
+ public void connect( Repository source, AuthenticationInfo authenticationInfo )
+ throws ConnectionException, AuthenticationException
+ {
+ delegate.connect( source, authenticationInfo );
+ }
+
+ public void connect( Repository source, AuthenticationInfo authenticationInfo, ProxyInfo proxyInfo )
+ throws ConnectionException, AuthenticationException
+ {
+ delegate.connect( source, authenticationInfo, proxyInfo );
+ }
+
+ public void openConnection()
+ throws ConnectionException, AuthenticationException
+ {
+ delegate.openConnection();
+ }
+
+ public void disconnect()
+ throws ConnectionException
+ {
+ delegate.disconnect();
+ }
+
+ public void addSessionListener( SessionListener listener )
+ {
+ delegate.addSessionListener( listener );
+ }
+
+ public void removeSessionListener( SessionListener listener )
+ {
+ delegate.removeSessionListener( listener );
+ }
+
+ public boolean hasSessionListener( SessionListener listener )
+ {
+ return delegate.hasSessionListener( listener );
+ }
+
+ public void addTransferListener( TransferListener listener )
+ {
+ delegate.addTransferListener( listener );
+ }
+
+ public void removeTransferListener( TransferListener listener )
+ {
+ delegate.removeTransferListener( listener );
+ }
+
+ public boolean hasTransferListener( TransferListener listener )
+ {
+ return delegate.hasTransferListener( listener );
+ }
+
+ public boolean isInteractive()
+ {
+ return delegate.isInteractive();
+ }
+
+ public void setInteractive( boolean interactive )
+ {
+ delegate.setInteractive( interactive );
+ }
+
+ public void setDelegate( Wagon delegate )
+ {
+ this.delegate = delegate;
+ }
+}
--- /dev/null
+get-in-both-proxies-1.0.jar
+(proxied 1)
+
--- /dev/null
+get-in-both-proxies-1.0.jar
+(proxied 2)
+
--- /dev/null
+get-in-second-proxy-1.0.jar
+
--- /dev/null
+<!--
+ ~ Copyright 2005-2006 The Apache Software Foundation.
+ ~
+ ~ Licensed 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.
+ -->
+
+<component-set>
+ <components>
+ <component>
+ <role>org.apache.maven.wagon.Wagon</role>
+ <role-hint>test</role-hint>
+ <implementation>org.apache.maven.repository.proxy.WagonDelegate</implementation>
+ </component>
+ </components>
+</component-set>