Skip to content

Commit 3fc194b

Browse files
authored
Merge pull request #74 from Simon-Initiative/minized-slack-alerts
Minimized slack alerts
2 parents eb17e05 + bc3544e commit 3fc194b

4 files changed

Lines changed: 46 additions & 6 deletions

File tree

src/main/java/edu/cmu/oli/content/AppUtils.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import java.security.NoSuchAlgorithmException;
3636
import java.security.SecureRandom;
3737
import java.util.*;
38+
import java.util.concurrent.ConcurrentHashMap;
3839
import java.util.stream.Collectors;
3940

4041
/**
@@ -466,14 +467,46 @@ public static EmbedActivityType inferEmbedActivityType(JsonObject embedActivity)
466467
return EmbedActivityType.UNKNOWN;
467468
}
468469

470+
private static Map<String, Long> delayedSlackMessages;
471+
static {
472+
delayedSlackMessages = new ConcurrentHashMap<>();
473+
long sleepTimeInMilli = 1000L * 60 * 1; // 1 minutes
474+
Timer timer = new Timer(true);
475+
TimerTask timerTask = new TimerTask() {
476+
@Override
477+
public void run() {
478+
delayedSlackMessagesClear();
479+
}
480+
};
481+
timer.scheduleAtFixedRate(timerTask, sleepTimeInMilli, sleepTimeInMilli);
482+
}
483+
484+
private static void delayedSlackMessagesClear(){
485+
Iterator<Map.Entry<String, Long>> it = delayedSlackMessages.entrySet().iterator();
486+
while (it.hasNext()){
487+
Map.Entry<String, Long> next = it.next();
488+
// Remove entry after 15 minutes
489+
if((System.currentTimeMillis() - next.getValue()) > (1000L * 60 * 15)){
490+
delayedSlackMessages.remove(next.getKey());
491+
}
492+
}
493+
}
494+
469495
public static Response.Status sendSlackAlert(JsonObject message) {
470496
String slackHook = System.getenv().get("slack_alert_hook");
471497
if (slackHook == null || slackHook.isEmpty() || slackHook.equalsIgnoreCase("none")) {
472498
return Response.Status.FORBIDDEN;
473499
}
500+
String messageString = AppUtils.gsonBuilder().create().toJson(message);
501+
if(delayedSlackMessages.containsKey(messageString)){
502+
// Same message already dispatched less than 15 minutes ago; ignore this one
503+
return Response.Status.OK;
504+
}
505+
506+
delayedSlackMessages.put(messageString, System.currentTimeMillis());
474507
WebTarget target = ClientBuilder.newClient().target(slackHook);
475508
Response response = target.request(MediaType.APPLICATION_JSON)
476-
.post(Entity.json(AppUtils.gsonBuilder().create().toJson(message)));
509+
.post(Entity.json(messageString));
477510
log.info("response code " + response.getStatusInfo() + " code " + response.getStatus());
478511

479512
return Response.Status.fromStatusCode(response.getStatus());

src/main/java/edu/cmu/oli/content/controllers/DeployControllerImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ private String packageDetails(ContentPackage contentPackage) {
348348
sb.append("Package Title: " + contentPackage.getTitle() + "\n");
349349
sb.append("Description: " + contentPackage.getDescription() + "\n");
350350
sb.append("Last Updated: " + contentPackage.getDateUpdated() + "\n\n");
351+
sb.append("Theme choice: " + contentPackage.getTheme()+ "\n\n");
351352

352353
CriteriaBuilder cb = em.getCriteriaBuilder();
353354
CriteriaQuery<Resource> criteria = cb.createQuery(Resource.class);

src/main/java/edu/cmu/oli/content/resource/builders/Json2Xml.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,13 @@ private void doJsonToXml(String key, JsonElement jsonTree, Content xmlParent, Ma
118118
} else if (key.equalsIgnoreCase("#cdata")) {
119119
((Element) xmlParent).addContent(new CDATA(jsonTree.getAsString()));
120120
} else {
121-
122-
String s = StringEscapeUtils.escapeXml10(jsonTree.getAsString());
123-
((Element) xmlParent).addContent(s);
121+
// Wraps with cdata any codeblock content not already wrapped in cdata
122+
if (((Element)xmlParent).getName().equalsIgnoreCase("codeblock")) {
123+
((Element) xmlParent).addContent(new CDATA(jsonTree.getAsString()));
124+
}else {
125+
String s = StringEscapeUtils.escapeXml10(jsonTree.getAsString());
126+
((Element) xmlParent).addContent(s);
127+
}
124128

125129
}
126130
} else if (jsonTree.isJsonNull()) {

src/test/java/edu/cmu/oli/content/resource/builders/Xml2JsonTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,17 @@ public String afterDocToString(final String str) {
2727
assertTrue(str.contains("<p>1 2 3</p>"));
2828
assertTrue(str.contains("<p>4 5 6</p>"));
2929

30+
System.out.println(str);
3031
// check newlines retained in preformatted codeblocks
3132
Matcher regex = Pattern.compile(
32-
"<codeblock syntax\\=\"xml\">7$\\s+8$\\s+9</codeblock>",
33+
"<codeblock syntax\\=\"xml\"><\\!\\[CDATA\\[7$\\s+8$\\s+9\\]\\]></codeblock>",
3334
Pattern.DOTALL | Pattern.MULTILINE
3435
).matcher(str);
3536
assertTrue("XML contains 7\\n 8\\n 9", regex.find());
3637

38+
3739
regex = Pattern.compile(
38-
"<codeblock syntax\\=\"xml\">$\\s+10$\\s+11$\\s+12</codeblock>",
40+
"<codeblock syntax\\=\"xml\"><\\!\\[CDATA\\[$\\s+10$\\s+11$\\s+12\\]\\]></codeblock>",
3941
Pattern.DOTALL | Pattern.MULTILINE
4042
).matcher(str);
4143
assertTrue("XML contains \\n 10\\n 11\\n 12", regex.find());

0 commit comments

Comments
 (0)