]> source.dussan.org Git - archiva.git/blob
635d8edfaed18ca961d1fba1cdbf0f66b9d747bd
[archiva.git] /
1 package org.apache.maven.repository.applet;
2
3 /*
4  * Copyright 2005-2006 The Apache Software Foundation.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18
19 import javax.swing.*;
20 import java.applet.Applet;
21 import java.awt.*;
22 import java.io.File;
23 import java.io.FileInputStream;
24 import java.io.IOException;
25 import java.io.InputStream;
26 import java.security.AccessController;
27 import java.security.MessageDigest;
28 import java.security.NoSuchAlgorithmException;
29 import java.security.PrivilegedAction;
30
31 /**
32  * TODO: Description.
33  *
34  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
35  */
36 public class ChecksumApplet
37     extends Applet
38 {
39     private static final int CHECKSUM_BUFFER_SIZE = 8192;
40
41     private static final int BYTE_MASK = 0xFF;
42
43     private JProgressBar progressBar;
44
45     public void init()
46     {
47         setLayout( new BorderLayout() );
48         progressBar = new JProgressBar();
49         progressBar.setStringPainted( true );
50         add( progressBar, BorderLayout.CENTER );
51         JLabel label = new JLabel( "Checksum progress: " );
52         add( label, BorderLayout.WEST );
53     }
54
55     public String generateMd5( final String file )
56         throws IOException, NoSuchAlgorithmException
57     {
58         Object o = AccessController.doPrivileged( new PrivilegedAction()
59         {
60             public Object run()
61             {
62                 try
63                 {
64                     return checksumFile( file );
65                 }
66                 catch ( NoSuchAlgorithmException e )
67                 {
68                     return e;
69                 }
70                 catch ( IOException e )
71                 {
72                     return e;
73                 }
74             }
75         } );
76
77         //noinspection ChainOfInstanceofChecks
78         if ( o instanceof IOException )
79         {
80             throw (IOException) o;
81         }
82         else if ( o instanceof NoSuchAlgorithmException )
83         {
84             throw (NoSuchAlgorithmException) o;
85         }
86         else
87         {
88             return (String) o;
89         }
90     }
91
92     protected String checksumFile( String file )
93         throws NoSuchAlgorithmException, IOException
94     {
95         MessageDigest digest = MessageDigest.getInstance( "MD5" );
96
97         long total = new File( file ).length();
98         InputStream fis = new FileInputStream( file );
99         try
100         {
101             long totalRead = 0;
102             byte[] buffer = new byte[CHECKSUM_BUFFER_SIZE];
103             int numRead;
104             do
105             {
106                 numRead = fis.read( buffer );
107                 if ( numRead > 0 )
108                 {
109                     digest.update( buffer, 0, numRead );
110                     totalRead += numRead;
111                     progressBar.setValue( (int) ( totalRead * progressBar.getMaximum() / total ) );
112                 }
113             }
114             while ( numRead != -1 );
115         }
116         finally
117         {
118             fis.close();
119         }
120
121         return byteArrayToHexStr( digest.digest() );
122     }
123
124     protected static String byteArrayToHexStr( byte[] data )
125     {
126         String output = "";
127
128         for ( int cnt = 0; cnt < data.length; cnt++ )
129         {
130             //Deposit a byte into the 8 lsb of an int.
131             int tempInt = data[cnt] & BYTE_MASK;
132
133             //Get hex representation of the int as a string.
134             String tempStr = Integer.toHexString( tempInt );
135
136             //Append a leading 0 if necessary so that each hex string will contain 2 characters.
137             if ( tempStr.length() == 1 )
138             {
139                 tempStr = "0" + tempStr;
140             }
141
142             //Concatenate the two characters to the output string.
143             output = output + tempStr;
144         }
145
146         return output.toUpperCase();
147     }
148 }