law(la,authority(cAdmin),language(java)) authority(cAdmin,keyHash(59FDEDC45F143A486AC0972C15B96FA3)) authority(sysAdmin,keyHash(AB693754C7D0C01C9D1278C90F990803)) //authority(cAdmin,keyHash()). //authority(sysAdmin,keyHash()). public class la extends Law{ public void adopted(String arg, String[] issuer, String[] subject, String[] attributes) { if (issuer.length != 0) { if (issuer[0].equals("sysAdmin") && subject[0].equals(Self) && attributes[0].equals("role(mgr)")) { doAdd("role(mgr)"); } } doAdd("level(0)"); } public void certified(String source, String issuer, String subject, String attributes) { if (issuer.equals("sysAdmin") && subject.equals(Self) && attributes.equals("role(mgr)")) { doAdd("role(mgr)"); } } public void sent(String source, String message, String dest) { if (message.equals("getCS")) doDiscloseAllCS(); if (message.startsWith("setLevel") && CS.has("role(mgr)") ) { doForward(); return; } int levelK = CS.fetchInt("level"); doForward(source, "extendedMessage(" + levelK + "," + message + ")", dest); } public void arrived(String source, String message, String dest) { String content = getContentFromMessage(message); Term levelTerm = CS.findT("level(%A)"); if (message.startsWith("setLevel")) { doReplace(levelTerm.toString(),"level(" + content + ")"); doDeliver(); return; } if (message.startsWith("extendedMessage")) { String trueMessage = content.substring(content.indexOf(',') + 1); int levelK = Integer.parseInt(content.substring(0, content.indexOf(','))); int levelK1 = CS.fetchInt("level"); if ((levelK >= levelK1) && (levelK <= levelK1 + 1)) { doDeliver(source, trueMessage, Self); return; } } } public void disconnected() { doQuit(); } /** Helper method to parse the argument out 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); } }