package com.github.signed.sandboxes.maven; import net.lingala.zip4j.model.FileHeader; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.metadata.ArtifactMetadataSource; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.model.License; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectBuilder; import org.apache.maven.project.ProjectBuildingException; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Set; @Mojo(name = "touch", defaultPhase = LifecyclePhase.PROCESS_SOURCES) public class MyMojo extends AbstractMojo { private final ZipDumper zipDumper = new ZipDumper(); /** * Location of the file. */ @Parameter(defaultValue = "${project.build.directory}/legal", property = "outputDir", required = true) private File outputDirectory; @Component private MavenProject mavenProject; @Component private ArtifactFactory artifactFactory; @Component private ArtifactResolver artifactResolver; @Parameter(defaultValue = "${project.remoteArtifactRepositories}", readonly = true, required = true) private List<ArtifactRepository> pomRemoteRepositories; @Parameter(defaultValue = "${localRepository}", readonly = true) private ArtifactRepository localRepository; @Parameter( defaultValue = "${project.remoteArtifactRepositories}", readonly = true ) private List remoteRepositories; @Component private ArtifactMetadataSource source; @Component private MavenProjectBuilder mavenProjectBuilder; public void execute() throws MojoExecutionException { Set<Artifact> artifacts = new TransitiveArtifactResolver(artifactFactory, localRepository, source, artifactResolver).allTransitiveDependencies(mavenProject, repositoriesToSearchForArtifacts()); for (Artifact artifact : artifacts) { if("jar".equals(artifact.getType())){ try { findLicenseInformation(artifact, artifact.getFile()); } catch (net.lingala.zip4j.exception.ZipException e) { getLog().error(String.format("unable to check artifact at '%s'.", artifact.getFile().getAbsolutePath())); } catch (IOException e) { getLog().error("could not write legal files"); } } } } private ArrayList<ArtifactRepository> repositoriesToSearchForArtifacts() { ArrayList<ArtifactRepository> repoList = new ArrayList<ArtifactRepository>(); if (pomRemoteRepositories != null) { repoList.addAll(pomRemoteRepositories); } return repoList; } private MavenProject buildProjectFrom(Artifact artifact){ try { MavenProject depMavenProject = mavenProjectBuilder.buildFromRepository( artifact, remoteRepositories, localRepository, true ); depMavenProject.getArtifact().setScope( artifact.getScope() ); return depMavenProject; } catch (ProjectBuildingException e) { throw new RuntimeException(e); } } private void findLicenseInformation(Artifact artifact, File file) throws net.lingala.zip4j.exception.ZipException, IOException { getLog().info(artifact.getId()); MavenProject mavenProjectForArtifact = buildProjectFrom(artifact); List<License> licenses = mavenProjectForArtifact.getLicenses(); boolean isCDDL = false; for (License license : licenses) { isCDDL = isCDDL || StringUtils.containsIgnoreCase(license.getName(),"cddl"); } if(!isCDDL){ return; } String sub = artifact.getGroupId().replaceAll("\\.", "/") + "/" + artifact.getArtifactId() + "/" + artifact.getVersion(); final File artifactDirectory = new File(outputDirectory, sub); FileUtils.forceMkdir(artifactDirectory); final SingleFileUnzip unzip = new SingleFileUnzip(artifact.getFile()); zipDumper.dumpZipContent(file, new LegalRelevantFiles() { @Override public void licenseFile(FileHeader license) { getLog().info(license.getFileName()); unzip.unzip(license, artifactDirectory); } @Override public void noticeFile(FileHeader notice) { getLog().info(notice.getFileName()); unzip.unzip(notice, artifactDirectory); } }); } }