[MRESOLVER-115] Make checksum algorithms configurable

This closes #53
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java
index d8dff28..0372758 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java
@@ -22,6 +22,7 @@
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Arrays;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -45,6 +46,9 @@
 {
 
     static final String CONFIG_PROP_SIGNATURE_CHECKSUMS = "aether.checksums.forSignature";
+    static final String CONFIG_PROP_CHECKSUMS_ALGORITHMS = "aether.checksums.algorithms";
+
+    static final String DEFAULT_CHECKSUMS_ALGORITHMS = "SHA-512,SHA-256,SHA-1,MD5";
 
     private float priority;
 
@@ -73,14 +77,24 @@
             throw new NoRepositoryLayoutException( repository );
         }
         boolean forSignature = ConfigUtils.getBoolean( session, false, CONFIG_PROP_SIGNATURE_CHECKSUMS );
-        return forSignature ? Maven2RepositoryLayout.INSTANCE : Maven2RepositoryLayoutEx.INSTANCE;
+        List<String> checksumsAlgorithms = Arrays.asList( ConfigUtils.getString( session,
+                DEFAULT_CHECKSUMS_ALGORITHMS, CONFIG_PROP_CHECKSUMS_ALGORITHMS ).split( "," ) );
+
+        return forSignature
+                ? new Maven2RepositoryLayout( checksumsAlgorithms )
+                : new Maven2RepositoryLayoutEx( checksumsAlgorithms );
     }
 
     private static class Maven2RepositoryLayout
         implements RepositoryLayout
     {
 
-        public static final RepositoryLayout INSTANCE = new Maven2RepositoryLayout();
+        private final List<String> checksumsAlgorithms;
+
+        protected Maven2RepositoryLayout( List<String> checksumsAlgorithms )
+        {
+            this.checksumsAlgorithms = checksumsAlgorithms;
+        }
 
         private URI toUri( String path )
         {
@@ -155,10 +169,12 @@
 
         private List<Checksum> getChecksums( URI location )
         {
-            return Arrays.asList( Checksum.forLocation( location, "SHA-512" ),
-                                  Checksum.forLocation( location, "SHA-256" ),
-                                  Checksum.forLocation( location, "SHA-1" ),
-                                  Checksum.forLocation( location, "MD5" ) );
+            List<Checksum> checksums = new ArrayList<>( checksumsAlgorithms.size() );
+            for ( String algorithm : checksumsAlgorithms )
+            {
+                checksums.add( Checksum.forLocation( location, algorithm ) );
+            }
+            return checksums;
         }
 
     }
@@ -167,7 +183,10 @@
         extends Maven2RepositoryLayout
     {
 
-        public static final RepositoryLayout INSTANCE = new Maven2RepositoryLayoutEx();
+        protected Maven2RepositoryLayoutEx( List<String> checksumsAlgorithms )
+        {
+            super( checksumsAlgorithms );
+        }
 
         @Override
         public List<Checksum> getChecksums( Artifact artifact, boolean upload, URI location )
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactoryTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactoryTest.java
index 4d14cb0..bbf67cd 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactoryTest.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactoryTest.java
@@ -22,6 +22,7 @@
 import static org.junit.Assert.*;
 
 import java.net.URI;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Locale;
 
@@ -162,6 +163,19 @@
     }
 
     @Test
+    public void testArtifactChecksums_DownloadWithCustomAlgorithms() throws NoRepositoryLayoutException
+    {
+        session.setConfigProperty( Maven2RepositoryLayoutFactory.CONFIG_PROP_CHECKSUMS_ALGORITHMS, "SHA-256,SHA-1");
+        layout = factory.newInstance( session, newRepo( "default" ) );
+        DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "ext", "1.0" );
+        URI uri = layout.getLocation( artifact, false );
+        List<Checksum> checksums = layout.getChecksums( artifact, false, uri );
+        assertEquals( 2, checksums.size() );
+        assertChecksum( checksums.get( 0 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha256", "SHA-256" );
+        assertChecksum( checksums.get( 1 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha1", "SHA-1" );
+    }
+
+    @Test
     public void testArtifactChecksums_Upload()
     {
         DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "ext", "1.0" );
@@ -175,6 +189,19 @@
     }
 
     @Test
+    public void testArtifactChecksums_UploadWithCustomAlgorithms() throws NoRepositoryLayoutException
+    {
+        session.setConfigProperty( Maven2RepositoryLayoutFactory.CONFIG_PROP_CHECKSUMS_ALGORITHMS, "SHA-512,MD5" );
+        layout = factory.newInstance( session, newRepo( "default" ) );
+        DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "ext", "1.0" );
+        URI uri = layout.getLocation( artifact, true );
+        List<Checksum> checksums = layout.getChecksums( artifact, true, uri );
+        assertEquals( 2, checksums.size() );
+        assertChecksum( checksums.get( 0 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha512", "SHA-512" );
+        assertChecksum( checksums.get( 1 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.md5", "MD5" );
+    }
+
+    @Test
     public void testMetadataChecksums_Download()
     {
         DefaultMetadata metadata =