You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by br...@apache.org on 2008/04/03 09:58:47 UTC

svn commit: r644205 [2/2] - in /archiva/branches/archiva-1.0.x: archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/ archiva-base/archiva-configuration/src/main/mdo/ archiva-base/archiva-policies/src/main/java/org/ap...

Copied: archiva/branches/archiva-1.0.x/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ErrorHandlingTest.java (from r642429, archiva/branches/archiva-1.0.x/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ManagedDefaultTransferTest.java)
URL: http://svn.apache.org/viewvc/archiva/branches/archiva-1.0.x/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ErrorHandlingTest.java?p2=archiva/branches/archiva-1.0.x/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ErrorHandlingTest.java&p1=archiva/branches/archiva-1.0.x/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ManagedDefaultTransferTest.java&r1=642429&r2=644205&rev=644205&view=diff
==============================================================================
--- archiva/branches/archiva-1.0.x/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ManagedDefaultTransferTest.java (original)
+++ archiva/branches/archiva-1.0.x/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ErrorHandlingTest.java Thu Apr  3 00:58:24 2008
@@ -19,445 +19,609 @@
  * under the License.
  */
 
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.maven.archiva.model.ArtifactReference;
 import org.apache.maven.archiva.policies.CachedFailuresPolicy;
 import org.apache.maven.archiva.policies.ChecksumPolicy;
+import org.apache.maven.archiva.policies.PropagateErrorsDownloadPolicy;
+import org.apache.maven.archiva.policies.PropagateErrorsOnUpdateDownloadPolicy;
+import org.apache.maven.archiva.policies.ProxyDownloadException;
 import org.apache.maven.archiva.policies.ReleasesPolicy;
 import org.apache.maven.archiva.policies.SnapshotsPolicy;
+import org.apache.maven.archiva.repository.layout.LayoutException;
 import org.apache.maven.wagon.ResourceDoesNotExistException;
+import org.apache.maven.wagon.TransferFailedException;
+import org.apache.maven.wagon.authorization.AuthorizationException;
 
 import java.io.File;
 
 /**
- * ManagedDefaultTransferTest
+ * ErrorHandlingTest
  *
  * @author Brett Porter
- * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
  * @version $Id$
  */
-public class ManagedDefaultTransferTest
+public class ErrorHandlingTest
     extends AbstractProxyTestCase
 {
-    public void testGetDefaultLayoutNotPresent()
+    private static final String PATH_IN_BOTH_REMOTES_NOT_LOCAL =
+        "org/apache/maven/test/get-in-both-proxies/1.0/get-in-both-proxies-1.0.jar";
+
+    private static final String PATH_IN_BOTH_REMOTES_AND_LOCAL =
+        "org/apache/maven/test/get-on-multiple-repos/1.0/get-on-multiple-repos-1.0.pom";
+
+    private static final String ID_MOCKED_PROXIED1 = "badproxied1";
+
+    private static final String NAME_MOCKED_PROXIED1 = "Bad Proxied 1";
+
+    private static final String ID_MOCKED_PROXIED2 = "badproxied2";
+
+    private static final String NAME_MOCKED_PROXIED2 = "Bad Proxied 2";
+
+    public void testPropagateErrorImmediatelyWithErrorThenSuccess()
         throws Exception
     {
-        String path = "org/apache/maven/test/get-default-layout/1.0/get-default-layout-1.0.jar";
-        setupTestableManagedRepository( path );
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
 
-        File expectedFile = new File( managedDefaultDir, path );
-        ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.STOP );
+        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2 );
 
-        // Ensure file isn't present first.
-        assertNotExistsInManagedDefaultRepo( expectedFile );
+        simulateGetError( path, expectedFile, createTransferException() );
 
-        // Configure Connector (usually done within archiva.xml configuration)
-        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ONCE, SnapshotsPolicy.ONCE,
-                       CachedFailuresPolicy.NO );
+        confirmSingleFailure( path, ID_MOCKED_PROXIED1 );
+    }
 
-        // Attempt the proxy fetch.
-        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+    public void testPropagateErrorImmediatelyWithNotFoundThenError()
+        throws Exception
+    {
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
+
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.STOP );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.STOP );
 
-        File sourceFile = new File( REPOPATH_PROXIED1, path );
-        assertFileEquals( expectedFile, downloadedFile, sourceFile );
-        assertNoTempFiles( expectedFile );
+        simulateGetError( path, expectedFile, createResourceNotFoundException() );
+
+        simulateGetError( path, expectedFile, createTransferException() );
+
+        confirmSingleFailure( path, ID_MOCKED_PROXIED2 );
     }
 
-    /**
-     * The attempt here should result in no file being transferred.
-     * <p/>
-     * The file exists locally, and the policy is ONCE.
-     *
-     * @throws Exception
-     */
-    public void testGetDefaultLayoutAlreadyPresentPolicyOnce()
+    public void testPropagateErrorImmediatelyWithSuccessThenError()
         throws Exception
     {
-        String path = "org/apache/maven/test/get-default-layout-present/1.0/get-default-layout-present-1.0.jar";
-        setupTestableManagedRepository( path );
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
 
-        File expectedFile = new File( managedDefaultDir, path );
+        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1 );
 
-        ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.STOP );
 
-        assertTrue( expectedFile.exists() );
+        confirmSuccess( path, expectedFile, REPOPATH_PROXIED1 );
+    }
 
-        // Configure Connector (usually done within archiva.xml configuration)
-        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ONCE, SnapshotsPolicy.ONCE,
-                       CachedFailuresPolicy.NO );
+    public void testPropagateErrorImmediatelyWithNotFoundThenSuccess()
+        throws Exception
+    {
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
 
-        // Attempt the proxy fetch.
-        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.STOP );
+
+        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2 );
+
+        simulateGetError( path, expectedFile, createResourceNotFoundException() );
 
