org.codehaus.mojo.license.ArtifactHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.codehaus.mojo.license.ArtifactHelper.java

Source

/*
 * #%L
 * License Maven Plugin
 * 
 * $Id$
 * $HeadURL$
 * %%
 * Copyright (C) 2008 - 2010 CodeLutin, Codehaus, Tony Chemit
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as 
 * published by the Free Software Foundation, either version 3 of the 
 * License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Lesser Public License for more details.
 * 
 * You should have received a copy of the GNU General Lesser Public 
 * License along with this program.  If not, see
 * <http://www.gnu.org/licenses/lgpl-3.0.html>.
 * #L%
 */
package org.codehaus.mojo.license;

import org.apache.commons.lang.StringUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectBuilder;
import org.apache.maven.project.ProjectBuildingException;

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

/**
 * A helper for artifacts.
 *
 * @author tchemit <chemit@codelutin.com>
 * @since 1.0
 */
public class ArtifactHelper {

    protected static Comparator<MavenProject> projectComparator;

    public static final String INVALIDE_PATTERN_MESSAGE = "The pattern specified by expression <%s> seems to be invalid.";

    /**
     * Get the list of project dependencies after applying transitivity and filtering rules.
     * 
     * @param mojo
     * @param log
     * @param cache
     * @return
     */
    public static SortedMap<String, MavenProject> loadProjectDependencies(MavenProjectDependenciesLoader mojo,
            Log log, SortedMap<String, MavenProject> cache) {

        boolean haveNoIncludedGroups = StringUtils.isEmpty(mojo.getIncludedGroups());
        boolean haveNoIncludedArtifacts = StringUtils.isEmpty(mojo.getIncludedArtifacts());

        boolean haveExcludedGroups = StringUtils.isNotEmpty(mojo.getExcludedGroups());
        boolean haveExcludedArtifacts = StringUtils.isNotEmpty(mojo.getExcludedArtifacts());
        boolean haveExclusions = haveExcludedGroups || haveExcludedArtifacts;

        Pattern includedGroupPattern = null;
        Pattern includedArtifactPattern = null;
        Pattern excludedGroupPattern = null;
        Pattern excludedArtifactPattern = null;

        if (!haveNoIncludedGroups) {
            includedGroupPattern = Pattern.compile(mojo.getIncludedGroups());
        }
        if (!haveNoIncludedArtifacts) {
            includedArtifactPattern = Pattern.compile(mojo.getIncludedArtifacts());
        }
        if (haveExcludedGroups) {
            excludedGroupPattern = Pattern.compile(mojo.getExcludedGroups());
        }
        if (haveExcludedArtifacts) {
            excludedArtifactPattern = Pattern.compile(mojo.getExcludedArtifacts());
        }

        MavenProject project = mojo.getProject();

        Set<?> depArtifacts;

        if (mojo.isIncludeTransitiveDependencies()) {
            // All project dependencies
            depArtifacts = project.getArtifacts();
        } else {
            // Only direct project dependencies
            depArtifacts = project.getDependencyArtifacts();
        }

        ArtifactRepository localRepository = mojo.getLocalRepository();
        List remoteRepositories = mojo.getRemoteRepositories();
        MavenProjectBuilder projectBuilder = mojo.getMavenProjectBuilder();

        List<String> excludeScopes = mojo.getExcludeScopes();

        boolean verbose = mojo.isVerbose();

        SortedMap<String, MavenProject> result = new TreeMap<String, MavenProject>();

        for (Object o : depArtifacts) {
            Artifact artifact = (Artifact) o;

            if (excludeScopes.contains(artifact.getScope())) {

                // never treate system artifacts (they are mysterious and
                // no information can be retrive from anywhere)...
                continue;
            }

            String id = getArtifactId(artifact);

            if (verbose) {
                log.info("detected artifact " + id);
            }

            // Check if the project should be included
            // If there is no specified artifacts and group to include, include all
            boolean isToInclude = haveNoIncludedArtifacts && haveNoIncludedGroups
                    || isIncludable(log, artifact, includedGroupPattern, includedArtifactPattern);

            // Check if the project should be excluded
            boolean isToExclude = isToInclude && haveExclusions
                    && isExcludable(log, artifact, excludedGroupPattern, excludedArtifactPattern);

            if (!isToInclude || isToExclude) {
                if (verbose) {
                    log.info("skip artifact " + id);
                }
                continue;
            }

            MavenProject depMavenProject = null;

            if (cache != null) {

                // try to get project from cache
                depMavenProject = cache.get(id);
            }

            if (depMavenProject != null) {
                if (verbose) {
                    log.info("add dependency [" + id + "] (from cache)");
                }
            } else {

                // build project

                try {
                    depMavenProject = projectBuilder.buildFromRepository(artifact, remoteRepositories,
                            localRepository, true);
                } catch (ProjectBuildingException e) {
                    log.warn("Unable to obtain POM for artifact : " + artifact);
                    log.warn(e);
                    continue;
                }

                if (verbose) {
                    log.info("add dependency [" + id + "]");
                }
                if (cache != null) {

                    // store it also in cache
                    cache.put(id, depMavenProject);
                }
            }

            // keep the project
            result.put(id, depMavenProject);
        }

        return result;
    }

