1   package org.apache.maven.plugin.surefire.booterclient;
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  import java.io.File;
23  import java.io.UnsupportedEncodingException;
24  import java.security.MessageDigest;
25  import java.security.NoSuchAlgorithmException;
26  import java.util.ArrayList;
27  import java.util.List;
28  import java.util.Map;
29  import org.apache.maven.artifact.Artifact;
30  import org.apache.maven.artifact.repository.ArtifactRepository;
31  
32  
33  
34  
35  public class ChecksumCalculator
36  {
37      private static final String HEX = "0123456789ABCDEF";
38  
39      private final List<Object> checksumItems = new ArrayList<Object>();
40  
41      private void appendObject( Object item )
42      {
43          checksumItems.add( item );
44      }
45  
46      public void add( boolean value )
47      {
48          checksumItems.add( value );
49      }
50  
51      public void add( int value )
52      {
53          checksumItems.add( value );
54      }
55  
56      public void add( double value )
57      {
58          checksumItems.add( value );
59      }
60  
61      public void add( Map<?, ?> map )
62      {
63          if ( map != null )
64          {
65              appendObject( map.toString() );
66          }
67      }
68  
69      public void add( String string )
70      {
71          appendObject( string );
72      }
73  
74      public void add( File workingDirectory )
75      {
76          appendObject( workingDirectory );
77      }
78  
79      public void add( ArtifactRepository localRepository )
80      {
81          appendObject( localRepository );
82      }
83  
84      public void add( List<?> items )
85      {
86          if ( items != null )
87          {
88              for ( Object item : items )
89              {
90                  appendObject( item );
91              }
92          }
93          else
94          {
95              appendObject( null );
96          }
97  
98      }
99  
100     public void add( Object[] items )
101     {
102         if ( items != null )
103         {
104             for ( Object item : items )
105             {
106                 appendObject( item );
107             }
108         }
109         else
110         {
111             appendObject( null );
112         }
113     }
114 
115     public void add( Artifact artifact )
116     {
117         appendObject( artifact != null ? artifact.getId() : null );
118     }
119 
120     public void add( Boolean aBoolean )
121     {
122         appendObject( aBoolean );
123     }
124 
125     @SuppressWarnings( "checkstyle:magicnumber" )
126     private static String asHexString( byte[] bytes )
127     {
128         if ( bytes == null )
129         {
130             return null;
131         }
132         final StringBuilder result = new StringBuilder( 2 * bytes.length );
133         for ( byte b : bytes )
134         {
135             result.append( HEX.charAt( ( b & 0xF0 ) >> 4 ) ).append( HEX.charAt( ( b & 0x0F ) ) );
136         }
137         return result.toString();
138     }
139 
140     private String getConfig()
141     {
142         StringBuilder result = new StringBuilder();
143         for ( Object checksumItem : checksumItems )
144         {
145             result.append( checksumItem != null ? checksumItem.toString() : "null" );
146         }
147         return result.toString();
148     }
149 
150     public String getSha1()
151     {
152         try
153         {
154             MessageDigest md = MessageDigest.getInstance( "SHA-1" );
155             String configValue = getConfig();
156             md.update( configValue.getBytes( "iso-8859-1" ), 0, configValue.length() );
157             byte[] sha1hash = md.digest();
158             return asHexString( sha1hash );
159         }
160         catch ( NoSuchAlgorithmException e )
161         {
162             throw new RuntimeException( e );
163         }
164         catch ( UnsupportedEncodingException e )
165         {
166             throw new RuntimeException( e );
167         }
168     }
169 
170 }