]> source.dussan.org Git - archiva.git/blob
41f18f4dfebc160a12206ef2b50f3924c390132c
[archiva.git] /
1 package org.apache.archiva.checksum;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *   http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import java.io.IOException;
23 import java.io.InputStream;
24 import java.security.DigestInputStream;
25 import java.security.MessageDigest;
26 import java.security.NoSuchAlgorithmException;
27 import java.util.List;
28
29 import org.apache.commons.io.IOUtils;
30 import org.apache.commons.io.output.NullOutputStream;
31
32 /**
33  * Checksum - simple checksum hashing routines. 
34  *
35  * @version $Id$
36  */
37 public class Checksum
38 {
39     private static final int BUFFER_SIZE = 32768;
40
41     public static void update( List<Checksum> checksums, InputStream stream )
42         throws IOException
43     {
44         byte[] buffer = new byte[BUFFER_SIZE];
45         int size = stream.read( buffer, 0, BUFFER_SIZE );
46         while ( size >= 0 )
47         {
48             for ( Checksum checksum : checksums )
49             {
50                 checksum.update( buffer, 0, size );
51             }
52             size = stream.read( buffer, 0, BUFFER_SIZE );
53         }
54     }
55
56     protected final MessageDigest md;
57
58     private ChecksumAlgorithm checksumAlgorithm;
59
60     public Checksum( ChecksumAlgorithm checksumAlgorithm )
61     {
62         this.checksumAlgorithm = checksumAlgorithm;
63         try
64         {
65             md = MessageDigest.getInstance( checksumAlgorithm.getAlgorithm() );
66         }
67         catch ( NoSuchAlgorithmException e )
68         {
69             // Not really possible, but here none-the-less
70             throw new IllegalStateException( "Unable to initialize MessageDigest algorithm " + checksumAlgorithm.getAlgorithm()
71                 + " : " + e.getMessage(), e );
72         }
73     }
74
75     public String getChecksum()
76     {
77         return Hex.encode( md.digest() );
78     }
79
80     public ChecksumAlgorithm getAlgorithm()
81     {
82         return this.checksumAlgorithm;
83     }
84
85     public void reset()
86     {
87         md.reset();
88     }
89
90     public Checksum update( byte[] buffer, int offset, int size )
91     {
92         md.update( buffer, 0, size );
93         return this;
94     }
95
96     public Checksum update( InputStream stream )
97         throws IOException
98     {
99         DigestInputStream dig = new DigestInputStream( stream, md );
100         IOUtils.copy( dig, new NullOutputStream() );
101
102         return this;
103     }
104 }