package slacknotifications.teamcity.settings; import jetbrains.buildServer.serverSide.SBuildType; import jetbrains.buildServer.serverSide.settings.ProjectSettings; import jetbrains.buildServer.serverSide.settings.ProjectSettingsManager; import org.jdom.Element; import slacknotifications.teamcity.BuildState; import slacknotifications.teamcity.Loggers; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; public class SlackNotificationProjectSettings implements ProjectSettings { private static final String ENABLED = "enabled"; private static final String NAME = SlackNotificationProjectSettings.class.getName(); ProjectSettingsManager psm; ProjectSettings ps; private Boolean slackNotificationsEnabled = true; private Boolean updateSuccess = false; private String updateMessage = ""; private CopyOnWriteArrayList<SlackNotificationConfig> slackNotificationsConfigs; public SlackNotificationProjectSettings(){ slackNotificationsConfigs = new CopyOnWriteArrayList<SlackNotificationConfig>(); } @SuppressWarnings("unchecked") @Override public void readFrom(Element rootElement) /* Is passed an Element by TC, and is expected to load it into the in memory settings object. * Old settings should be overwritten. */ { Loggers.SERVER.debug("readFrom :: " + rootElement.toString()); CopyOnWriteArrayList<SlackNotificationConfig> configs = new CopyOnWriteArrayList<SlackNotificationConfig>(); if (rootElement.getAttribute(ENABLED) != null){ this.slackNotificationsEnabled = Boolean.parseBoolean(rootElement.getAttributeValue(ENABLED)); } List<Element> namedChildren = rootElement.getChildren("slackNotification"); if(namedChildren.isEmpty()) { this.slackNotificationsConfigs = null; } else { for(Element e : namedChildren) { SlackNotificationConfig whConfig = new SlackNotificationConfig(e); Loggers.SERVER.debug(e.toString()); configs.add(whConfig); Loggers.SERVER.debug(NAME + ":readFrom :: channel " + whConfig.getChannel()); Loggers.SERVER.debug(NAME + ":readFrom :: enabled " + String.valueOf(whConfig.getEnabled())); } this.slackNotificationsConfigs = configs; } } @Override public void writeTo(Element parentElement) /* Is passed an (probably empty) Element by TC, which is expected to be populated from the settings * in memory. */ { Loggers.SERVER.debug(NAME + ":writeTo :: " + parentElement.toString()); parentElement.setAttribute(ENABLED, String.valueOf(this.slackNotificationsEnabled)); if(slackNotificationsConfigs != null) { for(SlackNotificationConfig whc : slackNotificationsConfigs){ Element el = whc.getAsElement(); Loggers.SERVER.debug(el.toString()); parentElement.addContent(el); Loggers.SERVER.debug(NAME + ":writeTo :: channel " + whc.getChannel()); Loggers.SERVER.debug(NAME + ":writeTo :: enabled " + String.valueOf(whc.getEnabled())); } } } public List<SlackNotificationConfig> getSlackNotificationsAsList(){ return this.slackNotificationsConfigs; } public List<SlackNotificationConfig> getProjectSlackNotificationsAsList(){ List<SlackNotificationConfig> projHooks = new ArrayList<SlackNotificationConfig>(); for (SlackNotificationConfig config : getSlackNotificationsAsList()){ if (config.isEnabledForAllBuildsInProject()){ projHooks.add(config); } } return projHooks; } public List<SlackNotificationConfig> getBuildSlackNotificationsAsList(SBuildType buildType){ List<SlackNotificationConfig> buildHooks = new ArrayList<SlackNotificationConfig>(); for (SlackNotificationConfig config : getSlackNotificationsAsList()){ if (config.isSpecificBuildTypeEnabled(buildType)){ buildHooks.add(config); } } return buildHooks; } public String getSlackNotificationsAsString(){ String tmpString = ""; for(SlackNotificationConfig whConf : slackNotificationsConfigs) { tmpString += whConf.getChannel() + "<br/>"; } return tmpString; } public void deleteSlackNotification(String slackNotificationId, String ProjectId){ if(this.slackNotificationsConfigs != null) { updateSuccess = false; updateMessage = ""; List<SlackNotificationConfig> tempSlackNotificationList = new ArrayList<SlackNotificationConfig>(); for(SlackNotificationConfig whc : slackNotificationsConfigs) { if (whc.getUniqueKey().equals(slackNotificationId)){ Loggers.SERVER.debug(NAME + ":deleteSlackNotification :: Deleting slacknotifications from " + ProjectId + " with Channel " + whc.getChannel()); tempSlackNotificationList.add(whc); } } if (!tempSlackNotificationList.isEmpty()){ this.updateSuccess = true; this.slackNotificationsConfigs.removeAll(tempSlackNotificationList); } } } public void updateSlackNotification(String ProjectId, String token, String slackNotificationId, String channel, Boolean enabled, BuildState buildState, boolean buildTypeAll, boolean buildSubProjects, Set<String> buildTypesEnabled, boolean mentionChannelEnabled, boolean mentionSlackUserEnabled, SlackNotificationContentConfig content) { if(this.slackNotificationsConfigs != null) { updateSuccess = false; updateMessage = ""; for(SlackNotificationConfig whc : slackNotificationsConfigs) { if (whc.getUniqueKey().equals(slackNotificationId)){ whc.setEnabled(enabled); whc.setToken(token); whc.setChannel(channel); whc.setMentionChannelEnabled(mentionChannelEnabled); whc.setMentionSlackUserEnabled(mentionSlackUserEnabled); whc.setBuildStates(buildState); whc.enableForSubProjects(buildSubProjects); whc.enableForAllBuildsInProject(buildTypeAll); whc.setHasCustomContent(content.isEnabled()); whc.setContent(content); if (!buildTypeAll){ whc.clearAllEnabledBuildsInProject(); for (String bt : buildTypesEnabled){ whc.enableBuildInProject(bt); } } Loggers.SERVER.debug(NAME + ":updateSlackNotification :: Updating slacknotifications from " + ProjectId + " with URL " + whc.getChannel()); this.updateSuccess = true; } } } } public void addNewSlackNotification(String ProjectId, String token, String channel, String teamName, Boolean enabled, BuildState buildState, boolean buildTypeAll, boolean buildTypeSubProjects, Set<String> buildTypesEnabled, boolean mentionChannelEnabled, boolean mentionSlackUserEnabled) { this.slackNotificationsConfigs.add(new SlackNotificationConfig(token, channel, teamName, enabled, buildState, buildTypeAll, buildTypeSubProjects, buildTypesEnabled, mentionChannelEnabled, mentionSlackUserEnabled)); Loggers.SERVER.debug(NAME + ":addNewSlackNotification :: Adding slack notifications to " + ProjectId + " with channel " + channel); this.updateSuccess = true; } public Boolean updateSuccessful(){ return this.updateSuccess; } @Override public void dispose() { Loggers.SERVER.debug(NAME + ":dispose() called"); } public Integer getSlackNotificationsCount(){ return this.slackNotificationsConfigs.size(); } public Boolean isEnabled() { return slackNotificationsEnabled; } public String isEnabledAsChecked() { if (this.slackNotificationsEnabled){ return "checked "; } return ""; } public List<SlackNotificationConfig> getSlackNotificationsConfigs() { return slackNotificationsConfigs; } public String getUpdateMessage() { return updateMessage; } }