You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by jo...@apache.org on 2007/04/16 02:49:29 UTC

svn commit: r529106 [1/3] - in /maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy: ./ src/main/java/org/apache/maven/archiva/proxy/ src/main/java/org/apache/maven/archiva/proxy/policy/ src/test/java/org/apache/maven/archi...

Author: joakime
Date: Sun Apr 15 17:49:27 2007
New Revision: 529106

URL: http://svn.apache.org/viewvc?view=rev&rev=529106
Log:
* Expanding Proxy / Policy tests.

Added:
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/CacheFailuresTransferTest.java   (with props)
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ChecksumTransferTest.java   (with props)
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ManagedDefaultTransferTest.java   (with props)
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ManagedLegacyTransferTest.java   (with props)
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/MetadataTransferTest.java   (with props)
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/MockConfiguration.java   (with props)
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/RelocateTransferTest.java
      - copied, changed from r528579, maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/RepositoryProxyConnectorsTest.java
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/SnapshotTransferTest.java   (with props)
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/resources/log4j.xml   (with props)
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/CacheFailuresTransferTest.xml   (with props)
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/ChecksumTransferTest.xml   (with props)
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/ManagedDefaultTransferTest.xml   (with props)
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/ManagedLegacyTransferTest.xml   (with props)
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/MetadataTransferTest.xml   (with props)
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/SnapshotTransferTest.xml   (with props)
Removed:
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/policy/
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ProxyRequestHandlerTest.java
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/RepositoryProxyConnectorsTest.java
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/ProxyRequestHandlerTest.xml
Modified:
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/pom.xml
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnector.java
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/RepositoryProxyConnectors.java
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java
    maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/WagonDelegate.java

Modified: maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/pom.xml
URL: http://svn.apache.org/viewvc/maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/pom.xml?view=diff&rev=529106&r1=529105&r2=529106
==============================================================================
--- maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/pom.xml (original)
+++ maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/pom.xml Sun Apr 15 17:49:27 2007
@@ -38,9 +38,12 @@
       <artifactId>archiva-repository-layer</artifactId>
     </dependency>
     <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+    </dependency>
+    <dependency>
       <groupId>org.apache.maven.wagon</groupId>
       <artifactId>wagon-file</artifactId>
-      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.maven.wagon</groupId>
@@ -57,8 +60,17 @@
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-slf4j-logging</artifactId>
+      <version>1.1-alpha-1-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <version>1.2</version>
+      <scope>test</scope>
     </dependency>
+    
   </dependencies>
 </project>

Modified: maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java
URL: http://svn.apache.org/viewvc/maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java?view=diff&rev=529106&r1=529105&r2=529106
==============================================================================
--- maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java (original)
+++ maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java Sun Apr 15 17:49:27 2007
@@ -19,22 +19,21 @@
  * under the License.
  */
 
-import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.io.FileUtils;
-import org.apache.maven.archiva.common.utils.VersionUtil;
 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
 import org.apache.maven.archiva.configuration.NetworkProxyConfiguration;
+import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
 import org.apache.maven.archiva.configuration.RepositoryConfiguration;
-import org.apache.maven.archiva.configuration.RepositoryProxyConnectorConfiguration;
 import org.apache.maven.archiva.model.ArchivaRepository;
 import org.apache.maven.archiva.model.ArtifactReference;
 import org.apache.maven.archiva.model.ProjectReference;
-import org.apache.maven.archiva.proxy.policy.PostfetchPolicy;
-import org.apache.maven.archiva.proxy.policy.PrefetchPolicy;
+import org.apache.maven.archiva.policies.DownloadPolicy;
+import org.apache.maven.archiva.policies.urlcache.UrlFailureCache;
 import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayout;
 import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayoutFactory;
 import org.apache.maven.archiva.repository.layout.LayoutException;
 import org.apache.maven.wagon.ConnectionException;
+import org.apache.maven.wagon.ResourceDoesNotExistException;
 import org.apache.maven.wagon.Wagon;
 import org.apache.maven.wagon.WagonException;
 import org.apache.maven.wagon.authentication.AuthenticationException;
@@ -50,11 +49,14 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Properties;
+import java.util.Map.Entry;
 
 /**
  * DefaultRepositoryProxyConnectors 
@@ -86,14 +88,19 @@
     private BidirectionalRepositoryLayoutFactory layoutFactory;
 
     /**
-     * @plexus.requirement role="checksum"
+     * @plexus.requirement role="org.apache.maven.archiva.policies.PreDownloadPolicy"
      */
-    private PrefetchPolicy checksumPolicy;
+    private Map preDownloadPolicies;
 
     /**
-     * @plexus.requirement role="artifact-update"
+     * @plexus.requirement role="org.apache.maven.archiva.policies.PostDownloadPolicy"
      */
-    private PostfetchPolicy updatePolicy;
+    private Map postDownloadPolicies;
+
+    /**
+     * @plexus.requirement role-hint="default"
+     */
+    private UrlFailureCache urlFailureCache;
 
     private Map proxyConnectorMap = new HashMap();
 
@@ -101,7 +108,7 @@
 
     private List propertyNameTriggers = new ArrayList();
 
-    public boolean fetchFromProxies( ArchivaRepository repository, ArtifactReference artifact )
+    public File fetchFromProxies( ArchivaRepository repository, ArtifactReference artifact )
         throws ProxyException
     {
         if ( !repository.isManaged() )
@@ -122,36 +129,41 @@
                 + e.getMessage(), e );
         }
 
-        boolean isSnapshot = VersionUtil.isSnapshot( artifact.getVersion() );
+        Properties requestProperties = new Properties();
+        requestProperties.setProperty( "version", artifact.getVersion() );
 
         List connectors = getProxyConnectors( repository );
         Iterator it = connectors.iterator();
         while ( it.hasNext() )
         {
             ProxyConnector connector = (ProxyConnector) it.next();
+            getLogger().debug( "Attempting connector: " + connector );
             ArchivaRepository targetRepository = connector.getTargetRepository();
             try
             {
                 BidirectionalRepositoryLayout targetLayout = layoutFactory.getLayout( targetRepository.getLayoutType() );
                 String targetPath = targetLayout.toPath( artifact );
 
-                if ( transferFile( connector, targetRepository, targetPath, localFile, isSnapshot ) )
+                File downloadedFile = transferFile( connector, targetRepository, targetPath, localFile,
+                                                    requestProperties );
+
+                if ( fileExists( downloadedFile ) )
                 {
-                    // Transfer was successful.  return.
-                    return true;
+                    getLogger().info( "Successfully transfered: " + downloadedFile.getAbsolutePath() );
+                    return downloadedFile;
                 }
             }
             catch ( LayoutException e )
             {
                 getLogger().error( "Unable to proxy due to bad layout definition: " + e.getMessage(), e );
-                return false;
+                return null;
             }
         }
 
-        return false;
+        return null;
     }
 
-    public boolean fetchFromProxies( ArchivaRepository repository, ProjectReference metadata )
+    public File fetchFromProxies( ArchivaRepository repository, ProjectReference metadata )
         throws ProxyException
     {
         if ( !repository.isManaged() )
@@ -172,6 +184,8 @@
                 + e.getMessage(), e );
         }
 
