/* * Copyright (c) 2015 BISON Schweiz AG, All Rights Reserved. */ package to.rtc.rtc2jira.exporter.jira.mapping; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.bind.annotation.XmlRootElement; import to.rtc.rtc2jira.ExportManager; import to.rtc.rtc2jira.exporter.jira.entities.Issue; import to.rtc.rtc2jira.exporter.jira.entities.JiraUser; import to.rtc.rtc2jira.importer.mapping.ContributorMapping; import to.rtc.rtc2jira.storage.StorageEngine; import com.sun.jersey.api.client.ClientResponse; /** * @author gustaf.hansen * */ public class WatcherMapping extends BaseUserMapping { static final Logger LOGGER = Logger.getLogger(WatcherMapping.class.getName()); static { LOGGER.addHandler(ExportManager.DEFAULT_LOG_HANDLER); } @Override public void map(Object value, Issue issue, StorageEngine storage) { @SuppressWarnings("unchecked") List<String> userList = (List<String>) value; if (userList != null) { List<JiraUser> watchersFromRtc = new ArrayList<JiraUser>(); List<JiraUser> existingWatchers = new ArrayList<JiraUser>(); List<JiraUser> watchersToDelete = new ArrayList<JiraUser>(); List<JiraUser> watchersToAdd = new ArrayList<JiraUser>(); Watchers response = getExistingWatchers(issue); if (response != null) { existingWatchers = response.getWatchers(); } for (String formattedStr : userList) { JiraUser jiraUser = getUser(formattedStr); watchersFromRtc.add(jiraUser); } for (JiraUser jiraUser : existingWatchers) { if (!watchersFromRtc.contains(jiraUser)) { watchersToDelete.add(jiraUser); } } for (JiraUser jiraUser : watchersFromRtc) { if (!existingWatchers.contains(jiraUser)) { watchersToAdd.add(jiraUser); } } removeWatchers(watchersToDelete, issue); addWatchers(watchersToAdd, issue); } } private JiraUser getUser(String contributorStr) { JiraUser jiraUser = ContributorMapping.stringToUser(contributorStr); return getUser(jiraUser); } private Watchers getExistingWatchers(Issue issue) { ClientResponse clientResponse = getRestAccess().get(issue.getSelfPath() + "/watchers"); if (clientResponse.getStatus() == 200) { return clientResponse.getEntity(Watchers.class); } else { LOGGER.log(Level.SEVERE, "Could not retrieve watchers for issue. " + clientResponse.getEntity(String.class)); return null; } } private void addWatchers(List<JiraUser> watchers, Issue issue) { for (JiraUser watcher : watchers) { ClientResponse clientResponse = getRestAccess().post(issue.getSelfPath() + "/watchers", "\"" + watcher.getName() + "\""); if (clientResponse.getStatus() != 204) { LOGGER.log(Level.SEVERE, "Could not add watcher to issue. " + clientResponse.getEntity(String.class)); } } } private void removeWatchers(List<JiraUser> watchers, Issue issue) { for (JiraUser watcher : watchers) { ClientResponse clientResponse = getRestAccess().delete(issue.getSelfPath() + "/watchers?username=" + watcher.getName()); if (clientResponse.getStatus() != 204) { LOGGER.log(Level.SEVERE, "Could not delete watcher of issue. " + clientResponse.getEntity(String.class)); } } } @XmlRootElement static class Watchers { boolean isWatching; int watchCount; List<JiraUser> watchers; public boolean isWatching() { return isWatching; } public void setWatching(boolean isWatching) { this.isWatching = isWatching; } public int getWatchCount() { return watchCount; } public void setWatchCount(int watchCount) { this.watchCount = watchCount; } public List<JiraUser> getWatchers() { return watchers; } public void setWatchers(List<JiraUser> watchers) { this.watchers = watchers; } } }