You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by ma...@apache.org on 2018/03/31 17:21:10 UTC

[2/2] archiva git commit: Unifying checksum code into the checksum module

Unifying checksum code into the checksum module


Project: http://git-wip-us.apache.org/repos/asf/archiva/repo
Commit: http://git-wip-us.apache.org/repos/asf/archiva/commit/fbf5e991
Tree: http://git-wip-us.apache.org/repos/asf/archiva/tree/fbf5e991
Diff: http://git-wip-us.apache.org/repos/asf/archiva/diff/fbf5e991

Branch: refs/heads/master
Commit: fbf5e991b3cbe86b6a60aae4f127e07b30bb374a
Parents: 0d6ee3d
Author: Martin Stockhammer <ma...@apache.org>
Authored: Sat Mar 31 19:20:30 2018 +0200
Committer: Martin Stockhammer <ma...@apache.org>
Committed: Sat Mar 31 19:20:30 2018 +0200

----------------------------------------------------------------------
 .../org/apache/archiva/checksum/Checksum.java   | 104 ++++++--
 .../archiva/checksum/ChecksumAlgorithm.java     |  47 +++-
 .../archiva/checksum/ChecksumFileContent.java   |  84 ++++++
 .../archiva/checksum/ChecksumReference.java     |  73 +++++
 .../checksum/ChecksumValidationException.java   |  65 +++++
 .../archiva/checksum/ChecksummedFile.java       | 264 +++++++++++--------
 .../java/org/apache/archiva/checksum/Hex.java   |  24 +-
 .../checksum/AbstractChecksumTestCase.java      |   1 +
 .../apache/archiva/checksum/ChecksumTest.java   |  17 +-
 .../archiva/checksum/ChecksummedFileTest.java   |  56 ++--
 .../archiva-core-consumers/pom.xml              |   5 +-
 .../checksum/ChecksumValidationException.java   |  65 -----
 .../archiva/checksum/ChecksumValidator.java     | 181 -------------
 .../core/ArtifactMissingChecksumsConsumer.java  |  19 +-
 .../core/ValidateChecksumConsumer.java          |  22 +-
 .../archiva/checksum/ChecksumValidatorTest.java | 145 ----------
 .../test/resources/checksum/checksumTest1.txt   |  26 --
 .../resources/checksum/checksumTest1.txt.md5    |   1 -
 .../resources/checksum/checksumTest1.txt.md8    |   1 -
 .../resources/checksum/checksumTest1.txt.sha1   |   1 -
 .../resources/checksum/checksumTest1.txt.sha2   |   1 -
 .../resources/checksum/checksumTest1.txt.sha3   |   1 -
 .../resources/checksum/checksumTest1.txt.sha5   |   1 -
 .../test/resources/checksum/checksumTest2.txt   |  27 --
 .../resources/checksum/checksumTest2.txt.md5    |   1 -
 .../resources/checksum/checksumTest2.txt.sha1   |   1 -
 .../resources/checksum/checksumTest2.txt.sha2   |   1 -
 .../resources/checksum/checksumTest2.txt.sha3   |   1 -
 .../resources/checksum/checksumTest2.txt.sha5   |   1 -
 .../test/resources/checksum/checksumTest3.txt   |  25 --
 .../resources/checksum/checksumTest3.txt.md5    |   1 -
 .../resources/checksum/checksumTest3.txt.sha1   |   1 -
 .../resources/checksum/checksumTest3.txt.sha2   |   1 -
 .../resources/checksum/checksumTest3.txt.sha3   |   1 -
 .../resources/checksum/checksumTest3.txt.sha5   |   1 -
 .../resources/checksum/checksumTest4.txt.md5    |   1 -
 .../apache/archiva/policies/ChecksumPolicy.java |   2 +-
 .../ArchivaRepositoryScanningTaskExecutor.java  |   2 -
 38 files changed, 577 insertions(+), 694 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/Checksum.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/Checksum.java b/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/Checksum.java
index c83b9d4..5dd05d5 100644
--- a/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/Checksum.java
+++ b/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/Checksum.java
@@ -22,8 +22,14 @@ package org.apache.archiva.checksum;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.output.NullOutputStream;
 
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.nio.MappedByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
 import java.security.DigestInputStream;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
