diff --git a/src/main/java/tmltranslator/TMLModeling.java b/src/main/java/tmltranslator/TMLModeling.java index e26aec40d9f0b87f175065b45e29171ac7ea4db2..6c09a2ff95778b0a9bdbf02c0cfa50f337d5ec96 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 a10aa5b3e2b47ecfb98ac33fced85d8dfa144cba..fd12f9db9a0b059a88e16013c3effe600191ab30 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 934329e6e05e4ffae16a6e211e4601ba784cb0cd..14c0f7ff5ce570d796d7e874bc38dd36d27d6c0b 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 ac0db6d7391bf9f57f839047891da7758679a502..868fe61b539e1c9ab5d449cb25ce08c3be0c346a 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 2be1041806a47537427ebd576394d941db97fed6..26d265aa549aa030a051c467564acec02cacf8fb 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 0be11393e1d6f7044b6ea0688d072fca1b8054a5..0e8645b54bc3786832df6fb1c9c97a8c7d01f0bb 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 bc60e9a61b1884838a717a457888ba45533befc9..c96128f5e98fc96156b963394ef3844f2e17c173 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 5ba5b992b9a8606c6c7f5a147722b567a34c8a15..87e96e507ce4ba1bcabac00678bbd72083e6dc78 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 43de148347ef7485457d2af1c7fb3b0b0ba41f9b..0459cf5831a3a60a781fef45482f38050331a907 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();