+        Properties requestProperties = new Properties();
+
         List connectors = getProxyConnectors( repository );
         Iterator it = connectors.iterator();
         while ( it.hasNext() )
@@ -183,20 +197,43 @@
                 BidirectionalRepositoryLayout targetLayout = layoutFactory.getLayout( targetRepository.getLayoutType() );
                 String targetPath = targetLayout.toPath( metadata ) + FILENAME_MAVEN_METADATA;
 
-                if ( transferFile( connector, targetRepository, targetPath, localFile, false ) )
+                File downloadedFile = transferFile( connector, targetRepository, targetPath, localFile,
+                                                    requestProperties );
+
+                if ( fileExists( downloadedFile ) )
                 {
-                    // Transfer was successful.  return.
-                    return true;
+                    getLogger().info( "Successfully transfered: " + downloadedFile.getAbsolutePath() );
+                    return downloadedFile;
                 }
             }
             catch ( LayoutException e )
             {
                 getLogger().error( "Unable to proxy due to bad layout definition: " + e.getMessage(), e );
-                return false;
+                return null;
             }
         }
 
-        return false;
+        return null;
+    }
+
+    private boolean fileExists( File file )
+    {
+        if ( file == null )
+        {
+            return false;
+        }
+
+        if ( !file.exists() )
+        {
+            return false;
+        }
+
+        if ( !file.isFile() )
+        {
+            return false;
+        }
+
+        return true;
     }
 
     /**
@@ -206,39 +243,38 @@
      * @param targetRepository
      * @param targetPath
      * @param localFile
-     * @param isSnapshot
+     * @param requestProperties
      * @return
      * @throws ProxyException 
      */
-    private boolean transferFile( ProxyConnector connector, ArchivaRepository targetRepository, String targetPath,
-                                  File localFile, boolean isSnapshot )
+    private File transferFile( ProxyConnector connector, ArchivaRepository targetRepository, String targetPath,
+                               File localFile, Properties requestProperties )
         throws ProxyException
     {
-        if ( isSnapshot )
-        {
-            // Handle Snapshot Policy
-            if ( !updatePolicy.applyPolicy( connector.getSnapshotsPolicy(), localFile ) )
-            {
-                return false;
-            }
-        }
-        else
+        String url = targetRepository.getUrl().toString() + targetPath;
+        requestProperties.setProperty( "url", url );
+
+        // Handle pre-download policy
+        if ( !applyPolicies( connector.getPolicies(), this.preDownloadPolicies, requestProperties, localFile ) )
         {
-            // Handle Release Policy
-            if ( !updatePolicy.applyPolicy( connector.getReleasesPolicy(), localFile ) )
+            getLogger().info( "Failed pre-download policies - " + localFile.getAbsolutePath() );
+
+            if ( fileExists( localFile ) )
             {
-                return false;
+                return localFile;
             }
+
+            return null;
         }
 
         // Is a whitelist defined?
-        if ( CollectionUtils.isNotEmpty( connector.getWhitelist() ) )
+        if ( !isEmpty( connector.getWhitelist() ) )
         {
             // Path must belong to whitelist.
             if ( !matchesPattern( targetPath, connector.getWhitelist() ) )
             {
                 getLogger().debug( "Path [" + targetPath + "] is not part of defined whitelist (skipping transfer)." );
-                return false;
+                return null;
             }
         }
 
@@ -246,17 +282,12 @@
         if ( matchesPattern( targetPath, connector.getBlacklist() ) )
         {
             getLogger().debug( "Path [" + targetPath + "] is part of blacklist (skipping transfer)." );
-            return false;
+            return null;
         }
 
-        // Transfer the file.
         Wagon wagon = null;
-
         try
         {
-            File temp = new File( localFile.getAbsolutePath() + ".tmp" );
-            temp.deleteOnExit();
-
             String protocol = targetRepository.getUrl().getProtocol();
             wagon = (Wagon) wagons.get( protocol );
             if ( wagon == null )
@@ -267,43 +298,166 @@
             boolean connected = connectToRepository( connector, wagon, targetRepository );
             if ( connected )
             {
-                if ( localFile.exists() )
+                localFile = transferSimpleFile( wagon, targetRepository, targetPath, localFile );
+
+                transferChecksum( wagon, targetRepository, targetPath, localFile, ".sha1" );
+                transferChecksum( wagon, targetRepository, targetPath, localFile, ".md5" );
+            }
+        }
+        catch ( ResourceDoesNotExistException e )
+        {
+            // Do not cache url here.
+            return null;
+        }
+        catch ( WagonException e )
+        {
+            urlFailureCache.cacheFailure( url );
+            return null;
+        }
+        finally
+        {
+            if ( wagon != null )
+            {
+                try
                 {
-                    getLogger().debug( "Retrieving " + targetPath + " from " + targetRepository.getName() );
-                    wagon.get( targetPath, temp );
+                    wagon.disconnect();
                 }
-                else
+                catch ( ConnectionException e )
                 {
-                    getLogger().debug(
-                                       "Retrieving " + targetPath + " from " + targetRepository.getName()
-                                           + " if updated" );
-                    wagon.getIfNewer( targetPath, temp, localFile.lastModified() );
+                    getLogger().warn( "Unable to disconnect wagon.", e );
                 }
+            }
+        }
+
+        // Handle post-download policies.
+        if ( !applyPolicies( connector.getPolicies(), this.postDownloadPolicies, requestProperties, localFile ) )
+        {
+            getLogger().info( "Failed post-download policies - " + localFile.getAbsolutePath() );
+
+            if ( fileExists( localFile ) )
+            {
+                return localFile;
+            }
+
+            return null;
+        }
+
+        // Everything passes.
+        return localFile;
+    }
+
+    private void transferChecksum( Wagon wagon, ArchivaRepository targetRepository, String targetPath, File localFile,
+                                   String type )
+        throws ProxyException
+    {
+        String url = targetRepository.getUrl().toString() + targetPath;
+
+        // Transfer checksum does not use the policy. 
+        if ( urlFailureCache.hasFailedBefore( url + type ) )
+        {
+            return;
+        }
+
+        try
+        {
+            File hashFile = new File( localFile.getAbsolutePath() + type );
+            transferSimpleFile( wagon, targetRepository, targetPath + type, hashFile );
+            getLogger().debug( "Checksum" + type + " Downloaded: " + hashFile );
+        }
+        catch ( ResourceDoesNotExistException e )
+        {
+            getLogger().debug( "Checksum" + type + " Not Download: " + e.getMessage() );
+        }
+        catch ( WagonException e )
+        {
+            urlFailureCache.cacheFailure( url + type );
+            getLogger().warn( "Transfer failed on checksum: " + url + " : " + e.getMessage(), e );
+        }
+    }
+
+    private File transferSimpleFile( Wagon wagon, ArchivaRepository targetRepository, String targetPath, File localFile )
+        throws ProxyException, WagonException
+    {
+        // Transfer the file.
+        File temp = null;
+
+        try
+        {
+            temp = new File( localFile.getAbsolutePath() + ".tmp" );
+
+            boolean success = false;
+
+            if ( localFile.exists() )
+            {
+                getLogger().debug( "Retrieving " + targetPath + " from " + targetRepository.getName() );
+                wagon.get( targetPath, temp );
+                success = true;
 
-                // temp won't exist if we called getIfNewer and it was older, but its still a successful return
                 if ( temp.exists() )
                 {
                     moveTempToTarget( temp, localFile );
                 }
-                else
+
+                // You wouldn't get here on failure, a WagonException would have been thrown.
+                getLogger().debug( "Downloaded successfully." );
+            }
+            else
+            {
+                getLogger().debug( "Retrieving " + targetPath + " from " + targetRepository.getName() + " if updated" );
+                success = wagon.getIfNewer( targetPath, temp, localFile.lastModified() );
+                if ( !success )
                 {
                     getLogger().debug(
-                                       "Attempt to retrieving " + targetPath + " from " + targetRepository.getName()
-                                           + " failed: local file does not exist." );
-                    return false;
+                                       "Not downloaded, as local file is newer than remote side: "
+                                           + localFile.getAbsolutePath() );
+                }
+                else if ( temp.exists() )
+                {
+                    getLogger().debug( "Downloaded successfully." );
+                    moveTempToTarget( temp, localFile );
                 }
-
-                getLogger().debug( "Successfully downloaded" );
             }
+
+            return localFile;
+        }
+        catch ( ResourceDoesNotExistException e )
+        {
+            getLogger().warn( "Resource does not exist: " + e.getMessage() );
+            throw e;
         }
         catch ( WagonException e )
         {
             getLogger().warn( "Download failure:" + e.getMessage(), e );
-            return false;
+            throw e;
         }