@@ -35,19 +41,35 @@ import java.util.List;
 public class Checksum
 {
     private static final int BUFFER_SIZE = 32768;
+    private byte[] result = new byte[0];
 
-    public static void update( List<Checksum> checksums, InputStream stream )
-        throws IOException
+    public static void update( List<Checksum> checksums, Path file )
+        throws ChecksumValidationException
     {
-        byte[] buffer = new byte[BUFFER_SIZE];
-        int size = stream.read( buffer, 0, BUFFER_SIZE );
-        while ( size >= 0 )
-        {
-            for ( Checksum checksum : checksums )
+        long fileSize;
+        try (FileChannel channel = FileChannel.open(file, StandardOpenOption.READ )) {
+            fileSize = channel.size();
+            long pos = 0;
+            while (pos<fileSize)
             {
-                checksum.update( buffer, 0, size );
+                long bufferSize = Math.min(BUFFER_SIZE, fileSize-pos);
+                MappedByteBuffer buffer = channel.map( FileChannel.MapMode.READ_ONLY, pos, bufferSize);
+                for ( Checksum checksum : checksums )
+                {
+                    checksum.update( buffer );
+                    buffer.rewind();
+                }
+                fileSize = channel.size();
+                pos += BUFFER_SIZE;
             }
-            size = stream.read( buffer, 0, BUFFER_SIZE );
+            for (Checksum checksum : checksums) {
+                checksum.finish();
+            }
+        } catch(FileNotFoundException e)
+        {
+            throw new ChecksumValidationException( ChecksumValidationException.ValidationError.FILE_NOT_FOUND, "File that should be parsed, not found: "+e.getMessage(), e );
+        } catch(IOException e) {
+            throw new ChecksumValidationException( ChecksumValidationException.ValidationError.READ_ERROR, "Parsing of file failed: "+e.getMessage(), e );
         }
     }
 
@@ -73,7 +95,17 @@ public class Checksum
 
     public String getChecksum()
     {
-        return Hex.encode( md.digest() );
+        if (this.result.length==0) {
+            finish();
+        }
+        return Hex.encode( this.result );
+    }
+
+    public byte[] getChecksumBytes() {
+        if (this.result.length==0) {
+            finish();
+        }
+        return this.result;
     }
 
     public ChecksumAlgorithm getAlgorithm()
@@ -84,21 +116,63 @@ public class Checksum
     public void reset()
     {
         md.reset();
+        this.result = new byte[0];
     }
 
     public Checksum update( byte[] buffer, int offset, int size )
     {
+        if (this.result.length!=0) {
+            reset();
+        }
         md.update( buffer, 0, size );
         return this;
     }
 
-    public Checksum update( InputStream stream )
-        throws IOException
+    public Checksum update( ByteBuffer buffer)
     {
-        try (DigestInputStream dig = new DigestInputStream( stream, md ))
-        {
-            IOUtils.copy( dig, new NullOutputStream() );
+        if (this.result.length!=0) {
+            reset();
         }
+        md.update( buffer );
+        return this;
+    }
+
+    public Checksum finish() {
+        this.result = md.digest();
         return this;
     }
+
+    public void update( Path file )
+        throws IOException
+    {
+        long fileSize;
+        try (FileChannel channel = FileChannel.open(file, StandardOpenOption.READ )) {
+            fileSize = channel.size();
+            long pos = 0;
+            while (pos<fileSize)
+            {
+                long bufferSize = Math.min(BUFFER_SIZE, fileSize-pos);
+                MappedByteBuffer buffer = channel.map( FileChannel.MapMode.READ_ONLY, pos, bufferSize);
+                update( buffer );
+                buffer.rewind();
+                fileSize = channel.size();
+                pos += BUFFER_SIZE;
+            }
+            finish();
+        }
+    }
+
+    public boolean compare(byte[] cmp) {
+        if (this.result == null || this.result.length==0) {
+            finish();
+        }
+        return md.isEqual( this.result, cmp );
+    }
+
+    public boolean compare(String hexString) {
+        if (this.result == null || this.result.length==0) {
+            finish();
+        }
+        return md.isEqual(this.result, Hex.decode( hexString ));
+    }
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksumAlgorithm.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksumAlgorithm.java b/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksumAlgorithm.java
index 8d20239..9d50bf0 100644
--- a/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksumAlgorithm.java
+++ b/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksumAlgorithm.java
@@ -23,6 +23,14 @@ package org.apache.archiva.checksum;
 import org.apache.commons.io.FilenameUtils;
 
 import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * Enumeration of available ChecksumAlgorithm techniques.
@@ -30,22 +38,34 @@ import java.nio.file.Path;
  *
  */
 public enum ChecksumAlgorithm {
-    SHA1("SHA-1", "sha1", "SHA1"),
-    MD5("MD5", "md5", "MD5");
+    MD5("MD5", "MD5", "md5"),
+    SHA1("SHA-1", "SHA1", "sha1", "sha128", "sha-128"),
+    SHA256("SHA-256", "SHA2", "sha2", "sha256", "sha-256"),
+    SHA384("SHA-384", "SHA3", "sha3", "sha384", "sha-384"),
+    SHA512("SHA-512", "SHA5", "sha5", "sha512", "sha-512");
 
     public static ChecksumAlgorithm getByExtension( Path file )
     {
         String ext = FilenameUtils.getExtension( file.getFileName().toString() ).toLowerCase();
-        if ( ChecksumAlgorithm.SHA1.getExt().equals( ext ) )
-        {
-            return ChecksumAlgorithm.SHA1;
+        if (extensionMap.containsKey(ext)) {
+            return extensionMap.get(ext);
         }
-        else if ( ChecksumAlgorithm.MD5.getExt().equals( ext ) )
-        {
-            return ChecksumAlgorithm.MD5;
+        throw new IllegalArgumentException( "Filename " + file.getFileName() + " has no valid extension." );
+    }
+
+    private static final Map<String, ChecksumAlgorithm> extensionMap = new HashMap<>(  );
+
+    static {
+        for (ChecksumAlgorithm alg : ChecksumAlgorithm.values()) {
+            for (String extString : alg.getExt())
+            {
+                extensionMap.put( extString, alg );
+            }
         }
+    }
 
-        throw new IllegalArgumentException( "Filename " + file.getFileName() + " has no associated extension." );
+    public static Set<String> getExtensions() {
+        return extensionMap.keySet();
     }
 
     /**
@@ -56,7 +76,7 @@ public enum ChecksumAlgorithm {
     /**
      * The file extension for this ChecksumAlgorithm.
      */
-    private final String ext;
+    private final List<String> ext;
 
     /**
      * The checksum type, the key that you see in checksum files.
@@ -70,11 +90,12 @@ public enum ChecksumAlgorithm {
      * @param ext the file extension.
      * @param type the checksum type.
      */
-    private ChecksumAlgorithm( String algorithm, String ext, String type )
+    private ChecksumAlgorithm( String algorithm, String type, String... ext )
     {
         this.algorithm = algorithm;
-        this.ext = ext;
+        this.ext = Arrays.asList( ext );
         this.type = type;
+
     }
 
     public String getAlgorithm()
@@ -82,7 +103,7 @@ public enum ChecksumAlgorithm {
         return algorithm;
     }
 
-    public String getExt()
+    public List<String> getExt()
     {
         return ext;
     }

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksumFileContent.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksumFileContent.java b/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksumFileContent.java
new file mode 100644
index 0000000..76079ec
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksumFileContent.java
@@ -0,0 +1,84 @@
+package org.apache.archiva.checksum;
+
+/*
+ * 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.
+ */
+
+/**
+ * Simple POJO for storing the data parsed from a checksum file.
+ *
+ * @author Martin Stockhammer <ma...@apache.org>
+ */
+public class ChecksumFileContent
+{
+    String checksum;
+    String fileReference;
+    boolean formatMatch = false;
+
+    public ChecksumFileContent() {
+    }
+
+    public ChecksumFileContent(String checksum, String fileReference, boolean formatMatch) {
+        this.checksum = checksum;
+        this.fileReference = fileReference;
+        this.formatMatch = formatMatch;
+    }
+
+    /**
+     * The checksum as hex string.
+     *
+     * @return
+     */
+    public String getChecksum( )
+    {
+        return checksum;
+    }
+
+    public void setChecksum( String checksum )
+    {
+        this.checksum = checksum;
+    }
+
+    /**
+     * The name of the reference file as stored in the checksum file.
+     * @return
+     */
+    public String getFileReference( )
+    {
+        return fileReference;
+    }
+
+    public void setFileReference( String fileReference )
+    {
+        this.fileReference = fileReference;
+    }
+
+    /**
+     * True, if the file content matches a known format
+     * @return
+     */
+    public boolean isFormatMatch( )
+    {
+        return formatMatch;
+    }
+
+    public void setFormatMatch( boolean formatMatch )
+    {
+        this.formatMatch = formatMatch;
+    }
+}

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksumReference.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksumReference.java b/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksumReference.java
new file mode 100644
index 0000000..b8c2f7f
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksumReference.java
@@ -0,0 +1,73 @@
+package org.apache.archiva.checksum;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.nio.file.Path;
+
+/**
+ *
+ * Simple POJO used to represent a one-to-one relationship between a reference file and
+ * a checksum file. The checksum file represents a certain algorithm.
+ *
+ * @author Martin Stockhammer <ma...@apache.org>
+ */
+public class ChecksumReference
+{
+    private ChecksummedFile file;
+    private Path checksumFile;
+    private ChecksumAlgorithm algorithm;
+
+
+    ChecksumReference( ChecksummedFile file, ChecksumAlgorithm algo, Path checksumFile )
+    {
+        this.file = file;
+        this.algorithm = algo;
+    }
+
+    public ChecksummedFile getFile( )
+    {
+        return file;
+    }
+
+    public void setFile( ChecksummedFile file )
+    {
+        this.file = file;
+    }
+
+    public ChecksumAlgorithm getAlgorithm( )
+    {
+        return algorithm;
+    }
+
+    public void setAlgorithm( ChecksumAlgorithm algorithm )
+    {
+        this.algorithm = algorithm;
+    }
+
+    public Path getChecksumFile( )
+    {
+        return checksumFile;
+    }
+
+    public void setChecksumFile( Path checksumFile )
+    {
+        this.checksumFile = checksumFile;
+    }
+}

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksumValidationException.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksumValidationException.java b/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksumValidationException.java
new file mode 100644
index 0000000..1123e6a
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksumValidationException.java
@@ -0,0 +1,65 @@
+package org.apache.archiva.checksum;
+
+/*
+ * 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.
+ */
+
+/**
+ * Exception thrown by the ChecksumValidator
+ *
+ * Has an error type for different validation errors.
+ *
+ * @author Martin Stockhammer <ma...@apache.org>
+ */
+public class ChecksumValidationException extends RuntimeException
+{
+
+    public enum ValidationError {
+        INVALID_FORMAT, DIGEST_ERROR, READ_ERROR, FILE_NOT_FOUND, BAD_CHECKSUM_FILE_REF
+    };
+
+    final private ValidationError errorType;
+
+    public ChecksumValidationException( ValidationError errorType )
+    {
+        super( );
+        this.errorType = errorType;
+    }
+
+    public ChecksumValidationException( ValidationError errorType,  String message )
+    {
+        super( message );
+        this.errorType = errorType;
+    }
+
+    public ChecksumValidationException( ValidationError errorType, String message, Throwable cause )
+    {
+        super( message, cause );
+        this.errorType = errorType;
+    }
+
+    public ChecksumValidationException( ValidationError errorType, Throwable cause )
+    {
+        super( cause );
+        this.errorType = errorType;
+    }
+
+    public ValidationError getErrorType() {
+        return errorType;
+    }
+}

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksummedFile.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksummedFile.java b/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksummedFile.java
index 6459a1c..53a3d46 100644
--- a/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksummedFile.java
+++ b/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/ChecksummedFile.java
@@ -20,12 +20,11 @@ package org.apache.archiva.checksum;
  */
 
 import org.apache.archiva.common.utils.FileUtils;
-import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.xml.bind.ValidationException;
 import java.io.IOException;
-import java.io.InputStream;
 import java.nio.charset.Charset;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -35,6 +34,8 @@ import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import static org.apache.archiva.checksum.ChecksumValidationException.ValidationError.BAD_CHECKSUM_FILE_REF;
+
 /**
  * ChecksummedFile
  * <p>Terminology:</p>
@@ -69,6 +70,20 @@ public class ChecksummedFile
         this.referenceFile = referenceFile;
     }
 
+
+    public static ChecksumReference getFromChecksumFile( Path checksumFile )
+    {
+        ChecksumAlgorithm alg = ChecksumAlgorithm.getByExtension( checksumFile );
+        ChecksummedFile file = new ChecksummedFile( getReferenceFile( checksumFile ) );
+        return new ChecksumReference( file, alg, checksumFile );
+    }
+
+    private static Path getReferenceFile( Path checksumFile )
+    {
+        String fileName = checksumFile.getFileName( ).toString( );
+        return checksumFile.resolveSibling( fileName.substring( 0, fileName.lastIndexOf( '.' ) ) );
+    }
+
     /**
      * Calculate the checksum based on a given checksum.
      *
@@ -80,12 +95,9 @@ public class ChecksummedFile
         throws IOException
     {
 
-        try (InputStream fis = Files.newInputStream( referenceFile ))
-        {
-            Checksum checksum = new Checksum( checksumAlgorithm );
-            checksum.update( fis );
-            return checksum.getChecksum();
-        }
+        Checksum checksum = new Checksum( checksumAlgorithm );
+        checksum.update( referenceFile );
+        return checksum.getChecksum( );
     }
 
     /**
@@ -98,12 +110,12 @@ public class ChecksummedFile
     public Path createChecksum( ChecksumAlgorithm checksumAlgorithm )
         throws IOException
     {
-        Path checksumFile = referenceFile.resolveSibling( referenceFile.getFileName() + "." + checksumAlgorithm.getExt() );
+        Path checksumFile = referenceFile.resolveSibling( referenceFile.getFileName( ) + "." + checksumAlgorithm.getExt( ).get( 0 ) );
         Files.deleteIfExists( checksumFile );
         String checksum = calculateChecksum( checksumAlgorithm );
         Files.write( checksumFile, //
-                     ( checksum + "  " + referenceFile.getFileName().toString() ).getBytes(), //
-                     StandardOpenOption.CREATE_NEW );
+            ( checksum + "  " + referenceFile.getFileName( ).toString( ) ).getBytes( ), //
+            StandardOpenOption.CREATE_NEW );
         return checksumFile;
     }
 
@@ -115,7 +127,15 @@ public class ChecksummedFile
      */
     public Path getChecksumFile( ChecksumAlgorithm checksumAlgorithm )
     {
-        return referenceFile.resolveSibling( referenceFile.getFileName() + "." + checksumAlgorithm.getExt() );
+        for ( String ext : checksumAlgorithm.getExt( ) )
+        {
+            Path file = referenceFile.resolveSibling( referenceFile.getFileName( ) + "." + checksumAlgorithm.getExt( ) );
+            if ( Files.exists( file ) )
+            {
+                return file;
+            }
+        }
+        return referenceFile.resolveSibling( referenceFile.getFileName( ) + "." + checksumAlgorithm.getExt( ).get( 0 ) );
     }
 
     /**
@@ -130,10 +150,14 @@ public class ChecksummedFile
      * @return true if the checksum is valid for the file it represents. or if the checksum file does not exist.
      * @throws IOException if the reading of the checksumFile or the file it refers to fails.
      */
-    public boolean isValidChecksum( ChecksumAlgorithm algorithm )
-        throws IOException
+    public boolean isValidChecksum( ChecksumAlgorithm algorithm) throws ChecksumValidationException
+    {
+        return isValidChecksum( algorithm, false );
+    }
+    public boolean isValidChecksum( ChecksumAlgorithm algorithm, boolean throwExceptions )
+        throws ChecksumValidationException
     {
-        return isValidChecksums( new ChecksumAlgorithm[]{ algorithm } );
+        return isValidChecksums( new ChecksumAlgorithm[]{algorithm} );
     }
 
     /**
@@ -143,74 +167,92 @@ public class ChecksummedFile
      * @param algorithms the algorithms to check for.
      * @return true if the checksums report that the the reference file is valid, false if invalid.
      */
-    public boolean isValidChecksums( ChecksumAlgorithm algorithms[] )
+    public boolean isValidChecksums( ChecksumAlgorithm algorithms[]) throws ChecksumValidationException
     {
+        return isValidChecksums( algorithms, false );
+    }
 
-        try (InputStream fis = Files.newInputStream( referenceFile))
-        {
-            List<Checksum> checksums = new ArrayList<>( algorithms.length );
-            // Create checksum object for each algorithm.
-            for ( ChecksumAlgorithm checksumAlgorithm : algorithms )
-            {
-                Path checksumFile = getChecksumFile( checksumAlgorithm );
+    /**
+     * Checks if the checksums are valid for the referenced file.
+     * This method throws only exceptions, if throwExceptions is true. Otherwise false will be returned instead.
+     * @param algorithms The algorithms to verify
+     * @param throwExceptions If true, exceptions will be thrown, otherwise false will be returned, if a exception occurred.
+     * @return True, if it is valid, otherwise false.
+     * @throws ChecksumValidationException
+     */
+    public boolean isValidChecksums( ChecksumAlgorithm algorithms[], boolean throwExceptions) throws ChecksumValidationException
+    {
 
-                // Only add algorithm if checksum file exists.
-                if ( Files.exists(checksumFile) )
-                {
-                    checksums.add( new Checksum( checksumAlgorithm ) );
-                }
-            }
+        List<Checksum> checksums = new ArrayList<>( algorithms.length );
+        // Create checksum object for each algorithm.
+        for ( ChecksumAlgorithm checksumAlgorithm : algorithms )
+        {
+            Path checksumFile = getChecksumFile( checksumAlgorithm );
 
-            // Any checksums?
-            if ( checksums.isEmpty() )
+            // Only add algorithm if checksum file exists.
+            if ( Files.exists( checksumFile ) )
             {
-                // No checksum objects, no checksum files, default to is invalid.
-                return false;
+                checksums.add( new Checksum( checksumAlgorithm ) );
             }
+        }
 
-            // Parse file once, for all checksums.
-            try
-            {
-                Checksum.update( checksums, fis );
-            }
-            catch ( IOException e )
-            {
-                log.warn( "Unable to update checksum:{}", e.getMessage() );
+        // Any checksums?
+        if ( checksums.isEmpty( ) )
+        {
+            // No checksum objects, no checksum files, default to is invalid.
+            return false;
+        }
+
+        // Parse file once, for all checksums.
+        try
+        {
+            Checksum.update( checksums, referenceFile );
+        }
+        catch ( ChecksumValidationException e )
+        {
+            log.warn( "Unable to update checksum:{}", e.getMessage( ) );
+            if (throwExceptions) {
+                throw e;
+            } else {
                 return false;
             }
+        }
 
-            boolean valid = true;
+        boolean valid = true;
 
-            // check the checksum files
-            try
+        // check the checksum files
+        try
+        {
+            for ( Checksum checksum : checksums )
             {
-                for ( Checksum checksum : checksums )
-                {
-                    ChecksumAlgorithm checksumAlgorithm = checksum.getAlgorithm();
-                    Path checksumFile = getChecksumFile( checksumAlgorithm );
+                ChecksumAlgorithm checksumAlgorithm = checksum.getAlgorithm( );
+                Path checksumFile = getChecksumFile( checksumAlgorithm );
 
-                    String rawChecksum = FileUtils.readFileToString( checksumFile , FILE_ENCODING );
-                    String expectedChecksum = parseChecksum( rawChecksum, checksumAlgorithm, referenceFile.getFileName().toString() );
+                String expectedChecksum = parseChecksum( checksumFile, checksumAlgorithm, referenceFile.getFileName( ).toString( ), FILE_ENCODING );
 
-                    if ( !StringUtils.equalsIgnoreCase( expectedChecksum, checksum.getChecksum() ) )
-                    {
-                        valid = false;
-                    }
+                if ( !checksum.compare( expectedChecksum ) )
+                {
+                    valid = false;
                 }
             }
-            catch ( IOException e )
+        }
+        catch ( ChecksumValidationException e )
+        {
+            log.warn( "Unable to read / parse checksum: {}", e.getMessage( ) );
+            if (throwExceptions) {
+                throw e;
+            } else
             {
-                log.warn( "Unable to read / parse checksum: {}", e.getMessage() );
                 return false;
             }
-
-            return valid;
-        }
-        catch ( IOException e )
-        {
-            log.warn( "Unable to read / parse checksum: {}", e.getMessage() );
-            return false;
         }
+
+        return valid;
+    }
+
+    public Path getReferenceFile( )
+    {
+        return referenceFile;
     }
 
     /**
@@ -229,20 +271,20 @@ public class ChecksummedFile
         }
 
         // Any checksums?
-        if ( checksums.isEmpty() )
+        if ( checksums.isEmpty( ) )
         {
             // No checksum objects, no checksum files, default to is valid.
             return true;
         }
 
-        try (InputStream fis = Files.newInputStream( referenceFile ))
+        try
         {
             // Parse file once, for all checksums.
-            Checksum.update( checksums, fis );
+            Checksum.update( checksums, referenceFile );
         }
-        catch ( IOException e )
+        catch ( ChecksumValidationException e )
         {
-            log.warn( e.getMessage(), e );
+            log.warn( e.getMessage( ), e );
             return false;
         }
 
@@ -251,31 +293,28 @@ public class ChecksummedFile
         // check the hash files
         for ( Checksum checksum : checksums )
         {
-            ChecksumAlgorithm checksumAlgorithm = checksum.getAlgorithm();
+            ChecksumAlgorithm checksumAlgorithm = checksum.getAlgorithm( );
             try
             {
                 Path checksumFile = getChecksumFile( checksumAlgorithm );
-                String actualChecksum = checksum.getChecksum();
-
-                if ( Files.exists(checksumFile) )
+                if ( Files.exists( checksumFile ) )
                 {
-                    String rawChecksum = FileUtils.readFileToString( checksumFile, FILE_ENCODING);
-                    String expectedChecksum = parseChecksum( rawChecksum, checksumAlgorithm, referenceFile.getFileName().toString() );
+                    String expectedChecksum = parseChecksum( checksumFile, checksumAlgorithm, referenceFile.getFileName( ).toString( ), FILE_ENCODING );
 
-                    if ( !StringUtils.equalsIgnoreCase( expectedChecksum, actualChecksum ) )
+                    if ( !checksum.compare( expectedChecksum ) )
                     {
                         // create checksum (again)
-                        FileUtils.writeStringToFile( checksumFile, FILE_ENCODING, actualChecksum + "  " + referenceFile.getFileName().toString());
+                        writeChecksumFile( checksumFile, FILE_ENCODING, checksum.getChecksum( ) );
                     }
                 }
                 else
                 {
-                    FileUtils.writeStringToFile( checksumFile, FILE_ENCODING, actualChecksum + "  " + referenceFile.getFileName().toString() );
+                    writeChecksumFile( checksumFile, FILE_ENCODING, checksum.getChecksum( ) );
                 }
             }
-            catch ( IOException e )
+            catch ( ChecksumValidationException e )
             {
-                log.warn( e.getMessage(), e );
+                log.warn( e.getMessage( ), e );
                 valid = false;
             }
         }
@@ -284,12 +323,17 @@ public class ChecksummedFile
 
     }
 
+    private void writeChecksumFile( Path checksumFile, Charset encoding, String checksumHex )
+    {
+        FileUtils.writeStringToFile( checksumFile, FILE_ENCODING, checksumHex + "  " + referenceFile.getFileName( ).toString( ) );
+    }
+
     private boolean isValidChecksumPattern( String filename, String path )
     {
         // check if it is a remote metadata file
 
         Matcher m = METADATA_PATTERN.matcher( path );
-        if ( m.matches() )
+        if ( m.matches( ) )
         {
             return filename.endsWith( path ) || ( "-".equals( filename ) ) || filename.endsWith( "maven-metadata.xml" );
         }
@@ -304,46 +348,56 @@ public class ChecksummedFile
      * the trimmed checksum hex string.
      * </p>
      *
-     * @param rawChecksumString
-     * @param expectedHash
-     * @param expectedPath
+     * @param checksumFile The file where the checksum is stored
+     * @param expectedHash The checksum algorithm to check
+     * @param expectedPath The filename of the reference file
      * @return
      * @throws IOException
      */
-    public String parseChecksum( String rawChecksumString, ChecksumAlgorithm expectedHash, String expectedPath )
-        throws IOException
+    public String parseChecksum( Path checksumFile, ChecksumAlgorithm expectedHash, String expectedPath, Charset encoding )
+        throws ChecksumValidationException
+    {
+        ChecksumFileContent fc = parseChecksumFile( checksumFile, expectedHash, encoding );
+        if ( fc.isFormatMatch() && !isValidChecksumPattern( fc.getFileReference( ), expectedPath ) )
+        {
+            throw new ChecksumValidationException(BAD_CHECKSUM_FILE_REF,
+                "The file reference '" + fc.getFileReference( ) + "' in the checksum file does not match expected file: '" + expectedPath + "'" );
+        }
+        return fc.getChecksum( );
+    }
+
+    public ChecksumFileContent parseChecksumFile( Path checksumFile, ChecksumAlgorithm expectedHash, Charset encoding )
     {
-        String trimmedChecksum = rawChecksumString.replace( '\n', ' ' ).trim();
+        ChecksumFileContent fc = new ChecksumFileContent( );
+        String rawChecksumString = FileUtils.readFileToString( checksumFile, encoding );
+        String trimmedChecksum = rawChecksumString.replace( '\n', ' ' ).trim( );
 
         // Free-BSD / openssl
-        String regex = expectedHash.getType() + "\\s*\\(([^)]*)\\)\\s*=\\s*([a-fA-F0-9]+)";
+        String regex = expectedHash.getType( ) + "\\s*\\(([^)]*)\\)\\s*=\\s*([a-fA-F0-9]+)";
         Matcher m = Pattern.compile( regex ).matcher( trimmedChecksum );
-        if ( m.matches() )
+        if ( m.matches( ) )
         {
-            String filename = m.group( 1 );
-            if ( !isValidChecksumPattern( filename, expectedPath ) )
-            {
-                throw new IOException(
-                    "Supplied checksum file '" + filename + "' does not match expected file: '" + expectedPath + "'" );
-            }
-            trimmedChecksum = m.group( 2 );
+            fc.setFileReference( m.group( 1 ) );
+            fc.setChecksum( m.group( 2 ) );
+            fc.setFormatMatch( true );
         }
         else
         {
             // GNU tools
             m = Pattern.compile( "([a-fA-F0-9]+)\\s+\\*?(.+)" ).matcher( trimmedChecksum );
-            if ( m.matches() )
+            if ( m.matches( ) )
             {
-                String filename = m.group( 2 );
-                if ( !isValidChecksumPattern( filename, expectedPath ) )
-                {
-                    throw new IOException(
-                        "Supplied checksum file '" + filename + "' does not match expected file: '" + expectedPath
-                            + "'" );
-                }
-                trimmedChecksum = m.group( 1 );
+                fc.setFileReference( m.group( 2 ) );
+                fc.setChecksum( m.group( 1 ) );
+                fc.setFormatMatch( true );
+            }
+            else
+            {
+                fc.setFileReference( "" );
+                fc.setChecksum( trimmedChecksum );
+                fc.setFormatMatch( false );
             }
         }
-        return trimmedChecksum;
+        return fc;
     }
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/Hex.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/Hex.java b/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/Hex.java
index 9ca6ce4..6353a87 100644
--- a/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/Hex.java
+++ b/archiva-modules/archiva-base/archiva-checksum/src/main/java/org/apache/archiva/checksum/Hex.java
@@ -19,6 +19,8 @@ package org.apache.archiva.checksum;
  * under the License.
  */
 
+import javax.xml.bind.DatatypeConverter;
+
 /**
  * Hex - simple hex conversions. 
  *
@@ -26,21 +28,15 @@ package org.apache.archiva.checksum;
  */
 public class Hex
 {
-    private static final byte[] DIGITS = "0123456789abcdef".getBytes();
 
     public static String encode( byte[] data )
     {
-        int l = data.length;
-
-        byte[] raw = new byte[l * 2];
-
-        for ( int i = 0, j = 0; i < l; i++ )
+        try
         {
-            raw[j++] = DIGITS[( 0xF0 & data[i] ) >>> 4];
-            raw[j++] = DIGITS[0x0F & data[i]];
+            return DatatypeConverter.printHexBinary( data ).trim( ).toLowerCase( );
+        } catch (IllegalArgumentException e) {
+            return "";
         }
-
-        return new String( raw );
     }
 
     public static String encode( String raw )
@@ -48,4 +44,12 @@ public class Hex
         return encode( raw.getBytes() );
     }
 
+    public static byte[] decode( String data ) {
+        try
+        {
+            return DatatypeConverter.parseHexBinary( data.trim( ) );
+        } catch (IllegalArgumentException e) {
+            return new byte[0];
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-checksum/src/test/java/org/apache/archiva/checksum/AbstractChecksumTestCase.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-checksum/src/test/java/org/apache/archiva/checksum/AbstractChecksumTestCase.java b/archiva-modules/archiva-base/archiva-checksum/src/test/java/org/apache/archiva/checksum/AbstractChecksumTestCase.java
index fafa103..f1caab9 100644
--- a/archiva-modules/archiva-base/archiva-checksum/src/test/java/org/apache/archiva/checksum/AbstractChecksumTestCase.java
+++ b/archiva-modules/archiva-base/archiva-checksum/src/test/java/org/apache/archiva/checksum/AbstractChecksumTestCase.java
@@ -65,4 +65,5 @@ public abstract class AbstractChecksumTestCase
         }
         return file;
     }
+
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-checksum/src/test/java/org/apache/archiva/checksum/ChecksumTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-checksum/src/test/java/org/apache/archiva/checksum/ChecksumTest.java b/archiva-modules/archiva-base/archiva-checksum/src/test/java/org/apache/archiva/checksum/ChecksumTest.java
index bc7f0b2..55746f6 100644
--- a/archiva-modules/archiva-base/archiva-checksum/src/test/java/org/apache/archiva/checksum/ChecksumTest.java
+++ b/archiva-modules/archiva-base/archiva-checksum/src/test/java/org/apache/archiva/checksum/ChecksumTest.java
@@ -20,12 +20,16 @@ package org.apache.archiva.checksum;
  */
 
 import junit.framework.TestCase;
+import org.apache.archiva.common.utils.FileUtils;
 import org.apache.archiva.test.utils.ArchivaBlockJUnit4ClassRunner;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -36,9 +40,10 @@ import java.util.List;
  */
 @RunWith( ArchivaBlockJUnit4ClassRunner.class )
 public class ChecksumTest
-    extends TestCase
+    extends AbstractChecksumTestCase
 {
     private static final String UNSET_SHA1 = "da39a3ee5e6b4b0d3255bfef95601890afd80709";
+    private static final Charset FILE_ENCODING = Charset.forName( "UTF-8" );
 
     @Test
     public void testConstructSha1()
@@ -68,7 +73,7 @@ public class ChecksumTest
 
     @Test
     public void testUpdateMany()
-        throws IOException
+        throws IOException, ChecksumValidationException
     {
         Checksum checksumSha1 = new Checksum( ChecksumAlgorithm.SHA1 );
         Checksum checksumMd5 = new Checksum( ChecksumAlgorithm.MD5 );
@@ -76,11 +81,11 @@ public class ChecksumTest
         checksums.add( checksumSha1 );
         checksums.add( checksumMd5 );
 
-        byte buf[] = ( "You know, I'm sick of following my dreams, man. "
-            + "I'm just going to ask where they're going and hook up with 'em later. - Mitch Hedberg" ).getBytes();
+        Path checkFile = getTestOutputDir().resolve( "test-file1.txt" );
+        FileUtils.writeStringToFile( checkFile, FILE_ENCODING,  "You know, I'm sick of following my dreams, man. "
+            + "I'm just going to ask where they're going and hook up with 'em later. - Mitch Hedberg");
 
-        ByteArrayInputStream stream = new ByteArrayInputStream( buf );
-        Checksum.update( checksums, stream );
+        Checksum.update( checksums, checkFile );
 
         assertEquals( "Checksum SHA1", "e396119ae0542e85a74759602fd2f81e5d36d762", checksumSha1.getChecksum() );
         assertEquals( "Checksum MD5", "21c2c5ca87ec018adacb2e2fb3432219", checksumMd5.getChecksum() );

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-checksum/src/test/java/org/apache/archiva/checksum/ChecksummedFileTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-checksum/src/test/java/org/apache/archiva/checksum/ChecksummedFileTest.java b/archiva-modules/archiva-base/archiva-checksum/src/test/java/org/apache/archiva/checksum/ChecksummedFileTest.java
index 04c6391..d458d82 100644
--- a/archiva-modules/archiva-base/archiva-checksum/src/test/java/org/apache/archiva/checksum/ChecksummedFileTest.java
+++ b/archiva-modules/archiva-base/archiva-checksum/src/test/java/org/apache/archiva/checksum/ChecksummedFileTest.java
@@ -25,6 +25,7 @@ import org.junit.Before;
 import org.junit.Test;
 import org.slf4j.LoggerFactory;
 
+import java.io.File;
 import java.io.IOException;
 import java.nio.charset.Charset;
 import java.nio.file.Files;
@@ -139,7 +140,7 @@ public class ChecksummedFileTest
 
     @Test
     public void testFixChecksum()
-        throws IOException
+        throws IOException, ChecksumValidationException
     {
         Path jarFile = createTestableJar( "examples/redback-authz-open.jar" );
         Path sha1File = jarFile.resolveSibling( jarFile.getFileName()+ ".sha1" );
@@ -167,7 +168,7 @@ public class ChecksummedFileTest
 
     @Test
     public void testIsValidChecksum()
-        throws IOException
+        throws IOException, ChecksumValidationException
     {
         Path jarFile = createTestableJar( "examples/redback-authz-open.jar", true, false );
 
@@ -177,7 +178,7 @@ public class ChecksummedFileTest
 
     @Test
     public void testIsValidChecksumInvalidSha1Format()
-        throws IOException
+        throws IOException, ChecksumValidationException
     {
         Path jarFile = createTestableJar( "examples/redback-authz-open.jar" );
         Path sha1File = jarFile.resolveSibling( jarFile.getFileName() + ".sha1" );
@@ -192,7 +193,7 @@ public class ChecksummedFileTest
 
     @Test
     public void testIsValidChecksumNoChecksumFiles()
-        throws IOException
+        throws IOException, ChecksumValidationException
     {
         Path jarFile = createTestableJar( "examples/redback-authz-open.jar", false, false );
 
@@ -204,7 +205,7 @@ public class ChecksummedFileTest
 
     @Test
     public void testIsValidChecksumSha1AndMd5()
-        throws IOException
+        throws IOException, ChecksumValidationException
     {
         Path jarFile = createTestableJar( "examples/redback-authz-open.jar", true, true );
 
@@ -215,7 +216,7 @@ public class ChecksummedFileTest
 
     @Test
     public void testIsValidChecksumSha1NoMd5()
-        throws IOException
+        throws IOException, ChecksumValidationException
     {
         Path jarFile = createTestableJar( "examples/redback-authz-open.jar", true, false );
 
@@ -227,40 +228,43 @@ public class ChecksummedFileTest
 
     @Test
     public void testParseChecksum()
-        throws IOException
+        throws IOException, ChecksumValidationException
     {
-        String expected = SERVLETAPI_SHA1
-            + "  /home/projects/maven/repository-staging/to-ibiblio/maven2/servletapi/servletapi/2.4/servletapi-2.4.pom";
+        Path expectedFile = getTestOutputDir().resolve("servletapi-2.4.pom.sha1");
+        FileUtils.writeStringToFile( expectedFile, FILE_ENCODING, SERVLETAPI_SHA1
+            + "  /home/projects/maven/repository-staging/to-ibiblio/maven2/servletapi/servletapi/2.4/servletapi-2.4.pom");
 
         Path testfile = getTestResource( "examples/redback-authz-open.jar" );
         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
-        String s = checksummedFile.parseChecksum( expected, ChecksumAlgorithm.SHA1,
-                                                  "servletapi/servletapi/2.4/servletapi-2.4.pom" );
+        String s = checksummedFile.parseChecksum( expectedFile, ChecksumAlgorithm.SHA1,
+                                                  "servletapi/servletapi/2.4/servletapi-2.4.pom", FILE_ENCODING);
         assertEquals( "Checksum doesn't match", SERVLETAPI_SHA1, s );
 
     }
 
     @Test
     public void testParseChecksumAltDash1()
-        throws IOException
+        throws IOException, ChecksumValidationException
     {
-        String expected = SERVLETAPI_SHA1 + "  -";
+        Path expectedFile = getTestOutputDir().resolve("redback-authz-open.jar.sha1");
+        FileUtils.writeStringToFile( expectedFile, FILE_ENCODING, SERVLETAPI_SHA1 + "  -");
         Path testfile = getTestResource( "examples/redback-authz-open.jar" );
         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
-        String s = checksummedFile.parseChecksum( expected, ChecksumAlgorithm.SHA1,
-                                                  "servletapi/servletapi/2.4/servletapi-2.4.pom" );
+        String s = checksummedFile.parseChecksum( expectedFile, ChecksumAlgorithm.SHA1,
+                                                  "servletapi/servletapi/2.4/servletapi-2.4.pom", FILE_ENCODING );
         assertEquals( "Checksum doesn't match", SERVLETAPI_SHA1, s );
     }
 
     @Test
     public void testParseChecksumAltDash2()
-        throws IOException
+        throws IOException, ChecksumValidationException
     {
-        String expected = "SHA1(-)=" + SERVLETAPI_SHA1;
+        Path expectedFile = getTestOutputDir().resolve("redback-authz-open.jar.sha1");
+        FileUtils.writeStringToFile( expectedFile, FILE_ENCODING, "SHA1(-)=" + SERVLETAPI_SHA1);
         Path testfile = getTestResource( "examples/redback-authz-open.jar" );
         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
-        String s = checksummedFile.parseChecksum( expected, ChecksumAlgorithm.SHA1,
-                                                  "servletapi/servletapi/2.4/servletapi-2.4.pom" );
+        String s = checksummedFile.parseChecksum( expectedFile, ChecksumAlgorithm.SHA1,
+                                                  "servletapi/servletapi/2.4/servletapi-2.4.pom" , FILE_ENCODING);
         assertEquals( "Checksum doesn't match", SERVLETAPI_SHA1, s );
     }
 
@@ -268,16 +272,17 @@ public class ChecksummedFileTest
     public void testRemoteMetadataChecksumFilePathSha1()
         throws IOException
     {
-        String expected = REMOTE_METADATA_SHA1 + "  /home/test/repository/examples/metadata/maven-metadata.xml";
+        Path expectedFile = getTestOutputDir().resolve("maven-metadata-remote.xml.sha1");
+        FileUtils.writeStringToFile( expectedFile, FILE_ENCODING, REMOTE_METADATA_SHA1 + "  /home/test/repository/examples/metadata/maven-metadata.xml");
         Path testfile = getTestResource( "examples/metadata/maven-metadata-remote.xml" );
         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
 
         try
         {
-            String s = checksummedFile.parseChecksum( expected, ChecksumAlgorithm.SHA1, "maven-metadata-remote.xml" );
+            String s = checksummedFile.parseChecksum( expectedFile, ChecksumAlgorithm.SHA1, "maven-metadata-remote.xml", FILE_ENCODING );
             assertEquals( "Checksum doesn't match", REMOTE_METADATA_SHA1, s );
         }
-        catch ( IOException e )
+        catch ( ChecksumValidationException e )
         {
             e.printStackTrace();
             fail( "IOException should not occur." );
@@ -288,16 +293,17 @@ public class ChecksummedFileTest
     public void testRemoteMetadataChecksumFilePathMd5()
         throws IOException
     {
-        String expected = REMOTE_METADATA_MD5 + "  ./examples/metadata/maven-metadata.xml";
+        Path expectedFile = getTestOutputDir().resolve( "maven-metadata.xml.md5" );
+        FileUtils.writeStringToFile( expectedFile, FILE_ENCODING, REMOTE_METADATA_MD5 + "  ./examples/metadata/maven-metadata.xml");
         Path testfile = getTestResource( "examples/metadata/maven-metadata-remote.xml" );
         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
 
         try
         {
-            String s = checksummedFile.parseChecksum( expected, ChecksumAlgorithm.MD5, "maven-metadata-remote.xml" );
+            String s = checksummedFile.parseChecksum( expectedFile, ChecksumAlgorithm.MD5, "maven-metadata-remote.xml", FILE_ENCODING );
             assertEquals( "Checksum doesn't match", REMOTE_METADATA_MD5, s );
         }
-        catch ( IOException e )
+        catch ( ChecksumValidationException e )
         {
             e.printStackTrace();
             fail( "IOException should not occur." );

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/pom.xml b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/pom.xml
index 274fe80..1de2ce6 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/pom.xml
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/pom.xml
@@ -44,6 +44,10 @@
     </dependency>
     <dependency>
       <groupId>org.apache.archiva</groupId>
+      <artifactId>archiva-checksum</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.archiva</groupId>
       <artifactId>archiva-repository-admin-api</artifactId>
     </dependency>
     <dependency>
@@ -223,7 +227,6 @@
               org.apache.commons.io;version="[1.4,2)",
               org.apache.commons.lang*;version="[2.4,3)",
               org.springframework*;version="[3,4)",
-              org.codehaus.plexus.digest,
               org.apache.archiva.redback.components.registry,
               org.apache.archiva.metadata.model*;version=${project.version},
               org.apache.archiva.metadata.repository.storage.maven2*;version=${project.version},

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/checksum/ChecksumValidationException.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/checksum/ChecksumValidationException.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/checksum/ChecksumValidationException.java
deleted file mode 100644
index 4ecab97..0000000
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/checksum/ChecksumValidationException.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.apache.archiva.checksum;
-
-/*
- * 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.
- */
-
-/**
- * Exception thrown by the ChecksumValidator
- *
- * Has an error type for different validation errors.
- *
- * @author Martin Stockhammer <ma...@apache.org>
- */
-public class ChecksumValidationException extends Exception
-{
-
-    public enum ValidationError {
-        INVALID_FORMAT, DIGEST_ERROR, READ_ERROR, FILE_NOT_FOUND
-    };
-
-    final private ValidationError errorType;
-
-    public ChecksumValidationException( ValidationError errorType )
-    {
-        super( );
-        this.errorType = errorType;
-    }
-
-    public ChecksumValidationException( ValidationError errorType,  String message )
-    {
-        super( message );
-        this.errorType = errorType;
-    }
-
-    public ChecksumValidationException( ValidationError errorType, String message, Throwable cause )
-    {
-        super( message, cause );
-        this.errorType = errorType;
-    }
-
-    public ChecksumValidationException( ValidationError errorType, Throwable cause )
-    {
-        super( cause );
-        this.errorType = errorType;
-    }
-
-    public ValidationError getErrorType() {
-        return errorType;
-    }
-}

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/checksum/ChecksumValidator.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/checksum/ChecksumValidator.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/checksum/ChecksumValidator.java
deleted file mode 100644
index f6005dd..0000000
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/checksum/ChecksumValidator.java
+++ /dev/null
@@ -1,181 +0,0 @@
-package org.apache.archiva.checksum;
-
-/*
- * 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 javax.xml.bind.DatatypeConverter;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.StandardOpenOption;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import static org.apache.archiva.checksum.ChecksumValidationException.ValidationError.*;
-
-/**
- * Class for validating checksums.
- *
- * @author Martin Stockhammer <ma...@apache.org>
- */
-public class ChecksumValidator
-{
-    private final int NOT_INITALIZED = 0;
-    private final int INITIALIZING = 1;
-    private final int INITIALIZED = 2;
-    private AtomicInteger status = new AtomicInteger( NOT_INITALIZED );
-    private static final Map<String, String> supportedTypes = new HashMap<>(  );
-
-    public ChecksumValidator() {
-        init();
-    }
-
-    private void init() {
-        int val;
-        if (status.compareAndSet( NOT_INITALIZED, INITIALIZING ))
-        {
-            try
-            {
-                supportedTypes.put( "md5", "MD5" );
-                supportedTypes.put( "sha1", "SHA-1" );
-                supportedTypes.put( "sha-1", "SHA-1" );
-                supportedTypes.put( "sha2", "SHA-256" );
-                supportedTypes.put( "sha256", "SHA-256" );
-                supportedTypes.put( "sha-256", "SHA-256" );
-                supportedTypes.put( "sha3", "SHA-384" );
-                supportedTypes.put( "sha384", "SHA-384" );
-                supportedTypes.put( "sha-384", "SHA-384" );
-                supportedTypes.put( "sha5", "SHA-512" );
-                supportedTypes.put( "sha512", "SHA-512" );
-                supportedTypes.put( "sha-512", "SHA-512" );
-            } finally
-            {
-                status.set(INITIALIZED);
-            }
-        } else if ((val = status.intValue())!=INITIALIZED) {
-            do
-            {
-                try
-                {
-                    Thread.currentThread().sleep(100);
-                    val = status.intValue();
-                }
-                catch ( InterruptedException e )
-                {
-                    // Ignore
-                }
-            } while(val!=INITIALIZED);
-        }
-    }
-
-    public boolean isValidChecksum(Path checksumFile) throws ChecksumValidationException
-    {
-        String fileName = checksumFile.getFileName().toString();
-        if (!Files.exists( checksumFile )) {
-            throw new ChecksumValidationException( FILE_NOT_FOUND, "Checksum file does not exist: "+checksumFile );
-        }
-        String extension = fileName.substring( fileName.lastIndexOf( '.' )+1).toLowerCase();
-        String digestType = this.supportedTypes.get(extension);
-        if (digestType==null) {
-            throw new ChecksumValidationException( INVALID_FORMAT, "The extension '"+extension+"' ist not known." );
-        }
-        Path checkFile = null;
-        try
-        {
-            MessageDigest md = MessageDigest.getInstance( digestType );
-            checkFile = getCheckFile( checksumFile );
-            byte[] computedChecksum = computeHash( checkFile, md );
-            byte[] readChecksum = readHashFile( checksumFile );
-            return md.isEqual( computedChecksum, readChecksum );
-        }
-        catch ( NoSuchAlgorithmException e )
-        {
-            throw new ChecksumValidationException( DIGEST_ERROR, "The digest is not supported "+digestType  );
-        }
-        catch ( IOException e )
-        {
-            throw new ChecksumValidationException( READ_ERROR, "Error while computing the checksum of "+checkFile+": "+e.getMessage(), e);
-        }
-    }
-
-    private Path getCheckFile(Path checksumFile) {
-        String fileName = checksumFile.getFileName().toString();
-        String newName = fileName.substring(0, fileName.lastIndexOf('.'));
-        return checksumFile.getParent().resolve(newName);
-    }
-
-    public Set<String> getSupportedExtensions() {
-        return supportedTypes.keySet();
-    }
-
-    public byte[] computeHash(Path file, MessageDigest digest) throws IOException
-    {
-        byte[] result;
-        try(FileChannel inChannel = FileChannel.open( file, StandardOpenOption.READ ))
-        {
-            MappedByteBuffer buffer = inChannel.map( FileChannel.MapMode.READ_ONLY, 0, inChannel.size( ) );
-            digest.update( buffer );
-            result = digest.digest( );
-        }
-        return result;
-    }
-
-    public byte[] computeHash(Path file, String type) throws ChecksumValidationException, NoSuchAlgorithmException, IOException
-    {
-        if (!supportedTypes.containsKey( type )) {
-            throw new ChecksumValidationException( INVALID_FORMAT );
-        }
-        return computeHash( file, MessageDigest.getInstance( supportedTypes.get(type) ) );
-    }
-
-    public byte[] readHashFile(Path file) throws IOException
-    {
-        StringBuilder sb = new StringBuilder(  );
-        try(BufferedReader reader = Files.newBufferedReader( file, StandardCharsets.US_ASCII )){
-            int ci;
-            while((ci = reader.read()) != -1) {
-                char c = (char)ci;
-                if (Character.isWhitespace( c )) {
-                    break;
-                } else {
-                    sb.append(c);
-                }
-            }
-            return convertFromHex( sb.toString() );
-        }
-    }
-
-    protected String convertToHex(byte[] array) {
-        return DatatypeConverter.printHexBinary( array ).trim().toLowerCase();
-    }
-
-    protected byte[] convertFromHex(String checksum) {
-        return DatatypeConverter.parseHexBinary( checksum.trim().toLowerCase() );
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/ArtifactMissingChecksumsConsumer.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/ArtifactMissingChecksumsConsumer.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/ArtifactMissingChecksumsConsumer.java
index 0cc3aa5..ca45bb6 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/ArtifactMissingChecksumsConsumer.java
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/ArtifactMissingChecksumsConsumer.java
@@ -155,25 +155,16 @@ public class ArtifactMissingChecksumsConsumer
     private void createFixChecksum( String path, ChecksumAlgorithm checksumAlgorithm )
     {
         Path artifactFile = repositoryDir.resolve(path);
-        Path checksumFile = repositoryDir.resolve(path + "." + checksumAlgorithm.getExt( ) );
+        Path checksumFile = repositoryDir.resolve(path + "." + checksumAlgorithm.getExt( ).get(0) );
 
         if ( Files.exists(checksumFile) )
         {
             checksum = new ChecksummedFile( artifactFile);
-            try
+            if ( !checksum.isValidChecksum( checksumAlgorithm ) )
             {
-                if ( !checksum.isValidChecksum( checksumAlgorithm ) )
-                {
-                    checksum.fixChecksums( new ChecksumAlgorithm[]{checksumAlgorithm} );
-                    log.info( "Fixed checksum file {}", checksumFile.toAbsolutePath( ) );
-                    triggerConsumerInfo( "Fixed checksum file " + checksumFile.toAbsolutePath( ) );
-                }
-            }
-            catch ( IOException e )
-            {
-                log.error( "Cannot calculate checksum for file {} :", checksumFile, e );
-                triggerConsumerError( TYPE_CHECKSUM_CANNOT_CALC, "Cannot calculate checksum for file " + checksumFile +
-                    ": " + e.getMessage( ) );
+                checksum.fixChecksums( new ChecksumAlgorithm[]{checksumAlgorithm} );
+                log.info( "Fixed checksum file {}", checksumFile.toAbsolutePath( ) );
+                triggerConsumerInfo( "Fixed checksum file " + checksumFile.toAbsolutePath( ) );
             }
         }
         else if ( !Files.exists(checksumFile) )

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/ValidateChecksumConsumer.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/ValidateChecksumConsumer.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/ValidateChecksumConsumer.java
index 06930bd..e4648a8 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/ValidateChecksumConsumer.java
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/ValidateChecksumConsumer.java
@@ -19,8 +19,10 @@ package org.apache.archiva.consumers.core;
  * under the License.
  */
 
+import org.apache.archiva.checksum.ChecksumAlgorithm;
+import org.apache.archiva.checksum.ChecksumReference;
 import org.apache.archiva.checksum.ChecksumValidationException;
-import org.apache.archiva.checksum.ChecksumValidator;
+import org.apache.archiva.checksum.ChecksummedFile;
 import org.apache.archiva.consumers.AbstractMonitoredConsumer;
 import org.apache.archiva.consumers.ConsumerException;
 import org.apache.archiva.consumers.KnownRepositoryContentConsumer;
@@ -63,8 +65,6 @@ public class ValidateChecksumConsumer
 
     private String description = "Validate checksums against file.";
 
-    ThreadLocal<ChecksumValidator> validatorThreadLocal = new ThreadLocal<>();
-
     private Path repositoryDir;
 
     private List<String> includes;
@@ -123,16 +123,11 @@ public class ValidateChecksumConsumer
     public void processFile( String path )
         throws ConsumerException
     {
-        ChecksumValidator validator;
-        if ((validator=validatorThreadLocal.get())==null) {
-            validator = new ChecksumValidator();
-            validatorThreadLocal.set(validator);
-        }
         Path checksumFile = this.repositoryDir.resolve( path );
         try
         {
-
-            if ( !validator.isValidChecksum( checksumFile ) )
+            ChecksumReference cf = ChecksummedFile.getFromChecksumFile( checksumFile );
+            if ( !cf.getFile().isValidChecksum( cf.getAlgorithm(), true )  )
             {
                 log.warn( "The checksum for {} is invalid.", checksumFile );
                 triggerConsumerWarning( NOT_VALID_CHECKSUM, "The checksum for " + checksumFile + " is invalid." );
@@ -164,12 +159,7 @@ public class ValidateChecksumConsumer
     @PostConstruct
     public void initialize( )
     {
-        ChecksumValidator validator;
-        if ((validator=validatorThreadLocal.get())==null) {
-            validator = new ChecksumValidator();
-            validatorThreadLocal.set(validator);
-        }
-        Set<String> extensions = validator.getSupportedExtensions();
+        Set<String> extensions = ChecksumAlgorithm.getExtensions();
         includes = new ArrayList<>( extensions.size() );
         for ( String ext : extensions )
         {

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/checksum/ChecksumValidatorTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/checksum/ChecksumValidatorTest.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/checksum/ChecksumValidatorTest.java
deleted file mode 100644
index 0b3118b..0000000
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/checksum/ChecksumValidatorTest.java
+++ /dev/null
@@ -1,145 +0,0 @@
-package org.apache.archiva.checksum;
-
-/*
- * 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.junit.Test;
-
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.junit.Assert.*;
-
-/**
- * @author Martin Stockhammer <ma...@apache.org>
- */
-
-public class ChecksumValidatorTest
-{
-
-    @Test
-    public void isValidChecksum( ) throws URISyntaxException, ChecksumValidationException
-    {
-        ChecksumValidator validator = new ChecksumValidator();
-        String fileName = "checksum/checksumTest1.txt";
-        List<String> exts = Arrays.asList( "md5", "sha1", "sha2", "sha3", "sha5" );
-        for(String ext : exts)
-        {
-            Path hashFile = Paths.get( Thread.currentThread( ).getContextClassLoader( ).getResource( fileName + "."+ext ).toURI( ) );
-            assertTrue( validator.isValidChecksum( hashFile ) );
-        }
-        fileName = "checksum/checksumTest2.txt";
-        for(String ext : exts)
-        {
-            Path hashFile = Paths.get( Thread.currentThread( ).getContextClassLoader( ).getResource( fileName + "."+ext ).toURI( ) );
-            assertTrue( validator.isValidChecksum( hashFile ) );
-        }
-    }
-
-    @Test
-    public void isInValidChecksum( ) throws URISyntaxException, ChecksumValidationException
-    {
-        ChecksumValidator validator = new ChecksumValidator();
-        String fileName = "checksum/checksumTest3.txt";
-        List<String> exts = Arrays.asList( "md5", "sha1", "sha2", "sha3", "sha5" );
-        for(String ext : exts)
-        {
-            Path hashFile = Paths.get( Thread.currentThread( ).getContextClassLoader( ).getResource( fileName + "."+ext ).toURI( ) );
-            assertFalse( validator.isValidChecksum( hashFile ) );
-        }
-    }
-
-    @Test
-    public void isInvalidExtension( ) throws URISyntaxException, ChecksumValidationException
-    {
-        ChecksumValidator validator = new ChecksumValidator();
-        String fileName = "checksum/checksumTest1.txt";
-        String ext = "md8";
-        try
-        {
-            Path hashFile = Paths.get( Thread.currentThread( ).getContextClassLoader( ).getResource( fileName + "." + ext ).toURI( ) );
-            validator.isValidChecksum( hashFile );
-        } catch (ChecksumValidationException e) {
-            assertEquals(ChecksumValidationException.ValidationError.INVALID_FORMAT, e.getErrorType());
-        }
-    }
-
-    @Test
-    public void computeFileDoesNotExist( ) throws URISyntaxException, ChecksumValidationException
-    {
-        ChecksumValidator validator = new ChecksumValidator();
-        String fileName = "checksum/checksumTest4.txt";
-        String ext = "md5";
-        try
-        {
-            Path hashFile = Paths.get( Thread.currentThread( ).getContextClassLoader( ).getResource( fileName + "." + ext ).toURI( ) );
-            validator.isValidChecksum( hashFile );
-        } catch (ChecksumValidationException e) {
-            assertEquals(ChecksumValidationException.ValidationError.READ_ERROR, e.getErrorType());
-        }
-    }
-
-    @Test
-    public void checksumFileDoesNotExist( ) throws URISyntaxException, ChecksumValidationException
-    {
-        ChecksumValidator validator = new ChecksumValidator();
-        String fileName = "checksumTest5.txt";
-        String ext = "md5";
-        try
-        {
-            Path sibling = Paths.get( Thread.currentThread( ).getContextClassLoader( ).getResource( "checksum/checksumTest1.txt." + ext ).toURI( ) );
-            Path hashFile = sibling.getParent().resolve(fileName);
-            validator.isValidChecksum( hashFile );
-        } catch (ChecksumValidationException e) {
-            assertEquals(ChecksumValidationException.ValidationError.FILE_NOT_FOUND, e.getErrorType());
-        }
-    }
-
-    @Test
-    public void computeHash( ) throws URISyntaxException, NoSuchAlgorithmException, IOException, ChecksumValidationException
-    {
-        ChecksumValidator validator = new ChecksumValidator();
-        Map<String, String> hashes = new HashMap<>( );
-        hashes.put("md5","079fe13e970ae7311172df6657f36892");
-        hashes.put("sha1", "01e14abba5401e1a63be468f9c3b723167f27dc8");
-        hashes.put("sha2", "ae7278e7bdfd8d7c06f9b1932ddccdddb0061a58a893aec3f00932e53ef9c794");
-        hashes.put("sha3", "a52efc629f256cd2b390f080ab7e23fc706ab9e2c8948cea2bd8504a70894f69f44f48e83c889edc82b40b673b575bad");
-        hashes.put("sha5", "b2340bbf150403725fdf6a6f340a8a33bb9526bad7e0220f1dfea67d5a06217bc1d5c3a773b083ed8c9f5352c94ecc6da2a6d8a33ad0347566f0acc55e042fde");
-        Path hashFile = Paths.get( Thread.currentThread( ).getContextClassLoader( ).getResource( "checksum/checksumTest1.txt").toURI( ) );
-
-        for (String key : hashes.keySet()) {
-            byte[] expectedSum = validator.convertFromHex( hashes.get(key) );
-            byte[] computedSum = validator.computeHash( hashFile, key );
-            assertArrayEquals( expectedSum, computedSum );
-        }
-    }
-
-    @Test
-    public void readHashFile( )
-    {
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt
deleted file mode 100644
index 3105054..0000000
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,
-sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum
-dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,
-sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
-Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
-At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
-
-Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero
-eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
-Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
-
-Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel
-eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto
-odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
-
-Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet,
-consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis
-nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
-
-Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.
-
-At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
-Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
-At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet,
-consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et
-gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.md5
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.md5 b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.md5
deleted file mode 100644
index 91bef91..0000000
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.md5
+++ /dev/null
@@ -1 +0,0 @@
-079fe13e970ae7311172df6657f36892  checksumTest1.txt

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.md8
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.md8 b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.md8
deleted file mode 100644
index 91bef91..0000000
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.md8
+++ /dev/null
@@ -1 +0,0 @@
-079fe13e970ae7311172df6657f36892  checksumTest1.txt

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.sha1
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.sha1 b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.sha1
deleted file mode 100644
index 939964c..0000000
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.sha1
+++ /dev/null
@@ -1 +0,0 @@
-01e14abba5401e1a63be468f9c3b723167f27dc8  checksumTest1.txt

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.sha2
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.sha2 b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.sha2
deleted file mode 100644
index 1f38197..0000000
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.sha2
+++ /dev/null
@@ -1 +0,0 @@
-ae7278e7bdfd8d7c06f9b1932ddccdddb0061a58a893aec3f00932e53ef9c794  checksumTest1.txt

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.sha3
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.sha3 b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.sha3
deleted file mode 100644
index 5ee6789..0000000
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.sha3
+++ /dev/null
@@ -1 +0,0 @@
-a52efc629f256cd2b390f080ab7e23fc706ab9e2c8948cea2bd8504a70894f69f44f48e83c889edc82b40b673b575bad  checksumTest1.txt

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.sha5
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.sha5 b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.sha5
deleted file mode 100644
index d0fe49d..0000000
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest1.txt.sha5
+++ /dev/null
@@ -1 +0,0 @@
-b2340bbf150403725fdf6a6f340a8a33bb9526bad7e0220f1dfea67d5a06217bc1d5c3a773b083ed8c9f5352c94ecc6da2a6d8a33ad0347566f0acc55e042fde  checksumTest1.txt

http://git-wip-us.apache.org/repos/asf/archiva/blob/fbf5e991/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest2.txt
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest2.txt b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest2.txt
deleted file mode 100644
index 8d2edd5..0000000
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/resources/checksum/checksumTest2.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-Check 2
-Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,
-sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum
-dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,
-sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
-Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
-At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
-
-Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero
-eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
-Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
-
-Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel
-eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto
-odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
-
-Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet,
-consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis
-nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
-
-Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.
-
-At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
-Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
-At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet,
-consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et
-gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur