1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  package org.codehaus.mojo.license;
27  
28  import java.io.File;
29  import java.io.FileOutputStream;
30  import java.io.IOException;
31  import java.util.ArrayList;
32  import java.util.Collection;
33  import java.util.List;
34  import java.util.Map;
35  import java.util.SortedMap;
36  import java.util.SortedSet;
37  
38  import org.apache.commons.collections.CollectionUtils;
39  import org.apache.commons.collections.MapUtils;
40  import org.apache.maven.artifact.repository.ArtifactRepository;
41  import org.apache.maven.plugin.MojoFailureException;
42  import org.apache.maven.plugin.logging.Log;
43  import org.apache.maven.project.MavenProject;
44  import org.apache.maven.project.ProjectBuildingException;
45  import org.codehaus.mojo.license.model.LicenseMap;
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  public class AddThirdPartyMojo extends AbstractAddThirdPartyMojo implements MavenProjectDependenciesConfigurator {
67  
68      
69  
70  
71  
72  
73  
74  
75  
76      protected ArtifactRepository localRepository;
77  
78      
79  
80  
81  
82  
83  
84  
85  
86      protected List remoteRepositories;
87  
88      
89  
90  
91  
92  
93  
94      protected boolean deployMissingFile;
95  
96      
97  
98  
99  
100 
101 
102     protected boolean useRepositoryMissingFiles;
103 
104     
105 
106 
107 
108 
109 
110 
111     private DependenciesTool dependenciesTool;
112 
113     
114 
115 
116 
117 
118     private boolean doGenerateMissing;
119 
120     @Override
121     protected boolean checkPackaging() {
122         return rejectPackaging("pom");
123     }
124 
125     @Override
126     protected SortedMap<String, MavenProject> loadDependencies() {
127         return dependenciesTool.loadProjectDependencies(getProject(), this, localRepository, remoteRepositories,
128                 getArtifactCache());
129     }
130 
131     @Override
132     protected SortedProperties createUnsafeMapping() throws ProjectBuildingException, IOException,
133             ThirdPartyToolException {
134 
135         SortedProperties unsafeMappings = getThridPartyTool().loadUnsafeMapping(getLicenseMap(), getArtifactCache(),
136                 getEncoding(), getMissingFile());
137 
138         SortedSet<MavenProject> unsafeDependencies = getUnsafeDependencies();
139 
140         if (CollectionUtils.isNotEmpty(unsafeDependencies)) {
141 
142             
143 
144             if (isUseRepositoryMissingFiles()) {
145 
146                 
147 
148                 Collection<MavenProject> projects = new ArrayList<MavenProject>(getProjectDependencies().values());
149                 projects.remove(getProject());
150                 projects.removeAll(unsafeDependencies);
151 
152                 SortedProperties resolvedUnsafeMapping = getThridPartyTool().loadThirdPartyDescriptorsForUnsafeMapping(
153                         getEncoding(), projects, unsafeDependencies, getLicenseMap(), localRepository,
154                         remoteRepositories);
155 
156                 
157                 unsafeMappings.putAll(resolvedUnsafeMapping);
158 
159             }
160         }
161         if (isVerbose()) {
162             getLog().info("found " + unsafeMappings.size() + " unsafe mappings");
163         }
164 
165         
166         boolean generateMissingfile = doGenerateMissing
167                 && computeDoGenerateMissingFile(unsafeMappings, unsafeDependencies);
168 
169         setDoGenerateMissing(generateMissingfile);
170 
171         if (generateMissingfile && isVerbose()) {
172             StringBuilder sb = new StringBuilder();
173             sb.append("Will use from missing file ");
174             sb.append(unsafeMappings.size());
175             sb.append(" dependencies :");
176             for (Map.Entry<Object, Object> entry : unsafeMappings.entrySet()) {
177                 String id = (String) entry.getKey();
178                 String license = (String) entry.getValue();
179                 sb.append("\n - ").append(id).append(" - ").append(license);
180             }
181             getLog().info(sb.toString());
182         } else {
183             if (isUseMissingFile() && !unsafeMappings.isEmpty()) {
184                 getLog().debug("Missing file " + getMissingFile() + " is up-to-date.");
185             }
186         }
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             getThridPartyTool().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 }