From 6e4894337f9b173f3a467c6ef50056de9c09c20c Mon Sep 17 00:00:00 2001
From: apvrille <ludovic.apvrille@eurecom.fr>
Date: Mon, 9 Mar 2020 17:55:30 +0100
Subject: [PATCH] Update on periodic task management

---
 src/main/java/tmltranslator/TMLModeling.java  | 76 +++++++++++++++++++
 src/main/java/tmltranslator/TMLTask.java      | 22 ++++++
 src/main/java/ui/TGCAttributeBox.java         |  2 +-
 src/main/java/ui/ebrdd/EBRDDAttributeBox.java |  3 +-
 src/main/java/ui/procsd/ProCSDComponent.java  |  2 +-
 src/main/java/ui/tmlcd/TMLAttributeBox.java   |  2 +-
 .../ui/tmlcompd/TMLCPrimitiveComponent.java   | 49 +++++++++++-
 .../java/ui/tmlcompd/TMLCRecordComponent.java |  3 +-
 src/main/java/ui/window/JDialogAttribute.java | 15 +++-
 9 files changed, 166 insertions(+), 8 deletions(-)

diff --git a/src/main/java/tmltranslator/TMLModeling.java b/src/main/java/tmltranslator/TMLModeling.java
index e26aec40d9..6c09a2ff95 100755
--- a/src/main/java/tmltranslator/TMLModeling.java
+++ b/src/main/java/tmltranslator/TMLModeling.java
@@ -2120,6 +2120,9 @@ public class  TMLModeling<E> {
         }
     }
 
