law(pingpongplus,language(java)) public class Pingpongplus extends Law { public void sent(String source, String message, String dest) { String pingToY = "pingTo(" + dest + ")"; String pingFromY = "pingFrom(" + dest + ")"; if (message.startsWith("ping(") && !CS.has(pingToY)) { doAdd(pingToY); doForward(); return; } if (message.startsWith("pong(") && CS.has(pingFromY)) { doRemove(pingFromY); doForward(); return; } if (message.equals("getCS")) { doDiscloseAllCS(); return; } if (message.startsWith("display(")) { int dt = Integer.parseInt(getContentFromMessage(message)); doImposeObligation("display", dt, "sec"); doAdd("obTime(" + dt + ")"); doShowEvents("all", "all"); return; } if (message.equals("stopDisplay")) { Term timeTerm = CS.findT("obTime(%A)"); doRemove(timeTerm); doRepealObligation("display"); return; } doDeliver(Self, "messageIgnored", Self); } public void arrived(String source, String message, String dest) { if (message.startsWith("ping(")) { doAdd("pingFrom(" + source + ")"); doDeliver(); } if (message.startsWith("pong(")) { doRemove("pingTo(" + source + ")"); doDeliver(); } } public void disconnected() { doImposeObligation("toQuit", 10, "min"); } public void reconnected() { doRepealObligation("toQuit"); } public void obligationDue(Term obligationTerm) { if (obligationTerm.toString().equals("toQuit")) doQuit(); if (obligationTerm.toString().equals("display")) { int dt = CS.fetchInt("obTime"); doImposeObligation("display", dt, "sec"); doShowEvents("all", "all"); } } public void exception(Message m, String diagnostic) { if ((m.type == Const.FWD) && m.source.equals(Self) && m.s_payload.startsWith("ping")) { doRemove("pingTo(" + m.dest + ")"); doDeliver("law", "exc(" + m.s_payload + ")", Self); return; } doDeliver("law", "exception(type(" + m.type + "),source(" + m.source + "),payload(" + m.s_payload + "),dest(" + m.dest + "),diagnostic(" + diagnostic + "))", Self); } /*This is a helper method to retrieve the only argument of a regular expression*/ public String getContentFromMessage(String anyMessage) { int index = anyMessage.indexOf("("); if (index == -1) return ""; else return anyMessage.substring(index+1, anyMessage.length()-1); } }