package slacknotifications; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class SlackNotificationCollection { private Map<Integer, SlackNotification> slackNotifications; private static final Integer SYSTEM = 0; private static final Integer SLACKNOTIFICATION = 1; private static final Integer SLACKNOTIFICATION_ID = 2; private static final Integer SLACKNOTIFICATION_KEY = 3; private static final Integer SLACKNOTIFICATION_PARAMETER_ID = 4; private static final Integer SLACKNOTIFICATION_PARAMETER_KEY = 5; private Map <String, String> origParams; public SlackNotificationCollection(Map<String, String> params) { slackNotifications = new HashMap<Integer, SlackNotification>(); this.origParams = params; this.parseParams(params); } private String getValue(String paramKey) throws SlackNotificationParameterReferenceException { if (this.origParams.containsKey(paramKey)){ String value = this.origParams.get(paramKey); if (value.startsWith("%") && value.endsWith("%")){ return this.getValue(value.substring(1,value.length() - 1)); } return value; } else { throw new SlackNotificationParameterReferenceException(paramKey); } } private void parseParams(Map <String, String> params) { //slackNotifications.add(new SlackNotification("blah")); for (Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator(); iterator.hasNext();) { Map.Entry<String,String> entry = (Map.Entry<String,String>) iterator.next(); String name = (String)entry.getKey(); String val = (String)entry.getValue(); System.out.println(name + " .. " + val); String tokens[] = name.toLowerCase().split("\\."); // First check if it's one of our tokens. if ("system".equals(tokens[SYSTEM]) && "slackNotification".equals(tokens[SLACKNOTIFICATION]) && this.canConvertToInt(tokens[SLACKNOTIFICATION_ID])) { // Check if we have already created a slacknotifications instance if (slackNotifications.containsKey(this.convertToInt(tokens[SLACKNOTIFICATION_ID]))){ if ("channel".equals(tokens[SLACKNOTIFICATION_KEY])) { slackNotifications.get(this.convertToInt(tokens[SLACKNOTIFICATION_ID])).setChannel(val); } else if ("teamName".equals(tokens[SLACKNOTIFICATION_KEY])) { slackNotifications.get(this.convertToInt(tokens[SLACKNOTIFICATION_ID])).setTeamName(val); } else if ("enabled".equals(tokens[SLACKNOTIFICATION_KEY])) { slackNotifications.get(this.convertToInt(tokens[SLACKNOTIFICATION_ID])).setEnabled(val); } else if ("parameter".equals(tokens[SLACKNOTIFICATION_KEY]) && (this.canConvertToInt(tokens[SLACKNOTIFICATION_PARAMETER_ID])) && ("name".equals(tokens[SLACKNOTIFICATION_PARAMETER_KEY]))) { try { String myVal = this.getValue("system.slacknotifications." + tokens[SLACKNOTIFICATION_ID] + ".parameter." + tokens[SLACKNOTIFICATION_PARAMETER_ID] + ".value"); slackNotifications.get(this.convertToInt(tokens[SLACKNOTIFICATION_ID])).addParam(val, myVal); } catch (SlackNotificationParameterReferenceException e) { slackNotifications.get(this.convertToInt(tokens[SLACKNOTIFICATION_ID])).setErrored(true); slackNotifications.get(this.convertToInt(tokens[SLACKNOTIFICATION_ID])).setErrorReason( "SlackNotification Listener: The configured slacknotifications parameter (" + name + ") references an alternate non-existant parameter"); } } } else { if ("url".equals(tokens[SLACKNOTIFICATION_KEY])) { SlackNotification wh = new SlackNotificationImpl(val); this.slackNotifications.put(this.convertToInt(tokens[SLACKNOTIFICATION_ID]), wh); // } else if ((tokens[SLACKNOTIFICATION_KEY].equals("bitmask")) // && (this.canConvertToInt(val))){ // SlackNotification slackNotification = new SlackNotificationImpl(); // slackNotification.setTriggerStateBitMask(this.convertToInt(val)); // this.slackNotifications.put(this.convertToInt(tokens[SLACKNOTIFICATION_ID]), slackNotification); } else if ("enabled".equals(tokens[SLACKNOTIFICATION_KEY])){ SlackNotification wh = new SlackNotificationImpl(); wh.setEnabled(true); this.slackNotifications.put(this.convertToInt(tokens[SLACKNOTIFICATION_ID]), wh); } else if ("parameter".equals(tokens[SLACKNOTIFICATION_KEY]) && (this.canConvertToInt(tokens[SLACKNOTIFICATION_PARAMETER_ID])) && ("name".equals(tokens[SLACKNOTIFICATION_PARAMETER_KEY]))) { try { String myVal = this.getValue("system.slacknotifications." + tokens[SLACKNOTIFICATION_ID] + ".parameter." + tokens[SLACKNOTIFICATION_PARAMETER_ID] + ".value"); SlackNotification wh = new SlackNotificationImpl(); wh.addParam(val, myVal); this.slackNotifications.put(this.convertToInt(tokens[SLACKNOTIFICATION_ID]), wh); } catch (SlackNotificationParameterReferenceException e) { SlackNotification wh = new SlackNotificationImpl(); wh.setErrored(true); wh.setErrorReason("SlackNotification Listener: The configured slacknotifications parameter (" + name + ") references an alternate non-existant parameter"); this.slackNotifications.put(this.convertToInt(tokens[SLACKNOTIFICATION_ID]), wh); } } } } } } public Map<Integer, SlackNotification> getSlackNotifications(){ return this.slackNotifications; } public Collection<SlackNotification> getSlackNotificationsAsCollection(){ return this.slackNotifications.values(); } private Boolean canConvertToInt(String s){ try{ Integer.parseInt(s); return true; } catch (NumberFormatException e){ return false; } } private Integer convertToInt(String s){ try{ int myInt = Integer.parseInt(s); return myInt; } catch (NumberFormatException e){ return null; } } }