-        assertFileEquals( expectedFile, downloadedFile, expectedFile );
-        assertNoTempFiles( expectedFile );
+        confirmSuccess( path, expectedFile, REPOPATH_PROXIED2 );
     }
 
-    /**
-     * <p>
-     * Request a file, that exists locally, and remotely.
-     * </p>
-     * <p>
-     * All policies are set to IGNORE.
-     * </p>
-     * <p>
-     * Managed file is newer than remote file.
-     * </p>
-     * <p>
-     * Transfer should not have occured, as managed file is newer.
-     * </p>
-     *
-     * @throws Exception
-     */
-    public void testGetDefaultLayoutAlreadyPresentNewerThanRemotePolicyIgnored()
+    public void testPropagateErrorAtEndWithErrorThenSuccess()
         throws Exception
     {
-        String path = "org/apache/maven/test/get-default-layout-present/1.0/get-default-layout-present-1.0.jar";
-        setupTestableManagedRepository( path );
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
 
-        File expectedFile = new File( managedDefaultDir, path );
-        File remoteFile = new File( REPOPATH_PROXIED1, path );
-        
-        // Set the managed File to be newer than local.
-        setManagedNewerThanRemote( expectedFile, remoteFile );
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.STOP );
 
-        long originalModificationTime = expectedFile.lastModified();
-        ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
+        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2 );
 
-        assertTrue( expectedFile.exists() );
+        simulateGetError( path, expectedFile, createTransferException() );
 
-        // Configure Connector (usually done within archiva.xml configuration)
-        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
-                       SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO );
+        confirmSingleFailure( path, ID_MOCKED_PROXIED1 );
+    }
 
-        // Attempt the proxy fetch.
-        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+    public void testPropagateErrorAtEndWithSuccessThenError()
+        throws Exception
+    {
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
 
-        assertNotDownloaded( downloadedFile );
-        assertNotModified( expectedFile, originalModificationTime );
-        assertNoTempFiles( expectedFile );
+        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1 );
+
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.QUEUE );
+
+        confirmSuccess( path, expectedFile, REPOPATH_PROXIED1 );
     }
-    
-    /**
-     * <p>
-     * Request a file, that exists locally, and remotely.
-     * </p>
-     * <p>
-     * All policies are set to IGNORE.
-     * </p>
-     * <p>
-     * Managed file is older than Remote file.
-     * </p>
-     * <p>
-     * Transfer should have occured, as managed file is older than remote.
-     * </p>
-     *
-     * @throws Exception
-     */
-    public void testGetDefaultLayoutAlreadyPresentOlderThanRemotePolicyIgnored()
+
+    public void testPropagateErrorAtEndWithNotFoundThenError()
         throws Exception
     {
-        String path = "org/apache/maven/test/get-default-layout-present/1.0/get-default-layout-present-1.0.jar";
-        setupTestableManagedRepository( path );
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
 
-        File expectedFile = new File( managedDefaultDir, path );
-        File remoteFile = new File( REPOPATH_PROXIED1, path );
-        
-        // Set the managed file to be newer than remote file.
-        setManagedOlderThanRemote( expectedFile, remoteFile );
-    
-        ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.QUEUE );
 
-        assertTrue( expectedFile.exists() );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.QUEUE );
 
-        // Configure Connector (usually done within archiva.xml configuration)
-        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
-                       SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO );
+        simulateGetError( path, expectedFile, createResourceNotFoundException() );
 
-        // Attempt the proxy fetch.
-        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+        simulateGetError( path, expectedFile, createTransferException() );
 
-        File proxiedFile = new File( REPOPATH_PROXIED1, path );
-        assertFileEquals( expectedFile, downloadedFile, proxiedFile );
-        assertNoTempFiles( expectedFile );
+        confirmSingleFailure( path, ID_MOCKED_PROXIED2 );
     }
 
-    /**
-     * The attempt here should result in file being transferred.
-     * <p/>
-     * The file exists locally, is over 6 years old, and the policy is DAILY.
-     *
-     * @throws Exception
-     */
-    public void testGetDefaultLayoutRemoteUpdate()
+    public void testPropagateErrorAtEndWithErrorThenNotFound()
         throws Exception
     {
-        String path = "org/apache/maven/test/get-default-layout-present/1.0/get-default-layout-present-1.0.jar";
-        setupTestableManagedRepository( path );
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
 
-        File expectedFile = new File( managedDefaultDir, path );
-        ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.QUEUE );
 
-        assertTrue( expectedFile.exists() );
-        expectedFile.setLastModified( getPastDate().getTime() );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.QUEUE );
 
-        // Configure Connector (usually done within archiva.xml configuration)
-        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.DAILY, SnapshotsPolicy.DAILY,
-                       CachedFailuresPolicy.NO );
+        simulateGetError( path, expectedFile, createTransferException() );
 
-        // Attempt the proxy fetch.
-        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+        simulateGetError( path, expectedFile, createResourceNotFoundException() );
 
-        File proxiedFile = new File( REPOPATH_PROXIED1, path );
-        assertFileEquals( expectedFile, downloadedFile, proxiedFile );
-        assertNoTempFiles( expectedFile );
+        confirmSingleFailure( path, ID_MOCKED_PROXIED1 );
     }
 
-    public void testGetWhenInBothProxiedRepos()
+    public void testPropagateErrorAtEndWithErrorThenError()
         throws Exception
     {
-        String path = "org/apache/maven/test/get-in-both-proxies/1.0/get-in-both-proxies-1.0.jar";
-        setupTestableManagedRepository( path );
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
 
-        File expectedFile = new File( managedDefaultDir, path );
-        ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.QUEUE );
 
