001 /** 002 * Copyright 2010-2013 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.codehaus.mojo.license; 017 018 import java.io.File; 019 import java.io.IOException; 020 import java.util.List; 021 import java.util.SortedMap; 022 import java.util.SortedSet; 023 024 import org.apache.commons.collections.CollectionUtils; 025 import org.apache.maven.plugin.MojoFailureException; 026 import org.apache.maven.plugin.logging.Log; 027 import org.apache.maven.project.MavenProject; 028 import org.apache.maven.project.ProjectBuildingException; 029 import org.codehaus.mojo.license.model.LicenseMap; 030 031 /** 032 * This aggregator goal (will be executed only once and only on pom projects) executed the {@code add-third-party} on 033 * all his modules (in a parellel build cycle) then aggreates all the third-party files in final one in the pom project. 034 * 035 * @author tchemit <chemit@codelutin.com> 036 * @goal aggregate-add-third-party 037 * @phase generate-resources 038 * @requiresProject true 039 * @aggregator 040 * @execute goal="add-third-party" 041 * @since 1.0 042 */ 043 public class AggregatorAddThirdPartyMojo extends AbstractAddThirdPartyMojo { 044 045 /** 046 * The projects in the reactor. 047 * 048 * @parameter expression="${reactorProjects}" 049 * @readonly 050 * @required 051 * @since 1.0 052 */ 053 protected List<?> reactorProjects; 054 055 @Override 056 protected boolean checkPackaging() { 057 return acceptPackaging("pom"); 058 } 059 060 @Override 061 protected boolean checkSkip() { 062 if (!isDoGenerate() && !isDoGenerateBundle()) { 063 064 getLog().info("All files are up to date, skip goal execution."); 065 return false; 066 } 067 return super.checkSkip(); 068 } 069 070 @Override 071 protected SortedMap<String, MavenProject> loadDependencies() { 072 // use the cache filled by modules in reactor 073 return getArtifactCache(); 074 } 075 076 @Override 077 protected SortedProperties createUnsafeMapping() throws ProjectBuildingException, IOException { 078 079 String path = getMissingFile().getAbsolutePath().substring( 080 getProject().getBasedir().getAbsolutePath().length() + 1); 081 082 if (isVerbose()) { 083 getLog().info("Use missing file path : " + path); 084 } 085 086 SortedProperties unsafeMappings = new SortedProperties(getEncoding()); 087 088 LicenseMap licenseMap = getLicenseMap(); 089 090 for (Object o : reactorProjects) { 091 MavenProject p = (MavenProject) o; 092 093 File file = new File(p.getBasedir(), path); 094 095 if (file.exists()) { 096 097 SortedProperties tmp = getThirdPartyTool().loadUnsafeMapping(licenseMap, getArtifactCache(), 098 getEncoding(), file); 099 unsafeMappings.putAll(tmp); 100 } 101 102 SortedSet<MavenProject> unsafes = getThirdPartyTool().getProjectsWithNoLicense(licenseMap, isVerbose()); 103 if (CollectionUtils.isEmpty(unsafes)) { 104 105 // no more unsafe dependencies, can break 106 break; 107 } 108 } 109 return unsafeMappings; 110 } 111 112 @Override 113 protected void doAction() throws Exception { 114 Log log = getLog(); 115 116 if (exists(getArtifactLicenseMapping())) { 117 File propertiesFile = copyToFileSystem(getArtifactLicenseMapping()); 118 setMissingFile(propertiesFile); 119 } 120 121 if (isVerbose()) { 122 log.info("After executing on " + reactorProjects.size() + " project(s)"); 123 } 124 SortedMap<String, MavenProject> artifacts = getArtifactCache(); 125 126 LicenseMap licenseMap = getLicenseMap(); 127 128 getLog().info(artifacts.size() + " detected artifact(s)."); 129 if (isVerbose()) { 130 for (String id : artifacts.keySet()) { 131 getLog().info(" - " + id); 132 } 133 } 134 getLog().info(licenseMap.size() + " detected license(s)."); 135 if (isVerbose()) { 136 for (String id : licenseMap.keySet()) { 137 getLog().info(" - " + id); 138 } 139 } 140 boolean unsafe = checkUnsafeDependencies(); 141 142 writeThirdPartyFile(); 143 144 if (unsafe && isFailIfWarning()) { 145 throw new MojoFailureException("There is some dependencies with no license, please review the modules."); 146 } 147 } 148 149 }