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 = getThridPartyTool().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             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 }