-        assertNotExistsInManagedDefaultRepo( expectedFile );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.QUEUE );
 
-        // Configure Connector (usually done within archiva.xml configuration)
-        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1 );
-        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2 );
+        simulateGetError( path, expectedFile, createTransferException() );
 
-        // Attempt the proxy fetch.
-        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+        simulateGetError( path, expectedFile, createTransferException() );
 
-        File proxied1File = new File( REPOPATH_PROXIED1, path );
-        File proxied2File = new File( REPOPATH_PROXIED2, path );
-        assertFileEquals( expectedFile, downloadedFile, proxied1File );
-        assertNoTempFiles( expectedFile );
+        confirmFailures( path, new String[]{ID_MOCKED_PROXIED1, ID_MOCKED_PROXIED2} );
+    }
 
-        // TODO: is this check even needed if it passes above? 
-        String actualContents = FileUtils.readFileToString( downloadedFile, null );
-        String badContents = FileUtils.readFileToString( proxied2File, null );
-        assertFalse( "Downloaded file contents should not be that of proxy 2",
-                     StringUtils.equals( actualContents, badContents ) );
+    public void testPropagateErrorAtEndWithNotFoundThenSuccess()
+        throws Exception
+    {
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
+
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.QUEUE );
+
+        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2 );
+
+        simulateGetError( path, expectedFile, createResourceNotFoundException() );
+
+        confirmSuccess( path, expectedFile, REPOPATH_PROXIED2 );
     }
 
-    public void testGetInSecondProxiedRepo()
+    public void testIgnoreErrorWithErrorThenSuccess()
         throws Exception
     {
-        String path = "org/apache/maven/test/get-in-second-proxy/1.0/get-in-second-proxy-1.0.jar";
-        setupTestableManagedRepository( path );
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
+
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.IGNORE );
+
+        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2 );
+
+        simulateGetError( path, expectedFile, createTransferException() );
 
-        File expectedFile = new File( managedDefaultDir, path );
-        ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
+        confirmSuccess( path, expectedFile, REPOPATH_PROXIED2 );
+    }
 
-        assertNotExistsInManagedDefaultRepo( expectedFile );
+    public void testIgnoreErrorWithSuccessThenError()
+        throws Exception
+    {
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
 
-        // Configure Connector (usually done within archiva.xml configuration)
         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1 );
-        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2 );
 
-        // Attempt the proxy fetch.
-        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.IGNORE );
 
-        File proxied2File = new File( REPOPATH_PROXIED2, path );
-        assertFileEquals( expectedFile, downloadedFile, proxied2File );
-        assertNoTempFiles( expectedFile );
+        confirmSuccess( path, expectedFile, REPOPATH_PROXIED1 );
     }
 
-    public void testNotFoundInAnyProxies()
+    public void testIgnoreErrorWithNotFoundThenError()
         throws Exception
     {
-        String path = "org/apache/maven/test/does-not-exist/1.0/does-not-exist-1.0.jar";
-        setupTestableManagedRepository( path );
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
 
-        File expectedFile = new File( managedDefaultDir, path );
-        ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.IGNORE );
 
-        assertNotExistsInManagedDefaultRepo( expectedFile );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.IGNORE );
 
-        // Configure Connector (usually done within archiva.xml configuration)
-        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1 );
-        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2 );
-        saveConnector( ID_DEFAULT_MANAGED, ID_LEGACY_PROXIED );
+        simulateGetError( path, expectedFile, createResourceNotFoundException() );
 
-        // Attempt the proxy fetch.
-        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+        simulateGetError( path, expectedFile, createTransferException() );
 
-        assertNull( "File returned was: " + downloadedFile + "; should have got a not found exception",
-                    downloadedFile );
-        assertNoTempFiles( expectedFile );
+        confirmNotDownloadedNoError( path );
     }
 
-    public void testGetInSecondProxiedRepoFirstFails()
+    public void testIgnoreErrorWithErrorThenNotFound()
         throws Exception
     {
-        String path = "org/apache/maven/test/get-in-second-proxy/1.0/get-in-second-proxy-1.0.jar";
-        setupTestableManagedRepository( path );
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
 
-        File expectedFile = new File( managedDefaultDir, path );
-        ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.IGNORE );
 
-        assertNotExistsInManagedDefaultRepo( expectedFile );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.IGNORE );
 
-        // Configure Repository (usually done within archiva.xml configuration)
-        saveRemoteRepositoryConfig( "badproxied", "Bad Proxied", "test://bad.machine.com/repo/", "default" );
+        simulateGetError( path, expectedFile, createTransferException() );
 
-        wagonMock.get( path, new File( expectedFile.getAbsolutePath() + ".tmp" ) );
-        wagonMockControl.setThrowable( new ResourceDoesNotExistException( "transfer failed" ) );
-        wagonMockControl.replay();
+        simulateGetError( path, expectedFile, createResourceNotFoundException() );
 
-        // Configure Connector (usually done within archiva.xml configuration)
-        saveConnector( ID_DEFAULT_MANAGED, "badproxied" );
-        saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2 );
+        confirmNotDownloadedNoError( path );
+    }
 
-        // Attempt the proxy fetch.
-        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+    public void testIgnoreErrorWithErrorThenError()
+        throws Exception
+    {
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
 
-        wagonMockControl.verify();
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.IGNORE );
+
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.IGNORE );
 
-        File proxied2File = new File( REPOPATH_PROXIED2, path );
-        assertFileEquals( expectedFile, downloadedFile, proxied2File );
-        assertNoTempFiles( expectedFile );
+        simulateGetError( path, expectedFile, createTransferException() );
+
+        simulateGetError( path, expectedFile, createTransferException() );
+
+        confirmNotDownloadedNoError( path );
     }
 
