All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.lucapino.jira.AbstractJiraMojo Maven / Gradle / Ivy

/*
 * Copyright 2011 Tomasz Maciejewski
 * Copyright 2012 George Gastaldi
 * Copyright 2013-2017 Luca Tagliani
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.github.lucapino.jira;

import com.github.lucapino.jira.helpers.JiraClient;
import com.github.lucapino.jira.helpers.TemplateEvaluator;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.apache.maven.settings.Server;
import org.apache.maven.settings.Settings;

/**
 * This class allows the use of {@link JiraClient} in JIRA Actions
 *
 * @author george
 *
 */
public abstract class AbstractJiraMojo extends AbstractMojo {

    /**
     * The current project base directory.
     */
    @Parameter(property = "basedir", required = true)
    protected String basedir;
    /**
     * The Maven Session.
     */
    @Parameter(defaultValue = "${session}", readonly = true, required = true)
    protected MavenSession mavenSession;

    @Parameter(defaultValue = "${settings}", readonly = true, required = true)
    private Settings settings;
    /**
     * Server's id in settings.xml to look up jiraUser and jiraPassword.
     */
    @Parameter
    protected String serverId;
    /**
     * JIRA Installation URL. If not informed, it will use the
     * project.issueManagement.jiraURL info.
     */
    @Parameter(defaultValue = "${project.issueManagement.url}", required = true)
    protected String jiraURL;
    /**
     * JIRA Authentication User.
     */
    @Parameter(defaultValue = "${scmUsername}")
    protected String jiraUser;
    /**
     * JIRA Authentication Password.
     */
    @Parameter(defaultValue = "${scmPassword}")
    protected String jiraPassword;
    /**
     * JIRA Project Key.
     */
    @Parameter
    protected String jiraProjectKey;

    /**
     * The Maven project
     */
    @Parameter(defaultValue = "${project}")
    protected MavenProject project;
    /**
     * Returns if this plugin is enabled for this context
     */
    @Parameter
    protected boolean skip;
    /**
     * This will cause the execution to be run only at the top of a given module
     * tree. That is, run in the project contained in the same folder where the
     * mvn execution was launched.
     */
    @Parameter(defaultValue = "false")
    protected boolean runOnlyAtExecutionRoot;

    private TemplateEvaluator evaluator;
    protected JiraClient jiraClient;

    private void initJiraClient() throws MojoFailureException {
        if (jiraClient == null) {
            loadUserCredentials();
            getLog().debug("Connecting to JIRA server");
            try {
                jiraClient = new JiraClient(jiraUser, jiraPassword, jiraURL);
                getLog().info("Successfuly connected to JIRA server");
            } catch (Exception e) {
                throw fail("Unable to connect to JIRA server", e);
            }
        }
    }

    @Override
    public final void execute() throws MojoExecutionException, MojoFailureException {
        Log log = getLog();
        // Run only at the execution root
        if (runOnlyAtExecutionRoot && !isThisTheExecutionRoot()) {
            getLog().info("Skipping the announcement mail in this project because it's not the Execution Root");
        } else {
            if (isSkip()) {
                log.info("Skipping Plugin execution.");
                return;
            }
            try {
                initJiraClient();
                doExecute();
                jiraClient.getRestClient().close();
            } catch (Exception e) {
                log.error("Error when executing mojo", e);
                // XXX: Por enquanto nao faz nada.
            }
        }
    }

    public TemplateEvaluator getEvaluator() {
        if (evaluator == null) {
            getLog().debug("Initializing Template Helper...");
            evaluator = new TemplateEvaluator(project);
            getLog().debug("Template Helper initialized");
        }
        return evaluator;
    }

    public abstract void doExecute() throws Exception;

    public boolean isSkip() {
        return skip;
    }

    public void setJiraProjectKey(String jiraProjectKey) {
        this.jiraProjectKey = jiraProjectKey;
    }

    public void setJiraPassword(String jiraPassword) {
        this.jiraPassword = jiraPassword;
    }

    public void setJiraURL(String jiraURL) {
        this.jiraURL = jiraURL;
    }

    public void setJiraUser(String jiraUser) {
        this.jiraUser = jiraUser;
    }

    public void setSettings(Settings settings) {
        this.settings = settings;
    }

    public void setServerId(String serverId) {
        this.serverId = serverId;
    }

    protected MojoFailureException fail(String message, Exception e) {
        getLog().error(message, e);
        return new MojoFailureException(e, message, e.getMessage());
    }

    private void loadUserCredentials() {
        if (serverId == null) {
            serverId = jiraURL;
        }
        // read credentials from settings.xml if user has not set them in configuration
        if ((jiraUser == null || jiraPassword == null) && this.settings != null) {
            Server server = settings.getServer(serverId);
            if (server != null) {
                if (jiraUser == null) {
                    jiraUser = server.getUsername();
                }
                if (jiraPassword == null) {
                    jiraPassword = server.getPassword();
                }
            }
        }
    }

    /**
     * Returns true if the current project is located at the
     * Execution Root Directory (where mvn was
     * launched).
     *
     * @return true if the current project is at the Execution Root
     */
    protected boolean isThisTheExecutionRoot() {
        getLog().debug("Root Folder:" + mavenSession.getExecutionRootDirectory());
        getLog().debug("Current Folder:" + basedir);
        boolean result = mavenSession.getExecutionRootDirectory().equalsIgnoreCase(basedir);
        if (result) {
            getLog().debug("This is the execution root.");
        } else {
            getLog().debug("This is NOT the execution root.");
        }
        return result;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy