diff --git a/build.txt b/build.txt index caae186eec26de808f64a9c9248b0d0552de3b7c..d53d32a34931852d1fa0fb8ac80b8ef01a2fa555 100644 --- a/build.txt +++ b/build.txt @@ -1 +1 @@ -14817 \ No newline at end of file +14820 \ No newline at end of file diff --git a/src/main/java/attacktrees/Defense.java b/src/main/java/attacktrees/Defense.java index 80524661dca7cc8218037697338a51f3a8838a0d..8b5cf87f4ebb1c7aab200f44173ee266d3f39ce2 100644 --- a/src/main/java/attacktrees/Defense.java +++ b/src/main/java/attacktrees/Defense.java @@ -85,6 +85,14 @@ public class Defense extends AttackElement { relatedAttacks.add(_attack); } + public boolean hasRelatedAttacks() { + if (relatedAttacks == null) { + return false; + } + + return relatedAttacks.size() > 0; + } + public ArrayList<Attack> getRelatedAttacks() { return relatedAttacks; } diff --git a/src/main/java/ui/AvatarPanelDrawer.java b/src/main/java/ui/AvatarPanelDrawer.java index 6922d436392e031e9fc066c0b2c232c4f2f4d809..0cc9e7ad51647420d0de1c0ba4a8dc3c6c78bc26 100644 --- a/src/main/java/ui/AvatarPanelDrawer.java +++ b/src/main/java/ui/AvatarPanelDrawer.java @@ -546,6 +546,8 @@ public class AvatarPanelDrawer { SMDCon.setTransitionInfo("", t.getAction(i, useOriginalValuesFirst).replaceAll(" ", "")); } + SMDCon.setTransitionProbability(t.getDelayDistributionLaw(), t.getDelayExtra1(), t.getDelayExtra2()); + smp.addComponent(SMDCon, p1.getX(), p1.getY(), false, true); if (t.getOtherReferenceObjects() != null) { diff --git a/src/main/java/ui/MainGUI.java b/src/main/java/ui/MainGUI.java index 867acb410d5d90250b2086c2d23b16bf14074ee1..b55c6ff3116a055020d7062542d73af46f3010d6 100644 --- a/src/main/java/ui/MainGUI.java +++ b/src/main/java/ui/MainGUI.java @@ -1903,7 +1903,7 @@ public class MainGUI implements ActionListener, WindowListener, KeyListener, Per atp.addAttackTreeDiagram(tabName); atp.atdp.drawable = false; atp.atdp.drawFromAttackTreeModel(_at); - atp.atdp.drawConnectionlessAttacks(_at); + //atp.atdp.drawConnectionlessAttacks(_at); atp.atdp.drawable = true; atp.atdp.repaint(); TraceManager.addDev("Draw AT 4"); diff --git a/src/main/java/ui/atd/AttackTreeDiagramPanel.java b/src/main/java/ui/atd/AttackTreeDiagramPanel.java index 323bf128b2c166a645279e09f069570a159db38f..c0eab5aa4e5d1a6dc83e1501c772fda177c2548e 100644 --- a/src/main/java/ui/atd/AttackTreeDiagramPanel.java +++ b/src/main/java/ui/atd/AttackTreeDiagramPanel.java @@ -43,10 +43,7 @@ package ui.atd; //import java.awt.*; -import attacktrees.Attack; -import attacktrees.AttackElement; -import attacktrees.AttackNode; -import attacktrees.AttackTree; +import attacktrees.*; import avatartranslator.AvatarElement; import avatartranslator.avatarucd.AvatarActor; import myutil.NameChecker; @@ -213,8 +210,11 @@ public class AttackTreeDiagramPanel extends TDiagramPanel implements TDPWithAttr HashMap<AttackElement, TGComponent> mapOfComponents = new HashMap<>(); + String ret = drawAttackFromAttackTreeModel(mapOfComponents, _at, root, null, -1, 600, 100, 1200); + drawConnectionlessAttacks(_at); + + return ret; - return drawAttackFromAttackTreeModel(mapOfComponents, _at, root, null, -1, 600, 100, 1200); } public void drawConnectionlessAttacks(AttackTree _at) { @@ -300,8 +300,7 @@ public class AttackTreeDiagramPanel extends TDiagramPanel implements TDPWithAttr TGConnectingPoint p2 = attack.closerFreeTGConnectingPoint(constraint.getX(), constraint.getY(), true, false); if (p1 != null && p2 != null) { - p1.setFree(false); - p2.setFree(false); + TGConnector conn = null; Vector<Point> points = new Vector<Point>(); @@ -312,6 +311,8 @@ public class AttackTreeDiagramPanel extends TDiagramPanel implements TDPWithAttr } if (conn != null) { + p1.setFree(false); + p2.setFree(false); addComponent(conn, 0, 0, false, true); } } @@ -334,6 +335,59 @@ public class AttackTreeDiagramPanel extends TDiagramPanel implements TDPWithAttr } } + // Handling countermeasures + int xNoRel = 100; + int yNoRel = 100; + int newX, newY; + for(Defense def : _at.getDefenses()) { + if (def.hasRelatedAttacks()) { + Attack firstAttack = def.getRelatedAttacks().get(0); + TGComponent refToAtt = _mapOfComponents.get(firstAttack); + if (refToAtt != null) { + newX = refToAtt.getX(); + newY = refToAtt.getY() + 100; + } else { + newX = xNoRel; + newY = yNoRel; + yNoRel += 100; + } + } else { + newX = xNoRel; + newY = yNoRel; + yNoRel += 100; + } + ATDCountermeasure atdc = new ATDCountermeasure(newX, newY, getMinX(), getMaxX(), getMinY(), getMaxY(), true, null, this); + atdc.setDescription(def.getDescription()); + atdc.setEnabled(def.isEnabled()); + addBuiltComponent(atdc); + + // Connections + for(Attack relatedAtt: def.getRelatedAttacks()) { + TGComponent refToAtt = _mapOfComponents.get(relatedAtt); + if (refToAtt != null) { + TGConnectingPoint p1 = atdc.closerFreeTGConnectingPoint(refToAtt.getX(), refToAtt.getY(), false, true); + TGConnectingPoint p2 = refToAtt.closerFreeTGConnectingPoint(atdc.getX(), atdc.getY(), true, false); + + if ((p1 != null) && (p2 != null)) { + + TGConnector conn = null; + Vector<Point> points = new Vector<Point>(); + conn = new ATDCountermeasureConnector(0, 0, 0, 0, 0, 0, true, null, + this, p1, p2, points); + if (_valueConst != -1) { + conn.setValue("" + _valueConst); + } + + if (conn != null) { + p1.setFree(false); + p2.setFree(false); + addComponent(conn, 0, 0, false, true); + } + } + } + } + } + return null; } diff --git a/src/main/java/ui/avatarsmd/AvatarSMDConnector.java b/src/main/java/ui/avatarsmd/AvatarSMDConnector.java index 63138b6869aa9f0e03f8ff7ac03a41414c625ade..2e19d3accd37425f11c0b5b69640bed716bdc532 100644 --- a/src/main/java/ui/avatarsmd/AvatarSMDConnector.java +++ b/src/main/java/ui/avatarsmd/AvatarSMDConnector.java @@ -124,6 +124,12 @@ public class AvatarSMDConnector extends TGConnectorWithCommentConnectionPoints i tgc.setTimes(minDelay, maxDelay, minCompute, maxCompute); } + public void setTransitionProbability(int _delayDistributionLaw, String _extraDelay1, String _extraDelay2) { + AvatarSMDTransitionInfo ti = getAvatarSMDTransitionInfo(); + ti.setTransitionProbability(""+_delayDistributionLaw, _extraDelay1, _extraDelay2); + + } + @Override protected void drawLastSegment(Graphics g, int x1, int y1, int x2, int y2) { if (Point2D.distance(x1, y1, x2, y2) < GraphicLib.longueur * 1.5) { diff --git a/src/main/java/ui/avatarsmd/AvatarSMDTransitionInfo.java b/src/main/java/ui/avatarsmd/AvatarSMDTransitionInfo.java index 4b665ee2d95a9d1d4e6da520629deb6ce0631107..a6e517f541c987fd5e5978e2776ed8727a5d4ca8 100755 --- a/src/main/java/ui/avatarsmd/AvatarSMDTransitionInfo.java +++ b/src/main/java/ui/avatarsmd/AvatarSMDTransitionInfo.java @@ -924,6 +924,11 @@ public class AvatarSMDTransitionInfo extends TGCWithoutInternalComponent impleme return extraDelay2.getText(); } + public void setTransitionProbability(String _delayDistributionLaw, String _extraDelay1, String _extraDelay2) { + delayDistributionLaw.setText(_delayDistributionLaw); + extraDelay1.setText(_extraDelay1); + extraDelay2.setText(_extraDelay2); + } /** * Issue #69 diff --git a/src/main/java/ui/util/DefaultText.java b/src/main/java/ui/util/DefaultText.java index 477fa8a36c50bff5d83d5006ce292df5b26ec8df..3fea22214118f71cafc699d4a854fc8254d5df19 100755 --- a/src/main/java/ui/util/DefaultText.java +++ b/src/main/java/ui/util/DefaultText.java @@ -50,8 +50,8 @@ package ui.util; */ public class DefaultText { - public static String BUILD = "14816"; - public static String DATE = "2024/06/21 03:22:03 CET"; + public static String BUILD = "14819"; + public static String DATE = "2024/06/24 03:22:02 CET"; public static StringBuffer sbAbout = makeAbout();