-    public void testGetAllRepositoriesFail()
+    public void testPropagateOnUpdateAlwaysArtifactNotPresent()
         throws Exception
     {
-        String path = "org/apache/maven/test/get-in-second-proxy/1.0/get-in-second-proxy-1.0.jar";
-        setupTestableManagedRepository( path );
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
 
-        File expectedFile = new File( managedDefaultDir.getAbsoluteFile(), path );
-        ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.STOP,
+                                    PropagateErrorsOnUpdateDownloadPolicy.ALWAYS );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.STOP,
+                                    PropagateErrorsOnUpdateDownloadPolicy.ALWAYS );
 
-        assertNotExistsInManagedDefaultRepo( expectedFile );
+        simulateGetError( path, expectedFile, createTransferException() );
 
-        // Configure Repository (usually done within archiva.xml configuration)
-        saveRemoteRepositoryConfig( "badproxied1", "Bad Proxied 1", "test://bad.machine.com/repo/", "default" );
-        saveRemoteRepositoryConfig( "badproxied2", "Bad Proxied 2", "test://dead.machine.com/repo/", "default" );
+        confirmSingleFailure( path, ID_MOCKED_PROXIED1 );
+    }
 
-        // Configure Connector (usually done within archiva.xml configuration)
-        saveConnector( ID_DEFAULT_MANAGED, "badproxied1" );
-        saveConnector( ID_DEFAULT_MANAGED, "badproxied2" );
+    public void testPropagateOnUpdateAlwaysArtifactPresent()
+        throws Exception
+    {
+        String path = PATH_IN_BOTH_REMOTES_AND_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFilePresent( path );
 
-        File tmpFile = new File( expectedFile.getParentFile(), expectedFile.getName() + ".tmp" );
-        wagonMock.get( path, tmpFile );
-        wagonMockControl.setThrowable( new ResourceDoesNotExistException( "Can't find resource." ) );
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.STOP,
+                                    PropagateErrorsOnUpdateDownloadPolicy.ALWAYS );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.STOP,
+                                    PropagateErrorsOnUpdateDownloadPolicy.ALWAYS );
 
-        wagonMock.get( path, tmpFile );
-        wagonMockControl.setThrowable( new ResourceDoesNotExistException( "Can't find resource." ) );
+        simulateGetIfNewerError( path, expectedFile, createTransferException() );
 
-        wagonMockControl.replay();
+        confirmSingleFailure( path, ID_MOCKED_PROXIED1 );
+    }
 
-        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+    public void testPropagateOnUpdateAlwaysQueueArtifactNotPresent()
+        throws Exception
+    {
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
 
-        assertNotDownloaded( downloadedFile );
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.QUEUE,
+                                    PropagateErrorsOnUpdateDownloadPolicy.ALWAYS );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.QUEUE,
+                                    PropagateErrorsOnUpdateDownloadPolicy.ALWAYS );
 
-        wagonMockControl.verify();
-        assertNoTempFiles( expectedFile );
+        simulateGetError( path, expectedFile, createTransferException() );
+        simulateGetError( path, expectedFile, createTransferException() );
 
-        // TODO: do not want failures to present as a not found [MRM-492]
-        // TODO: How much information on each failure should we pass back to the user vs. logging in the proxy? 
+        confirmFailures( path, new String[] { ID_MOCKED_PROXIED1, ID_MOCKED_PROXIED2 } );
     }
 
-    public void testGetFromLegacyProxyAlreadyPresentInManaged_NewerThanRemote()
+    public void testPropagateOnUpdateAlwaysQueueArtifactPresent()
         throws Exception
     {
-        String legacyPath = "org.apache.maven.test/jars/get-default-layout-present-1.0.jar";
-        String path = "org/apache/maven/test/get-default-layout-present/1.0/get-default-layout-present-1.0.jar";
-        setupTestableManagedRepository( path );
+        String path = PATH_IN_BOTH_REMOTES_AND_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFilePresent( path );
+
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.QUEUE,
+                                    PropagateErrorsOnUpdateDownloadPolicy.ALWAYS );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.QUEUE,
+                                    PropagateErrorsOnUpdateDownloadPolicy.ALWAYS );
+
+        simulateGetIfNewerError( path, expectedFile, createTransferException() );
+        simulateGetIfNewerError( path, expectedFile, createTransferException() );
+
+        confirmFailures( path, new String[] { ID_MOCKED_PROXIED1, ID_MOCKED_PROXIED2 } );
+    }
+
+    public void testPropagateOnUpdateAlwaysIgnoreArtifactNotPresent()
+        throws Exception
+    {
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
+
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.IGNORE,
+                                    PropagateErrorsOnUpdateDownloadPolicy.ALWAYS );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.IGNORE,
+                                    PropagateErrorsOnUpdateDownloadPolicy.ALWAYS );
+
+        simulateGetError( path, expectedFile, createTransferException() );
+        simulateGetError( path, expectedFile, createTransferException() );
 
-        File expectedFile = new File( managedDefaultDir, path );
-        File remoteFile = new File( REPOPATH_PROXIED_LEGACY, legacyPath );
-        
-        // Set the managed file to be newer than remote.
-        setManagedNewerThanRemote( expectedFile, remoteFile );
-        long expectedTimestamp = expectedFile.lastModified();
-        
-        ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
-        
+        confirmNotDownloadedNoError( path );
+    }
+
+    public void testPropagateOnUpdateAlwaysIgnoreArtifactPresent()
+        throws Exception
+    {
+        String path = PATH_IN_BOTH_REMOTES_AND_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFilePresent( path );
+
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.IGNORE,
+                                    PropagateErrorsOnUpdateDownloadPolicy.ALWAYS );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.IGNORE,
+                                    PropagateErrorsOnUpdateDownloadPolicy.ALWAYS );
+
+        simulateGetIfNewerError( path, expectedFile, createTransferException() );
+        simulateGetIfNewerError( path, expectedFile, createTransferException() );
+
+        confirmNotDownloadedNoError( path );
         assertTrue( expectedFile.exists() );