+        finally
+        {
+            if ( temp != null )
+            {
+                temp.delete();
+            }
+        }
+    }
 
-        // Handle checksum Policy.
-        return checksumPolicy.applyPolicy( connector.getChecksumPolicy(), localFile );
+    private boolean applyPolicies( Properties policySettings, Map downloadPolicies, Properties request, File localFile )
+    {
+        Iterator it = downloadPolicies.entrySet().iterator();
+        while ( it.hasNext() )
+        {
+            Map.Entry entry = (Entry) it.next();
+            String key = (String) entry.getKey();
+            DownloadPolicy policy = (DownloadPolicy) entry.getValue();
+            String defaultSetting = policy.getDefaultPolicySetting();
+            String setting = policySettings.getProperty( key, defaultSetting );
+
+            getLogger().debug( "Applying [" + key + "] policy with [" + setting + "]" );
+            if ( !policy.applyPolicy( setting, request, localFile ) )
+            {
+                getLogger().debug( "Didn't pass the [" + key + "] policy." );
+                return false;
+            }
+        }
+        return true;
     }
 
     /**
@@ -378,7 +532,7 @@
 
     private boolean matchesPattern( String path, List patterns )
     {
-        if ( CollectionUtils.isEmpty( patterns ) )
+        if ( isEmpty( patterns ) )
         {
             return false;
         }
@@ -442,20 +596,18 @@
             it = proxyConfigs.iterator();
             while ( it.hasNext() )
             {
-                RepositoryProxyConnectorConfiguration proxyConfig = (RepositoryProxyConnectorConfiguration) it.next();
+                ProxyConnectorConfiguration proxyConfig = (ProxyConnectorConfiguration) it.next();
                 String key = proxyConfig.getSourceRepoId();
 
                 // Create connector object.
                 ProxyConnector connector = new ProxyConnector();
                 connector.setSourceRepository( getRepository( proxyConfig.getSourceRepoId() ) );
                 connector.setTargetRepository( getRepository( proxyConfig.getTargetRepoId() ) );
-                connector.setSnapshotsPolicy( proxyConfig.getSnapshotsPolicy() );
-                connector.setReleasesPolicy( proxyConfig.getReleasesPolicy() );
-                connector.setChecksumPolicy( proxyConfig.getChecksumPolicy() );
+                connector.setPolicies( proxyConfig.getPolicies() );
 
                 // Copy any blacklist patterns.
                 List blacklist = new ArrayList();
-                if ( !CollectionUtils.isEmpty( proxyConfig.getBlackListPatterns() ) )
+                if ( !isEmpty( proxyConfig.getBlackListPatterns() ) )
                 {
                     blacklist.addAll( proxyConfig.getBlackListPatterns() );
                 }
@@ -463,7 +615,7 @@
 
                 // Copy any whitelist patterns.
                 List whitelist = new ArrayList();
-                if ( !CollectionUtils.isEmpty( proxyConfig.getWhiteListPatterns() ) )
+                if ( !isEmpty( proxyConfig.getWhiteListPatterns() ) )
                 {
                     whitelist.addAll( proxyConfig.getWhiteListPatterns() );
                 }
@@ -507,6 +659,16 @@
                 this.networkProxyMap.put( key, proxy );
             }
         }
+    }
+
+    private boolean isEmpty( Collection collection )
+    {
+        if ( collection == null )
+        {
+            return true;
+        }
+
+        return collection.isEmpty();
     }
 
     private ArchivaRepository getRepository( String repoId )

Modified: maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnector.java
URL: http://svn.apache.org/viewvc/maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnector.java?view=diff&rev=529106&r1=529105&r2=529106
==============================================================================
--- maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnector.java (original)
+++ maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/ProxyConnector.java Sun Apr 15 17:49:27 2007
@@ -22,7 +22,9 @@
 import org.apache.maven.archiva.model.ArchivaRepository;
 import org.apache.maven.archiva.repository.connector.RepositoryConnector;
 
+import java.util.Enumeration;
 import java.util.List;
+import java.util.Properties;
 
 /**
  * This represents a connector for a repository to repository proxy.
@@ -41,14 +43,10 @@
 
     private List whitelist;
 
-    private String snapshotsPolicy;
-
-    private String releasesPolicy;
-
-    private String checksumPolicy;
-    
     private String proxyId;
 
+    private Properties policies;
+
     public List getBlacklist()
     {
         return blacklist;
@@ -89,43 +87,50 @@
         this.whitelist = whitelist;
     }
 
-    public String getChecksumPolicy()
+    public Properties getPolicies()
     {
-        return checksumPolicy;
+        return policies;
     }
 
-    public void setChecksumPolicy( String failurePolicy )
+    public void setPolicies( Properties policies )
     {
-        this.checksumPolicy = failurePolicy;
+        this.policies = policies;
     }
 
-    public String getReleasesPolicy()
+    public String getProxyId()
     {
-        return releasesPolicy;
+        return proxyId;
     }
 
-    public void setReleasesPolicy( String releasesPolicy )
+    public void setProxyId( String proxyId )
     {
-        this.releasesPolicy = releasesPolicy;
+        this.proxyId = proxyId;
     }
 
-    public String getSnapshotsPolicy()
+    public String toString()
     {
-        return snapshotsPolicy;
-    }
+        StringBuffer sb = new StringBuffer();
 
-    public void setSnapshotsPolicy( String snapshotsPolicy )
-    {
-        this.snapshotsPolicy = snapshotsPolicy;
-    }
+        sb.append( "ProxyConnector[\n" );
+        sb.append( "  source:" ).append( this.sourceRepository ).append( "\n" );
+        sb.append( "  target:" ).append( this.targetRepository ).append( "\n" );
+        sb.append( "  proxyId:" ).append( this.proxyId ).append( "\n" );
 
-    public String getProxyId()
-    {
-        return proxyId;
+        Enumeration keys = this.policies.propertyNames();
+        while ( keys.hasMoreElements() )
+        {
+            String name = (String) keys.nextElement();
+            sb.append( "  policy[" ).append( name ).append( "]:" );
+            sb.append( this.policies.getProperty( name ) ).append( "\n" );
+        }
+
+        sb.append( "]" );
+
+        return sb.toString();
     }
 
-    public void setProxyId( String proxyId )
+    public void setPolicy( String policyId, String policySetting )
     {
-        this.proxyId = proxyId;
+        // TODO Auto-generated method stub
     }
 }

Modified: maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/RepositoryProxyConnectors.java
URL: http://svn.apache.org/viewvc/maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/RepositoryProxyConnectors.java?view=diff&rev=529106&r1=529105&r2=529106
==============================================================================
--- maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/RepositoryProxyConnectors.java (original)
+++ maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/RepositoryProxyConnectors.java Sun Apr 15 17:49:27 2007
@@ -23,6 +23,7 @@
 import org.apache.maven.archiva.model.ArtifactReference;
 import org.apache.maven.archiva.model.ProjectReference;
 
+import java.io.File;
 import java.util.List;
 
 /**
@@ -45,7 +46,7 @@
      * @return true if the fetch operation succeeded in obtaining content, false if no content was obtained.
      * @throws ProxyException if there was a problem fetching the content from the target repositories.
      */
