From c66f99fdbd1d87709e1ff9cd5433206788ca33cb Mon Sep 17 00:00:00 2001 From: Ludovic Apvrille <ludovic.apvrille@telecom-paristech.fr> Date: Wed, 22 Apr 2015 15:06:33 +0000 Subject: [PATCH] Enable / disable on attacks of attack graphs --- src/attacktrees/Attack.java | 10 + src/ui/AttackTreePanelTranslator.java | 416 +++++++++++++++-------- src/ui/CanBeDisabled.java | 53 +++ src/ui/ColorManager.java | 3 +- src/ui/GTURTLEModeling.java | 4 + src/ui/TDiagramPanel.java | 35 +- src/ui/TGComponent.java | 17 + src/ui/atd/ATDAttack.java | 24 +- src/ui/window/JDialogAvatarProperty.java | 246 +++++++------- 9 files changed, 533 insertions(+), 275 deletions(-) create mode 100755 src/ui/CanBeDisabled.java diff --git a/src/attacktrees/Attack.java b/src/attacktrees/Attack.java index 586df1a702..73bc2d2591 100755 --- a/src/attacktrees/Attack.java +++ b/src/attacktrees/Attack.java @@ -54,6 +54,8 @@ public class Attack { private String name; private Object referenceObject; private boolean isRoot; + private boolean isEnabled = true; + public Attack(String _name, Object _referenceObject) { name = _name; @@ -68,6 +70,14 @@ public class Attack { public void setRoot(boolean _root) { isRoot = _root; } + + public boolean isEnabled() { + return isEnabled; + } + + public void setEnabled(boolean _enabled) { + isEnabled = _enabled; + } public void setOriginNode(AttackNode _node) { originNode = _node; diff --git a/src/ui/AttackTreePanelTranslator.java b/src/ui/AttackTreePanelTranslator.java index 959c96365f..1faa9ad99d 100644 --- a/src/ui/AttackTreePanelTranslator.java +++ b/src/ui/AttackTreePanelTranslator.java @@ -125,6 +125,7 @@ public class AttackTreePanelTranslator { } att = new Attack(value, atdatt); att.setRoot(atdatt.isRootAttack()); + att.setEnabled(atdatt.isEnabled()); at.addAttack(att); listE.addCor(att, comp); } @@ -334,16 +335,16 @@ public class AttackTreePanelTranslator { 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); - - } - + // 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); + + } + } } @@ -359,7 +360,7 @@ public class AttackTreePanelTranslator { avatartranslator.AvatarSignal stopAttack = _main.getAvatarSignalWithName("makeStop__" + attack.getName()); if ((sigAttack != null) && (stopAttack != null)) { - makeAttackBlockSMD(ab, sigAttack, stopAttack, listE.getTG(attack)); + makeAttackBlockSMD(ab, sigAttack, stopAttack, attack.isEnabled(), listE.getTG(attack)); } } else { @@ -370,141 +371,276 @@ public class AttackTreePanelTranslator { avatartranslator.AvatarSignal sigAttack = _main.getAvatarSignalWithName("make__" + attack.getName()); avatartranslator.AvatarSignal stopAttack = _main.getAvatarSignalWithName("makeStop__" + attack.getName()); - avatartranslator.AvatarSignal activateAttack = _main.getAvatarSignalWithName("activate__" + attack.getName()); + avatartranslator.AvatarSignal activateAttack = _main.getAvatarSignalWithName("activate__" + attack.getName()); - makeIntermediateAttackBlockSMD(ab, sigAttack, stopAttack, activateAttack, listE.getTG(attack)); + makeIntermediateAttackBlockSMD(ab, sigAttack, stopAttack, activateAttack, attack.isEnabled(), listE.getTG(attack)); - // Intermediate attack - } + // Intermediate attack + } } } - private void makeAttackBlockSMD(AvatarBlock _ab, avatartranslator.AvatarSignal _sigAttack, avatartranslator.AvatarSignal _sigStop, Object _ref) { + private void makeAttackBlockSMD(AvatarBlock _ab, avatartranslator.AvatarSignal _sigAttack, avatartranslator.AvatarSignal _sigStop, boolean isEnabled, Object _ref) { 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 mainStop = new AvatarState("stop", _ref, false); - AvatarActionOnSignal getMake = new AvatarActionOnSignal("GettingAttack", _sigAttack, _ref1); - AvatarActionOnSignal getStop = new AvatarActionOnSignal("GettingStop", _sigStop, _ref); + if (isEnabled) { - asm.addElement(start); - asm.setStartState(start); - asm.addElement(mainState); - asm.addElement(performedState); - asm.addElement(getMake); - asm.addElement(getStop); + AvatarStartState start = new AvatarStartState("start", _ref); + AvatarState mainState = new AvatarState("main", _ref, false); + 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); + asm.addElement(start); + asm.setStartState(start); + asm.addElement(mainState); + asm.addElement(performedState); + asm.addElement(getMake); + asm.addElement(getStop); - AvatarTransition at = new AvatarTransition("at1", _ref); - asm.addElement(at); - start.addNext(at); - at.addNext(mainState); - at = new AvatarTransition("at2", _ref); - asm.addElement(at); - mainState.addNext(at); - at.addNext(getMake); + AvatarTransition at = new AvatarTransition("at1", _ref); + asm.addElement(at); + start.addNext(at); + at.addNext(mainState); - at = new AvatarTransition("at3", _ref); - asm.addElement(at); - getMake.addNext(at); - at.addNext(performedState); + at = new AvatarTransition("at2", _ref); + asm.addElement(at); + mainState.addNext(at); + at.addNext(getMake); - at = new AvatarTransition("backToMain", _ref); - asm.addElement(at); - performedState.addNext(at); - at.addNext(mainState); + at = new AvatarTransition("at3", _ref); + asm.addElement(at); + getMake.addNext(at); + at.addNext(performedState); - at = new AvatarTransition("at4", _ref); - asm.addElement(at); - mainState.addNext(at); - at.addNext(getStop); + at = new AvatarTransition("backToMain", _ref); + asm.addElement(at); + performedState.addNext(at); + at.addNext(mainState); - at = new AvatarTransition("at5", _ref); - asm.addElement(at); - getStop.addNext(at); - at.addNext(mainStop); + 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); + + } else { + + AvatarStartState start = new AvatarStartState("start", _ref); + AvatarState mainState = new AvatarState("main", _ref, false); + AvatarState mainStop = new AvatarState("stop", _ref, false); + AvatarActionOnSignal getStop = new AvatarActionOnSignal("GettingStop", _sigStop, _ref); + + asm.addElement(start); + asm.setStartState(start); + asm.addElement(mainState); + asm.addElement(getStop); + + + AvatarTransition at = new AvatarTransition("at1", _ref); + asm.addElement(at); + start.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) { + private void makeIntermediateAttackBlockSMD(AvatarBlock _ab, avatartranslator.AvatarSignal _sigAttack, avatartranslator.AvatarSignal _sigStop, avatartranslator.AvatarSignal _sigActivate, boolean isEnabled, 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); + if (isEnabled) { + + 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); + AvatarState stopBeforeActivate = new AvatarState("stopBeforeActivate", _ref, false); + AvatarActionOnSignal getMake = new AvatarActionOnSignal("GettingAttack", _sigAttack, _ref1); + AvatarActionOnSignal getStop = new AvatarActionOnSignal("GettingStop", _sigStop, _ref); + AvatarActionOnSignal getStopInitial = new AvatarActionOnSignal("GettingInitialStop", _sigStop, _ref); + AvatarActionOnSignal getActivate = new AvatarActionOnSignal("GettingActivate", _sigActivate, _ref1); + AvatarActionOnSignal getActivateAfterStop = new AvatarActionOnSignal("GettingActivateAfterStop", _sigActivate, _ref1); + + asm.addElement(start); + asm.setStartState(start); + asm.addElement(activateState); + asm.addElement(activatedState); + asm.addElement(mainState); + asm.addElement(stopBeforeActivate); + asm.addElement(performedState); + asm.addElement(getMake); + asm.addElement(getStop); + asm.addElement(getStopInitial); + asm.addElement(getActivate); + asm.addElement(getActivateAfterStop); + + + AvatarTransition at = new AvatarTransition("at1", _ref); + asm.addElement(at); + start.addNext(at); + at.addNext(activateState); - 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); + 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); - AvatarTransition at = new AvatarTransition("at1", _ref); - asm.addElement(at); - start.addNext(at); - at.addNext(activateState); + at = new AvatarTransition("at2_main", _ref); + asm.addElement(at); + activatedState.addNext(at); + at.addNext(mainState); + at.setHidden(true); - 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", _ref); + asm.addElement(at); + mainState.addNext(at); + at.addNext(getMake); - at = new AvatarTransition("at2_main", _ref); - asm.addElement(at); - activatedState.addNext(at); - at.addNext(mainState); - at.setHidden(true); - + at = new AvatarTransition("at3", _ref); + asm.addElement(at); + getMake.addNext(at); + at.addNext(performedState); - at = new AvatarTransition("at2", _ref); - asm.addElement(at); - mainState.addNext(at); - at.addNext(getMake); + at = new AvatarTransition("backToMain", _ref); + asm.addElement(at); + performedState.addNext(at); + at.addNext(mainState); - at = new AvatarTransition("at3", _ref); - asm.addElement(at); - getMake.addNext(at); - at.addNext(performedState); + at = new AvatarTransition("at4", _ref); + asm.addElement(at); + mainState.addNext(at); + at.addNext(getStop); - at = new AvatarTransition("backToMain", _ref); - asm.addElement(at); - performedState.addNext(at); - at.addNext(mainState); + at = new AvatarTransition("at5", _ref); + asm.addElement(at); + getStop.addNext(at); + at.addNext(mainStop); - at = new AvatarTransition("at4", _ref); - asm.addElement(at); - mainState.addNext(at); - at.addNext(getStop); + // Stop before activate + at = new AvatarTransition("at6", _ref); + asm.addElement(at); + activateState.addNext(at); + at.addNext(getStopInitial); - at = new AvatarTransition("at5", _ref); - asm.addElement(at); - getStop.addNext(at); - at.addNext(mainStop); + at = new AvatarTransition("at7", _ref); + asm.addElement(at); + getStopInitial.addNext(at); + at.addNext(stopBeforeActivate); + + at = new AvatarTransition("at8", _ref); + asm.addElement(at); + stopBeforeActivate.addNext(at); + at.addNext(getActivateAfterStop); + + at = new AvatarTransition("at9", _ref); + asm.addElement(at); + getActivateAfterStop.addNext(at); + at.addNext(mainStop); + } else { + 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 mainStop = new AvatarState("stop", _ref, false); + AvatarState stopBeforeActivate = new AvatarState("stopBeforeActivate", _ref, false); + AvatarActionOnSignal getStop = new AvatarActionOnSignal("GettingStop", _sigStop, _ref); + AvatarActionOnSignal getStopInitial = new AvatarActionOnSignal("GettingInitialStop", _sigStop, _ref); + AvatarActionOnSignal getActivate = new AvatarActionOnSignal("GettingActivate", _sigActivate, _ref1); + AvatarActionOnSignal getActivateAfterStop = new AvatarActionOnSignal("GettingActivateAfterStop", _sigActivate, _ref1); + + asm.addElement(start); + asm.setStartState(start); + asm.addElement(activateState); + asm.addElement(activatedState); + asm.addElement(mainState); + asm.addElement(stopBeforeActivate); + asm.addElement(getStop); + asm.addElement(getStopInitial); + asm.addElement(getActivate); + asm.addElement(getActivateAfterStop); + + + 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("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); + + // Stop before activate + at = new AvatarTransition("at6", _ref); + asm.addElement(at); + activateState.addNext(at); + at.addNext(getStopInitial); + + at = new AvatarTransition("at7", _ref); + asm.addElement(at); + getStopInitial.addNext(at); + at.addNext(stopBeforeActivate); + + at = new AvatarTransition("at8", _ref); + asm.addElement(at); + stopBeforeActivate.addNext(at); + at.addNext(getActivateAfterStop); + + at = new AvatarTransition("at9", _ref); + asm.addElement(at); + getActivateAfterStop.addNext(at); + at.addNext(mainStop); + } } @@ -555,7 +691,7 @@ public class AttackTreePanelTranslator { asm.addElement(atF); start.addNext(atF); atF.addNext(mainState); - atF.setHidden(true); + atF.setHidden(true); String finalGuard = ""; for(Attack att: _node.getInputAttacks()) { AvatarAttribute aa = new AvatarAttribute(att.getName() + "__performed", AvatarType.BOOLEAN, _ref); @@ -566,7 +702,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); @@ -581,7 +717,7 @@ public class AttackTreePanelTranslator { asm.addElement(at); acceptAttack.addNext(at); at.addNext(mainState); - at.setHidden(true); + at.setHidden(true); } // Adding resulting attack @@ -727,7 +863,7 @@ public class AttackTreePanelTranslator { AvatarTransition atF = new AvatarTransition("at1", _ref); - atF.setHidden(true); + atF.setHidden(true); asm.addElement(atF); start.addNext(atF); atF.addNext(mainState); @@ -756,39 +892,39 @@ public class AttackTreePanelTranslator { at.setGuard("[("+att.getName() + "__performed == false) && (oneDone == false)]"); at = new AvatarTransition("at_fromInputAttack", _ref); at.addAction(att.getName() + "__performed = true"); - at.setHidden(true); + at.setHidden(true); at.addAction("oneDone = true"); asm.addElement(at); acceptAttack.addNext(at); at.addNext(mainState); // Link from 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);*/ - // } + // 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);*/ + // } } diff --git a/src/ui/CanBeDisabled.java b/src/ui/CanBeDisabled.java new file mode 100755 index 0000000000..1a40e3beeb --- /dev/null +++ b/src/ui/CanBeDisabled.java @@ -0,0 +1,53 @@ +/**Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + +ludovic.apvrille AT enst.fr + +This software is a computer program whose purpose is to allow the +edition of TURTLE analysis, design and deployment diagrams, to +allow the generation of RT-LOTOS or Java code from this diagram, +and at last to allow the analysis of formal validation traces +obtained from external tools, e.g. RTL from LAAS-CNRS and CADP +from INRIA Rhone-Alpes. + +This software is governed by the CeCILL license under French law and +abiding by the rules of distribution of free software. You can use, +modify and/ or redistribute the software under the terms of the CeCILL +license as circulated by CEA, CNRS and INRIA at the following URL +"http://www.cecill.info". + +As a counterpart to the access to the source code and rights to copy, +modify and redistribute granted by the license, users are provided only +with a limited warranty and the software's author, the holder of the +economic rights, and the successive licensors have only limited +liability. + +In this respect, the user's attention is drawn to the risks associated +with loading, using, modifying and/or developing or reproducing the +software by the user in light of its specific status of free software, +that may mean that it is complicated to manipulate, and that also +therefore means that it is reserved for developers and experienced +professionals having in-depth computer knowledge. Users are therefore +encouraged to load and test the software's suitability as regards their +requirements in conditions enabling the security of their systems and/or +data to be ensured and, more generally, to use and operate it in the +same conditions as regards security. + +The fact that you are presently reading this means that you have had +knowledge of the CeCILL license and that you accept its terms. + +/** + * Class CanBeDisabled + * Components that can be enabled/disabled with a mouse click + * Creation: 22/04/2015 + * @version 1.0 22/04/2015 + * @author Ludovic APVRILLE + * @see + */ + + +package ui; + +public interface CanBeDisabled { + public boolean isEnabled(); + public void setEnabled(boolean _enabled); +} diff --git a/src/ui/ColorManager.java b/src/ui/ColorManager.java index 02ade04bce..f93c7dea52 100755 --- a/src/ui/ColorManager.java +++ b/src/ui/ColorManager.java @@ -133,8 +133,9 @@ public class ColorManager { //public static Color ATD_BLOCK = new Color(196, 232, 195); - public static Color ATD_BLOCK = new Color(218, 218, 218); + public static Color ATD_BLOCK = new Color(218, 218, 218); public static Color ATD_ATTACK = new Color(214, 187, 158); + public static Color ATD_ATTACK_DISABLED = new Color(214, 206, 198); public static Color ATD_ROOT_ATTACK = new Color(243, 131, 10); public static Color ATD_CONSTRAINT = new Color(191, 153, 161); diff --git a/src/ui/GTURTLEModeling.java b/src/ui/GTURTLEModeling.java index 57358991ad..d6cc9f5143 100755 --- a/src/ui/GTURTLEModeling.java +++ b/src/ui/GTURTLEModeling.java @@ -5586,6 +5586,7 @@ public class GTURTLEModeling { boolean breakpoint = false; boolean hidden = false; boolean masterMutex = false; + boolean enable = true; for(i=0; i<nl.getLength(); i++) { n = nl.item(i); @@ -5611,6 +5612,8 @@ public class GTURTLEModeling { myValue = elt.getAttribute("value"); } else if (elt.getTagName().equals("hidden")) { hidden = elt.getAttribute("value").equals("true"); + } else if (elt.getTagName().equals("enabled")) { + enable = elt.getAttribute("value").equals("true"); } else if (elt.getTagName().equals("TGConnectingPoint")) { x = Integer.decode(elt.getAttribute("num")).intValue(); y = Integer.decode(elt.getAttribute("id")).intValue() + decId; @@ -5696,6 +5699,7 @@ public class GTURTLEModeling { } tgc.setHidden(hidden); + tgc.setEnabled(enable); /*if (tgc instanceof TCDTObject) { TraceManager.addDev("Loading " + myValue); diff --git a/src/ui/TDiagramPanel.java b/src/ui/TDiagramPanel.java index 4aa5682e57..30a52c5686 100755 --- a/src/ui/TDiagramPanel.java +++ b/src/ui/TDiagramPanel.java @@ -125,7 +125,7 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree { protected JPopupMenu componentMenu; protected JPopupMenu selectedMenu; protected int popupX, popupY; - protected JMenuItem remove, edit, clone, bringFront, bringBack, makeSquare, setJavaCode, removeJavaCode, setInternalComment, removeInternalComment, attach, detach, hide, unhide,search; + protected JMenuItem remove, edit, clone, bringFront, bringBack, makeSquare, setJavaCode, removeJavaCode, setInternalComment, removeInternalComment, attach, detach, hide, unhide,search, enableDisable; protected JMenuItem checkAccessibility, checkInvariant, checkMasterMutex; protected JMenuItem breakpoint; protected JMenuItem paste, insertLibrary, upX, upY, downX, downY; @@ -134,7 +134,7 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree { //search dialog protected JDialogSearchBox j; //-- - + // Main window protected MainGUI mgui; @@ -693,12 +693,12 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree { //boolean b = false; boolean hoveredElementFound = false; byte info = 0; - - + + TGComponent tmp = componentHovered; componentHovered = null; Iterator iterator = componentList.listIterator(); - + while(iterator.hasNext()) { tgc = (TGComponent)(iterator.next()); //state = tgc.getState(); @@ -716,11 +716,11 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree { tgc.setState(TGState.NORMAL); } } - + if (tmp != componentHovered) { info ++; } - + return info; } @@ -1420,6 +1420,7 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree { componentMenu.add(clone); componentMenu.add(bringFront); componentMenu.add(bringBack); + componentMenu.add(enableDisable); componentMenu.add(makeSquare); componentMenu.addSeparator(); componentMenu.add(attach); @@ -1489,6 +1490,9 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree { clone = new JMenuItem("Clone"); clone.addActionListener(menuAL); + enableDisable = new JMenuItem("Enable/Disable"); + enableDisable.addActionListener(menuAL); + bringFront = new JMenuItem("Bring to front"); bringFront.addActionListener(menuAL); @@ -1595,6 +1599,13 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree { repaint(); return; } + + if (e.getSource() == enableDisable) { + componentPopup.setEnabled(!componentPopup.isEnabled()); + getGUI().changeMade(this, CHANGE_VALUE_COMPONENT); + repaint(); + return; + } if (e.getSource() == edit) { if (componentPopup.doubleClick(mgui.getFrame(), 0, 0)) { @@ -1861,6 +1872,16 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree { clone.setEnabled(false); } + if (componentPointed instanceof CanBeDisabled) { + /*if (componentPointed.hasFather()) { + clone.setEnabled(false); + } else {*/ + enableDisable.setEnabled(true); + //} + } else { + enableDisable.setEnabled(false); + } + if (componentPointed instanceof SwallowedTGComponent) { if (componentPointed.getFather() == null) { attach.setEnabled(true); diff --git a/src/ui/TGComponent.java b/src/ui/TGComponent.java index dccd811496..8353bb4cf7 100755 --- a/src/ui/TGComponent.java +++ b/src/ui/TGComponent.java @@ -138,6 +138,7 @@ public abstract class TGComponent implements CDElement, GenericTree { protected TGComponent selectedInternalComponent; // characteristics + protected boolean enabled = true; protected boolean moveable; protected boolean removable; protected boolean multieditable = false; @@ -212,6 +213,15 @@ public abstract class TGComponent implements CDElement, GenericTree { public abstract TGComponent isOnMe(int _x, int _y); public abstract void setState(int s); + + public void setEnabled(boolean _enabled) { + enabled = _enabled; + } + + public boolean isEnabled() { + return enabled; + } + // Internal component operations public void setFather(TGComponent _father) { father = _father; @@ -2703,6 +2713,9 @@ public abstract class TGComponent implements CDElement, GenericTree { sb.append(translateCDParam()); sb.append(translateSizeParam()); sb.append(translateHidden()); + if (this instanceof CanBeDisabled) { + sb.append(translateEnabled()); + } sb.append(translateCDRectangleParam()); sb.append(translateNameValue()); sb.append(translateConnectingPoints()); @@ -2745,6 +2758,10 @@ public abstract class TGComponent implements CDElement, GenericTree { return new String(sb); } + protected String translateEnabled() { + return "<enabled value=\"" + enabled + "\" />\n"; + } + protected String translateHidden() { return "<hidden value=\"" + hidden + "\" />\n"; } diff --git a/src/ui/atd/ATDAttack.java b/src/ui/atd/ATDAttack.java index 7550155e68..ac3136c0b1 100755 --- a/src/ui/atd/ATDAttack.java +++ b/src/ui/atd/ATDAttack.java @@ -56,7 +56,7 @@ import myutil.*; import ui.*; import ui.window.*; -public class ATDAttack extends TGCScalableWithInternalComponent implements SwallowedTGComponent, WithAttributes, CheckableAccessibility { +public class ATDAttack extends TGCScalableWithInternalComponent implements SwallowedTGComponent, WithAttributes, CheckableAccessibility, CanBeDisabled { private int textY1 = 3; private int textY2 = 3; @@ -183,11 +183,16 @@ public class ATDAttack extends TGCScalableWithInternalComponent implements Swall // Core of the attack Color c = g.getColor(); g.draw3DRect(x, y, width, height, true); - if (isRootAttack) { - g.setColor(ColorManager.ATD_ROOT_ATTACK); + if (isEnabled()) { + if (isRootAttack) { + g.setColor(ColorManager.ATD_ROOT_ATTACK); + } else { + g.setColor(ColorManager.ATD_ATTACK); + } } else { - g.setColor(ColorManager.ATD_ATTACK); + g.setColor(ColorManager.ATD_ATTACK_DISABLED); } + g.fill3DRect(x+1, y+1, width-1, height-1, true); g.setColor(c); @@ -235,6 +240,17 @@ public class ATDAttack extends TGCScalableWithInternalComponent implements Swall //TraceManager.addDev("w=" + w + " val=" + (2*textX + width) + "h=" + h + " height=" + height + " zoom=" + tdp.getZoom() + " Font=" + f0); } } + + if (!isEnabled()) { + String val = "disabled"; + w = g.getFontMetrics().stringWidth(val); + int h = currentFontSize + (int)(textY1 * tdp.getZoom()); + g.setFont(f.deriveFont(Font.ITALIC)); + g.drawString(val, x + (width - w - 5), y + height - 2); + } + + + } else { //TraceManager.addDev("-------------------------------------------------- Cannot display text of attack"); } diff --git a/src/ui/window/JDialogAvatarProperty.java b/src/ui/window/JDialogAvatarProperty.java index 5a6ee2d9a3..1a2fafd5e6 100755 --- a/src/ui/window/JDialogAvatarProperty.java +++ b/src/ui/window/JDialogAvatarProperty.java @@ -1,48 +1,48 @@ /**Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille -ludovic.apvrille AT enst.fr - -This software is a computer program whose purpose is to allow the -edition of TURTLE analysis, design and deployment diagrams, to -allow the generation of RT-LOTOS or Java code from this diagram, -and at last to allow the analysis of formal validation traces -obtained from external tools, e.g. RTL from LAAS-CNRS and CADP -from INRIA Rhone-Alpes. - -This software is governed by the CeCILL license under French law and -abiding by the rules of distribution of free software. You can use, -modify and/ or redistribute the software under the terms of the CeCILL -license as circulated by CEA, CNRS and INRIA at the following URL -"http://www.cecill.info". - -As a counterpart to the access to the source code and rights to copy, -modify and redistribute granted by the license, users are provided only -with a limited warranty and the software's author, the holder of the -economic rights, and the successive licensors have only limited -liability. - -In this respect, the user's attention is drawn to the risks associated -with loading, using, modifying and/or developing or reproducing the -software by the user in light of its specific status of free software, -that may mean that it is complicated to manipulate, and that also -therefore means that it is reserved for developers and experienced -professionals having in-depth computer knowledge. Users are therefore -encouraged to load and test the software's suitability as regards their -requirements in conditions enabling the security of their systems and/or -data to be ensured and, more generally, to use and operate it in the -same conditions as regards security. - -The fact that you are presently reading this means that you have had -knowledge of the CeCILL license and that you accept its terms. - -/** - * Class JDialogAvatarProperty - * Dialog for managing property attributes - * Creation: 26/04/2010 - * @version 1.0 26/04/2010 - * @author Ludovic APVRILLE - * @see - */ + ludovic.apvrille AT enst.fr + + This software is a computer program whose purpose is to allow the + edition of TURTLE analysis, design and deployment diagrams, to + allow the generation of RT-LOTOS or Java code from this diagram, + and at last to allow the analysis of formal validation traces + obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + from INRIA Rhone-Alpes. + + This software is governed by the CeCILL license under French law and + abiding by the rules of distribution of free software. You can use, + modify and/ or redistribute the software under the terms of the CeCILL + license as circulated by CEA, CNRS and INRIA at the following URL + "http://www.cecill.info". + + As a counterpart to the access to the source code and rights to copy, + modify and redistribute granted by the license, users are provided only + with a limited warranty and the software's author, the holder of the + economic rights, and the successive licensors have only limited + liability. + + In this respect, the user's attention is drawn to the risks associated + with loading, using, modifying and/or developing or reproducing the + software by the user in light of its specific status of free software, + that may mean that it is complicated to manipulate, and that also + therefore means that it is reserved for developers and experienced + professionals having in-depth computer knowledge. Users are therefore + encouraged to load and test the software's suitability as regards their + requirements in conditions enabling the security of their systems and/or + data to be ensured and, more generally, to use and operate it in the + same conditions as regards security. + + The fact that you are presently reading this means that you have had + knowledge of the CeCILL license and that you accept its terms. + + /** + * Class JDialogAvatarProperty + * Dialog for managing property attributes + * Creation: 26/04/2010 + * @version 1.0 26/04/2010 + * @author Ludovic APVRILLE + * @see + */ package ui.window; @@ -54,57 +54,57 @@ import ui.*; public class JDialogAvatarProperty extends javax.swing.JDialog implements ActionListener { private JPanel panel1; - - private String name; - private int kind; - boolean notSelected; - private boolean hasBeenCancelled = false; - private JTextField myName; - private JRadioButton safety, notSafety, reachability, liveness, notReachability, notLiveness; - + + private String name; + private int kind; + boolean notSelected; + private boolean hasBeenCancelled = false; + private JTextField myName; + private JRadioButton safety, notSafety, reachability, liveness, notReachability, notLiveness; + // Main Panel private JButton closeButton; private JButton cancelButton; - + //private String id1, id2; - + /** Creates new form */ public JDialogAvatarProperty(Frame f, String _name, int _kind, boolean _notSelected) { - + super(f, "Setting property attributes", true); - - name = _name; + + name = _name; kind = _kind; - notSelected = _notSelected; + notSelected = _notSelected; initComponents(); myInitComponents(); pack(); } - - + + private void myInitComponents() { } - + private void initComponents() { Container c = getContentPane(); GridBagLayout gridbag0 = new GridBagLayout(); GridBagLayout gridbag1 = new GridBagLayout(); GridBagConstraints c0 = new GridBagConstraints(); GridBagConstraints c1 = new GridBagConstraints(); - + setFont(new Font("Helvetica", Font.PLAIN, 14)); c.setLayout(gridbag0); - + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - + panel1 = new JPanel(); panel1.setLayout(gridbag1); - + panel1.setBorder(new javax.swing.border.TitledBorder("Property")); - + //panel1.setPreferredSize(new Dimension(200, 150)); - + // first line panel1 c1.weighty = 1.0; c1.weightx = 1.0; @@ -112,60 +112,60 @@ public class JDialogAvatarProperty extends javax.swing.JDialog implements Action c1.fill = GridBagConstraints.BOTH; c1.gridheight = 1; panel1.add(new JLabel(" "), c1); - + // second line panel1 c1.gridwidth = GridBagConstraints.REMAINDER; //end row myName = new JTextField(name, 30); - myName.setEditable(true); + myName.setEditable(true); panel1.add(myName, c1); - - c1.gridwidth = GridBagConstraints.REMAINDER; //end row + + c1.gridwidth = GridBagConstraints.REMAINDER; //end row reachability = new JRadioButton("Reachable"); - reachability.setSelected((kind == 1) && !notSelected); + reachability.setSelected((kind == 1) && !notSelected); panel1.add(reachability, c1); - - c1.gridwidth = GridBagConstraints.REMAINDER; //end row + + c1.gridwidth = GridBagConstraints.REMAINDER; //end row notReachability = new JRadioButton("Not reachable"); - notReachability.setSelected((kind == 1) && notSelected); + notReachability.setSelected((kind == 1) && notSelected); panel1.add(notReachability, c1); - - c1.gridwidth = GridBagConstraints.REMAINDER; //end row + + c1.gridwidth = GridBagConstraints.REMAINDER; //end row liveness = new JRadioButton("Liveness"); - liveness.setSelected((kind == 0) && !notSelected); + liveness.setSelected((kind == 0) && !notSelected); panel1.add(liveness, c1); - - c1.gridwidth = GridBagConstraints.REMAINDER; //end row + + c1.gridwidth = GridBagConstraints.REMAINDER; //end row notLiveness = new JRadioButton("Not Liveness"); - notLiveness.setSelected((kind == 0) && notSelected); + notLiveness.setSelected((kind == 0) && notSelected); panel1.add(notLiveness, c1); - - c1.gridwidth = GridBagConstraints.REMAINDER; //end row + + c1.gridwidth = GridBagConstraints.REMAINDER; //end row safety = new JRadioButton("Safety"); - safety.setSelected((kind == 2) && !notSelected); + safety.setSelected((kind == 2) && !notSelected); panel1.add(safety, c1); - - c1.gridwidth = GridBagConstraints.REMAINDER; //end row + + c1.gridwidth = GridBagConstraints.REMAINDER; //end row notSafety = new JRadioButton("Not Safety"); - notSafety.setSelected((kind == 2) && notSelected); + notSafety.setSelected((kind == 2) && notSelected); panel1.add(notSafety, c1); - - ButtonGroup bg = new ButtonGroup(); - bg.add(reachability); - bg.add(liveness); - bg.add(notReachability); - bg.add(notLiveness); - bg.add(safety); - bg.add(notSafety); - + + ButtonGroup bg = new ButtonGroup(); + bg.add(reachability); + bg.add(liveness); + bg.add(notReachability); + bg.add(notLiveness); + bg.add(safety); + bg.add(notSafety); + // main panel; c0.gridwidth = 1; c0.gridheight = 10; c0.weighty = 1.0; c0.weightx = 1.0; c0.gridwidth = GridBagConstraints.REMAINDER; //end row - + c.add(panel1, c0); - + c0.gridwidth = 1; c0.gridheight = 1; c0.fill = GridBagConstraints.HORIZONTAL; @@ -178,10 +178,10 @@ public class JDialogAvatarProperty extends javax.swing.JDialog implements Action cancelButton.addActionListener(this); c.add(cancelButton, c0); } - - public void actionPerformed(ActionEvent evt) { + + public void actionPerformed(ActionEvent evt) { String command = evt.getActionCommand(); - + // Compare the action command to the known actions. if (command.equals("Save and Close")) { closeDialog(); @@ -189,46 +189,46 @@ public class JDialogAvatarProperty extends javax.swing.JDialog implements Action cancelDialog(); } } - - public boolean hasBeenCancelled() { - return hasBeenCancelled; - } - - + + public boolean hasBeenCancelled() { + return hasBeenCancelled; + } + + public void closeDialog() { dispose(); } - - public boolean isReachabilitySelected() { + + public boolean isReachabilitySelected() { return reachability.isSelected(); } - - public boolean isNotReachabilitySelected() { + + public boolean isNotReachabilitySelected() { return notReachability.isSelected(); } - + public boolean isLivenessSelected() { return liveness.isSelected(); } - - public boolean isNotLivenessSelected() { + + public boolean isNotLivenessSelected() { return notLiveness.isSelected(); } - - public boolean isSafetySelected() { + + public boolean isSafetySelected() { return safety.isSelected(); } - - public boolean isNotSafetySelected() { + + public boolean isNotSafetySelected() { return notSafety.isSelected(); } - - public String getName() { - return myName.getText(); - } - + + public String getName() { + return myName.getText(); + } + public void cancelDialog() { - hasBeenCancelled = true; + hasBeenCancelled = true; dispose(); } } -- GitLab