From 02bd4c5fcb7c243e18dc777e4b128dc7f589a180 Mon Sep 17 00:00:00 2001 From: Ludovic Apvrille <ludovic.apvrille@telecom-paristech.fr> Date: Tue, 21 Apr 2015 16:36:24 +0000 Subject: [PATCH] Update on attack graphs --- .../AvatarStateMachineElement.java | 11 + src/avatartranslator/AvatarTransition.java | 1 + .../AvatarSpecificationSimulation.java | 10 +- src/ui/AttackTreePanelTranslator.java | 226 +++++++++++++----- 4 files changed, 183 insertions(+), 65 deletions(-) diff --git a/src/avatartranslator/AvatarStateMachineElement.java b/src/avatartranslator/AvatarStateMachineElement.java index c85ac80acd..d3bd2156f5 100644 --- a/src/avatartranslator/AvatarStateMachineElement.java +++ b/src/avatartranslator/AvatarStateMachineElement.java @@ -58,6 +58,8 @@ public abstract class AvatarStateMachineElement extends AvatarElement { private boolean isCheckable; + private boolean isHidden = false; + public AvatarStateMachineElement(String _name, Object _referenceObject) { super(_name, _referenceObject); nexts = new LinkedList<AvatarStateMachineElement>(); @@ -90,6 +92,15 @@ public abstract class AvatarStateMachineElement extends AvatarElement { return null; } + public void setHidden(boolean _b) { + isHidden = _b; + } + + public boolean isHidden() { + return isHidden; + } + + public void setState(AvatarState _as) { myState = _as; } diff --git a/src/avatartranslator/AvatarTransition.java b/src/avatartranslator/AvatarTransition.java index 86edf83705..7e8dc9073d 100644 --- a/src/avatartranslator/AvatarTransition.java +++ b/src/avatartranslator/AvatarTransition.java @@ -71,6 +71,7 @@ public class AvatarTransition extends AvatarStateMachineElement { guard = _guard; } + public void addGuard(String _g) { guard = "(" + guard + ") and (" + _g + ")"; } diff --git a/src/avatartranslator/directsimulation/AvatarSpecificationSimulation.java b/src/avatartranslator/directsimulation/AvatarSpecificationSimulation.java index 8ef45d0756..8c15a1ae3a 100644 --- a/src/avatartranslator/directsimulation/AvatarSpecificationSimulation.java +++ b/src/avatartranslator/directsimulation/AvatarSpecificationSimulation.java @@ -879,7 +879,10 @@ public class AvatarSpecificationSimulation { tr.isSilent = true; return tr; } - } + } else if (atr.isHidden()) { + tr.isSilent = true; + return tr; + } // State entering? } else if (((tr.elementToExecute instanceof AvatarState) || (tr.elementToExecute instanceof AvatarStopState)) && (executeStateEntering)) { if (nbOfTransactions(tr.asb, _pendingTransactions) < 2) { @@ -887,7 +890,10 @@ public class AvatarSpecificationSimulation { tr.isSilent = true; return tr; } - } + } else if (tr.elementToExecute.isHidden()) { + tr.isSilent = true; + return tr; + } } return null; diff --git a/src/ui/AttackTreePanelTranslator.java b/src/ui/AttackTreePanelTranslator.java index b358fd8e67..959c96365f 100644 --- a/src/ui/AttackTreePanelTranslator.java +++ b/src/ui/AttackTreePanelTranslator.java @@ -194,11 +194,7 @@ public class AttackTreePanelTranslator { ce.setTDiagramPanel(atdp); addCheckingError(ce); } - - } - - } // Making connections between nodes&attacks @@ -309,7 +305,7 @@ public class AttackTreePanelTranslator { declareAllAttacks(as, mainBlock); // Make block for attacks - makeLeafAttackBlocks(as, mainBlock); + makeAttackBlocks(as, mainBlock); // Make blocks for nodes makeAttackNodeBlocks(as, mainBlock); @@ -337,10 +333,21 @@ public class AttackTreePanelTranslator { _main.addSignal(stopAcceptAttack); ar.addSignals(makeAttack, acceptAttack); ar.addSignals(stopMakeAttack, stopAcceptAttack); + + // If attack is not leaf: add the intermediate action to activate the intermediate leaf + if (!attack.isLeaf()) { + avatartranslator.AvatarSignal nodeDone = new avatartranslator.AvatarSignal("nodeDone__" + attack.getName(), AvatarSignal.OUT, (Object)(listE.getTG(attack))); + _main.addSignal(nodeDone); + avatartranslator.AvatarSignal activateAttack = new avatartranslator.AvatarSignal("activate__" + attack.getName(), AvatarSignal.IN, listE.getTG(attack)); + _main.addSignal(activateAttack); + ar.addSignals(nodeDone, activateAttack); + + } + } } - private void makeLeafAttackBlocks(AvatarSpecification _as, AvatarBlock _main) { + private void makeAttackBlocks(AvatarSpecification _as, AvatarBlock _main) { for(Attack attack: at.getAttacks()) { if (attack.isLeaf()) { // Make the block @@ -355,29 +362,32 @@ public class AttackTreePanelTranslator { makeAttackBlockSMD(ab, sigAttack, stopAttack, listE.getTG(attack)); } - } else if (attack.isFinal()) { + } else { // Make the block AvatarBlock ab = new AvatarBlock(attack.getName(), listE.getTG(attack)); _as.addBlock(ab); ab.setFather(_main); - avatartranslator.AvatarSignal sigAttack = _main.getAvatarSignalWithName("accept__" + attack.getName()); - avatartranslator.AvatarSignal stopAttack = _main.getAvatarSignalWithName("acceptStop__" + attack.getName()); + avatartranslator.AvatarSignal sigAttack = _main.getAvatarSignalWithName("make__" + attack.getName()); + avatartranslator.AvatarSignal stopAttack = _main.getAvatarSignalWithName("makeStop__" + attack.getName()); + avatartranslator.AvatarSignal activateAttack = _main.getAvatarSignalWithName("activate__" + attack.getName()); - makeAttackBlockSMD(ab, sigAttack, stopAttack, listE.getTG(attack)); + makeIntermediateAttackBlockSMD(ab, sigAttack, stopAttack, activateAttack, listE.getTG(attack)); - } + // Intermediate attack + } } } + private void makeAttackBlockSMD(AvatarBlock _ab, avatartranslator.AvatarSignal _sigAttack, avatartranslator.AvatarSignal _sigStop, Object _ref) { - Object _ref1 = _ref; - _ref = null; + Object _ref1 = _ref; + _ref = null; AvatarStateMachine asm = _ab.getStateMachine(); AvatarStartState start = new AvatarStartState("start", _ref); AvatarState mainState = new AvatarState("main", _ref, false); - AvatarState performedState = new AvatarState("main", _ref1, true); + AvatarState performedState = new AvatarState("main", _ref1, true); AvatarState mainStop = new AvatarState("stop", _ref, false); AvatarActionOnSignal getMake = new AvatarActionOnSignal("GettingAttack", _sigAttack, _ref1); AvatarActionOnSignal getStop = new AvatarActionOnSignal("GettingStop", _sigStop, _ref); @@ -385,7 +395,7 @@ public class AttackTreePanelTranslator { asm.addElement(start); asm.setStartState(start); asm.addElement(mainState); - asm.addElement(performedState); + asm.addElement(performedState); asm.addElement(getMake); asm.addElement(getStop); @@ -405,7 +415,82 @@ public class AttackTreePanelTranslator { getMake.addNext(at); at.addNext(performedState); - at = new AvatarTransition("backToMain", _ref); + at = new AvatarTransition("backToMain", _ref); + asm.addElement(at); + performedState.addNext(at); + at.addNext(mainState); + + at = new AvatarTransition("at4", _ref); + asm.addElement(at); + mainState.addNext(at); + at.addNext(getStop); + + at = new AvatarTransition("at5", _ref); + asm.addElement(at); + getStop.addNext(at); + at.addNext(mainStop); + + } + + private void makeIntermediateAttackBlockSMD(AvatarBlock _ab, avatartranslator.AvatarSignal _sigAttack, avatartranslator.AvatarSignal _sigStop, avatartranslator.AvatarSignal _sigActivate, Object _ref) { + Object _ref1 = _ref; + _ref = null; + AvatarStateMachine asm = _ab.getStateMachine(); + + AvatarStartState start = new AvatarStartState("start", _ref); + AvatarState activateState = new AvatarState("activate", _ref, false); + AvatarState mainState = new AvatarState("main", _ref, false); + AvatarState activatedState = new AvatarState("main", _ref1, true); + AvatarState performedState = new AvatarState("main", _ref, false); + AvatarState mainStop = new AvatarState("stop", _ref, false); + AvatarActionOnSignal getMake = new AvatarActionOnSignal("GettingAttack", _sigAttack, _ref1); + AvatarActionOnSignal getStop = new AvatarActionOnSignal("GettingStop", _sigStop, _ref); + AvatarActionOnSignal getActivate = new AvatarActionOnSignal("GettingStop", _sigActivate, _ref1); + + asm.addElement(start); + asm.setStartState(start); + asm.addElement(activateState); + asm.addElement(activatedState); + asm.addElement(mainState); + asm.addElement(performedState); + asm.addElement(getMake); + asm.addElement(getStop); + asm.addElement(getActivate); + + + AvatarTransition at = new AvatarTransition("at1", _ref); + asm.addElement(at); + start.addNext(at); + at.addNext(activateState); + + at = new AvatarTransition("at1_act", _ref); + asm.addElement(at); + activateState.addNext(at); + at.addNext(getActivate); + + at = new AvatarTransition("at1_performed", _ref); + asm.addElement(at); + getActivate.addNext(at); + at.addNext(activatedState); + + at = new AvatarTransition("at2_main", _ref); + asm.addElement(at); + activatedState.addNext(at); + at.addNext(mainState); + at.setHidden(true); + + + at = new AvatarTransition("at2", _ref); + asm.addElement(at); + mainState.addNext(at); + at.addNext(getMake); + + at = new AvatarTransition("at3", _ref); + asm.addElement(at); + getMake.addNext(at); + at.addNext(performedState); + + at = new AvatarTransition("backToMain", _ref); asm.addElement(at); performedState.addNext(at); at.addNext(mainState); @@ -452,8 +537,8 @@ public class AttackTreePanelTranslator { private void makeANDNode(AvatarSpecification _as, AvatarBlock _main, AvatarBlock _ab, ANDNode _node, Object _ref) { - Object _ref1 = _ref; - _ref = null; + Object _ref1 = _ref; + _ref = null; AvatarStateMachine asm = _ab.getStateMachine(); // Basic machine @@ -470,6 +555,7 @@ public class AttackTreePanelTranslator { asm.addElement(atF); start.addNext(atF); atF.addNext(mainState); + atF.setHidden(true); String finalGuard = ""; for(Attack att: _node.getInputAttacks()) { AvatarAttribute aa = new AvatarAttribute(att.getName() + "__performed", AvatarType.BOOLEAN, _ref); @@ -480,6 +566,7 @@ public class AttackTreePanelTranslator { } _ab.addAttribute(aa); atF.addAction(att.getName() + "__performed = false"); + avatartranslator.AvatarSignal sigAtt = _main.getAvatarSignalWithName("accept__" + att.getName()); AvatarActionOnSignal acceptAttack = new AvatarActionOnSignal("AcceptAttack", sigAtt, _ref1); @@ -494,8 +581,7 @@ public class AttackTreePanelTranslator { asm.addElement(at); acceptAttack.addNext(at); at.addNext(mainState); - - + at.setHidden(true); } // Adding resulting attack @@ -506,7 +592,7 @@ public class AttackTreePanelTranslator { at.setGuard("[" + finalGuard + "]"); Attack resulting = _node.getResultingAttack(); - avatartranslator.AvatarSignal sigAttack = _main.getAvatarSignalWithName("make__" + resulting.getName()); + avatartranslator.AvatarSignal sigAttack = _main.getAvatarSignalWithName("nodeDone__" + resulting.getName()); AvatarActionOnSignal resultingAttack = new AvatarActionOnSignal("ResultingAttack", sigAttack, _ref1); asm.addElement(resultingAttack); at = new AvatarTransition("at_toResultingAttack", _ref); @@ -517,13 +603,12 @@ public class AttackTreePanelTranslator { asm.addElement(at); resultingAttack.addNext(at); at.addNext(overallState); - } private void makeORNode(AvatarSpecification _as, AvatarBlock _main, AvatarBlock _ab, ORNode _node, Object _ref) { - Object _ref1 = _ref; - _ref = null; + Object _ref1 = _ref; + _ref = null; AvatarStateMachine asm = _ab.getStateMachine(); // Basic machine @@ -599,7 +684,7 @@ public class AttackTreePanelTranslator { } - // Adding resulting attack + // Adding resulting attack AvatarTransition at = new AvatarTransition("at_toEnd", _ref); asm.addElement(at); mainState.addNext(at); @@ -607,7 +692,7 @@ public class AttackTreePanelTranslator { at.setGuard("[" + finalGuard + "]"); Attack resulting = _node.getResultingAttack(); - avatartranslator.AvatarSignal sigAttack = _main.getAvatarSignalWithName("make__" + resulting.getName()); + avatartranslator.AvatarSignal sigAttack = _main.getAvatarSignalWithName("nodeDone__" + resulting.getName()); AvatarActionOnSignal resultingAttack = new AvatarActionOnSignal("ResultingAttack", sigAttack, _ref1); asm.addElement(resultingAttack); at = new AvatarTransition("at_toResultingAttack", _ref); @@ -623,14 +708,14 @@ public class AttackTreePanelTranslator { private void makeXORNode(AvatarSpecification _as, AvatarBlock _main, AvatarBlock _ab, XORNode _node, Object _ref) { - Object _ref1 = _ref; - _ref = null; + Object _ref1 = _ref; + _ref = null; AvatarStateMachine asm = _ab.getStateMachine(); // Basic machine AvatarStartState start = new AvatarStartState("start", _ref); AvatarState mainState = new AvatarState("main", _ref, false); - AvatarState stoppingAll = new AvatarState("stoppingAll", _ref, false); + AvatarState stoppingAll = new AvatarState("stoppingAll", _ref, false); AvatarState endState = new AvatarState("end", _ref, false); AvatarState overallState = new AvatarState("overall", _ref, false); asm.addElement(start); @@ -638,23 +723,24 @@ public class AttackTreePanelTranslator { asm.addElement(mainState); asm.addElement(endState); asm.addElement(overallState); - asm.addElement(stoppingAll); + asm.addElement(stoppingAll); + - AvatarTransition atF = new AvatarTransition("at1", _ref); + atF.setHidden(true); asm.addElement(atF); start.addNext(atF); atF.addNext(mainState); String finalGuard = "oneDone == true"; - String toEndGuard = ""; - AvatarAttribute oneDone = new AvatarAttribute("oneDone", AvatarType.BOOLEAN, _ref); - _ab.addAttribute(oneDone); - atF.addAction("oneDone = false"); + String toEndGuard = ""; + AvatarAttribute oneDone = new AvatarAttribute("oneDone", AvatarType.BOOLEAN, _ref); + _ab.addAttribute(oneDone); + atF.addAction("oneDone = false"); for(Attack att: _node.getInputAttacks()) { AvatarAttribute aa = new AvatarAttribute(att.getName() + "__performed", AvatarType.BOOLEAN, _ref); _ab.addAttribute(aa); atF.addAction(att.getName() + "__performed = false"); - if (toEndGuard.length() ==0) { + if (toEndGuard.length() ==0) { toEndGuard += "(" + att.getName() + "__performed == true)"; } else { toEndGuard += " && (" + att.getName() + "__performed == true)"; @@ -670,30 +756,44 @@ public class AttackTreePanelTranslator { at.setGuard("[("+att.getName() + "__performed == false) && (oneDone == false)]"); at = new AvatarTransition("at_fromInputAttack", _ref); at.addAction(att.getName() + "__performed = true"); - at.addAction("oneDone = true"); + at.setHidden(true); + at.addAction("oneDone = true"); asm.addElement(at); acceptAttack.addNext(at); at.addNext(mainState); // Link from stoppingAll - sigAtt = _main.getAvatarSignalWithName("acceptStop__" + att.getName()); - acceptAttack = new AvatarActionOnSignal("StopAttack", sigAtt, _ref); - asm.addElement(acceptAttack); - at = new AvatarTransition("at_toInputAttack", _ref); - asm.addElement(at); - stoppingAll.addNext(at); - at.addNext(acceptAttack); - at.setGuard("["+att.getName() + "__performed == false]"); - at = new AvatarTransition("at_fromInputAttack", _ref); - at.addAction(att.getName() + "__performed = true"); - asm.addElement(at); - acceptAttack.addNext(at); - at.addNext(stoppingAll); + // if (att.isLeaf()) { + // Leaf attack -> must make a stop + sigAtt = _main.getAvatarSignalWithName("acceptStop__" + att.getName()); + acceptAttack = new AvatarActionOnSignal("StopAttack", sigAtt, _ref1); + asm.addElement(acceptAttack); + at = new AvatarTransition("at_toInputAttack_leaf", _ref); + asm.addElement(at); + stoppingAll.addNext(at); + at.addNext(acceptAttack); + at.setGuard("["+att.getName() + "__performed == false]"); + at = new AvatarTransition("at_fromInputAttack", _ref); + at.addAction(att.getName() + "__performed = true"); + at.setHidden(true); + asm.addElement(at); + acceptAttack.addNext(at); + at.addNext(stoppingAll); + // } else { + // Generated attack-> must set performed to true. + /* at = new AvatarTransition("at_toInputAttack", _ref); + stoppingAll.addNext(at); + asm.addElement(at); + at.addNext(stoppingAll); + at.setGuard("["+att.getName() + "__performed == false]"); + at.addAction(att.getName() + "__performed = true"); + at.setHidden(true);*/ + // } - } + } - // Adding link to stopping all - AvatarTransition at = new AvatarTransition("at_toStoppingAll", _ref); + // Adding link to stopping all + AvatarTransition at = new AvatarTransition("at_toStoppingAll", _ref); asm.addElement(at); mainState.addNext(at); at.addNext(stoppingAll); @@ -708,7 +808,7 @@ public class AttackTreePanelTranslator { at.setGuard("[" + toEndGuard + "]"); Attack resulting = _node.getResultingAttack(); - avatartranslator.AvatarSignal sigAttack = _main.getAvatarSignalWithName("make__" + resulting.getName()); + avatartranslator.AvatarSignal sigAttack = _main.getAvatarSignalWithName("nodeDone__" + resulting.getName()); AvatarActionOnSignal resultingAttack = new AvatarActionOnSignal("ResultingAttack", sigAttack, _ref1); asm.addElement(resultingAttack); at = new AvatarTransition("at_toResultingAttack", _ref); @@ -725,8 +825,8 @@ public class AttackTreePanelTranslator { private void makeSequenceNode(AvatarSpecification _as, AvatarBlock _main, AvatarBlock _ab, SequenceNode _node, Object _ref) { - Object _ref1 = _ref; - _ref = null; + Object _ref1 = _ref; + _ref = null; AvatarStateMachine asm = _ab.getStateMachine(); _node.orderAttacks(); @@ -776,7 +876,7 @@ public class AttackTreePanelTranslator { // Performing resulting attack Attack resulting = _node.getResultingAttack(); - avatartranslator.AvatarSignal sigAttack = _main.getAvatarSignalWithName("make__" + resulting.getName()); + avatartranslator.AvatarSignal sigAttack = _main.getAvatarSignalWithName("nodeDone__" + resulting.getName()); AvatarActionOnSignal resultingAttack = new AvatarActionOnSignal("ResultingAttack", sigAttack, _ref1); asm.addElement(resultingAttack); at = new AvatarTransition("at_toResultingAttack", _ref); @@ -790,8 +890,8 @@ public class AttackTreePanelTranslator { } private void makeAfterNode(AvatarSpecification _as, AvatarBlock _main, AvatarBlock _ab, AfterNode _node, Object _ref) { - Object _ref1 = _ref; - _ref = null; + Object _ref1 = _ref; + _ref = null; AvatarStateMachine asm = _ab.getStateMachine(); _node.orderAttacks(); @@ -846,7 +946,7 @@ public class AttackTreePanelTranslator { // Performing resulting attack Attack resulting = _node.getResultingAttack(); - avatartranslator.AvatarSignal sigAttack = _main.getAvatarSignalWithName("make__" + resulting.getName()); + avatartranslator.AvatarSignal sigAttack = _main.getAvatarSignalWithName("nodeDone__" + resulting.getName()); AvatarActionOnSignal resultingAttack = new AvatarActionOnSignal("ResultingAttack", sigAttack, _ref1); asm.addElement(resultingAttack); at = new AvatarTransition("at_toResultingAttack", _ref); @@ -860,8 +960,8 @@ public class AttackTreePanelTranslator { } private void makeBeforeNode(AvatarSpecification _as, AvatarBlock _main, AvatarBlock _ab, BeforeNode _node, Object _ref) { - Object _ref1 = _ref; - _ref = null; + Object _ref1 = _ref; + _ref = null; AvatarStateMachine asm = _ab.getStateMachine(); _node.orderAttacks(); @@ -922,7 +1022,7 @@ public class AttackTreePanelTranslator { // Performing resulting attack Attack resulting = _node.getResultingAttack(); - avatartranslator.AvatarSignal sigAttack = _main.getAvatarSignalWithName("make__" + resulting.getName()); + avatartranslator.AvatarSignal sigAttack = _main.getAvatarSignalWithName("nodeDone__" + resulting.getName()); AvatarActionOnSignal resultingAttack = new AvatarActionOnSignal("ResultingAttack", sigAttack, _ref1); asm.addElement(resultingAttack); at = new AvatarTransition("at_toResultingAttack", _ref); -- GitLab