-    public boolean fetchFromProxies( ArchivaRepository repository, ArtifactReference artifact )
+    public File fetchFromProxies( ArchivaRepository repository, ArtifactReference artifact )
         throws ProxyException;
     
     /**
@@ -60,7 +61,7 @@
      * @return true if the fetch operation succeeded in obtaining content, false if no content was obtained.
      * @throws ProxyException if there was a problem fetching the content from the target repositories.
      */
-    public boolean fetchFromProxies( ArchivaRepository repository, ProjectReference metadata )
+    public File fetchFromProxies( ArchivaRepository repository, ProjectReference metadata )
         throws ProxyException;
 
     /**

Modified: maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java
URL: http://svn.apache.org/viewvc/maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java?view=diff&rev=529106&r1=529105&r2=529106
==============================================================================
--- maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java (original)
+++ maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java Sun Apr 15 17:49:27 2007
@@ -20,10 +20,32 @@
  */
 
 import org.apache.commons.io.FileUtils;
+import org.apache.maven.archiva.common.utils.PathUtil;
+import org.apache.maven.archiva.configuration.ArchivaConfiguration;
+import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
+import org.apache.maven.archiva.configuration.RepositoryConfiguration;
+import org.apache.maven.archiva.model.ArchivaArtifact;
+import org.apache.maven.archiva.model.ArchivaRepository;
+import org.apache.maven.archiva.model.ArtifactReference;
+import org.apache.maven.archiva.model.ProjectReference;
+import org.apache.maven.archiva.policies.urlcache.UrlFailureCache;
+import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayout;
+import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayoutFactory;
+import org.apache.maven.archiva.repository.layout.LayoutException;
+import org.apache.maven.wagon.Wagon;
 import org.codehaus.plexus.PlexusTestCase;
+import org.easymock.MockControl;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.FileReader;
 import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.Locale;
 
 /**
  * AbstractProxyTestCase 
@@ -34,6 +56,144 @@
 public class AbstractProxyTestCase
     extends PlexusTestCase
 {
+    protected static final String ID_LEGACY_PROXIED = "legacy-proxied";
+
+    protected static final String ID_PROXIED1 = "proxied1";
+
+    protected static final String ID_PROXIED2 = "proxied2";
+
+    protected static final String ID_DEFAULT_MANAGED = "default-managed-repository";
+
+    protected static final String ID_LEGACY_MANAGED = "legacy-managed-repository";
+
+    protected static final String REPOPATH_PROXIED_LEGACY = "src/test/repositories/legacy-proxied";
+
+    protected static final String REPOPATH_PROXIED1 = "src/test/repositories/proxied1";
+
+    protected static final String REPOPATH_PROXIED2 = "src/test/repositories/proxied2";
+
+    protected static final String REPOPATH_DEFAULT_MANAGED = "src/test/repositories/managed";
+
+    protected static final String REPOPATH_DEFAULT_MANAGED_TARGET = "target/test-repository/managed";
+
+    protected static final String REPOPATH_LEGACY_MANAGED = "src/test/repositories/legacy-managed";
+
+    protected static final String REPOPATH_LEGACY_MANAGED_TARGET = "target/test-repository/legacy-managed";
+
+    protected MockControl wagonMockControl;
+
+    protected Wagon wagonMock;
+
+    protected RepositoryProxyConnectors proxyHandler;
+
+    protected ArchivaRepository managedDefaultRepository;
+
+    protected File managedDefaultDir;
+
+    protected ArchivaRepository managedLegacyRepository;
+
+    protected File managedLegacyDir;
+    
+    protected BidirectionalRepositoryLayoutFactory layoutFactory;
+
+    protected MockConfiguration config;
+
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+
+        layoutFactory = (BidirectionalRepositoryLayoutFactory) lookup( BidirectionalRepositoryLayoutFactory.class
+                                                                       .getName() );
+        
+        config = (MockConfiguration) lookup( ArchivaConfiguration.class.getName(), "mock" );
+        RepositoryConfiguration repoConfig;
+
+        // Setup source repository (using default layout)
+        File repoLocation = getTestFile( REPOPATH_DEFAULT_MANAGED_TARGET );
+        // faster only to delete this one before copying, the others are done case by case
+        FileUtils.deleteDirectory( new File( repoLocation, "org/apache/maven/test/get-merged-metadata" ) );
+        copyDirectoryStructure( getTestFile( REPOPATH_DEFAULT_MANAGED ), repoLocation );
+
+        managedDefaultRepository = createRepository( ID_DEFAULT_MANAGED, "Default Managed Repository",
+                                                     REPOPATH_DEFAULT_MANAGED_TARGET, "default" );
+
+        managedDefaultDir = new File( managedDefaultRepository.getUrl().getPath() );
+
+        repoConfig = createRepoConfig( managedDefaultRepository );
+
+        config.getConfiguration().addRepository( repoConfig );
+
+        // Setup source repository (using legacy layout)
+        repoLocation = getTestFile( REPOPATH_LEGACY_MANAGED_TARGET );
+        FileUtils.deleteDirectory( repoLocation );
+        copyDirectoryStructure( getTestFile( REPOPATH_LEGACY_MANAGED ), repoLocation );
+
+        managedLegacyRepository = createRepository( ID_LEGACY_MANAGED, "Legacy Managed Repository",
+                                                    REPOPATH_LEGACY_MANAGED_TARGET, "legacy" );
+
+        managedLegacyDir = new File( managedLegacyRepository.getUrl().getPath() );
+
+        repoConfig = createRepoConfig( managedLegacyRepository );
+
+        config.getConfiguration().addRepository( repoConfig );
+
+        // Setup target (proxied to) repository.
+        saveRepositoryConfig( ID_PROXIED1, "Proxied Repository 1", REPOPATH_PROXIED1, "default" );
+
+        // Setup target (proxied to) repository.
+        saveRepositoryConfig( ID_PROXIED2, "Proxied Repository 2", REPOPATH_PROXIED2, "default" );
+
+        // Setup target (proxied to) repository using legacy layout.
+        saveRepositoryConfig( ID_LEGACY_PROXIED, "Proxied Legacy Repository", REPOPATH_PROXIED_LEGACY, "legacy" );
+
+        // Setup the proxy handler.
+        proxyHandler = (RepositoryProxyConnectors) lookup( RepositoryProxyConnectors.class.getName() );
+
+        // Setup the wagon mock.
+        wagonMockControl = MockControl.createNiceControl( Wagon.class );
+        wagonMock = (Wagon) wagonMockControl.getMock();
+        WagonDelegate delegate = (WagonDelegate) lookup( Wagon.ROLE, "test" );
+        delegate.setDelegate( wagonMock );
+
+        System.out.println( "\n.\\ " + getName() + "() \\._________________________________________\n" );
+    }
+    
+    protected void saveRepositoryConfig( String id, String name, String path, String layout )
+    {
+        RepositoryConfiguration repoConfig = new RepositoryConfiguration();
+
+        repoConfig.setId( id );
+        repoConfig.setName( name );
+
+        if ( path.indexOf( "://" ) > 0 )
+        {
+            repoConfig.setUrl( path );
+        }
+        else
+        {
+            repoConfig.setUrl( PathUtil.toUrl( path ) );
+        }
+        repoConfig.setLayout( layout );
+
+        config.getConfiguration().addRepository( repoConfig );
+        config.triggerChange( "repository", "" );
+    }
+
+    protected void assertFileEquals( File expectedFile, File actualFile, File sourceFile )
+        throws Exception
+    {
+        assertNotNull( "Expected File should not be null.", expectedFile );
+        assertNotNull( "Actual File should not be null.", actualFile );
+
+        assertTrue( "Check file exists.", actualFile.exists() );
+        assertEquals( "Check file path matches.", expectedFile.getAbsolutePath(), actualFile.getAbsolutePath() );
+
+        String expectedContents = FileUtils.readFileToString( sourceFile, null );
+        String actualContents = FileUtils.readFileToString( actualFile, null );
+        assertEquals( "Check file contents.", expectedContents, actualContents );
+    }
+
     /**
      * A faster recursive copy that omits .svn directories.
      *
@@ -42,7 +202,7 @@
      * @throws java.io.IOException if there is a copying problem
      * @todo get back into plexus-utils, share with converter module
      */
