org.jboss.set.aphrodite.issue.trackers.jira.JiraFields.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.set.aphrodite.issue.trackers.jira.JiraFields.java

Source

/*
 * JBoss, Home of Professional Open Source.
 * Copyright 2015, Red Hat, Inc., and individual contributors
 * as indicated by the @author tags. See the copyright.txt file in the
 * distribution for a full listing of individual contributors.
 *
 * This 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 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */

package org.jboss.set.aphrodite.issue.trackers.jira;

import java.util.regex.Pattern;

import org.jboss.set.aphrodite.domain.Flag;
import org.jboss.set.aphrodite.domain.Issue;
import org.jboss.set.aphrodite.domain.IssuePriority;
import org.jboss.set.aphrodite.domain.IssueStatus;
import org.jboss.set.aphrodite.spi.AphroditeException;

import com.google.common.collect.BiMap;
import com.google.common.collect.ImmutableBiMap;

/**
 * @author Ryan Emerson
 */
class JiraFields {

    static final String API_BASE_PATH = "/rest/api/2/";
    static final String API_ISSUE_PATH = API_BASE_PATH + "issue/";
    static final String BROWSE_ISSUE_PATH = "/browse/";
    static final Pattern PROJECTS_ISSUE_PATTERN = Pattern.compile("\\/projects\\/[^\\/]+\\/issues\\/");

    static final String DATE_STRING_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZ";
    static final String JSON_CUSTOM_FIELD = "customfield_";
    static final String JQL_CUSTOM_TEMPLATE = "cf[%s]";

    static final String PM_ACK = "12311242";
    static final String DEV_ACK = "12311243";
    static final String QE_ACK = "12311244";
    static final String TARGET_RELEASE = "12311240";

    static final BiMap<String, String> CUSTOM_FIELD_MAP = new ImmutableBiMap.Builder<String, String>()
            .put(Flag.DEV.toString(), getJQLField(DEV_ACK)).put(Flag.PM.toString(), getJQLField(PM_ACK))
            .put(Flag.QE.toString(), getJQLField(QE_ACK)).put("TARGET_RELEASE", getJQLField(TARGET_RELEASE))
            .build();

    static final BiMap<String, IssueStatus> STATUS_MAP = new ImmutableBiMap.Builder<String, IssueStatus>()
            .put("new", IssueStatus.CREATED).put("open", IssueStatus.NEW)
            .put("coding in progress", IssueStatus.ASSIGNED).put("pull request sent", IssueStatus.POST)
            .put("resolved", IssueStatus.MODIFIED).put("ready for qa", IssueStatus.ON_QA)
            .put("verified", IssueStatus.VERIFIED).put("closed", IssueStatus.CLOSED).build();

    static final BiMap<String, IssuePriority> PRIORITY_MAP = initPriorityMap();

    static BiMap<String, IssuePriority> initPriorityMap() {
        ImmutableBiMap.Builder<String, IssuePriority> mapBuilder = new ImmutableBiMap.Builder<String, IssuePriority>();
        for (IssuePriority priority : IssuePriority.values())
            mapBuilder.put(priority.toString().toLowerCase(), priority);
        return mapBuilder.build();
    }

    static final BiMap<Flag, String> FLAG_MAP = new ImmutableBiMap.Builder<Flag, String>().put(Flag.DEV, DEV_ACK)
            .put(Flag.PM, PM_ACK).put(Flag.QE, QE_ACK).build();

    static IssueStatus getAphroditeStatus(String status) {
        status = status.toLowerCase();
        IssueStatus issueStatus = STATUS_MAP.get(status);
        if (issueStatus == null) {
            switch (status) {
            case "reopened":
                return IssueStatus.NEW;
            case "qa in progress":
                return IssueStatus.ON_QA;
            default:
                return IssueStatus.UNDEFINED;
            }
        }
        return issueStatus;
    }

    static IssuePriority getAphroditePriority(String priority) {
        IssuePriority issueStatus = PRIORITY_MAP.get(priority.toLowerCase());
        return (issueStatus == null ? IssuePriority.UNDEFINED : issueStatus);
    }

    static String getJiraStatus(IssueStatus status) {
        return STATUS_MAP.inverse().get(status);
    }

    static String getJQLField(String field) {
        return String.format(JQL_CUSTOM_TEMPLATE, field);
    }

    static boolean hasSameIssueStatus(Issue issue, com.atlassian.jira.rest.client.api.domain.Issue jiraIssue) {
        IssueStatus status = issue.getStatus();
        IssueStatus jiraStatus = getAphroditeStatus(jiraIssue.getStatus().getName());
        return status == jiraStatus;
    }

    static String getJiraTransition(Issue issue, com.atlassian.jira.rest.client.api.domain.Issue jiraIssue)
            throws AphroditeException {
        IssueStatus currentStatus = getAphroditeStatus(jiraIssue.getStatus().getName());
        return getJiraTransition(currentStatus, issue.getStatus());
    }

