com.github.maven.plugins.core.GitHubProjectMojo.java Source code

Java tutorial

Introduction

Here is the source code for com.github.maven.plugins.core.GitHubProjectMojo.java

Source

/*
 * Copyright (c) 2011 GitHub Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to
 * deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 */
package com.github.maven.plugins.core;

import java.io.IOException;
import java.text.MessageFormat;
import java.util.List;

import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import org.apache.maven.settings.Server;
import org.apache.maven.settings.Settings;
import org.eclipse.egit.github.core.RepositoryId;
import org.eclipse.egit.github.core.client.GitHubClient;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.repository.Authentication;
import org.sonatype.aether.repository.RemoteRepository;

/**
 * Base GitHub Mojo class to be extended.
 * 
 * @author Kevin Sawicki (kevin@github.com)
 */
public abstract class GitHubProjectMojo extends AbstractMojo {

    /**
     * Get formatted exception message for {@link IOException}
     * 
     * @param e
     * @return message
     */
    public static String getExceptionMessage(IOException e) {
        return e.getMessage();
    }

    /**
     * Is debug logging enabled?
     * 
     * @return true if enabled, false otherwise
     */
    protected boolean isDebug() {
        final Log log = getLog();
        return log != null ? log.isDebugEnabled() : false;
    }

    /**
     * Is info logging enabled?
     * 
     * @return true if enabled, false otherwise
     */
    protected boolean isInfo() {
        final Log log = getLog();
        return log != null ? log.isInfoEnabled() : false;
    }

    /**
     * Log given message at debug level
     * 
     * @param message
     */
    protected void debug(String message) {
        final Log log = getLog();
        if (log != null)
            log.debug(message);
    }

    /**
     * Log given message and throwable at debug level
     * 
     * @param message
     * @param throwable
     */
    protected void debug(String message, Throwable throwable) {
        final Log log = getLog();
        if (log != null)
            log.debug(message, throwable);
    }

    /**
     * Log given message at info level
     * 
     * @param message
     */
    protected void info(String message) {
        final Log log = getLog();
        if (log != null)
            log.info(message);
    }

    /**
     * Log given message and throwable at info level
     * 
     * @param message
     * @param throwable
     */
    protected void info(String message, Throwable throwable) {
        final Log log = getLog();
        if (log != null)
            log.info(message, throwable);
    }

    /**
     * Create client
     * 
     * @param host
     * @param userName
     * @param password
     * @param oauth2Token
     * @param serverId
     * @param settings
     * @param session
     * @return client
     * @throws MojoExecutionException
     */
    protected GitHubClient createClient(String host, String userName, String password, String oauth2Token,
            String serverId, Settings settings, MavenSession session) throws MojoExecutionException {
        GitHubClient client;
        if (!StringUtils.isEmpty(host)) {
            if (isDebug())
                debug("Using custom host: " + host);
            client = createClient(host);
        } else
            client = createClient();

        if (configureUsernamePassword(client, userName, password) || configureOAuth2Token(client, oauth2Token)
                || configureServerCredentials(client, serverId, settings, session))
            return client;
        else
            throw new MojoExecutionException("No authentication credentials configured");
    }

    /**
     * Create client
     * <p>
     * Subclasses can override to do any custom client configuration
     * 
     * @param hostname
     * @return non-null client
     */
    protected GitHubClient createClient(String hostname) {
        return new GitHubClient(hostname);
    }

    /**
     * Create client
     * <p>
     * Subclasses can override to do any custom client configuration
     * 
     * @return non-null client
     */
    protected GitHubClient createClient() {
        return new GitHubClient();
    }

    /**
     * Configure credentials from configured username/password combination
     * 
     * @param client
     * @param userName
     * @param password
     * @return true if configured, false otherwise
     */
    protected boolean configureUsernamePassword(final GitHubClient client, final String userName,
            final String password) {
        if (StringUtils.isEmpty(userName, password))
            return false;

        if (isDebug())
            debug("Using basic authentication with username: " + userName);
        client.setCredentials(userName, password);
        return true;
    }

    /**
     * Configure credentials from configured OAuth2 token
     * 
     * @param client
     * @param oauth2Token
     * @return true if configured, false otherwise
     */
    protected boolean configureOAuth2Token(final GitHubClient client, final String oauth2Token) {
        if (StringUtils.isEmpty(oauth2Token))
            return false;

        if (isDebug())
            debug("Using OAuth2 access token authentication");
        client.setOAuth2Token(oauth2Token);
        return true;
    }

    /**
     * Configure client with credentials from given server id
     * 
     * @param client
     * @param serverId
     * @param settings
     * @param session
     * @return true if configured, false otherwise
     * @throws MojoExecutionException
     */
    protected boolean configureServerCredentials(final GitHubClient client, final String serverId,
            final Settings settings, final MavenSession session) throws MojoExecutionException {
        if (StringUtils.isEmpty(serverId))
            return false;

        String serverUsername = null;
        String serverPassword = null;

        if (session != null) {
            RepositorySystemSession systemSession = session.getRepositorySession();
            if (systemSession != null) {
                Authentication authInfo = systemSession.getAuthenticationSelector()
                        .getAuthentication(new RemoteRepository().setId(serverId));
                if (authInfo != null) {
                    serverUsername = authInfo.getUsername();
                    serverPassword = authInfo.getPassword();
                }
            }
        }

        if (StringUtils.isEmpty(serverPassword)) {
            Server server = getServer(settings, serverId);
            if (server == null)
                throw new MojoExecutionException(
                        MessageFormat.format("Server ''{0}'' not found in settings", serverId));

            if (isDebug())
                debug(MessageFormat.format("Using ''{0}'' server credentials", serverId));

            serverUsername = server.getUsername();
            serverPassword = server.getPassword();
        }

        if (!StringUtils.isEmpty(serverUsername, serverPassword)) {
            if (isDebug())
                debug("Using basic authentication with username: " + serverUsername);
            client.setCredentials(serverUsername, serverPassword);
            return true;
        }

        // A server password without a username is assumed to be an OAuth2 token
        if (!StringUtils.isEmpty(serverPassword)) {
            if (isDebug())
                debug("Using OAuth2 access token authentication");
            client.setOAuth2Token(serverPassword);
            return true;
        }

        if (isDebug())
            debug(MessageFormat.format("Server ''{0}'' is missing username/password credentials", serverId));
        return false;
    }

    /**
     * Get repository and throw a {@link MojoExecutionException} on failures
     * 
     * @param project
     * @param owner
     * @param name
     * @return non-null repository id
     * @throws MojoExecutionException
     */
    protected RepositoryId getRepository(final MavenProject project, final String owner, final String name)
            throws MojoExecutionException {
        RepositoryId repository = RepositoryUtils.getRepository(project, owner, name);
        if (repository == null)
            throw new MojoExecutionException("No GitHub repository (owner and name) configured");
        if (isDebug())
            debug(MessageFormat.format("Using GitHub repository {0}", repository.generateId()));
        return repository;
    }

    /**
     * Get server with given id
     * 
     * @param settings
     * @param serverId
     *            must be non-null and non-empty
     * @return server or null if none matching
     */
    protected Server getServer(final Settings settings, final String serverId) {
        if (settings == null)
            return null;
        List<Server> servers = settings.getServers();
        if (servers == null || servers.isEmpty())
            return null;

        for (Server server : servers)
            if (serverId.equals(server.getId()))
                return server;
        return null;
    }
}