diff --git a/src/main/java/tmltranslator/mutations/AddAttributeMutation.java b/src/main/java/tmltranslator/mutations/AddAttributeMutation.java index d79310d5bcb8a7f8c6b7485ecf1efb4a95b38de5..e07894f0fda5ea72d64f205bc8d4e9e5bf88cb00 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 fcc5be46da0828cf05b5802c41a6cb706b55a09a..23222c8b644d15a2e1850c2d13557ff3f0dc1590 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 0000000000000000000000000000000000000000..a7b847c70057e1b4607d6a9a53a877a0db8ca43d --- /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 0ca4c5a2224373adef45b65024c1816f7e6b7604..7d70b80eeb98efec576b14e6ec0e858c9ce8fab9 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 6f1d854c6cbc535f7a49aa50e62a944fe8582017..df65004ed1a1f7422fcf73c4fdd6c44c2e5e6c74 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);