-    private static void copyDirectoryStructure( File sourceDirectory, File destDirectory )
+    protected void copyDirectoryStructure( File sourceDirectory, File destDirectory )
         throws IOException
     {
         if ( !sourceDirectory.exists() )
@@ -78,8 +238,8 @@
                 {
                     if ( !destination.exists() && !destination.mkdirs() )
                     {
-                        throw new IOException(
-                            "Could not create destination directory '" + destination.getAbsolutePath() + "'." );
+                        throw new IOException( "Could not create destination directory '"
+                            + destination.getAbsolutePath() + "'." );
                     }
 
                     copyDirectoryStructure( file, destination );
@@ -90,5 +250,180 @@
                 throw new IOException( "Unknown file type: " + file.getAbsolutePath() );
             }
         }
+    }
+
+    protected ArtifactReference createArtifactReference( String layoutType, String path )
+        throws Exception
+    {
+        BidirectionalRepositoryLayout layout = layoutFactory.getLayout( layoutType );
+        ArchivaArtifact artifact = layout.toArtifact( path );
+        ArtifactReference ref = new ArtifactReference();
+        ref.setGroupId( artifact.getGroupId() );
+        ref.setArtifactId( artifact.getArtifactId() );
+        ref.setVersion( artifact.getVersion() );
+        ref.setClassifier( artifact.getClassifier() );
+        ref.setType( artifact.getType() );
+        return ref;
+    }
+
+    protected ProjectReference createMetadataReference( String layoutType, String path )
+        throws Exception
+    {
+        BidirectionalRepositoryLayout layout = layoutFactory.getLayout( layoutType );
+        ProjectReference metadata = layout.toProjectReference( path );
+        return metadata;
+    }
+
+    protected ArchivaRepository createManagedLegacyRepository()
+    {
+        return createRepository( "src/test/repositories/legacy-managed", "testManagedLegacyRepo",
+                                 "Test Managed (Legacy) Repository", "legacy" );
+    }
+
+    protected ArchivaRepository createProxiedLegacyRepository()
+    {
+        return createRepository( "src/test/repositories/legacy-proxied", "testProxiedLegacyRepo",
+                                 "Test Proxied (Legacy) Repository", "legacy" );
+    }
+
+    protected RepositoryConfiguration createRepoConfig( ArchivaRepository repo )
+    {
+        return createRepoConfig( repo.getId(), repo.getName(), repo.getUrl().toString(), repo.getLayoutType() );
+    }
+
+    protected RepositoryConfiguration createRepoConfig( String id, String name, String path, String layout )
+    {
+        RepositoryConfiguration repoConfig = new RepositoryConfiguration();
+
+        repoConfig.setId( id );
+        repoConfig.setName( name );
+
+        repoConfig.setUrl( PathUtil.toUrl( path ) );
+        repoConfig.setLayout( layout );
+
+        return repoConfig;
+    }
+
+    protected ArchivaRepository createRepository( String id, String name, String path, String layout )
+    {
+        ArchivaRepository repo = new ArchivaRepository( id, name, PathUtil.toUrl( path ) );
+        repo.getModel().setLayoutName( layout );
+
+        return repo;
+    }
+
+    protected void saveConnector( String sourceRepoId, String targetRepoId, String checksumPolicy,
+                                  String releasePolicy, String snapshotPolicy, String cacheFailuresPolicy )
+    {
+        ProxyConnectorConfiguration connectorConfig = new ProxyConnectorConfiguration();
+        connectorConfig.setSourceRepoId( sourceRepoId );
+        connectorConfig.setTargetRepoId( targetRepoId );
+        connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_CHECKSUM, checksumPolicy );
+        connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_RELEASES, releasePolicy );
+        connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_SNAPSHOTS, snapshotPolicy );
+        connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_CACHE_FAILURES, cacheFailuresPolicy );
+
+        config.getConfiguration().addProxyConnector( connectorConfig );
+        config.triggerChange( "proxyConnector", "" );
+    }
+
+    protected UrlFailureCache lookupUrlFailureCache()
+        throws Exception
+    {
+        UrlFailureCache failurlCache = (UrlFailureCache) lookup( UrlFailureCache.class.getName(), "default" );
+        assertNotNull( "URL Failure Cache cannot be null.", failurlCache );
+        return failurlCache;
+    }
+
+    protected void assertNoTempFiles( File expectedFile )
+    {
+        File workingDir = expectedFile.getParentFile();
+        if ( ( workingDir == null ) || !workingDir.isDirectory() )
+        {
+            return;
+        }
+
+        Collection tmpFiles = FileUtils.listFiles( workingDir, new String[] { "tmp" }, false );
+        if ( !tmpFiles.isEmpty() )
+        {
+            StringBuffer emsg = new StringBuffer();
+            emsg.append( "Found Temp Files in dir: " ).append( workingDir.getPath() );
+            Iterator it = tmpFiles.iterator();
+            while ( it.hasNext() )
+            {
+                File tfile = (File) it.next();
+                emsg.append( "\n   " ).append( tfile.getName() );
+            }
+            fail( emsg.toString() );
+        }
+    }
+
+    /**
+     * Read the first line from the checksum file, and return it (trimmed).
+     */
+    protected String readChecksumFile( File checksumFile )
+        throws Exception
+    {
+        FileReader freader = null;
+        BufferedReader buf = null;
+
+        try
+        {
+            freader = new FileReader( checksumFile );
+            buf = new BufferedReader( freader );
+            return buf.readLine();
+        }
+        finally
+        {
+            if ( buf != null )
+            {
+                buf.close();
+            }
+
+            if ( freader != null )
+            {
+                freader.close();
+            }
+        }
+    }
+
+    protected void assertChecksums( File expectedFile, String expectedSha1Contents, String expectedMd5Contents )
+        throws Exception
+    {
+        File sha1File = new File( expectedFile.getAbsolutePath() + ".sha1" );
+        File md5File = new File( expectedFile.getAbsolutePath() + ".md5" );
+
+        if ( expectedSha1Contents == null )
+        {
+            assertFalse( "SHA1 File should NOT exist: " + sha1File.getPath(), sha1File.exists() );
+        }
+        else
+        {
+            assertTrue( "SHA1 File should exist: " + sha1File.getPath(), sha1File.exists() );
+            String actualSha1Contents = readChecksumFile( sha1File );
+            assertEquals( "SHA1 File contents: " + sha1File.getPath(), expectedSha1Contents, actualSha1Contents );
+        }
+
+        if ( expectedMd5Contents == null )
+        {
+            assertFalse( "MD5 File should NOT exist: " + md5File.getPath(), md5File.exists() );
+        }
+        else
+        {
+            assertTrue( "MD5 File should exist: " + md5File.getPath(), md5File.exists() );
+            String actualMd5Contents = readChecksumFile( md5File );
+            assertEquals( "MD5 File contents: " + md5File.getPath(), expectedMd5Contents, actualMd5Contents );
+        }
+    }
+
+    protected void assertNotDownloaded( File downloadedFile )
+    {
+        assertNull( "Found file: " + downloadedFile + "; but was expecting a failure", downloadedFile );
+    }
+
+    protected static Date getPastDate()
+        throws ParseException
+    {
+        return new SimpleDateFormat( "yyyy-MM-dd", Locale.US ).parse( "2000-01-01" );
     }
 }