    public static String getArtifactId(Artifact artifact) {
        StringBuilder sb = new StringBuilder();
        sb.append(artifact.getGroupId());
        sb.append("--");
        sb.append(artifact.getArtifactId());
        sb.append("--");
        sb.append(artifact.getVersion());
        String type = artifact.getType();
        if (!StringUtils.isEmpty(type) && !"pom".equals(type)) {
            sb.append("--");
            sb.append(artifact.getType());
        }
        if (!StringUtils.isEmpty(artifact.getClassifier())) {
            sb.append("--");
            sb.append(artifact.getClassifier());
        }
        return sb.toString();
    }

    public static String getArtifactName(MavenProject project) {
        StringBuilder sb = new StringBuilder();
        if (project.getName().startsWith("Unnamed -")) {

            // as in Maven 3, let's use the artifact id
            sb.append(project.getArtifactId());
        } else {
            sb.append(project.getName());
        }
        sb.append(" (");
        sb.append(project.getGroupId());
        sb.append(":");
        sb.append(project.getArtifactId());
        sb.append(":");
        sb.append(project.getVersion());
        sb.append(" - ");
        String url = project.getUrl();
        sb.append(url == null ? "no url defined" : url);
        sb.append(")");

        return sb.toString();
    }

    public static Comparator<MavenProject> getProjectComparator() {
        if (projectComparator == null) {
            projectComparator = new Comparator<MavenProject>() {
                public int compare(MavenProject o1, MavenProject o2) {

                    String id1 = getArtifactId(o1.getArtifact());
                    String id2 = getArtifactId(o2.getArtifact());
                    return id1.compareTo(id2);
                }
            };
        }
        return projectComparator;
    }

    protected static boolean isIncludable(Log log, Artifact project, Pattern includedGroupPattern,
            Pattern includedArtifactPattern) {

        // check if the groupId of the project should be included
        if (includedGroupPattern != null) {
            // we have some defined license filters
            try {
                Matcher matchGroupId = includedGroupPattern.matcher(project.getGroupId());
                if (matchGroupId.find()) {
                    if (log.isDebugEnabled()) {
                        log.debug("Include " + project.getGroupId());
                    }
                    return true;
                }
            } catch (PatternSyntaxException e) {
                log.warn(String.format(INVALIDE_PATTERN_MESSAGE, includedGroupPattern.pattern()));
            }
        }

        // check if the artifactId of the project should be included
        if (includedArtifactPattern != null) {
            // we have some defined license filters
            try {
                Matcher matchGroupId = includedArtifactPattern.matcher(project.getArtifactId());
                if (matchGroupId.find()) {
                    if (log.isDebugEnabled()) {
                        log.debug("Include " + project.getArtifactId());
                    }
                    return true;
                }
            } catch (PatternSyntaxException e) {
                log.warn(String.format(INVALIDE_PATTERN_MESSAGE, includedArtifactPattern.pattern()));
            }
        }

        return false;
    }

    protected static boolean isExcludable(Log log, Artifact project, Pattern excludedGroupPattern,
            Pattern excludedArtifactPattern) {

        // check if the groupId of the project should be included
        if (excludedGroupPattern != null) {
            // we have some defined license filters
            try {
                Matcher matchGroupId = excludedGroupPattern.matcher(project.getGroupId());
                if (matchGroupId.find()) {
                    if (log.isDebugEnabled()) {
                        log.debug("Exclude " + project.getGroupId());
                    }
                    return true;
                }
            } catch (PatternSyntaxException e) {
                log.warn(String.format(INVALIDE_PATTERN_MESSAGE, excludedGroupPattern.pattern()));
            }
        }

        // check if the artifactId of the project should be included
        if (excludedArtifactPattern != null) {
            // we have some defined license filters
            try {
                Matcher matchGroupId = excludedArtifactPattern.matcher(project.getArtifactId());
                if (matchGroupId.find()) {
                    if (log.isDebugEnabled()) {
                        log.debug("Exclude " + project.getArtifactId());
                    }
                    return true;
                }
            } catch (PatternSyntaxException e) {
                log.warn(String.format(INVALIDE_PATTERN_MESSAGE, excludedArtifactPattern.pattern()));
            }
        }

        return false;
    }
}