com.github.signed.sandboxes.maven.MyMojo.java Source code

Java tutorial

Introduction

Here is the source code for com.github.signed.sandboxes.maven.MyMojo.java

Source

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);
            }
        });
    }
}