1 package org.apache.maven.plugins.enforcer;
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.FileInputStream;
24 import java.io.IOException;
25 import java.io.InputStream;
26
27 import org.apache.commons.codec.digest.DigestUtils;
28 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
29 import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
30
31
32
33
34
35
36
37
38 public class RequireFileChecksum
39 extends AbstractNonCacheableEnforcerRule
40 {
41
42 protected File file;
43
44 private String checksum;
45
46 private String type;
47
48 private String nonexistentFileMessage;
49
50 @Override
51 public void execute( EnforcerRuleHelper helper )
52 throws EnforcerRuleException
53 {
54 if ( this.file == null )
55 {
56 throw new EnforcerRuleException( "Input file unspecified" );
57 }
58
59 if ( this.type == null )
60 {
61 throw new EnforcerRuleException( "Hash type unspecified" );
62 }
63
64 if ( this.checksum == null )
65 {
66 throw new EnforcerRuleException( "Checksum unspecified" );
67 }
68
69 if ( !this.file.exists() )
70 {
71 String message = nonexistentFileMessage;
72 if ( message == null )
73 {
74 message = "File does not exist: " + this.file.getAbsolutePath();
75 }
76 throw new EnforcerRuleException( message );
77 }
78
79 if ( this.file.isDirectory() )
80 {
81 throw new EnforcerRuleException( "Cannot calculate the checksum of directory: "
82 + this.file.getAbsolutePath() );
83 }
84
85 if ( !this.file.canRead() )
86 {
87 throw new EnforcerRuleException( "Cannot read file: " + this.file.getAbsolutePath() );
88 }
89
90 String checksum = calculateChecksum();
91
92 if ( !checksum.equalsIgnoreCase( this.checksum ) )
93 {
94 String exceptionMessage = getMessage();
95 if ( exceptionMessage == null )
96 {
97 exceptionMessage = this.type + " hash of " + this.file + " was " + checksum
98 + " but expected " + this.checksum;
99 }
100 throw new EnforcerRuleException( exceptionMessage );
101 }
102 }
103
104
105
106
107
108
109 public void setFile( File file )
110 {
111 this.file = file;
112 }
113
114
115
116
117
118
119 public void setChecksum( String checksum )
120 {
121 this.checksum = checksum;
122 }
123
124
125
126
127
128
129 public void setType( String type )
130 {
131 this.type = type;
132 }
133
134
135
136
137
138
139 public void setNonexistentFileMessage( String nonexistentFileMessage )
140 {
141 this.nonexistentFileMessage = nonexistentFileMessage;
142 }
143
144 protected String calculateChecksum()
145 throws EnforcerRuleException
146 {
147 try ( InputStream inputStream = new FileInputStream( this.file ) )
148 {
149 return calculateChecksum( inputStream );
150 }
151 catch ( IOException e )
152 {
153 throw new EnforcerRuleException( "Unable to calculate checksum", e );
154 }
155 }
156
157 protected String calculateChecksum( InputStream inputStream )
158 throws IOException, EnforcerRuleException
159 {
160 String checksum;
161 if ( "md5".equals( this.type ) )
162 {
163 checksum = DigestUtils.md5Hex( inputStream );
164 }
165 else if ( "sha1".equals( this.type ) )
166 {
167 checksum = DigestUtils.sha1Hex( inputStream );
168 }
169 else if ( "sha256".equals( this.type ) )
170 {
171 checksum = DigestUtils.sha256Hex( inputStream );
172 }
173 else if ( "sha384".equals( this.type ) )
174 {
175 checksum = DigestUtils.sha384Hex( inputStream );
176 }
177 else if ( "sha512".equals( this.type ) )
178 {
179 checksum = DigestUtils.sha512Hex( inputStream );
180 }
181 else
182 {
183 throw new EnforcerRuleException( "Unsupported hash type: " + this.type );
184 }
185 return checksum;
186 }
187 }