+    }
 
-        // Configure Connector (usually done within archiva.xml configuration)
-        saveConnector( ID_DEFAULT_MANAGED, ID_LEGACY_PROXIED );
+    public void testPropagateOnUpdateNotPresentArtifactNotPresent()
+        throws Exception
+    {
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
 
-        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.STOP,
+                                    PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.STOP,
+                                    PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT );
 
-        assertNotDownloaded( downloadedFile );
-        assertNotModified( expectedFile, expectedTimestamp );
-        assertNoTempFiles( expectedFile );
+        simulateGetError( path, expectedFile, createTransferException() );
+
+        confirmSingleFailure( path, ID_MOCKED_PROXIED1 );
     }
-    
-    public void testGetFromLegacyProxyAlreadyPresentInManaged_OlderThanRemote()
+
+    public void testPropagateOnUpdateNotPresentArtifactPresent()
         throws Exception
     {
-        String legacyPath = "org.apache.maven.test/jars/get-default-layout-present-1.0.jar";
-        String path = "org/apache/maven/test/get-default-layout-present/1.0/get-default-layout-present-1.0.jar";
-        setupTestableManagedRepository( path );
+        String path = PATH_IN_BOTH_REMOTES_AND_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFilePresent( path );
+
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.STOP,
+                                    PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.STOP,
+                                    PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT );
 
-        File expectedFile = new File( managedDefaultDir, path );
-        File remoteFile = new File( REPOPATH_PROXIED_LEGACY, legacyPath );
+        simulateGetIfNewerError( path, expectedFile, createTransferException() );
+
+        confirmNotDownloadedNoError( path );
+        assertTrue( expectedFile.exists() );
+    }
+
+    public void testPropagateOnUpdateNotPresentQueueArtifactNotPresent()
+        throws Exception
+    {
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
 
-        // Set the managed file to be older than remote.
-        setManagedOlderThanRemote( expectedFile, remoteFile );
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.QUEUE,
+                                    PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.QUEUE,
+                                    PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT );
 
-        ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
+        simulateGetError( path, expectedFile, createTransferException() );
+        simulateGetError( path, expectedFile, createTransferException() );
 
+        confirmFailures( path, new String[] { ID_MOCKED_PROXIED1, ID_MOCKED_PROXIED2 } );
+    }
+
+    public void testPropagateOnUpdateNotPresentQueueArtifactPresent()
+        throws Exception
+    {
+        String path = PATH_IN_BOTH_REMOTES_AND_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFilePresent( path );
+
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.QUEUE,
+                                    PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.QUEUE,
+                                    PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT );
+
+        simulateGetIfNewerError( path, expectedFile, createTransferException() );
+        simulateGetIfNewerError( path, expectedFile, createTransferException() );
+
+        confirmNotDownloadedNoError( path );
         assertTrue( expectedFile.exists() );
+    }
+
+    public void testPropagateOnUpdateNotPresentIgnoreArtifactNotPresent()
+        throws Exception
+    {
+        String path = PATH_IN_BOTH_REMOTES_NOT_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFileNotPresent( path );
 
-        // Configure Connector (usually done within archiva.xml configuration)
-        saveConnector( ID_DEFAULT_MANAGED, ID_LEGACY_PROXIED );
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.IGNORE,
+                                    PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.IGNORE,
+                                    PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT );
 
-        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+        simulateGetError( path, expectedFile, createTransferException() );
+        simulateGetError( path, expectedFile, createTransferException() );
 
-        File proxiedFile = new File( REPOPATH_PROXIED_LEGACY, legacyPath );
-        assertFileEquals( expectedFile, downloadedFile, proxiedFile );
-        assertNoTempFiles( expectedFile );
+        confirmNotDownloadedNoError( path );
     }
 
-    public void testGetFromLegacyProxyNotPresentInManaged()
+    public void testPropagateOnUpdateNotPresentIgnoreArtifactPresent()
         throws Exception
     {
-        String legacyPath = "org.apache.maven.test/jars/example-lib-2.2.jar";
-        String path = "org/apache/maven/test/example-lib/2.2/example-lib-2.2.jar";
-        setupTestableManagedRepository( path );
+        String path = PATH_IN_BOTH_REMOTES_AND_LOCAL;
+        File expectedFile = setupRepositoriesWithLocalFilePresent( path );
 
-        File expectedFile = new File( managedDefaultDir, path );
-        ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
+        createMockedProxyConnector( ID_MOCKED_PROXIED1, NAME_MOCKED_PROXIED1, PropagateErrorsDownloadPolicy.IGNORE,
+                                    PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT );
+        createMockedProxyConnector( ID_MOCKED_PROXIED2, NAME_MOCKED_PROXIED2, PropagateErrorsDownloadPolicy.IGNORE,
+                                    PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT );
 
-        assertNotExistsInManagedDefaultRepo( expectedFile );
+        simulateGetIfNewerError( path, expectedFile, createTransferException() );
+        simulateGetIfNewerError( path, expectedFile, createTransferException() );
 
-        // Configure Connector (usually done within archiva.xml configuration)
-        saveConnector( ID_DEFAULT_MANAGED, ID_LEGACY_PROXIED );
+        confirmNotDownloadedNoError( path );
+        assertTrue( expectedFile.exists() );
+    }
+
+    // ------------------------------------------
+    // HELPER METHODS
+    // ------------------------------------------
 
