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