1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.codehaus.mojo.license;
17
18 import java.io.File;
19 import java.io.FileOutputStream;
20 import java.io.IOException;
21 import java.util.ArrayList;
22 import java.util.Collection;
23 import java.util.List;
24 import java.util.Map;
25 import java.util.SortedMap;
26 import java.util.SortedSet;
27
28 import org.apache.commons.collections.CollectionUtils;
29 import org.apache.commons.collections.MapUtils;
30 import org.apache.maven.artifact.repository.ArtifactRepository;
31 import org.apache.maven.plugin.MojoFailureException;
32 import org.apache.maven.plugin.logging.Log;
33 import org.apache.maven.project.MavenProject;
34 import org.apache.maven.project.ProjectBuildingException;
35 import org.codehaus.mojo.license.model.LicenseMap;
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 public class AddThirdPartyMojo extends AbstractAddThirdPartyMojo implements MavenProjectDependenciesConfigurator {
57
58
59
60
61
62
63
64
65
66 protected ArtifactRepository localRepository;
67
68
69
70
71
72
73
74
75
76 protected List remoteRepositories;
77
78
79
80
81
82
83
84 protected boolean deployMissingFile;
85
86
87
88
89
90
91
92 protected boolean useRepositoryMissingFiles;
93
94
95
96
97
98
99
100
101 private DependenciesTool dependenciesTool;
102
103
104
105
106
107
108 private boolean doGenerateMissing;
109
110 @Override
111 protected boolean checkPackaging() {
112 return rejectPackaging("pom");
113 }
114
115 @Override
116 protected SortedMap<String, MavenProject> loadDependencies() {
117 getLog().info("dependencies tool=" + dependenciesTool.getClass());
118
119 return dependenciesTool.loadProjectDependencies(getProject(), this, localRepository, remoteRepositories,
120 getArtifactCache());
121 }
122
123 @Override
124 protected SortedProperties createUnsafeMapping() throws ProjectBuildingException, IOException,
125 ThirdPartyToolException {
126
127 SortedProperties unsafeMappings = getThridPartyTool().loadUnsafeMapping(getLicenseMap(), getArtifactCache(),
128 getEncoding(), getMissingFile());
129
130 SortedSet<MavenProject> unsafeDependencies = getUnsafeDependencies();
131
132 getLog().debug("1.0");
133 if (CollectionUtils.isNotEmpty(unsafeDependencies)) {
134
135
136
137 getLog().debug("2.0");
138 if (isUseRepositoryMissingFiles()) {
139
140
141
142 Collection<MavenProject> projects = new ArrayList<MavenProject>(getProjectDependencies().values());
143 projects.remove(getProject());
144 projects.removeAll(unsafeDependencies);
145
146 getLog().debug("2.1");
147 SortedProperties resolvedUnsafeMapping = new SortedProperties("UTF-8");
148
149
150 getLog().debug("2.2");
151
152
153 unsafeMappings.putAll(resolvedUnsafeMapping);
154
155 }
156 }
157 if (isVerbose()) {
158 getLog().info("found " + unsafeMappings.size() + " unsafe mappings");
159 }
160
161
162 boolean generateMissingfile = doGenerateMissing
163 && computeDoGenerateMissingFile(unsafeMappings, unsafeDependencies);
164
165 setDoGenerateMissing(generateMissingfile);
166
167 if (generateMissingfile && isVerbose()) {
168 StringBuilder sb = new StringBuilder();
169 sb.append("Will use from missing file ");
170 sb.append(unsafeMappings.size());
171 sb.append(" dependencies :");
172 for (Map.Entry<Object, Object> entry : unsafeMappings.entrySet()) {
173 String id = (String) entry.getKey();
174 String license = (String) entry.getValue();
175 sb.append("\n - ").append(id).append(" - ").append(license);
176 }
177 getLog().info(sb.toString());
178 } else {
179 if (isUseMissingFile() && !unsafeMappings.isEmpty()) {
180 getLog().debug("Missing file " + getMissingFile() + " is up-to-date.");
181 }
182 }
183 getLog().info("4");
184 return unsafeMappings;
185 }
186
187
188
189
190
191
192
193
194
195
196
197 protected boolean computeDoGenerateMissingFile(SortedProperties unsafeMappings,
198 SortedSet<MavenProject> unsafeDependencies) throws IOException {
199
200 if (!isUseMissingFile()) {
201
202
203 return false;
204 }
205
206 if (isForce()) {
207
208
209 return !CollectionUtils.isEmpty(unsafeMappings.keySet());
210 }
211
212 if (!CollectionUtils.isEmpty(unsafeDependencies)) {
213
214
215
216 return true;
217 }
218
219 File missingFile = getMissingFile();
220
221 if (!missingFile.exists()) {
222
223
224
225 return true;
226 }
227
228
229 SortedProperties oldUnsafeMappings = new SortedProperties(getEncoding());
230 oldUnsafeMappings.load(missingFile);
231 return !unsafeMappings.equals(oldUnsafeMappings);
232 }
233
234 @Override
235 protected boolean checkSkip() {
236 if (!isDoGenerate() && !isDoGenerateBundle() && !isDoGenerateMissing()) {
237
238 getLog().info("All files are up to date, skip goal execution.");
239 return false;
240 }
241 return true;
242 }
243
244 @Override
245 protected void doAction() throws Exception {
246 boolean unsafe = checkUnsafeDependencies();
247
248 writeThirdPartyFile();
249
250 if (isDoGenerateMissing()) {
251
252 writeMissingFile();
253 }
254
255 if (unsafe && isFailIfWarning()) {
256 throw new MojoFailureException("There is some dependencies with no license, please fill the file "
257 + getMissingFile());
258 }
259
260 if (!unsafe && isUseMissingFile() && MapUtils.isEmpty(getUnsafeMappings()) && getMissingFile().exists()) {
261
262
263 getLog().debug("There is no dependency to put in missing file, delete it at " + getMissingFile());
264 FileUtil.deleteFile(getMissingFile());
265 }
266
267 if (!unsafe && isDeployMissingFile() && MapUtils.isNotEmpty(getUnsafeMappings())) {
268
269
270 File file = getMissingFile();
271
272 getLog().debug("Will deploy third party file from " + file);
273 getThridPartyTool().attachThirdPartyDescriptor(getProject(), file);
274 }
275
276 addResourceDir(getOutputDirectory(), "**/*.txt");
277 }
278
279 protected void writeMissingFile() throws IOException {
280
281 Log log = getLog();
282 LicenseMap licenseMap = getLicenseMap();
283 File file = getMissingFile();
284
285 FileUtil.createDirectoryIfNecessary(file.getParentFile());
286 log.info("Regenerate missing license file " + file);
287
288 FileOutputStream writer = new FileOutputStream(file);
289 try {
290 StringBuilder sb = new StringBuilder(" Generated by " + getClass().getName());
291 List<String> licenses = new ArrayList<String>(licenseMap.keySet());
292 licenses.remove(LicenseMap.getUnknownLicenseMessage());
293 if (!licenses.isEmpty()) {
294 sb.append("\n-------------------------------------------------------------------------------");
295 sb.append("\n Already used licenses in project :");
296 for (String license : licenses) {
297 sb.append("\n - ").append(license);
298 }
299 }
300 sb.append("\n-------------------------------------------------------------------------------");
301 sb.append("\n Please fill the missing licenses for dependencies :\n\n");
302 getUnsafeMappings().store(writer, sb.toString());
303 } finally {
304 writer.close();
305 }
306 }
307
308 public boolean isDoGenerateMissing() {
309 return doGenerateMissing;
310 }
311
312 public void setDoGenerateMissing(boolean doGenerateMissing) {
313 this.doGenerateMissing = doGenerateMissing;
314 }
315
316 public ArtifactRepository getLocalRepository() {
317 return localRepository;
318 }
319
320 public List getRemoteRepositories() {
321 return remoteRepositories;
322 }
323
324
325
326
327 @Override
328 public boolean isIncludeTransitiveDependencies() {
329 return includeTransitiveDependencies;
330 }
331
332
333
334
335
336
337
338
339
340 public boolean isDeployMissingFile() {
341 return deployMissingFile;
342 }
343
344 public boolean isUseRepositoryMissingFiles() {
345 return useRepositoryMissingFiles;
346 }
347
348 }