From cbb2ba884a38973b76c3f84a5c50c66559faaf20 Mon Sep 17 00:00:00 2001
From: Ludovic Apvrille <ludovic.apvrille@telecom-paris.fr>
Date: Wed, 26 Jun 2024 16:08:24 +0200
Subject: [PATCH] improving representation of attack trees drawn from internal
 model

---
 src/main/java/cli/Action.java                 | 55 +++++++++++++++++++
 src/main/java/cli/Interpreter.java            |  2 +
 src/main/java/ui/atd/ATDCountermeasure.java   |  2 +-
 .../java/ui/atd/AttackTreeDiagramPanel.java   | 16 ++++++
 4 files changed, 74 insertions(+), 1 deletion(-)

diff --git a/src/main/java/cli/Action.java b/src/main/java/cli/Action.java
index 3ede8b7940..ce0adc24c9 100644
--- a/src/main/java/cli/Action.java
+++ b/src/main/java/cli/Action.java
@@ -39,6 +39,7 @@
 
 package cli;
 
+import attacktrees.AttackTree;
 import avatartranslator.*;
 import avatartranslator.directsimulation.AvatarSpecificationSimulation;
 import avatartranslator.modelchecker.AvatarModelChecker;
@@ -70,6 +71,7 @@ import tmltranslator.mutations.DiplodocusMutation;
 import tmltranslator.mutations.DiplodocusMutationParser;
 import tmltranslator.mutations.ParseDiplodocusMutationException;
 import ui.MainGUI;
+import ui.atd.AttackTreeDiagramPanel;
 import ui.avatarinteractivesimulation.AvatarInteractiveSimulationActions;
 import ui.avatarinteractivesimulation.JFrameAvatarInteractiveSimulation;
 import ui.graphd.GraphDPanel;
