/* * Copyright (c) 2015 BISON Schweiz AG, All Rights Reserved. */ package to.rtc.rtc2jira.exporter.jira.mapping; import static to.rtc.rtc2jira.storage.WorkItemTypes.BUSINESSNEED; import static to.rtc.rtc2jira.storage.WorkItemTypes.DEFECT; import static to.rtc.rtc2jira.storage.WorkItemTypes.EPIC; import static to.rtc.rtc2jira.storage.WorkItemTypes.IMPEDIMENT; import static to.rtc.rtc2jira.storage.WorkItemTypes.STORY; import static to.rtc.rtc2jira.storage.WorkItemTypes.TASK; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.function.Supplier; import java.util.logging.Logger; import java.util.stream.Collectors; import to.rtc.rtc2jira.ExportManager; import to.rtc.rtc2jira.exporter.jira.JiraExporter; import to.rtc.rtc2jira.exporter.jira.JiraRestAccess; import to.rtc.rtc2jira.exporter.jira.entities.Issue; import to.rtc.rtc2jira.exporter.jira.entities.IssueFields; import to.rtc.rtc2jira.exporter.jira.entities.IssueMetadata; import to.rtc.rtc2jira.exporter.jira.entities.IssueType; import to.rtc.rtc2jira.exporter.jira.entities.ProjectOverview; import to.rtc.rtc2jira.storage.StorageEngine; /** * @author roman.schaller * */ public class WorkItemTypeMapping implements Mapping { private static final Logger LOGGER = Logger.getLogger(WorkItemTypeMapping.class.getName()); static { LOGGER.addHandler(ExportManager.DEFAULT_LOG_HANDLER); } private Map<String, List<IssueType>> existingIssueTypes; private JiraRestAccess restAccess; public WorkItemTypeMapping() { this.restAccess = JiraExporter.INSTANCE.getRestAccess(); } @Override public void map(Object value, Issue issue, StorageEngine storage) { String workitemType = (String) value; IssueFields issueFields = issue.getFields(); ProjectOverview project = issueFields.getProject(); switch (workitemType) { case TASK: issueFields.setIssuetype(getIssueType(IssueType.TASK.getName(), project)); break; case STORY: issueFields.setIssuetype(getIssueType(IssueType.STORY.getName(), project)); break; case EPIC: issueFields.setIssuetype(getIssueType(IssueType.EPIC.getName(), project)); break; case BUSINESSNEED: issueFields.setIssuetype(getIssueType(IssueType.BUSINESS_NEED.getName(), project)); break; case IMPEDIMENT: issueFields.setIssuetype(getIssueType(IssueType.IMPEDIMENT.getName(), project)); break; case DEFECT: issueFields.setIssuetype(getIssueType(IssueType.BUG.getName(), project)); break; default: LOGGER.warning("Cannot determine issuetype for unknown workitemType: " + workitemType); break; } } public IssueType getIssueType(String issuetypeName, ProjectOverview project) { String projectKey = project.getKey(); if (existingIssueTypes == null) { IssueMetadata issueMetadata = restAccess.get("/issue/createmeta/?expand=projects.issuetypes.fields.", IssueMetadata.class); existingIssueTypes = new HashMap<>(); existingIssueTypes.put(projectKey, issueMetadata.getProject(projectKey).get().getIssuetypes()); } List<IssueType> issuesTypesByProject = existingIssueTypes.get(projectKey); Supplier<IssueType> createIssueTypeForName = () -> { return createIssueType(issuetypeName); }; IssueType issueType = getIssueTypeByName(issuetypeName, issuesTypesByProject).orElseGet(createIssueTypeForName); if (!issuesTypesByProject.contains(issueType)) { issuesTypesByProject.add(issueType); } return issueType; } private IssueType createIssueType(String issuetypeName) { IssueType newIssueType = new IssueType(); newIssueType.setName(issuetypeName); newIssueType = restAccess.post(newIssueType.getPath(), newIssueType, IssueType.class); return newIssueType; } private Optional<IssueType> getIssueTypeByName(String name, Collection<IssueType> types) { List<IssueType> filteredTypes = types.stream().filter(issuetype -> issuetype.getName().equals(name)).collect(Collectors.toList()); if (filteredTypes.isEmpty()) { return Optional.empty(); } else { return Optional.of(filteredTypes.get(0)); } } }