org.axway.grapes.maven.resolver.LicenseResolver.java Source code

Java tutorial

Introduction

Here is the source code for org.axway.grapes.maven.resolver.LicenseResolver.java

Source

package org.axway.grapes.maven.resolver;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.model.License;
import org.apache.maven.model.Model;
import org.apache.maven.model.Parent;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import org.apache.maven.repository.RepositorySystem;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * License Resolver
 *
 * <p>Handle license resolution</p>
 *
 * @author jdcoffre
 */
public class LicenseResolver {

    /**
     * Pom parser
     */
    private final MavenXpp3Reader reader = new MavenXpp3Reader();

    private final ArtifactResolver artifactResolver;

    public LicenseResolver(final RepositorySystem repositorySystem, final ArtifactRepository localRepository,
            final Log log) {
        this.artifactResolver = new ArtifactResolver(repositorySystem, localRepository, log);
    }

    public List<License> resolve(final MavenProject project) throws MojoExecutionException {
        final List<License> licenses = new ArrayList<License>();
        licenses.addAll(project.getLicenses());

        if (licenses.isEmpty() && project.getParent() != null) {
            final MavenProject parent = project.getParent();
            licenses.addAll(resolve(project, parent.getGroupId(), parent.getArtifactId(), parent.getVersion()));
        }

        return licenses;
    }

    /**
     * Resolve the licenses attached to an artifact (there is no transitive resolution here)
     *
     * @param project MavenProject
     * @param groupId String
     * @param artifactId String
     * @param version String
     * @return List<License>
     * @throws MojoExecutionException
     */
    public List<License> resolve(final MavenProject project, final String groupId, final String artifactId,
            final String version) throws MojoExecutionException {
        final Artifact modelArtifact = getModelArtifact(groupId, artifactId, version);
        return getLicenses(project, modelArtifact);
    }

    /**
     * Retrieve all the license (included parent's ones)
     *
     * @param project MavenProject
     * @param modelArtifact Artifact
     * @return List<License>
     * @throws MojoExecutionException
     */
    private List<License> getLicenses(final MavenProject project, final Artifact modelArtifact)
            throws MojoExecutionException {
        try {
            final List<License> licenses = new ArrayList<License>();
            artifactResolver.resolveArtifact(project, modelArtifact);

            final File pomFile = modelArtifact.getFile();
            if (pomFile.exists()) {
                final Model model = reader.read(new FileReader(pomFile));
                licenses.addAll(model.getLicenses());

                if (model.getParent() != null) {
                    final Parent parent = model.getParent();
                    final Artifact parentModel = getModelArtifact(parent.getGroupId(), parent.getArtifactId(),
                            parent.getVersion());
                    licenses.addAll(getLicenses(project, parentModel));
                }
            }

            return licenses;
        } catch (XmlPullParserException e) {
            throw new MojoExecutionException("Failed to read " + modelArtifact.getFile(), e);
        } catch (IOException e) {
            throw new MojoExecutionException("Failed to read " + modelArtifact.getFile(), e);
        }
    }

    /**
     * Generate an model Artifact
     *
     * @param groupId String
     * @param artifactId String
     * @param version String
     * @return Artifact
     */
    private Artifact getModelArtifact(final String groupId, final String artifactId, final String version) {
        final DefaultArtifactHandler handler = new DefaultArtifactHandler();
        handler.setExtension("pom");

        final Artifact model = new DefaultArtifact(groupId, artifactId, version, null, "pom", null, handler);

        return model;

    }

}