-        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+    private void createMockedProxyConnector( String id, String name, String errorPolicy )
+    {
+        saveRemoteRepositoryConfig( id, name, "test://bad.machine.com/repo/", "default" );
+        saveConnector( ID_DEFAULT_MANAGED, id, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS, SnapshotsPolicy.ALWAYS,
+                       CachedFailuresPolicy.NO, errorPolicy );
+    }
 
-        File proxiedFile = new File( REPOPATH_PROXIED_LEGACY, legacyPath );
-        assertFileEquals( expectedFile, downloadedFile, proxiedFile );
-        assertNoTempFiles( expectedFile );
+    private void createMockedProxyConnector( String id, String name, String errorPolicy, String errorOnUpdatePolicy )
+    {
+        saveRemoteRepositoryConfig( id, name, "test://bad.machine.com/repo/", "default" );
+        saveConnector( ID_DEFAULT_MANAGED, id, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS, SnapshotsPolicy.ALWAYS,
+                       CachedFailuresPolicy.NO, errorPolicy, errorOnUpdatePolicy );
     }
 
-    public void testGetFromLegacyProxyPluginNotPresentInManaged()
+    private File setupRepositoriesWithLocalFileNotPresent( String path )
         throws Exception
     {
-        String legacyPath = "org.apache.maven.test/plugins/example-maven-plugin-0.42.jar";
-        String path = "org/apache/maven/test/example-maven-plugin/0.42/example-maven-plugin-0.42.jar";
         setupTestableManagedRepository( path );
 
-        File expectedFile = new File( managedDefaultDir, path );
-        ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
+        File file = new File( managedDefaultDir, path );
 
-        assertNotExistsInManagedDefaultRepo( expectedFile );
+        assertNotExistsInManagedDefaultRepo( file );
+
+        return file;
+    }
+
+    private File setupRepositoriesWithLocalFilePresent( String path )
+        throws Exception
+    {
+        setupTestableManagedRepository( path );
 
-        // Configure Connector (usually done within archiva.xml configuration)
-        saveConnector( ID_DEFAULT_MANAGED, ID_LEGACY_PROXIED );
+        File file = new File( managedDefaultDir, path );
 
-        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+        assertTrue( file.exists() );
 
-        File proxiedFile = new File( REPOPATH_PROXIED_LEGACY, legacyPath );
-        assertFileEquals( expectedFile, downloadedFile, proxiedFile );
-        assertNoTempFiles( expectedFile );
+        return file;
+    }
+
+    private void simulateGetError( String path, File expectedFile, Exception throwable )
+        throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
+    {
+        wagonMock.get( path, createExpectedTempFile( expectedFile ) );
+        wagonMockControl.setThrowable( throwable, 1 );
+    }
+
+    private void simulateGetIfNewerError( String path, File expectedFile, TransferFailedException exception )
+        throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
+    {
+        wagonMock.getIfNewer( path, createExpectedTempFile( expectedFile ), expectedFile.lastModified() );
+        wagonMockControl.setThrowable( exception, 1 );
+    }
+
+    private File createExpectedTempFile( File expectedFile )
+    {
+        return new File( expectedFile.getParentFile(), expectedFile.getName() + ".tmp" ).getAbsoluteFile();
+    }
+
+    private void confirmSingleFailure( String path, String id )
+        throws LayoutException
+    {
+        confirmFailures( path, new String[]{id} );
+    }
+
+    private void confirmFailures( String path, String[] ids )
+        throws LayoutException
+    {
+        wagonMockControl.replay();
+
+        // Attempt the proxy fetch.
+        File downloadedFile = null;
+        try
+        {
+            downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository,
+                                                            managedDefaultRepository.toArtifactReference( path ) );
+            fail( "Proxy should not have succeeded" );
+        }
+        catch ( ProxyDownloadException e )
+        {
+            assertEquals( ids.length, e.getFailures().size() );
+            for ( String id : ids )
+            {
+                assertTrue( e.getFailures().keySet().contains( id ) );
+            }
+        }
+
+        wagonMockControl.verify();
+
+        assertNotDownloaded( downloadedFile );
+    }
+
+    private void confirmSuccess( String path, File expectedFile, String basedir )
+        throws Exception
+    {
+        File downloadedFile = performDownload( path );
+
+        File proxied1File = new File( basedir, path );
+        assertFileEquals( expectedFile, downloadedFile, proxied1File );
+    }
+
+    private void confirmNotDownloadedNoError( String path )
+        throws Exception
+    {
+        File downloadedFile = performDownload( path );
+
+        assertNotDownloaded( downloadedFile );
+    }
+
+    private File performDownload( String path )
+        throws ProxyDownloadException, LayoutException
+    {
+        wagonMockControl.replay();
+
+        // Attempt the proxy fetch.
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository,
+                                                             managedDefaultRepository.toArtifactReference( path ) );
+
+        wagonMockControl.verify();
+        return downloadedFile;
+    }
+
+    private static TransferFailedException createTransferException()
+    {
+        return new TransferFailedException( "test download exception" );
+    }
+
+    private static ResourceDoesNotExistException createResourceNotFoundException()
+    {
+        return new ResourceDoesNotExistException( "test download not found" );
     }
-}
+}
\ No newline at end of file

Copied: archiva/branches/archiva-1.0.x/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/ErrorHandlingTest.xml (from r642429, archiva/branches/archiva-1.0.x/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/CacheFailuresTransferTest.xml)
URL: http://svn.apache.org/viewvc/archiva/branches/archiva-1.0.x/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/ErrorHandlingTest.xml?p2=archiva/branches/archiva-1.0.x/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/ErrorHandlingTest.xml&p1=archiva/branches/archiva-1.0.x/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/CacheFailuresTransferTest.xml&r1=642429&r2=644205&rev=644205&view=diff
==============================================================================
--- archiva/branches/archiva-1.0.x/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/CacheFailuresTransferTest.xml (original)
+++ archiva/branches/archiva-1.0.x/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/ErrorHandlingTest.xml Thu Apr  3 00:58:24 2008
@@ -73,6 +73,10 @@
           <field-name>postDownloadPolicies</field-name>
         </requirement>
         <requirement>