+
+
+
     /**
      *  Concatenate Delay operations
      * @param activity : TML actvity {@link TMLActivity}
@@ -2156,6 +2159,79 @@ public class  TMLModeling<E> {
         }
     }
 
+    /**
+     *  Replaces periodic task by two tasks and an event
+     */
+    public Vector<TMLTask> removePeriodicTasks() {
+        Vector<TMLTask> addedTasks = new Vector<>();
+
+        
+        for(TMLTask t: tasks) {
+            if (t.isPeriodic()) {
+
+                // Create a new Task
+                TMLTask startingTask = new TMLTask("StarterOf" + t.getTaskName(), t.getReferenceObject(),
+                        t.getActivityDiagram().getReferenceObject());
+                addedTasks.add(startingTask);
+                // Create an event between the 2
+                TMLEvent evt = new TMLEvent("PERIODIC_EVT_" + t.getNameExtension(), t.getReferenceObject(),
+                        1, false);
+                events.add(evt);
+                evt.setOriginTask(startingTask);
+                evt.setDestinationTask(t);
+                t.addTMLEvent(evt);
+                startingTask.addTMLEvent(evt);
+
+                // Modify the activity diagram of t
+                TMLActivity activity = t.getActivityDiagram();
+                TMLForLoop mainLoop = new TMLForLoop("LoopForPeriod", activity.getFirst().getReferenceObject());
+                activity.addElement(mainLoop);
+                TMLActivityElement ae = activity.getFirst().getNextElement(0);
+                TMLWaitEvent tmlwe = new TMLWaitEvent("periodEvent", activity.getFirst().getReferenceObject());
+                tmlwe.setEvent(evt);
+                activity.addElement(tmlwe);
+                activity.getFirst().removeNext(0);
+                activity.getFirst().addNext(mainLoop);
+                mainLoop.addNext(tmlwe);
+                tmlwe.addNext(ae);
+
+
+                // Generate the activity diagram of startingTask
+                activity = startingTask.getActivityDiagram();
+                TMLStartState start = new TMLStartState("startState", startingTask.getReferenceObject());
+                activity.setFirst(start);
+
+                mainLoop = new TMLForLoop("LoopForPeriod", startingTask.getReferenceObject());
+                activity.addElement(mainLoop);
+                start.addNext(mainLoop);
+
+                TMLSendEvent tmlse = new TMLSendEvent("periodEvent", startingTask.getReferenceObject());
+                tmlse.setEvent(evt);
+                activity.addElement(tmlse);
+                mainLoop.addNext(tmlse);
+
+                TMLDelay delay = new TMLDelay("periodDelay", startingTask.getReferenceObject());
+                delay.setUnit(t.getPeriodUnit());
+                delay.setValue(t.getPeriodValue());
+                activity.addElement(delay);
+                tmlse.addNext(delay);
+
+                TMLStopState stopState = new TMLStopState("periodiStop", startingTask.getReferenceObject());
+                activity.addElement(stopState);
+                delay.addNext(stopState);
+
+
+                t.setPeriodic(false, "", "ns");
+
+            }
+        }
+
+
+        return addedTasks;
+    }
+
+
+
     public void removeAllRandomSequences() {
         for (TMLTask task: tasks) {
             task.removeAllRandomSequences();
diff --git a/src/main/java/tmltranslator/TMLTask.java b/src/main/java/tmltranslator/TMLTask.java
index a10aa5b3e2..fd12f9db9a 100755
--- a/src/main/java/tmltranslator/TMLTask.java
+++ b/src/main/java/tmltranslator/TMLTask.java
@@ -67,6 +67,11 @@ public class TMLTask extends TMLElement {
     private String operationMEC;
     private boolean isAttacker;
 
+
+    private boolean isPeriodic = false;
+    private String periodValue = "";
+    private String periodUnit = "ns";
+
     public TMLTask(String name, Object referenceToClass, Object referenceToActivityDiagram) {
         super(name, referenceToClass);
         //TraceManager.addDev("Creating new TMLTask:" + name);
@@ -88,6 +93,23 @@ public class TMLTask extends TMLElement {
 
     public boolean isDaemon() {return isDaemon;}
 
+    public void setPeriodic(boolean _b, String _periodValue, String _unit) {
+        isPeriodic = _b;
+        periodValue = periodValue;
+        periodUnit = _unit;
+    }
+
+    public String getPeriodUnit() {
+        return periodUnit;
+    }
+
+    public String getPeriodValue() {
+        return periodValue;
+    }
+
+
+    public boolean isPeriodic() {return isPeriodic;}
+
     public void setPriority(int _priority) {
         priority = _priority;
     }
diff --git a/src/main/java/ui/TGCAttributeBox.java b/src/main/java/ui/TGCAttributeBox.java
index 934329e6e0..14c0f7ff5c 100644
--- a/src/main/java/ui/TGCAttributeBox.java
+++ b/src/main/java/ui/TGCAttributeBox.java
@@ -199,7 +199,7 @@ public abstract class TGCAttributeBox extends TGCWithoutInternalComponent {
         String oldValue = value;
         JDialogAttribute jda = new JDialogAttribute(myAttributes, forbiddenNames, frame,
                 "Setting " + attributeText + "s of " + father.getValue(), attributeText,
-                null, false, null);
+                null, false, false, "", "",null);
         setJDialogOptions(jda);
     //    jda.setSize(650, 375);
         GraphicLib.centerOnParent(jda, 650, 375);
diff --git a/src/main/java/ui/ebrdd/EBRDDAttributeBox.java b/src/main/java/ui/ebrdd/EBRDDAttributeBox.java
index ac0db6d739..868fe61b53 100644
--- a/src/main/java/ui/ebrdd/EBRDDAttributeBox.java
+++ b/src/main/java/ui/ebrdd/EBRDDAttributeBox.java
@@ -213,7 +213,8 @@ public class EBRDDAttributeBox extends TGCWithoutInternalComponent  {
     public boolean editOndoubleClick(JFrame frame) {
         String oldValue = value;
         JDialogAttribute jda = new JDialogAttribute(myAttributes, forbiddenNames, frame,
-                "Setting variables", attributeText, null, false, null);
+                "Setting variables", attributeText, null, false,
+                false, "", "", null);
         setJDialogOptions(jda);
       //  jda.setSize(650, 375);
         GraphicLib.centerOnParent(jda, 650, 375);
diff --git a/src/main/java/ui/procsd/ProCSDComponent.java b/src/main/java/ui/procsd/ProCSDComponent.java
index 2be1041806..26d265aa54 100755
--- a/src/main/java/ui/procsd/ProCSDComponent.java
+++ b/src/main/java/ui/procsd/ProCSDComponent.java
@@ -518,7 +518,7 @@ public class ProCSDComponent extends TGCWithInternalComponent implements Swallow
 			JDialogAttribute dialog = new JDialogAttribute(myAttributes,
 					new LinkedList<TAttribute> (), tdp.getGUI().getFrame(),
 					"Setting attributes for this component", "Attribute",
-					null, false, null);
+					null, false, false, "", "", null);
 			dialog.addAccess("-");
 			dialog.addType("Natural");
 			// must see in GProactiveDesign for bool params
diff --git a/src/main/java/ui/tmlcd/TMLAttributeBox.java b/src/main/java/ui/tmlcd/TMLAttributeBox.java
index 0be11393e1..0e8645b54b 100755
--- a/src/main/java/ui/tmlcd/TMLAttributeBox.java
+++ b/src/main/java/ui/tmlcd/TMLAttributeBox.java
@@ -244,7 +244,7 @@ public class TMLAttributeBox extends TGCWithoutInternalComponent {
         String oldValue = value;
         JDialogAttribute jda = new JDialogAttribute(myAttributes, forbiddenNames, frame,
                 "Setting " + attributeText + "s of " + father.getValue(), attributeText,
-                null, false, null);
+                null, false, false, "", "", null);
         setJDialogOptions(jda);
   //      jda.setSize(650, 375);
         GraphicLib.centerOnParent(jda, 650, 375);
diff --git a/src/main/java/ui/tmlcompd/TMLCPrimitiveComponent.java b/src/main/java/ui/tmlcompd/TMLCPrimitiveComponent.java
index bc60e9a61b..c96128f5e9 100755
--- a/src/main/java/ui/tmlcompd/TMLCPrimitiveComponent.java
+++ b/src/main/java/ui/tmlcompd/TMLCPrimitiveComponent.java
@@ -75,6 +75,9 @@ public class TMLCPrimitiveComponent extends TGCScalableWithInternalComponent imp
 
     private boolean isAttacker = false;
     private boolean isDaemon = false;
+    private boolean isPeriodic = false;
+    private String periodValue = "";
+    private String unit = "ms";
     
     // Icon
     private int iconSize = 15;
@@ -445,7 +448,8 @@ public class TMLCPrimitiveComponent extends TGCScalableWithInternalComponent imp
 
 
 		JDialogAttribute jda = new JDialogAttribute(myAttributes, null, frame,
-                "Setting attributes of " + value, "Attribute", operation, isDaemon, getValue());
+                "Setting attributes of " + value, "Attribute", operation, isDaemon, isPeriodic, periodValue,
+                unit, getValue());
         setJDialogOptions(jda);
         // jda.setSize(650, 375);
         GraphicLib.centerOnParent(jda, 750, 375);
@@ -456,6 +460,22 @@ public class TMLCPrimitiveComponent extends TGCScalableWithInternalComponent imp
         //}
         operation = jda.getOperation();
         isDaemon = jda.isDaemon();
+        isPeriodic = jda.isPeriodic();
+        periodValue = jda.getPeriodValue();
+        unit = jda.getUnit();
+
+        if (!periodValue.matches("-?\\d+")) {
+            TraceManager.addDev("Invalid period: " + periodValue);
+            JOptionPane.showMessageDialog(frame,
+                    "Invalid period: " + periodValue,
+                    "Error",
+                    JOptionPane.INFORMATION_MESSAGE);
+            periodValue = "";
+            isPeriodic = false;
+        }
+
+
+        unit = jda.getUnit();
 
         TraceManager.addDev("PC1");
 
@@ -662,6 +682,12 @@ public class TMLCPrimitiveComponent extends TGCScalableWithInternalComponent imp
         sb.append(isAttacker() ? "Yes" : "No");
         sb.append("\" daemon=\"");
         sb.append(isDaemon);
+        sb.append("\" periodic=\"");
+        sb.append(isPeriodic);
+        sb.append("\" periodValue=\"");
+        sb.append(periodValue);
+        sb.append("\" unit=\"");
+        sb.append(unit);
         sb.append("\" Operation=\"");
         sb.append(operation);
         sb.append("\" />\n");
@@ -726,6 +752,27 @@ public class TMLCPrimitiveComponent extends TGCScalableWithInternalComponent imp
                                 }  else {
                                     isDaemon = tmpO.equals("true");
                                 }
+
+                                tmpO = elt.getAttribute("periodic");
+                                if (tmpO == null) {
+                                    isPeriodic = false;
+                                }  else {
+                                    isPeriodic = tmpO.equals("true");
+                                }
+
+                                tmpO = elt.getAttribute("periodValue");
+                                if (tmpO == null) {
+                                    periodValue = "";
+                                }  else {
+                                    periodValue = tmpO;
+                                }
+
+                                tmpO = elt.getAttribute("unit");
+                                if (tmpO == null) {
+                                    unit = "ms";
+                                }  else {
+                                    unit = tmpO;
+                                }
                             }
                             if (elt.getTagName().equals("Attribute")) {
                                 //TraceManager.addDev("Analyzing attribute");
diff --git a/src/main/java/ui/tmlcompd/TMLCRecordComponent.java b/src/main/java/ui/tmlcompd/TMLCRecordComponent.java
index 5ba5b992b9..87e96e507c 100755
--- a/src/main/java/ui/tmlcompd/TMLCRecordComponent.java
+++ b/src/main/java/ui/tmlcompd/TMLCRecordComponent.java
@@ -292,7 +292,8 @@ public class TMLCRecordComponent extends TGCScalableWithInternalComponent implem
 		
 		// And so -> attributes!
 		JDialogAttribute jda = new JDialogAttribute(myAttributes, null, frame,
-				"Setting fields of " + value, "Field", null, false, null);
+				"Setting fields of " + value, "Field", null, false,
+				false, "", "", null);
         setJDialogOptions(jda);
       //  jda.setSize(650, 375);
         GraphicLib.centerOnParent(jda, 650, 375);
diff --git a/src/main/java/ui/window/JDialogAttribute.java b/src/main/java/ui/window/JDialogAttribute.java
index 43de148347..0459cf5831 100644
--- a/src/main/java/ui/window/JDialogAttribute.java
+++ b/src/main/java/ui/window/JDialogAttribute.java
@@ -111,7 +111,8 @@ public class JDialogAttribute extends JDialogBase implements ActionListener, Lis
     
     /* Creates new form  */
     public JDialogAttribute(java.util.List<TAttribute> _attributes, java.util.List<TAttribute>_forbidden, Frame f,
-                            String title, String attrib, String _operation, boolean _isDaemon, String name) {
+                            String title, String attrib, String _operation, boolean _isDaemon,
+                            boolean _isPeriodic, String _periodValue, String _unit, String name) {
         super(f, title, true);
         frame = f;
         attributesPar = _attributes;
@@ -121,6 +122,10 @@ public class JDialogAttribute extends JDialogBase implements ActionListener, Lis
         this.operation = _operation;
         this.isDaemon = _isDaemon;
         this.name = name;
+
+        this.isPeriodic = _isPeriodic;
+        this.periodValue = _periodValue;
+        this.unit = _unit;
         
         attributes = new LinkedList<TAttribute> ();
         
@@ -340,7 +345,7 @@ public class JDialogAttribute extends JDialogBase implements ActionListener, Lis
             units.addItem("us");
             units.addItem("ms");
             units.addItem("s");
-            units.setSelectedItem(units);
+            units.setSelectedItem(unit);
             panelOperation.add(units, cOp);
             periodicBox.setSelected(isPeriodic);
             handlePeriodicElements();
@@ -611,6 +616,12 @@ public class JDialogAttribute extends JDialogBase implements ActionListener, Lis
         return periodicBox.isSelected();
     }
 
+    public String getPeriodValue() {return periodText.getText().trim();}
+
+    public String getUnit() {
+        return units.getItemAt(units.getSelectedIndex());
+    }
+
     public String getOperation() {
         if (operationField != null) {
             return operationField.getText().trim();
-- 
GitLab