@@ -137,6 +139,8 @@ public class Action extends Command implements ProVerifOutputListener {
 
     private final static String SELECT_PANEL = "select-panel";
 
+    private final static String ATTACK_TREE_DUPLICATE = "attack-tree-duplicate";
+
     private final static String AVATAR_MUTATION = "avatar-mutation";
     private final static String AVATAR_MUTATION_BATCH = "avatar-mutation-batch";
     private final static String AVATAR_DRAW = "avatar-draw";
@@ -2472,6 +2476,55 @@ public class Action extends Command implements ProVerifOutputListener {
         };
 
 
+        Command attackTreeDuplication = new Command() {
+            public String getCommand() {
+                return ATTACK_TREE_DUPLICATE;
+            }
+
+            public String getShortCommand() {
+                return "atd";
+            }
+
+            public String getDescription() {
+                return "Duplicate a displayed attack tree via its internal representation";
+            }
+
+            public String getUsage() {
+                return ATTACK_TREE_DUPLICATE;
+            }
+
+            public String executeCommand(String command, Interpreter interpreter) {
+                if (!interpreter.isTToolStarted()) {
+                    return Interpreter.TTOOL_NOT_STARTED;
+                }
+
+                TDiagramPanel tdp = interpreter.mgui.getCurrentTDiagramPanel();
+
+                if (tdp == null) {
+                    return interpreter.TTOOL_NO_MODEL;
+                }
+
+                if (!(tdp instanceof AttackTreeDiagramPanel)) {
+                    return interpreter.TTOOL_BAD_DIAGRAM;
+                }
+
+                AttackTreePanelTranslator atpt = new AttackTreePanelTranslator((AttackTreeDiagramPanel) tdp);
+                AttackTree at = atpt.translateToAttackTreeDataStructure();
+                if (at == null) {
+                    return interpreter.GEN_FAILED;
+                }
+
+                TraceManager.addDev("Drawing attack tree:" + at.toString() + " / " + at.toTextFormat());
+
+                interpreter.mgui.drawAttackTreeDiagram(at);
+
+
+
+                return null;
+            }
+        };
+
+
 
 
 
@@ -2530,6 +2583,8 @@ public class Action extends Command implements ProVerifOutputListener {
         addAndSortSubcommand(graphtToAvatar);
         addAndSortSubcommand(AvatarDependencyGraphGeneration);
 
+        addAndSortSubcommand(attackTreeDuplication);
+
 
 
     }
diff --git a/src/main/java/cli/Interpreter.java b/src/main/java/cli/Interpreter.java
index d47aca788e..52e9afed35 100644
--- a/src/main/java/cli/Interpreter.java
+++ b/src/main/java/cli/Interpreter.java
@@ -72,6 +72,7 @@ public class Interpreter implements Runnable, TerminalProviderInterface {
     public final static String UNKNOWN_NEXT_COMMAND = "Invalid action: ";
     public final static String TTOOL_NOT_STARTED = "TTool is not yet started. Cannot execute command.";
     public final static String TTOOL_NO_MODEL = "TTool is started no model has been created. Execute new or load a model";
+    public final static String TTOOL_BAD_DIAGRAM = "The selected diagram is not the correct one";
     public final static String TTOOL_ALREADY_STARTED = "TTool is already started. Cannot execute command.";
     public final static String BAD_COMMAND_NAME = "The provided command is invalid";
     public final static String ROBOT_EXCEPTION = "Robot could not be started";
@@ -87,6 +88,7 @@ public class Interpreter implements Runnable, TerminalProviderInterface {
     public final static String BAD_TYPE = "Invalid type";
 
 
+
     private String script;
     private InterpreterOutputInterface printInterface;
     private boolean show;
diff --git a/src/main/java/ui/atd/ATDCountermeasure.java b/src/main/java/ui/atd/ATDCountermeasure.java
index 4b3b650c32..8b0684a7f7 100644
--- a/src/main/java/ui/atd/ATDCountermeasure.java
+++ b/src/main/java/ui/atd/ATDCountermeasure.java
@@ -204,7 +204,7 @@ public class ATDCountermeasure extends TGCScalableWithInternalComponent implemen
         g.setFont(fold);
 
     }
-    
+
 
     private Polygon getMyPolygon() {
         Polygon p = new Polygon();
diff --git a/src/main/java/ui/atd/AttackTreeDiagramPanel.java b/src/main/java/ui/atd/AttackTreeDiagramPanel.java
index 4ff293462c..29e3e3d016 100644
--- a/src/main/java/ui/atd/AttackTreeDiagramPanel.java
+++ b/src/main/java/ui/atd/AttackTreeDiagramPanel.java
@@ -222,9 +222,17 @@ public class AttackTreeDiagramPanel extends TDiagramPanel implements TDPWithAttr
                                                 ATDConstraint _const, int _valueConst, int _x, int _y, int _length) {
         ATDAttack attack = alreadyDrawnAttack(_att);
 
+        int newX, newY;
         if (attack == null) {
             // We draw the attack
+            newX = _x;
+            newY = _y;
+
             attack = new ATDAttack(_x, _y, getMinX(), getMaxX(), getMinY(), getMaxY(), true, null, this);
+            if ((_att.getReferenceObject() != null) && (_att.getReferenceObject() instanceof CDElement)) {
+                CDElement cd = (CDElement) _att.getReferenceObject();
+                attack.setUserResize(cd.getX(), cd.getY(), cd.getWidth(), cd.getHeight());
+            }
             attack.setValue(_att.getName());
             attack.setRootAttack(_att.isRoot());
             attack.setDescription(_att.getDescription());
@@ -275,6 +283,10 @@ public class AttackTreeDiagramPanel extends TDiagramPanel implements TDPWithAttr
             _y = _y + 70;
             ATDConstraint constraint = new ATDConstraint(_x, _y, getMinX(), getMaxX(), getMinY(), getMaxY(), true, null, this);
             //constraint.setValue(nextNode.getName());
+            if ((nextNode.getReferenceObject() != null) && (nextNode.getReferenceObject() instanceof CDElement)) {
+                CDElement cd = (CDElement) nextNode.getReferenceObject();
+                constraint.setUserResize(cd.getX(), cd.getY(), cd.getWidth(), cd.getHeight());
+            }
             constraint.setType(nextNode.getType());
             addBuiltComponent(constraint);
             _mapOfComponents.put(nextNode, constraint);
@@ -365,6 +377,10 @@ public class AttackTreeDiagramPanel extends TDiagramPanel implements TDPWithAttr
 
         for(Defense def : _at.getDefenses()) {
             ATDCountermeasure atdc = new ATDCountermeasure(xNoRel, yNoRel, getMinX(), getMaxX(), getMinY(), getMaxY(), true, null, this);
+            if ((def.getReferenceObject() != null) && (def.getReferenceObject() instanceof CDElement)) {
+                CDElement cd = (CDElement) def.getReferenceObject();
+                atdc.setUserResize(cd.getX(), cd.getY(), cd.getWidth(), cd.getHeight());
+            }
             atdc.setCountermeasureName(def.getName());
             atdc.setDescription(def.getDescription());
             atdc.setEnabled(true);
-- 
GitLab