]> source.dussan.org Git - archiva.git/blob
d89470d6e6a22eb69bc32911a1dfef97d94072ab
[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
20 import javax.swing.*;
21 import java.applet.Applet;
22 import java.awt.*;
23 import java.io.File;
24 import java.io.FileInputStream;
25 import java.io.IOException;
26 import java.io.InputStream;
27 import java.security.AccessController;
28 import java.security.MessageDigest;
29 import java.security.NoSuchAlgorithmException;
30 import java.security.PrivilegedAction;
31
32 /**
33  * TODO: Description.
34  *
35  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
36  */
37 public class ChecksumApplet
38     extends Applet
39 {
40     private static final int CHECKSUM_BUFFER_SIZE = 8192;
41
42     private static final int BYTE_MASK = 0xFF;
43
44     private JProgressBar progressBar;
45
46     public void init()
47     {
48         setLayout( new BorderLayout() );
49         progressBar = new JProgressBar();
50         progressBar.setStringPainted( true );
51         add( progressBar, BorderLayout.CENTER );
52         JLabel label = new JLabel( "Checksum progress: " );
53         add( label, BorderLayout.WEST );
54     }
55
56     public String generateMd5( final String file )
57         throws IOException, NoSuchAlgorithmException
58     {
59         return (String) AccessController.doPrivileged( new PrivilegedAction()
60         {
61             public Object run()
62             {
63                 try
64                 {
65                     MessageDigest digest = MessageDigest.getInstance( "MD5" );
66
67                     long total = new File( file ).length();
68                     InputStream fis = new FileInputStream( file );
69                     try
70                     {
71                         long totalRead = 0;
72                         byte[] buffer = new byte[CHECKSUM_BUFFER_SIZE];
73                         int numRead;
74                         do
75                         {
76                             numRead = fis.read( buffer );
77                             if ( numRead > 0 )
78                             {
79                                 digest.update( buffer, 0, numRead );
80                                 totalRead += numRead;
81                                 progressBar.setValue( (int) ( totalRead * progressBar.getMaximum() / total ) );
82                             }
83                         }
84                         while ( numRead != -1 );
85                     }
86                     finally
87                     {
88                         fis.close();
89                     }
90
91                     return byteArrayToHexStr( digest.digest() );
92                 }
93                 catch ( NoSuchAlgorithmException e )
94                 {
95                     throw new RuntimeException( e );
96                 }
97                 catch ( IOException e )
98                 {
99                     throw new RuntimeException( e );
100                 }
101             }
102         } );
103     }
104
105     private static String byteArrayToHexStr( byte[] data )
106     {
107         String output = "";
108
109         for ( int cnt = 0; cnt < data.length; cnt++ )
110         {
111             //Deposit a byte into the 8 lsb of an int.
112             int tempInt = data[cnt] & BYTE_MASK;
113
114             //Get hex representation of the int as a string.
115             String tempStr = Integer.toHexString( tempInt );
116
117             //Append a leading 0 if necessary so that each hex string will contain 2 characters.
118             if ( tempStr.length() == 1 )
119             {
120                 tempStr = "0" + tempStr;
121             }
122
123             //Concatenate the two characters to the output string.
124             output = output + tempStr;
125         }
126
127         return output.toUpperCase();
128     }
129 }