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 return dependenciesTool.loadProjectDependencies(getProject(), this, localRepository, remoteRepositories,
118 getArtifactCache());
119 }
120
121 @Override
122 protected SortedProperties createUnsafeMapping() throws ProjectBuildingException, IOException,
123 ThirdPartyToolException {
124
125 SortedProperties unsafeMappings = getThirdPartyTool().loadUnsafeMapping(getLicenseMap(), getArtifactCache(),
126 getEncoding(), getMissingFile());
127
128 SortedSet<MavenProject> unsafeDependencies = getUnsafeDependencies();
129
130 getLog().debug("1.0");
131 if (CollectionUtils.isNotEmpty(unsafeDependencies)) {
132
133
134
135 getLog().debug("2.0");
136 if (isUseRepositoryMissingFiles()) {
137
138
139
140 Collection<MavenProject> projects = new ArrayList<MavenProject>(getProjectDependencies().values());
141 projects.remove(getProject());
142 projects.removeAll(unsafeDependencies);
143
144 getLog().debug("2.1");
145
146 SortedProperties resolvedUnsafeMapping = new SortedProperties("UTF-8");
147
148
149
150
151
152
153 getLog().debug("2.2");
154
155
156 unsafeMappings.putAll(resolvedUnsafeMapping);
157
158 }
159 }
160 if (isVerbose()) {
161 getLog().info("found " + unsafeMappings.size() + " unsafe mappings");
162 }
163
164
165 boolean generateMissingfile = doGenerateMissing
166 && computeDoGenerateMissingFile(unsafeMappings, unsafeDependencies);
167
168 setDoGenerateMissing(generateMissingfile);
169
170 if (generateMissingfile && isVerbose()) {
171 StringBuilder sb = new StringBuilder();
172 sb.append("Will use from missing file ");
173 sb.append(unsafeMappings.size());
174 sb.append(" dependencies :");
175 for (Map.Entry<Object, Object> entry : unsafeMappings.entrySet()) {
176 String id = (String) entry.getKey();
177 String license = (String) entry.getValue();
178 sb.append("\n - ").append(id).append(" - ").append(license);
179 }
180 getLog().info(sb.toString());
181 } else {
182 if (isUseMissingFile() && !unsafeMappings.isEmpty()) {
183 getLog().debug("Missing file " + getMissingFile() + " is up-to-date.");
184 }
185 }
186 getLog().debug("4");
187 return unsafeMappings;
188 }
189
190
191
192
193
194
195
196
197
198
199
200 protected boolean computeDoGenerateMissingFile(SortedProperties unsafeMappings,
201 SortedSet<MavenProject> unsafeDependencies) throws IOException {
202
203 if (!isUseMissingFile()) {
204
205
206 return false;
207 }
208
209 if (isForce()) {
210
211
212 return !CollectionUtils.isEmpty(unsafeMappings.keySet());
213 }
214
215 if (!CollectionUtils.isEmpty(unsafeDependencies)) {
216
217
218
219 return true;
220 }
221
222 File missingFile = getMissingFile();
223
224 if (!missingFile.exists()) {
225
226
227
228 return true;
229 }
230
231
232 SortedProperties oldUnsafeMappings = new SortedProperties(getEncoding());
233 oldUnsafeMappings.load(missingFile);
234 return !unsafeMappings.equals(oldUnsafeMappings);
235 }
236
237 @Override
238 protected boolean checkSkip() {
239 if (!isDoGenerate() && !isDoGenerateBundle() && !isDoGenerateMissing()) {
240
241 getLog().info("All files are up to date, skip goal execution.");
242 return false;
243 }
244 return true;
245 }
246
247 @Override
248 protected void doAction() throws Exception {
249 boolean unsafe = checkUnsafeDependencies();
250
251 writeThirdPartyFile();
252
253 if (isDoGenerateMissing()) {
254
255 writeMissingFile();
256 }
257
258 if (unsafe && isFailIfWarning()) {
259 throw new MojoFailureException("There is some dependencies with no license, please fill the file "
260 + getMissingFile());
261 }
262
263 if (!unsafe && isUseMissingFile() && MapUtils.isEmpty(getUnsafeMappings()) && getMissingFile().exists()) {
264
265
266 getLog().debug("There is no dependency to put in missing file, delete it at " + getMissingFile());
267 FileUtil.deleteFile(getMissingFile());
268 }
269
270 if (!unsafe && isDeployMissingFile() && MapUtils.isNotEmpty(getUnsafeMappings())) {
271
272
273 File file = getMissingFile();
274
275 getLog().debug("Will deploy third party file from " + file);
276 getThirdPartyTool().attachThirdPartyDescriptor(getProject(), file);
277 }
278
279 addResourceDir(getOutputDirectory(), "**/*.txt");
280 }
281
282 protected void writeMissingFile() throws IOException {
283
284 Log log = getLog();
285 LicenseMap licenseMap = getLicenseMap();
286 File file = getMissingFile();
287
288 FileUtil.createDirectoryIfNecessary(file.getParentFile());
289 log.info("Regenerate missing license file " + file);
290
291 FileOutputStream writer = new FileOutputStream(file);
292 try {
293 StringBuilder sb = new StringBuilder(" Generated by " + getClass().getName());
294 List<String> licenses = new ArrayList<String>(licenseMap.keySet());
295 licenses.remove(LicenseMap.getUnknownLicenseMessage());
296 if (!licenses.isEmpty()) {
297 sb.append("\n-------------------------------------------------------------------------------");
298 sb.append("\n Already used licenses in project :");
299 for (String license : licenses) {
300 sb.append("\n - ").append(license);
301 }
302 }
303 sb.append("\n-------------------------------------------------------------------------------");
304 sb.append("\n Please fill the missing licenses for dependencies :\n\n");
305 getUnsafeMappings().store(writer, sb.toString());
306 } finally {
307 writer.close();
308 }
309 }
310
311 public boolean isDoGenerateMissing() {
312 return doGenerateMissing;
313 }
314
315 public void setDoGenerateMissing(boolean doGenerateMissing) {
316 this.doGenerateMissing = doGenerateMissing;
317 }
318
319 public ArtifactRepository getLocalRepository() {
320 return localRepository;
321 }
322
323 public List getRemoteRepositories() {
324 return remoteRepositories;
325 }
326
327
328
329
330 @Override
331 public boolean isIncludeTransitiveDependencies() {
332 return includeTransitiveDependencies;
333 }
334
335
336
337
338
339
340
341
342
343 public boolean isDeployMissingFile() {
344 return deployMissingFile;
345 }
346
347 public boolean isUseRepositoryMissingFiles() {
348 return useRepositoryMissingFiles;
349 }
350
351 }