From 07feeeb472eec7fed5bfac44997e8d271511ea0c Mon Sep 17 00:00:00 2001 From: Bastien Sultan <bastien.sultan@telecom-paris.fr> Date: Mon, 23 Oct 2023 16:00:26 +0200 Subject: [PATCH] Adding new commands to JURASSIC compiler --- .../mutations/AddAttributeMutation.java | 3 +- .../mutations/AddTaskMutation.java | 2 +- .../mutations/CloneTaskMutation.java | 60 +++++++++++++++++++ .../mutations/DiplodocusMutationParser.java | 2 +- .../tmltranslator/mutations/TaskMutation.java | 2 + 5 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 src/main/java/tmltranslator/mutations/CloneTaskMutation.java diff --git a/src/main/java/tmltranslator/mutations/AddAttributeMutation.java b/src/main/java/tmltranslator/mutations/AddAttributeMutation.java index d79310d5bc..e07894f0fd 100644 --- a/src/main/java/tmltranslator/mutations/AddAttributeMutation.java +++ b/src/main/java/tmltranslator/mutations/AddAttributeMutation.java @@ -59,7 +59,8 @@ public class AddAttributeMutation extends AttributeMutation { String _attributeName = tokens[index + 2]; String[] types = {"INT","BOOL"}; if (!Arrays.asList(types).contains(_attributeType.toUpperCase())){ - throw new ParseDiplodocusMutationException("Missing type. Expected format is add attribute type name[=val] in taskName"); + throw new ParseDiplodocusMutationException("Missing or wrong type. Expected format is add attribute type name[=val] in taskName, and " + + "type is int or bool."); } index = DiplodocusMutationParser.indexOf(tokens, "IN"); diff --git a/src/main/java/tmltranslator/mutations/AddTaskMutation.java b/src/main/java/tmltranslator/mutations/AddTaskMutation.java index fcc5be46da..23222c8b64 100644 --- a/src/main/java/tmltranslator/mutations/AddTaskMutation.java +++ b/src/main/java/tmltranslator/mutations/AddTaskMutation.java @@ -33,7 +33,7 @@ public class AddTaskMutation extends TaskMutation { String[] tokens = DiplodocusMutationParser.tokenise(toParse); int index = DiplodocusMutationParser.indexOf(tokens, "TASK"); if (tokens.length == index + 1) { - throw new ParseDiplodocusMutationException("Block name missing. Expected syntax is [add task taskName]"); + throw new ParseDiplodocusMutationException("Task name missing. Expected format is add task taskName"); } String _taskName = tokens[index + 1]; AddTaskMutation mutation = new AddTaskMutation(_taskName); diff --git a/src/main/java/tmltranslator/mutations/CloneTaskMutation.java b/src/main/java/tmltranslator/mutations/CloneTaskMutation.java new file mode 100644 index 0000000000..a7b847c700 --- /dev/null +++ b/src/main/java/tmltranslator/mutations/CloneTaskMutation.java @@ -0,0 +1,60 @@ +package tmltranslator.mutations; + +import tmltranslator.TMLCheckingError; +import tmltranslator.TMLModeling; +import tmltranslator.TMLTask; + +public class CloneTaskMutation extends TaskMutation{ + + private String newTaskName; + protected CloneTaskMutation(String _taskName, String _newTaskName) { + super(_taskName); + setNewTaskName(_newTaskName); + } + + protected void setNewTaskName(String _newTaskName){ + newTaskName = _newTaskName; + } + + protected String getNewTaskName(){ + return newTaskName; + } + + @Override + public void apply(TMLModeling<?> _tmlModel) throws ApplyDiplodocusMutationException { + TMLTask task = getTask(_tmlModel); + TMLTask newTask = null; + + if (task == null){ + throw new ApplyDiplodocusMutationException("Task " + getTaskName() + " does not exist in the current model."); + } + try { + newTask = task.deepClone(_tmlModel); + } catch (TMLCheckingError e) { + throw new RuntimeException(e); + } + newTask.setName(_tmlModel.getTasks().get(0).getName().split("__")[0] + "__" + getNewTaskName()); + _tmlModel.addTask(newTask); + } + + public static CloneTaskMutation createFromString(String toParse) throws ParseDiplodocusMutationException{ + String[] tokens = DiplodocusMutationParser.tokenise(toParse); + + int index = DiplodocusMutationParser.indexOf(tokens, "TASK"); + if (tokens.length == index + 1) { + throw new ParseDiplodocusMutationException("Task name missing. Expected format is clone task taskName in newTaskName"); + } + String _taskName = tokens[index + 1]; + + index = DiplodocusMutationParser.indexOf(tokens,"IN"); + if (tokens.length == index + 1) { + throw new ParseDiplodocusMutationException("New task name missing. Expected format is clone task taskName in newTaskName"); + } + String _newTaskName = tokens[index + 1]; + + CloneTaskMutation mutation = new CloneTaskMutation(_taskName, _newTaskName); + mutation.setMutationType("TMLmutation"); + return mutation; + } + +} diff --git a/src/main/java/tmltranslator/mutations/DiplodocusMutationParser.java b/src/main/java/tmltranslator/mutations/DiplodocusMutationParser.java index 0ca4c5a222..7d70b80eeb 100644 --- a/src/main/java/tmltranslator/mutations/DiplodocusMutationParser.java +++ b/src/main/java/tmltranslator/mutations/DiplodocusMutationParser.java @@ -42,7 +42,7 @@ import java.util.UUID; public interface DiplodocusMutationParser { - public static final String[] MUTATION_TOKENS = {"ADD", "RM", "REMOVE", "MD", "MODIFY"}; + public static final String[] MUTATION_TOKENS = {"ADD", "RM", "REMOVE", "MD", "MODIFY", "CLONE"}; /*public static final String[] ELEMENT_TOKENS = {"ATTRIBUTE", "METHOD", "INPUT", "OUTPUT", "STATE", "ACTION", "RANDOM", "SET", "RESET", "EXPIRE" , "TRANSITION", "CONNECTION", "LINK", "SIGNAL", "BLOCK"};*/ public static final String[] ELEMENT_TOKENS = {"TASK", "CONNECTION", "PORT", "ATTRIBUTE"}; diff --git a/src/main/java/tmltranslator/mutations/TaskMutation.java b/src/main/java/tmltranslator/mutations/TaskMutation.java index 6f1d854c6c..df65004ed1 100644 --- a/src/main/java/tmltranslator/mutations/TaskMutation.java +++ b/src/main/java/tmltranslator/mutations/TaskMutation.java @@ -30,6 +30,8 @@ public abstract class TaskMutation extends DiplodocusMutation { switch (DiplodocusMutationParser.findMutationToken(toParse)){ case "ADD": return AddTaskMutation.createFromString(toParse); + case "CLONE": + return CloneTaskMutation.createFromString(toParse); case "RM": case "REMOVE": return RemoveTaskMutation.createFromString(toParse); -- GitLab