+          <role>org.apache.maven.archiva.policies.DownloadErrorPolicy</role>
+          <field-name>downloadErrorPolicies</field-name>
+        </requirement>
+        <requirement>
           <role>org.apache.maven.archiva.policies.urlcache.UrlFailureCache</role>
           <role-hint>default</role-hint>
           <field-name>urlFailureCache</field-name>

Modified: archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorFormAction.java
URL: http://svn.apache.org/viewvc/archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorFormAction.java?rev=644205&r1=644204&r2=644205&view=diff
==============================================================================
--- archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorFormAction.java (original)
+++ archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AbstractProxyConnectorFormAction.java Thu Apr  3 00:58:24 2008
@@ -22,7 +22,8 @@
 import com.opensymphony.xwork.Preparable;
 import org.apache.commons.lang.StringUtils;
 import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
-import org.apache.maven.archiva.policies.DownloadPolicy;
+import org.apache.maven.archiva.policies.DownloadErrorPolicy;
+import org.apache.maven.archiva.policies.Policy;
 import org.apache.maven.archiva.policies.PostDownloadPolicy;
 import org.apache.maven.archiva.policies.PreDownloadPolicy;
 
@@ -55,6 +56,11 @@
     private Map<String, PostDownloadPolicy> postDownloadPolicyMap;
 
     /**
+     * @plexus.requirement role="org.apache.maven.archiva.policies.DownloadErrorPolicy"
+     */
+    private Map<String, DownloadErrorPolicy> downloadErrorPolicyMap;
+
+    /**
      * The list of network proxy ids that are available.
      */
     private List<String> proxyIdOptions;
@@ -72,7 +78,7 @@
     /**
      * The map of policies that are available to be set.
      */
-    private Map<String, DownloadPolicy> policyMap;
+    private Map<String, Policy> policyMap;
 
     /**
      * The property key to add or remove.
@@ -185,7 +191,7 @@
         return pattern;
     }
 
-    public Map<String, DownloadPolicy> getPolicyMap()
+    public Map<String, Policy> getPolicyMap()
     {
         return policyMap;
     }
@@ -318,7 +324,7 @@
         this.pattern = pattern;
     }
 
-    public void setPolicyMap( Map<String, DownloadPolicy> policyMap )
+    public void setPolicyMap( Map<String, Policy> policyMap )
     {
         this.policyMap = policyMap;
     }
@@ -363,12 +369,13 @@
         return options;
     }
 
-    protected Map<String, DownloadPolicy> createPolicyMap()
+    protected Map<String, Policy> createPolicyMap()
     {
-        Map<String, DownloadPolicy> policyMap = new HashMap<String, DownloadPolicy>();
+        Map<String, Policy> policyMap = new HashMap<String, Policy>();
 
         policyMap.putAll( preDownloadPolicyMap );
         policyMap.putAll( postDownloadPolicyMap );
+        policyMap.putAll( downloadErrorPolicyMap );
 
         return policyMap;
     }
@@ -387,10 +394,10 @@
         else
         {
             // Validate / Fix policy settings arriving from browser.
-            for ( Map.Entry<String, DownloadPolicy> entry : getPolicyMap().entrySet() )
+            for ( Map.Entry<String, Policy> entry : getPolicyMap().entrySet() )
             {
-                String policyId = (String) entry.getKey();
-                DownloadPolicy policy = (DownloadPolicy) entry.getValue();
+                String policyId = entry.getKey();
+                Policy policy = entry.getValue();
                 List<String> options = policy.getOptions();
 
                 if ( !connector.getPolicies().containsKey( policyId ) )

Modified: archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/ProxiedDavServer.java
URL: http://svn.apache.org/viewvc/archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/ProxiedDavServer.java?rev=644205&r1=644204&r2=644205&view=diff
==============================================================================
--- archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/ProxiedDavServer.java (original)
+++ archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/ProxiedDavServer.java Thu Apr  3 00:58:24 2008
@@ -19,23 +19,11 @@
  * under the License.
  */
 
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletResponse;
-
 import org.apache.maven.archiva.common.utils.PathUtil;
 import org.apache.maven.archiva.model.ArtifactReference;
 import org.apache.maven.archiva.model.ProjectReference;
 import org.apache.maven.archiva.model.VersionedReference;
-import org.apache.maven.archiva.proxy.ProxyException;
+import org.apache.maven.archiva.policies.ProxyDownloadException;
 import org.apache.maven.archiva.proxy.RepositoryProxyConnectors;
 import org.apache.maven.archiva.repository.ManagedRepositoryContent;
 import org.apache.maven.archiva.repository.RepositoryContentFactory;
@@ -61,6 +49,17 @@
 import org.codehaus.plexus.webdav.servlet.DavServerRequest;
 import org.codehaus.plexus.webdav.util.WebdavMethodUtil;
 
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * ProxiedDavServer
  * 
@@ -365,7 +364,7 @@
         {
             /* eat it */
         }
-        catch ( ProxyException e )
+        catch ( ProxyDownloadException e )
         {
             throw new ServletException( "Unable to fetch artifact resource.", e );
         }
@@ -392,10 +391,6 @@
         {
             /* eat it */
         }
-        catch ( ProxyException e )
-        {
-            throw new ServletException( "Unable to fetch versioned metadata resource.", e );
-        }
 
         try
         {
@@ -410,10 +405,6 @@
         {
             /* eat it */
         }
-        catch ( ProxyException e )
-        {
-            throw new ServletException( "Unable to fetch project metadata resource.", e );
-        }
 
         return false;
     }
