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