com.blackducksoftware.integration.jira.task.JiraTaskTimed.java Source code

Java tutorial

Introduction

Here is the source code for com.blackducksoftware.integration.jira.task.JiraTaskTimed.java

Source

/**
 * Hub JIRA Plugin
 *
 * Copyright (C) 2017 Black Duck Software, Inc.
 * http://www.blackducksoftware.com/
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you 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.blackducksoftware.integration.jira.task;

import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;

import org.apache.log4j.Logger;
import org.joda.time.DateTime;
import org.joda.time.Period;

import com.atlassian.jira.issue.fields.layout.field.EditableFieldLayout;
import com.atlassian.jira.issue.fields.layout.field.FieldLayoutScheme;
import com.atlassian.jira.issue.fields.screen.FieldScreenScheme;
import com.atlassian.jira.issue.issuetype.IssueType;
import com.atlassian.jira.project.Project;
import com.atlassian.jira.user.ApplicationUser;
import com.atlassian.jira.user.util.UserManager;
import com.atlassian.jira.workflow.JiraWorkflow;
import com.atlassian.sal.api.pluginsettings.PluginSettings;
import com.blackducksoftware.integration.jira.common.HubJiraConfigKeys;
import com.blackducksoftware.integration.jira.common.HubJiraLogger;
import com.blackducksoftware.integration.jira.common.HubProjectMapping;
import com.blackducksoftware.integration.jira.common.JiraContext;
import com.blackducksoftware.integration.jira.common.TicketInfoFromSetup;
import com.blackducksoftware.integration.jira.common.exception.ConfigurationException;
import com.blackducksoftware.integration.jira.common.exception.JiraException;
import com.blackducksoftware.integration.jira.common.jiraversion.JiraVersionCheck;
import com.blackducksoftware.integration.jira.config.HubJiraConfigSerializable;
import com.blackducksoftware.integration.jira.task.issue.JiraServices;
import com.blackducksoftware.integration.jira.task.setup.HubFieldConfigurationSetup;
import com.blackducksoftware.integration.jira.task.setup.HubFieldScreenSchemeSetup;
import com.blackducksoftware.integration.jira.task.setup.HubIssueTypeSetup;
import com.blackducksoftware.integration.jira.task.setup.HubWorkflowSetup;

public class JiraTaskTimed implements Callable<String> {
    private final HubJiraLogger logger = new HubJiraLogger(Logger.getLogger(this.getClass().getName()));

    private final PluginSettings settings;

    private final JiraServices jiraServices;

    private final JiraSettingsService jiraSettingsService;

    private final PluginConfigurationDetails configDetails;

    public JiraTaskTimed(final PluginSettings settings, final JiraSettingsService jiraSettingsService,
            final JiraServices jiraServices, final PluginConfigurationDetails configDetails) {
        this.settings = settings;
        this.jiraSettingsService = jiraSettingsService;
        this.configDetails = configDetails;
        this.jiraServices = jiraServices;
    }

    @Override
    public String call() throws Exception {
        logger.info("Running the Hub JIRA periodic timed task.");

        final JiraContext jiraContext = initJiraContext(configDetails.getJiraAdminUserName(),
                configDetails.getJiraIssueCreatorUserName());
        if (jiraContext == null) {
            logger.error(
                    "No (valid) user in configuration data; The plugin has likely not yet been configured; The task cannot run (yet)");
            return "error";
        }
        final DateTime beforeSetup = new DateTime();
        final TicketInfoFromSetup ticketInfoFromSetup = new TicketInfoFromSetup();
        try {
            jiraSetup(jiraServices, jiraSettingsService, configDetails.getProjectMappingJson(), ticketInfoFromSetup,
                    jiraContext);
        } catch (final Exception e) {
            logger.error("Error during JIRA setup: " + e.getMessage() + "; The task cannot run", e);
            return "error";
        }
        final DateTime afterSetup = new DateTime();
        final Period diff = new Period(beforeSetup, afterSetup);
        logger.info("Hub JIRA setup took " + diff.getMinutes() + "m," + diff.getSeconds() + "s," + diff.getMillis()
                + "ms.");
        final HubJiraTask processor = new HubJiraTask(configDetails, jiraContext, jiraSettingsService,
                ticketInfoFromSetup);
        final String runDateString = processor.execute();
        if (runDateString != null) {
            settings.put(HubJiraConfigKeys.HUB_CONFIG_LAST_RUN_DATE, runDateString);
        }
        logger.info("hub-jira periodic timed task has completed");
        return "success";
    }

    public void jiraSetup(final JiraServices jiraServices, final JiraSettingsService jiraSettingsService,
            final String projectMappingJson, final TicketInfoFromSetup ticketInfoFromSetup,
            final JiraContext jiraContext) throws ConfigurationException, JiraException {

        // Make sure current JIRA version is supported
        getJiraVersionCheck(); // throws exception if not

        // Create Issue Types, workflow, etc.
        HubIssueTypeSetup issueTypeSetup;
        try {
            issueTypeSetup = getHubIssueTypeSetup(jiraSettingsService, jiraServices,
                    jiraContext.getJiraAdminUser().getName());
        } catch (final ConfigurationException e) {
            logger.error(
                    "Unable to create IssueTypes; Perhaps configuration is not ready; Will try again next time");
            return;
        }
        final List<IssueType> issueTypes = issueTypeSetup.addIssueTypesToJira();
        if (issueTypes == null || issueTypes.isEmpty()) {
            logger.error("No Black Duck Issue Types found or created");
            return;
        }
        logger.debug("Number of Black Duck issue types found or created: " + issueTypes.size());

        final HubFieldScreenSchemeSetup fieldConfigurationSetup = getHubFieldScreenSchemeSetup(jiraSettingsService,
                jiraServices);

        final Map<IssueType, FieldScreenScheme> screenSchemesByIssueType = fieldConfigurationSetup
                .addHubFieldConfigurationToJira(issueTypes);
        if (screenSchemesByIssueType == null || screenSchemesByIssueType.isEmpty()) {
            logger.error("No Black Duck Screen Schemes found or created");
        }
        ticketInfoFromSetup.setCustomFields(fieldConfigurationSetup.getCustomFields());

        logger.debug("Number of Black Duck Screen Schemes found or created: " + screenSchemesByIssueType.size());

        final HubFieldConfigurationSetup hubFieldConfigurationSetup = getHubFieldConfigurationSetup(
                jiraSettingsService, jiraServices);
        final EditableFieldLayout fieldConfiguration = hubFieldConfigurationSetup.addHubFieldConfigurationToJira();
        final FieldLayoutScheme fieldConfigurationScheme = hubFieldConfigurationSetup
                .createFieldConfigurationScheme(issueTypes, fieldConfiguration);

        final HubWorkflowSetup workflowSetup = getHubWorkflowSetup(jiraSettingsService, jiraServices);
        final JiraWorkflow workflow = workflowSetup.addHubWorkflowToJira();
        logger.debug("Black Duck workflow Name: " + workflow.getName());

        // Associate these config objects with mapped projects
        adjustProjectsConfig(jiraServices, projectMappingJson, issueTypeSetup, issueTypes, screenSchemesByIssueType,
                fieldConfiguration, fieldConfigurationScheme, workflowSetup, workflow);
    }

    public JiraVersionCheck getJiraVersionCheck() throws ConfigurationException {
        return new JiraVersionCheck();
    }

    private void adjustProjectsConfig(final JiraServices jiraServices, final String projectMappingJson,
            final HubIssueTypeSetup issueTypeSetup, final List<IssueType> issueTypes,
            final Map<IssueType, FieldScreenScheme> screenSchemesByIssueType,
            final EditableFieldLayout fieldConfiguration, final FieldLayoutScheme fieldConfigurationScheme,
            final HubWorkflowSetup workflowSetup, final JiraWorkflow workflow) {
        if (projectMappingJson != null && issueTypes != null && !issueTypes.isEmpty()) {
            final HubJiraConfigSerializable config = new HubJiraConfigSerializable();
            // Converts Json to list of mappings
            config.setHubProjectMappingsJson(projectMappingJson);
            if (!config.getHubProjectMappings().isEmpty()) {
                for (final HubProjectMapping projectMapping : config.getHubProjectMappings()) {
                    if (projectMapping.getJiraProject() != null
                            && projectMapping.getJiraProject().getProjectId() != null) {
                        // Get jira Project object by Id
                        // from the JiraProject in the mapping
                        final Project jiraProject = jiraServices.getJiraProjectManager()
                                .getProjectObj(projectMapping.getJiraProject().getProjectId());
                        if (jiraProject != null) {
                            // add issuetypes to this project
                            issueTypeSetup.addIssueTypesToProjectIssueTypeScheme(jiraProject, issueTypes);
                            issueTypeSetup.addIssueTypesToProjectIssueTypeScreenSchemes(jiraProject,
                                    screenSchemesByIssueType);
                            final boolean wasAlreadySetUp = issueTypeSetup
                                    .associateIssueTypesWithFieldConfigurationsOnProjectFieldConfigurationScheme(
                                            jiraProject, fieldConfigurationScheme, issueTypes, fieldConfiguration);
                            if (wasAlreadySetUp) {
                                logger.debug(
                                        "It appears the project's WorkflowScheme has already been configured; leaving it unchanged");
                            } else {
                                workflowSetup.addWorkflowToProjectsWorkflowScheme(workflow, jiraProject,
                                        issueTypes);
                            }
                        }
                    }
                }
            }
        }
    }

    private HubIssueTypeSetup getHubIssueTypeSetup(final JiraSettingsService jiraSettingsService,
            final JiraServices jiraServices, final String jiraUserName) throws ConfigurationException {
        return new HubIssueTypeSetup(jiraServices, jiraSettingsService, jiraServices.getIssueTypes(), jiraUserName);
    }

    public HubFieldScreenSchemeSetup getHubFieldScreenSchemeSetup(final JiraSettingsService jiraSettingsService,
            final JiraServices jiraServices) {
        return new HubFieldScreenSchemeSetup(jiraSettingsService, jiraServices);
    }

    private HubFieldConfigurationSetup getHubFieldConfigurationSetup(final JiraSettingsService jiraSettingsService,
            final JiraServices jiraServices) {
        return new HubFieldConfigurationSetup(jiraSettingsService, jiraServices);
    }

    private HubWorkflowSetup getHubWorkflowSetup(final JiraSettingsService jiraSettingsService,
            final JiraServices jiraServices) {
        return new HubWorkflowSetup(jiraSettingsService, jiraServices);
    }

    private JiraContext initJiraContext(final String jiraAdminUsername, String jiraIssueCreatorUsername) {
        logger.debug(String.format("Checking JIRA users: Admin: %s; Issue creator: %s", jiraAdminUsername,
                jiraIssueCreatorUsername));
        if (jiraIssueCreatorUsername == null) {
            logger.warn(String.format(
                    "The JIRA Issue Creator user has not been configured, using the admin user (%s) to create issues. This can be changed via the Issue Creation configuration",
                    jiraAdminUsername));
            jiraIssueCreatorUsername = jiraAdminUsername;
        }
        final ApplicationUser jiraAdminUser = getJiraUser(jiraAdminUsername);
        final ApplicationUser jiraIssueCreatorUser = getJiraUser(jiraIssueCreatorUsername);
        if ((jiraAdminUser == null) || (jiraIssueCreatorUser == null)) {
            return null;
        }
        final JiraContext jiraContext = new JiraContext(jiraAdminUser, jiraIssueCreatorUser);
        return jiraContext;
    }

    private ApplicationUser getJiraUser(final String jiraUsername) {
        final UserManager jiraUserManager = jiraServices.getUserManager();
        final ApplicationUser jiraUser = jiraUserManager.getUserByName(jiraUsername);
        if (jiraUser == null) {
            logger.error(String.format("Could not find the JIRA user %s", jiraUsername));
            return null;
        }
        return jiraUser;
    }

}