@@ -429,7 +420,7 @@
      * artifact.
      */
     protected void applyServerSideRelocation( ArtifactReference artifact )
-        throws ProxyException
+        throws ProxyDownloadException
     {
         if ( "pom".equals( artifact.getType() ) )
         {

Modified: archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/include/proxyConnectorForm.jspf
URL: http://svn.apache.org/viewvc/archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/include/proxyConnectorForm.jspf?rev=644205&r1=644204&r2=644205&view=diff
==============================================================================
--- archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/include/proxyConnectorForm.jspf (original)
+++ archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/include/proxyConnectorForm.jspf Thu Apr  3 00:58:24 2008
@@ -42,7 +42,7 @@
         <tr>
           <td>
             <ww:label for="policy_${policy.key}" required="true"
-                      theme="simple">${policy.key}:
+                      theme="simple">${policy.value.name}:
             </ww:label>
           </td>
           <td>

Modified: archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AddProxyConnectorActionTest.java
URL: http://svn.apache.org/viewvc/archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AddProxyConnectorActionTest.java?rev=644205&r1=644204&r2=644205&view=diff
==============================================================================
--- archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AddProxyConnectorActionTest.java (original)
+++ archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/AddProxyConnectorActionTest.java Thu Apr  3 00:58:24 2008
@@ -28,6 +28,8 @@
 import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration;
 import org.apache.maven.archiva.policies.CachedFailuresPolicy;
 import org.apache.maven.archiva.policies.ChecksumPolicy;
+import org.apache.maven.archiva.policies.PropagateErrorsDownloadPolicy;
+import org.apache.maven.archiva.policies.PropagateErrorsOnUpdateDownloadPolicy;
 import org.apache.maven.archiva.policies.ReleasesPolicy;
 import org.apache.maven.archiva.policies.SnapshotsPolicy;
 import org.apache.maven.archiva.web.action.AbstractWebworkTestCase;
@@ -36,6 +38,7 @@
 import org.easymock.MockControl;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * AddProxyConnectorActionTest 
@@ -390,10 +393,13 @@
         connector.setTargetRepoId( "central" );
 
         // TODO: Set these options programatically via list of available policies.
-        connector.getPolicies().put( "releases", new ReleasesPolicy().getDefaultOption() );
-        connector.getPolicies().put( "snapshots", new SnapshotsPolicy().getDefaultOption() );
-        connector.getPolicies().put( "checksum", new ChecksumPolicy().getDefaultOption() );
-        connector.getPolicies().put( "cache-failures", new CachedFailuresPolicy().getDefaultOption() );
+        Map<String, String> policies = connector.getPolicies();
+        policies.put( "releases", new ReleasesPolicy().getDefaultOption() );
+        policies.put( "snapshots", new SnapshotsPolicy().getDefaultOption() );
+        policies.put( "checksum", new ChecksumPolicy().getDefaultOption() );
+        policies.put( "cache-failures", new CachedFailuresPolicy().getDefaultOption() );
+        policies.put( "propagate-errors", new PropagateErrorsDownloadPolicy().getDefaultOption() );
+        policies.put( "propagate-errors-on-update", new PropagateErrorsOnUpdateDownloadPolicy().getDefaultOption() );
     }
 
     @Override

Modified: archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/EditProxyConnectorActionTest.java
URL: http://svn.apache.org/viewvc/archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/EditProxyConnectorActionTest.java?rev=644205&r1=644204&r2=644205&view=diff
==============================================================================
--- archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/EditProxyConnectorActionTest.java (original)
+++ archiva/branches/archiva-1.0.x/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/connectors/proxy/EditProxyConnectorActionTest.java Thu Apr  3 00:58:24 2008
@@ -28,6 +28,8 @@
 import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration;
 import org.apache.maven.archiva.policies.CachedFailuresPolicy;
 import org.apache.maven.archiva.policies.ChecksumPolicy;
+import org.apache.maven.archiva.policies.PropagateErrorsDownloadPolicy;
+import org.apache.maven.archiva.policies.PropagateErrorsOnUpdateDownloadPolicy;
 import org.apache.maven.archiva.policies.ReleasesPolicy;
 import org.apache.maven.archiva.policies.SnapshotsPolicy;
 import org.apache.maven.archiva.web.action.AbstractWebworkTestCase;
@@ -36,6 +38,7 @@
 import org.easymock.MockControl;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * EditProxyConnectorActionTest 
@@ -395,10 +398,13 @@
         connector.setTargetRepoId( TEST_TARGET_ID );
         
         // TODO: Set these options programatically via list of available policies.
-        connector.getPolicies().put( "releases", new ReleasesPolicy().getDefaultOption() );
-        connector.getPolicies().put( "snapshots", new SnapshotsPolicy().getDefaultOption() );
-        connector.getPolicies().put( "checksum", new ChecksumPolicy().getDefaultOption() );
-        connector.getPolicies().put( "cache-failures", new CachedFailuresPolicy().getDefaultOption() );
+        Map<String, String> policies = connector.getPolicies();
+        policies.put( "releases", new ReleasesPolicy().getDefaultOption() );
+        policies.put( "snapshots", new SnapshotsPolicy().getDefaultOption() );
+        policies.put( "checksum", new ChecksumPolicy().getDefaultOption() );
+        policies.put( "cache-failures", new CachedFailuresPolicy().getDefaultOption() );
+        policies.put( "propagate-errors", new PropagateErrorsDownloadPolicy().getDefaultOption() );
+        policies.put( "propagate-errors-on-update", new PropagateErrorsOnUpdateDownloadPolicy().getDefaultOption() );
 
         config.addProxyConnector( connector );