    // Surely there is a better way of achieving this?????
    static String getJiraTransition(IssueStatus currentStatus, IssueStatus newStatus) throws AphroditeException {
        switch (currentStatus) {
        case CREATED:
            return transitionsForCreatedStatus(currentStatus, newStatus);
        case NEW:
            return transitionsForNewStatus(currentStatus, newStatus);
        case ASSIGNED:
            return transitionsForAssignedStatus(currentStatus, newStatus);
        case POST:
            return transitionsForPostStatus(currentStatus, newStatus);
        case MODIFIED:
            return transitionsForModifiedStatus(currentStatus, newStatus);
        case ON_QA:
            return transitionsForON_QAStatus(currentStatus, newStatus);
        case VERIFIED:
            return transitionsForVerifiedStatus(currentStatus, newStatus);
        case CLOSED:
            return transitionsForClosedStatus(currentStatus, newStatus);
        default:
            throw new AphroditeException("It's not possible to transition from " + currentStatus);
        }
    }

    private static String transitionsForCreatedStatus(IssueStatus currentStatus, IssueStatus newStatus)
            throws AphroditeException {
        switch (newStatus) {
        case CREATED:
            return "Devel Approve";
        case NEW:
            return "Hand Over to Development";
        case CLOSED:
            return "Close Issue";
        default:
            throw new AphroditeException("It's not possible to transition from " + currentStatus);
        }
    }

    private static String transitionsForNewStatus(IssueStatus currentStatus, IssueStatus newStatus)
            throws AphroditeException {
        switch (newStatus) {
        case CREATED:
            return "Back To New";
        case ASSIGNED:
            return "Start Progress";
        case POST:
            return "Link Pull Request";
        case MODIFIED:
            return "Resolve Issue";
        case CLOSED:
            return "Close Issue";
        default:
            throw new AphroditeException(
                    "It's not possible to transition from " + currentStatus + " to " + newStatus);
        }
    }

    private static String transitionsForAssignedStatus(IssueStatus currentStatus, IssueStatus newStatus)
            throws AphroditeException {
        switch (newStatus) {
        case CREATED:
            return "Back To New";
        case NEW:
            return "Stop Progress";
        default:
            return transitionsForNewStatus(currentStatus, newStatus);
        }
    }

    private static String transitionsForPostStatus(IssueStatus currentStatus, IssueStatus newStatus)
            throws AphroditeException {
        switch (newStatus) {
        case CREATED:
            return "Back To New";
        case MODIFIED:
            return "Resolve Issue";
        case ASSIGNED:
            return "Start Progress";
        case POST:
            return "Update Pull Request";
        case NEW:
            return "Reject Pull Request";
        case CLOSED:
            return "Close Issue";
        default:
            throw new AphroditeException(
                    "It's not possible to transition from " + currentStatus + " to " + newStatus);
        }
    }

    private static String transitionsForModifiedStatus(IssueStatus currentStatus, IssueStatus newStatus)
            throws AphroditeException {
        switch (newStatus) {
        case CREATED:
            return "Back To New";
        case NEW:
        case ASSIGNED:
            return "Reopen Issue";
        case ON_QA:
            return "Hand Over to QA";
        case CLOSED:
            return "Close Issue";
        default:
            throw new AphroditeException(
                    "It's not possible to transition from " + currentStatus + " to " + newStatus);
        }
    }

    private static String transitionsForON_QAStatus(IssueStatus currentStatus, IssueStatus newStatus)
            throws AphroditeException {
        switch (newStatus) {
        case CREATED:
            return "Back To New";
        case NEW:
        case ASSIGNED:
            return "Reopen Issue From QA";
        case VERIFIED:
            return "Verify Issue";
        case CLOSED:
            return "Close Issue";
        default:
            throw new AphroditeException(
                    "It's not possible to transition from " + currentStatus + " to " + newStatus);
        }
    }

    private static String transitionsForVerifiedStatus(IssueStatus currentStatus, IssueStatus newStatus)
            throws AphroditeException {
        switch (newStatus) {
        case CREATED:
            return "Back To New";
        case NEW:
        case ASSIGNED:
            return "Reopen Issue";
        case ON_QA:
            return "Retest";
        case CLOSED:
            return "Close Issue";
        default:
            throw new AphroditeException(
                    "It's not possible to transition from " + currentStatus + " to " + newStatus);
        }
    }

    private static String transitionsForClosedStatus(IssueStatus currentStatus, IssueStatus newStatus)
            throws AphroditeException {
        switch (newStatus) {
        case NEW:
        case ASSIGNED:
            return "Reopen Issue";
        default:
            throw new AphroditeException(
                    "It's not possible to transition from " + currentStatus + " to " + newStatus);
        }
    }
}