Added: maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/CacheFailuresTransferTest.java
URL: http://svn.apache.org/viewvc/maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/CacheFailuresTransferTest.java?view=auto&rev=529106
==============================================================================
--- maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/CacheFailuresTransferTest.java (added)
+++ maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/CacheFailuresTransferTest.java Sun Apr 15 17:49:27 2007
@@ -0,0 +1,140 @@
+package org.apache.maven.archiva.proxy;
+
+/*
+ * 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 org.apache.maven.archiva.common.utils.PathUtil;
+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.ReleasesPolicy;
+import org.apache.maven.archiva.policies.SnapshotsPolicy;
+import org.apache.maven.archiva.policies.urlcache.UrlFailureCache;
+import org.apache.maven.wagon.TransferFailedException;
+
+import java.io.File;
+
+/**
+ * CacheFailuresTransferTest 
+ *
+ * @author Brett Porter
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class CacheFailuresTransferTest
+    extends AbstractProxyTestCase
+{
+    public void testGetWithCacheFailuresOn()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-in-second-proxy/1.0/get-in-second-proxy-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        expectedFile.delete();
+        assertFalse( expectedFile.exists() );
+
+        // Configure Repository (usually done within archiva.xml configuration)
+        saveRepositoryConfig( "badproxied1", "Bad Proxied 1", "test://bad.machine.com/repo/", "default" );
+        saveRepositoryConfig( "badproxied2", "Bad Proxied 2", "test://bad.machine.com/repo/", "default" );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "badproxied1", ChecksumPolicy.FIX, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.CACHED );
+        saveConnector( ID_DEFAULT_MANAGED, "badproxied2", ChecksumPolicy.FIX, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.CACHED );
+
+        wagonMock.getIfNewer( path, new File( expectedFile.getParentFile(), expectedFile.getName() + ".tmp" ), 0 );
+        TransferFailedException failedException = new TransferFailedException( "transfer failed" );
+        wagonMockControl.setThrowable( failedException );
+
+        wagonMockControl.replay();
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        assertNotDownloaded( downloadedFile );
+
+        wagonMockControl.verify();
+        assertNoTempFiles( expectedFile );
+    }
+
+    public void testGetWithCacheFailuresOff()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-in-second-proxy/1.0/get-in-second-proxy-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        expectedFile.delete();
+        assertFalse( expectedFile.exists() );
+
+        // Configure Repository (usually done within archiva.xml configuration)
+        saveRepositoryConfig( "badproxied1", "Bad Proxied 1", "test://bad.machine.com/repo/", "default" );
+        saveRepositoryConfig( "badproxied2", "Bad Proxied 2", "test://bad.machine.com/repo/", "default" );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "badproxied1", ChecksumPolicy.FIX, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+        saveConnector( ID_DEFAULT_MANAGED, "badproxied2", ChecksumPolicy.FIX, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        wagonMock.getIfNewer( path, new File( expectedFile.getParentFile(), expectedFile.getName() + ".tmp" ), 0 );
+        TransferFailedException failedException = new TransferFailedException( "transfer failed" );
+        wagonMockControl.setThrowable( failedException );
+
+        wagonMockControl.replay();
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        assertNotDownloaded( downloadedFile );
+
+        wagonMockControl.verify();
+        assertNoTempFiles( expectedFile );
+    }
+
+    public void testGetWhenInBothProxiedButFirstCacheFailure()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-in-second-proxy/1.0/get-in-second-proxy-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        expectedFile.delete();
+        assertFalse( expectedFile.exists() );
+
+        String url = PathUtil.toUrl( REPOPATH_PROXIED1 + "/" + path );
+
+        // Intentionally set failure on url in proxied1 (for test)
+        UrlFailureCache failurlCache = lookupUrlFailureCache();
+        failurlCache.cacheFailure( url );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FIX, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.CACHED );
+        saveConnector( ID_DEFAULT_MANAGED, "proxied2", ChecksumPolicy.FIX, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.CACHED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        // Validate that file actually came from proxied2 (as intended).
+        File proxied2File = new File( REPOPATH_PROXIED2, path );
+        assertFileEquals( expectedFile, downloadedFile, proxied2File );
+        assertNoTempFiles( expectedFile );
+    }
+}

Propchange: maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/CacheFailuresTransferTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/CacheFailuresTransferTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/CacheFailuresTransferTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ChecksumTransferTest.java
URL: http://svn.apache.org/viewvc/maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ChecksumTransferTest.java?view=auto&rev=529106
==============================================================================
--- maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ChecksumTransferTest.java (added)
+++ maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ChecksumTransferTest.java Sun Apr 15 17:49:27 2007
@@ -0,0 +1,459 @@
+package org.apache.maven.archiva.proxy;
+
+/*
+ * 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 org.apache.commons.io.FileUtils;
+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.ReleasesPolicy;
+import org.apache.maven.archiva.policies.SnapshotsPolicy;
+import org.apache.maven.wagon.TransferFailedException;
+
+import java.io.File;
+
+/**
+ * ChecksumTransferTest 
+ *
+ * @author Brett Porter
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class ChecksumTransferTest
+    extends AbstractProxyTestCase
+{
+    public void testGetChecksumBothCorrect()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-checksum-both-right/1.0/get-checksum-both-right-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        FileUtils.deleteDirectory( expectedFile.getParentFile() );
+        assertFalse( expectedFile.exists() );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.IGNORED, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        File proxied1File = new File( REPOPATH_PROXIED1, path );
+        assertFileEquals( expectedFile, downloadedFile, proxied1File );
+        assertNoTempFiles( expectedFile );
+        assertChecksums( expectedFile, "066d76e459f7782c312c31e8a11b3c0f1e3e43a7 *get-checksum-both-right-1.0.jar",
+                         "e58f30c6a150a2e843552438d18e15cb *get-checksum-both-right-1.0.jar" );
+    }
+
+    public void testGetChecksumCorrectSha1NoMd5()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-checksum-sha1-only/1.0/get-checksum-sha1-only-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        FileUtils.deleteDirectory( expectedFile.getParentFile() );
+        assertFalse( expectedFile.exists() );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.IGNORED, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        File proxied1File = new File( REPOPATH_PROXIED1, path );
+        assertFileEquals( expectedFile, downloadedFile, proxied1File );
+        assertNoTempFiles( expectedFile );
+        assertChecksums( expectedFile, "748a3a013bf5eacf2bbb40a2ac7d37889b728837 *get-checksum-sha1-only-1.0.jar", null );
+    }
+
+    public void testGetChecksumNoSha1CorrectMd5()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-checksum-md5-only/1.0/get-checksum-md5-only-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        FileUtils.deleteDirectory( expectedFile.getParentFile() );
+        assertFalse( expectedFile.exists() );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.IGNORED, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        File proxied1File = new File( REPOPATH_PROXIED1, path );
+        assertFileEquals( expectedFile, downloadedFile, proxied1File );
+        assertNoTempFiles( expectedFile );
+        assertChecksums( expectedFile, null, "f3af5201bf8da801da37db8842846e1c *get-checksum-md5-only-1.0.jar" );
+    }
+
+    public void testGetWithNoChecksumsUsingIgnoredSetting()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-default-layout/1.0/get-default-layout-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        FileUtils.deleteDirectory( expectedFile.getParentFile() );
+        assertFalse( expectedFile.exists() );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.IGNORED, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        File proxied1File = new File( REPOPATH_PROXIED1, path );
+        assertFileEquals( expectedFile, downloadedFile, proxied1File );
+        assertNoTempFiles( expectedFile );
+        assertChecksums( expectedFile, null, null );
+    }
+
+    public void testGetChecksumBadSha1BadMd5IgnoredSetting()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-checksum-both-bad/1.0/get-checksum-both-bad-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        FileUtils.deleteDirectory( expectedFile.getParentFile() );
+        assertFalse( expectedFile.exists() );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.IGNORED, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        File proxied1File = new File( REPOPATH_PROXIED1, path );
+        assertFileEquals( expectedFile, downloadedFile, proxied1File );
+        assertNoTempFiles( expectedFile );
+        assertChecksums( expectedFile, "invalid checksum file", "invalid checksum file" );
+    }
+
+    public void testGetChecksumBadSha1BadMd5FailSetting()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-checksum-both-bad/1.0/get-checksum-both-bad-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        FileUtils.deleteDirectory( expectedFile.getParentFile() );
+        assertFalse( expectedFile.exists() );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FAIL, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        assertNotDownloaded( downloadedFile );
+        assertChecksums( expectedFile, null, null );
+    }
+
+    public void testGetChecksumBadSha1BadMd5FixSetting()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-checksum-both-bad/1.0/get-checksum-both-bad-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        FileUtils.deleteDirectory( expectedFile.getParentFile() );
+        assertFalse( expectedFile.exists() );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FIX, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        File proxied1File = new File( REPOPATH_PROXIED1, path );
+        assertFileEquals( expectedFile, downloadedFile, proxied1File );
+        assertNoTempFiles( expectedFile );
+        assertChecksums( expectedFile, "4ec20a12dc91557330bd0b39d1805be5e329ae56  get-checksum-both-bad-1.0.jar",
+                         "a292491a35925465e693a44809a078b5  get-checksum-both-bad-1.0.jar" );
+    }
+
+    public void testGetChecksumCorrectSha1BadMd5UsingFailSetting()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-checksum-sha1-bad-md5/1.0/get-checksum-sha1-bad-md5-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        FileUtils.deleteDirectory( expectedFile.getParentFile() );
+        assertFalse( expectedFile.exists() );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FAIL, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        assertNotDownloaded( downloadedFile );
+        assertChecksums( expectedFile, null, null );
+    }
+
+    public void testGetChecksumNoSha1CorrectMd5UsingFailSetting()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-checksum-md5-only/1.0/get-checksum-md5-only-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        FileUtils.deleteDirectory( expectedFile.getParentFile() );
+        assertFalse( expectedFile.exists() );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FAIL, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        // This is a success situation. No SHA1 with a Good MD5.
+        File proxied1File = new File( REPOPATH_PROXIED1, path );
+        assertFileEquals( expectedFile, downloadedFile, proxied1File );
+        assertNoTempFiles( expectedFile );
+        assertChecksums( expectedFile, null, "f3af5201bf8da801da37db8842846e1c *get-checksum-md5-only-1.0.jar" );
+    }
+
+    public void testGetWithNoChecksumsUsingFailSetting()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-default-layout/1.0/get-default-layout-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        FileUtils.deleteDirectory( expectedFile.getParentFile() );
+        assertFalse( expectedFile.exists() );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FAIL, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        assertNotDownloaded( downloadedFile );
+        assertChecksums( expectedFile, null, null );
+    }
+
+    public void testGetChecksumCorrectSha1BadMd5UsingIgnoredSetting()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-checksum-sha1-bad-md5/1.0/get-checksum-sha1-bad-md5-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        FileUtils.deleteDirectory( expectedFile.getParentFile() );
+        assertFalse( expectedFile.exists() );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.IGNORED, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        File proxied1File = new File( REPOPATH_PROXIED1, path );
+        assertFileEquals( expectedFile, downloadedFile, proxied1File );
+        assertNoTempFiles( expectedFile );
+        assertChecksums( expectedFile, "3dd1a3a57b807d3ef3fbc6013d926c891cbb8670 *get-checksum-sha1-bad-md5-1.0.jar",
+                         "invalid checksum file" );
+    }
+
+    public void testGetChecksumCorrectSha1BadMd5UsingFixSetting()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-checksum-sha1-bad-md5/1.0/get-checksum-sha1-bad-md5-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        FileUtils.deleteDirectory( expectedFile.getParentFile() );
+        assertFalse( expectedFile.exists() );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FIX, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        File proxied1File = new File( REPOPATH_PROXIED1, path );
+        assertFileEquals( expectedFile, downloadedFile, proxied1File );
+        assertNoTempFiles( expectedFile );
+        assertChecksums( expectedFile, "3dd1a3a57b807d3ef3fbc6013d926c891cbb8670 *get-checksum-sha1-bad-md5-1.0.jar",
+                         "c35f3b76268b73a4ba617f6f275c49ab  get-checksum-sha1-bad-md5-1.0.jar" );
+    }
+
+    public void testGetChecksumNoSha1CorrectMd5UsingFixSetting()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-checksum-md5-only/1.0/get-checksum-md5-only-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        FileUtils.deleteDirectory( expectedFile.getParentFile() );
+        assertFalse( expectedFile.exists() );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FIX, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        File proxied1File = new File( REPOPATH_PROXIED1, path );
+        assertFileEquals( expectedFile, downloadedFile, proxied1File );
+        assertNoTempFiles( expectedFile );
+        assertChecksums( expectedFile, "71f7dc3f72053a3f2d9fdd6fef9db055ef957ffb  get-checksum-md5-only-1.0.jar",
+                         "f3af5201bf8da801da37db8842846e1c *get-checksum-md5-only-1.0.jar" );
+    }
+
+    public void testGetWithNoChecksumsUsingFixSetting()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-default-layout/1.0/get-default-layout-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        FileUtils.deleteDirectory( expectedFile.getParentFile() );
+        assertFalse( expectedFile.exists() );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FIX, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        File proxied1File = new File( REPOPATH_PROXIED1, path );
+        assertFileEquals( expectedFile, downloadedFile, proxied1File );
+        assertNoTempFiles( expectedFile );
+        assertChecksums( expectedFile, "1f12821c5e43e1a0b76b9564a6ddb0548ccb9486  get-default-layout-1.0.jar",
+                         "3f7341545f21226b6f49a3c2704cb9be  get-default-layout-1.0.jar" );
+    }
+
+    public void testGetChecksumTransferFailed()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-checksum-sha1-only/1.0/get-checksum-sha1-only-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        FileUtils.deleteDirectory( expectedFile.getParentFile() );
+        assertFalse( expectedFile.getParentFile().exists() );
+        assertFalse( expectedFile.exists() );
+
+        saveRepositoryConfig( "badproxied", "Bad Proxied", "test://bad.machine.com/repo/", "default" );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "badproxied", ChecksumPolicy.IGNORED, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        wagonMock.getIfNewer( path, new File( expectedFile.getAbsolutePath() + ".tmp" ), 0 );
+        wagonMockControl.setReturnValue( true );
+        wagonMock.getIfNewer( path + ".sha1", new File( expectedFile.getAbsolutePath() + ".sha1.tmp" ), 0 );
+        wagonMockControl.setReturnValue( true );
+        wagonMock.getIfNewer( path + ".md5", new File( expectedFile.getAbsolutePath() + ".md5.tmp" ), 0 );
+        wagonMockControl.setThrowable( new TransferFailedException( "transfer failed" ) );
+        wagonMockControl.replay();
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        wagonMockControl.verify();
+
+        // Do what the mock doesn't do.
+        String proxyPath = new File( REPOPATH_PROXIED1, path ).getAbsolutePath();
+        String localPath = new File( managedDefaultDir, path ).getAbsolutePath();
+        FileUtils.copyFile( new File( proxyPath ), new File( localPath ) );
+        FileUtils.copyFile( new File( proxyPath + ".sha1" ), new File( localPath + ".sha1" ) );
+
+        // Test results.
+        File proxied1File = new File( REPOPATH_PROXIED1, path );
+        assertFileEquals( expectedFile, downloadedFile, proxied1File );
+        assertNoTempFiles( expectedFile );
+        assertChecksums( expectedFile, "748a3a013bf5eacf2bbb40a2ac7d37889b728837 *get-checksum-sha1-only-1.0.jar", null );
+    }
+
+    public void testGetAlwaysBadChecksumPresentLocallyAbsentRemoteUsingIgnoredSetting()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-bad-local-checksum/1.0/get-bad-local-checksum-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        assertTrue( expectedFile.exists() );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.IGNORED, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        File proxied1File = new File( REPOPATH_PROXIED1, path );
+        assertFileEquals( expectedFile, downloadedFile, proxied1File );
+        assertNoTempFiles( expectedFile );
+        // There are no hashcodes on the proxy side to download, hence the local ones should remain invalid.
+        assertChecksums( expectedFile, "invalid checksum file", "invalid checksum file" );
+    }
+
+    public void testGetAlwaysBadChecksumPresentLocallyAbsentRemoteUsingFailSetting()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-bad-local-checksum/1.0/get-bad-local-checksum-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        assertTrue( expectedFile.exists() );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FAIL, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        assertNotDownloaded( downloadedFile );
+        assertNoTempFiles( expectedFile );
+        // There are no hashcodes on the proxy side to download.
+        // The FAIL policy will delete the checksums as bad.
+        assertChecksums( expectedFile, null, null );
+    }
+
+    public void testGetAlwaysBadChecksumPresentLocallyAbsentRemoteUsingFixSetting()
+        throws Exception
+    {
+        String path = "org/apache/maven/test/get-bad-local-checksum/1.0/get-bad-local-checksum-1.0.jar";
+        File expectedFile = new File( managedDefaultDir, path );
+        ArtifactReference artifact = createArtifactReference( "default", path );
+
+        assertTrue( expectedFile.exists() );
+
+        // Configure Connector (usually done within archiva.xml configuration)
+        saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FIX, ReleasesPolicy.IGNORED,
+                       SnapshotsPolicy.IGNORED, CachedFailuresPolicy.IGNORED );
+
+        File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
+
+        File proxied1File = new File( REPOPATH_PROXIED1, path );
+        assertFileEquals( expectedFile, downloadedFile, proxied1File );
+        assertNoTempFiles( expectedFile );
+        assertChecksums( expectedFile, "96a08dc80a108cba8efd3b20aec91b32a0b2cbd4  get-bad-local-checksum-1.0.jar",
+                         "46fdd6ca55bf1d7a7eb0c858f41e0ccd  get-bad-local-checksum-1.0.jar" );
+    }
+
+}

Propchange: maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ChecksumTransferTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ChecksumTransferTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/branches/archiva-jpox-database-refactor/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/ChecksumTransferTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain