diff --git a/src/main/java/cli/Interpreter.java b/src/main/java/cli/Interpreter.java index 67ef8a9bcb2cc4c34fce872b869064d12b3e4ff5..ae29dea7ab7bae5bdd4da6de0bfa19bb0b456dba 100644 --- a/src/main/java/cli/Interpreter.java +++ b/src/main/java/cli/Interpreter.java @@ -59,7 +59,7 @@ import java.util.Vector; public class Interpreter implements Runnable, TerminalProviderInterface { public final static Command[] commands = {new Action(), new Chat(), new Help(), new HelpTTool(), new History(), new Print(), - new Plan(), new PluginAction(), new Quit(), + new Plan(), new PluginAction(), new PatternHandling(), new Quit(), new TestSpecific(), new TML(), new Set(), new Wait(), new Robot(), new BF(), new SimulatorScript()}; // Errors @@ -152,6 +152,26 @@ public class Interpreter implements Runnable, TerminalProviderInterface { System.out.flush(); } + public String interpretUntilError() { + Scanner scanner = new Scanner(script); + currentLine = 0; + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + currentLine++; + for (String subCommand: line.split(";")) { + executeLine(subCommand, currentLine, false); + if (error != "" && error != null) { + scanner.close(); + return error; + } + } + } + scanner.close(); + printInterface.print("All done. See you soon."); + printInterface.exit(0); + return null; + } + public void interpret() { Scanner scanner = new Scanner(script); currentLine = 0; diff --git a/src/main/java/cli/PatternHandling.java b/src/main/java/cli/PatternHandling.java new file mode 100644 index 0000000000000000000000000000000000000000..e9b582645e64997ed0c2e47b69a6430ed2e4bb21 --- /dev/null +++ b/src/main/java/cli/PatternHandling.java @@ -0,0 +1,1899 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package cli; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Vector; + +import myutil.FileUtils; +import tmltranslator.HwNode; +import tmltranslator.TMLChannel; +import tmltranslator.TMLEvent; +import tmltranslator.TMLMapping; +import tmltranslator.TMLMappingTextSpecification; +import tmltranslator.TMLRequest; +import tmltranslator.TMLSyntaxChecking; +import tmltranslator.TMLTask; +import tmltranslator.patternhandling.AttributeTaskJsonFile; +import tmltranslator.patternhandling.MappingPatternChannel; +import tmltranslator.patternhandling.MappingPatternTask; +import tmltranslator.patternhandling.PatternChannelWithSecurity; +import tmltranslator.patternhandling.PatternCloneTask; +import tmltranslator.patternhandling.PatternConfiguration; +import tmltranslator.patternhandling.PatternConnection; +import tmltranslator.patternhandling.PatternCreation; +import tmltranslator.patternhandling.PatternPortsConfig; +import tmltranslator.patternhandling.PortTaskJsonFile; +import tmltranslator.patternhandling.TaskPattern; +import tmltranslator.patternhandling.TaskPorts; +import ui.GTURTLEModeling; +import ui.TMLArchiPanel; +import ui.TURTLEPanel; + +/** + * Class PatternHandling + * Creation: 23/10/2023 + * Version 1.0 23/10/2023 + * + * @author Jawher JERRAY + */ + +public class PatternHandling extends Command { + private final static String SYNTAX_ERROR = "Syntax Error"; + private final static String NO_NAME_NO_TASK_FOR_PATTERN = "No name or no tasks is giving for the pattern"; + + private final static String PATTERN_NOT_EXIST = "Pattern does not exist"; + private final static String NO_PATTERN_SELECTED = "No pattern selected"; + public final static String PATTERN_NOT_CONNECTED = "Some pattern ports are not connected yet"; + private final static String PORT_CONFIGURATION_NOT_FINISHED = "Some ports configuration are missing"; + private final static String CLONE_TASK_EXIST = "Cloned task already exists"; + private final static String TASK_TO_CLONE_NOT_EXIST = "Task to clone does not exist"; + private final static String TASK_NOT_EXIST = "Task does not exist"; + private final static String PATTERN_TASK_NOT_EXIST = "Pattern task does not exist or all its external ports are already connected"; + private final static String PATTERN_PORT_NOT_EXIST = "Pattern port does not exist or it's already connected"; + private final static String MODEL_TASK_NOT_EXIST = "Model task does not exist"; + private final static String MODEL_PORT_NOT_EXIST = "Model port does not exist or its already used"; + private final static String MODEL_PORT_CONFIG_NOT_EXIST = "Model port does not exist or it's already configured"; + private final static String MODEL_PORT_MERGE_WITH_NOT_EXIST = "Model port to merge with does not exist or can't be used"; + private final static String PORTS_TYPES_NOT_MATCH = "The selected port in pattern side does not match with the selected port in the model side"; + private final static String ATTRIBUTE_NOT_EXIST = "Attribute does not exist"; + private final static String VALUE_BAD = "Unreadable value"; + private final static String TASK_TO_MAP_NOT_EXIST = "Task to map does not exist or it's already mapped"; + private final static String TASK_IN_SAME_HW_MAP_NOT_EXIST = "Selected task in same HW does not exist or can't be used"; + private final static String CHANNEL_TO_MAP_NOT_EXIST = "Channel to map does not exist or it's already mapped"; + private final static String CHANNEL_IN_SAME_MEM_MAP_NOT_EXIST = "Selected channel in same memory does not exist or can't be used"; + private final static String BUS_NOT_EXIST = "Bus does not exist"; + private final static String CONFIG_JSON_FILE_NOT_EXIST = "Config json file does not exist"; + private final static String CONFIG_JSON_FILE_MISSING = "Path of the configuration json is missing or no pattern is selected"; + // PatternHandling commands + private final static String CREATE = "create-pattern"; + private final static String CONFIGURE = "configure-pattern"; + private final static String INTEGRATE = "apply-pattern"; + private final static String DIPLO_LOAD_TMAP = "diplodocus-load-tmap"; + + private TMLMapping<?> tmap; + private String tabName = ""; + private String patternName, patternsPath = "../ttool/build/resources/main/patterns/"; + private HashSet<String> selectedTasks = new HashSet<String>(); + private HashSet<String> allTasksOfModel = new HashSet<String>(); + + private Vector<String> listPatterns = new Vector<String>(); + private String selectedPatternPath, selectedPatternName; + private PatternConfiguration patternConfiguration = new PatternConfiguration(); + LinkedHashMap<String, TaskPattern> patternTasksAll, patternTasksLeft; + LinkedHashMap<String, TaskPorts> portsTaskOfModelAll; + LinkedHashMap<String, TaskPorts> portsTaskModelLeft; + List<PatternPortsConfig> portsLeftToConfig; + List<MappingPatternTask> tasksLeftToMap; + List<MappingPatternChannel> channelsLeftToMap; + + private String selectedPatternToIntergrate, selectedPatternPathToIntergrate, selectedJsonFilePath; + + public PatternHandling() { + + } + + public List<Command> getListOfSubCommands() { + return subcommands; + } + + public String getCommand() { + return "pattern"; + } + + public String getShortCommand() { + return "pa"; + } + + public String getUsage() { + return "pattern <subcommand> <options>"; + } + + public String getDescription() { + return "Can be used to create, configure or integrate a pattern into a DIPLODOCUS model."; + } + + public void fillSubCommands() { + + // Create Pattern + Command createPattern = new Command() { + final String [] options = {"-n", "-p","-a", "-l", "-t", "-r", "-m"}; + public String getCommand() { + return CREATE; + } + + public String getShortCommand() { + return "c"; + } + + public String getDescription() { + return "Create a pattern from a model by giving a name to the new pattern and selecting its tasks"; + } + + public String getUsage() { + return "[OPTION]... [NAME] [PATH] [TASKS]\n" + + "-n NAME\tset a name for the pattern to create\n" + + "-p PATH\tset a path for the files that will be generated for the pattern\n" + + "-a TASKS\tselect tasks to add to the pattern (seperated by a space)\n" + + "-l \tget the list of selected tasks to be added to the pattern\n" + + "-t \tget all tasks of the model\n" + + "-r TASKS\tremove selected tasks\n" + + "-m \tmake the pattern\n"; + } + + public String executeCommand(String command, Interpreter interpreter) { + /*if (!interpreter.isTToolStarted()) { + return Interpreter.TTOOL_NOT_STARTED; + }*/ + + if (tmap == null) { + if (interpreter.mgui != null) { + TURTLEPanel tp = interpreter.mgui.getCurrentTURTLEPanel(); + if (!(tp instanceof TMLArchiPanel)) { + return "Current panel does not contain TMAP (NB: you can load a textual TMAP Spec using " + DIPLO_LOAD_TMAP +" or move to Arch panel.)"; + } + if(!interpreter.mgui.checkModelingSyntax(tp, true)) { + return SYNTAX_ERROR + "in current panel (NB: you can load a textual TMAP Spec using " + DIPLO_LOAD_TMAP +")"; + } + tmap = interpreter.mgui.gtm.getTMLMapping(); + nullifyAll(); + if (tmap == null) { + return Interpreter.TMAP_NO_SPEC + "\nLoad a textual TMAP Spec using " + DIPLO_LOAD_TMAP + " command or move to Arch panel."; + } else { + for (TMLTask task : tmap.getTMLModeling().getTasks()) { + String[] taskNameSplit = task.getName().split("__"); + allTasksOfModel.add(taskNameSplit[taskNameSplit.length-1]); + if (taskNameSplit.length > 1) { + tabName = taskNameSplit[0]; + } + task.setName(taskNameSplit[taskNameSplit.length-1]); + } + for (TMLChannel ch : tmap.getTMLModeling().getChannels()) { + String[] chNameSplit = ch.getName().split("__"); + ch.setName(chNameSplit[chNameSplit.length-1]); + } + for (TMLEvent evt : tmap.getTMLModeling().getEvents()) { + String[] evtNameSplit = evt.getName().split("__"); + evt.setName(evtNameSplit[evtNameSplit.length-1]); + } + for (TMLRequest req : tmap.getTMLModeling().getRequests()) { + String[] reqNameSplit = req.getName().split("__"); + req.setName(reqNameSplit[reqNameSplit.length-1]); + } + } + } else { + return Interpreter.TTOOL_NOT_STARTED; + } + } + + String[] commands = command.split(" "); + for (int i = 0; i < commands.length; i++) { + List<String> argumentsOfOption = new ArrayList<String>(); + + switch (commands[i]) { + case "-n": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 1) { + return Interpreter.BAD; + } + patternName = argumentsOfOption.get(0); + break; + case "-p": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 1) { + return Interpreter.BAD; + } + patternsPath = argumentsOfOption.get(0); + break; + case "-a": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() == 0) { + return Interpreter.BAD; + } + for (String argumentOfOption : argumentsOfOption) { + if (allTasksOfModel.contains(argumentOfOption)) { + selectedTasks.add(argumentOfOption); + } else { + interpreter.print("The task " + argumentOfOption + " does not exist, it will not be added."); + } + } + break; + case "-l": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + interpreter.print("The selected tasks are :"); + String printSelectedTasks = ""; + for (int ind = 0; ind < selectedTasks.size(); ind++) { + if (ind == 0) { + printSelectedTasks = (String) selectedTasks.toArray()[ind]; + } else { + printSelectedTasks = printSelectedTasks + "\t" + (String) selectedTasks.toArray()[ind]; + } + } + interpreter.print(printSelectedTasks); + break; + case "-t": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + + interpreter.print("This model contains " + allTasksOfModel.size() + " task(s) :"); + String printTasks = ""; + for (int ind = 0; ind < allTasksOfModel.size(); ind++) { + if (ind == 0) { + printTasks = (String) allTasksOfModel.toArray()[ind]; + } else { + printTasks = printTasks + "\t" + (String) allTasksOfModel.toArray()[ind]; + } + } + interpreter.print(printTasks); + break; + case "-r": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() == 0) { + return Interpreter.BAD; + } + for (String argumentOfOption : argumentsOfOption) { + if (allTasksOfModel.contains(argumentOfOption)) { + selectedTasks.remove(argumentOfOption); + } else { + interpreter.print("The task " + argumentOfOption + " does not exist, it will not be removed."); + } + } + break; + case "-m": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + if (patternName != null && !patternName.equals("") && selectedTasks.size() != 0) { + GTURTLEModeling.createPatternFromTmap(new ArrayList<String>(selectedTasks), patternName, patternsPath, tmap); + selectedTasks.clear(); + patternName = null; + } else { + return NO_NAME_NO_TASK_FOR_PATTERN; + } + + break; + default: + return Interpreter.BAD; + } + } + return null; + } + }; + + // Create Pattern + Command configurePattern = new Command() { + final String [] options = {"-n", "-p", "-pal", "-sp", "-ct", "-ctr", "-co", "-cor", "-col", "-plnc", "-pl", "-t", "-b", "-cptl", "-cpd", "-cpm", "-cpml", "-cpr", "-cpl", "-tctl", "-tcm", "-tcml", "-tcn", "-tcr", "-tcl", "-mctl", "-mcm", "-mcml", "-mcn", "-mcr", "-mcl", "-ua", "-m"}; + public String getCommand() { + return CONFIGURE; + } + + public String getShortCommand() { + return "sc"; + } + + public String getDescription() { + return "Select a pattern and Configure how it will be integrated into a given model"; + } + + public String getUsage() { + return "[OPTION]... [NAME] [TASK]\n" + + "-n NAME\tselect a pattern by its name\n" + + "-p PATH\tselect a pattern by the path of its folder\n" + + "-pal \tget the list of all the created patterns\n" + + "-sp \tget selected pattern\n" + + "-ct TASK1 TASK2\tclone TASK1 from TASK2\n" + + "-ctr TASK\t remove the clone task TASK\n" + + "-ctl TASK\t get the list of cloned tasks\n" + + "-co TASK1.PORT1 TASK2.PORT2 [NEW] [C] [WA] [SA]\tconnect PORT1 of TASK1 (pattern side) with PORT2 of TASK2 (model side). Other possible options:\n\t*Set NEW to specify that this is a new port that needs to be created.\n\t*Set C to ensure confidentiality for this channel\n\t*Set WA to ensure weak authenticity for this channel\n\t*Set SA to ensure strong authenticity for this channel\n" + + "-cor TASK.PORT\tremove connections that have TASK.PORT in the pattern side.\n" + + "-col \tget the list of connections already made\n" + + "-plnc \tget the list of pattern's ports that are not yet connected\n" + + "-pl TASK.PORT \tget list of available ports in model that could be used to connect with PORT (pattern side)\n" + + "-t \tget all tasks of the model\n" + + "-b \tget all buses of the model\n" + + "-cptl \tget list of ports to be configured\n" + + "-cpd [TASK.PORT] [ALL]\tchoose removing PORT as decision (or ALL to remove all the ports)\n" + + "-cpm TASK.PORT1 PORT2\tchoose merging PORT1 with PORT2 as decision\n" + + "-cpml TASK.PORT\tget list of ports that can be merge with TASK.PORT\n" + + "-cpr TASK.PORT\tremove the configuration decision for PORT\n" + + "-cpl \tget list of configured ports\n" + + "-tctl \tget list of tasks to be mapped \n" + + "-tcm TASK1 TASK2\tmap TASK1 in same CPU as TASK2\n" + + "-tcml\tmap get list of tasks that can be used to map in same CPU\n" + + "-tcn TASK BUS\tmap TASK in new CPU linked to bus BUS\n" + + "-tcr TASK\tremove the mapping of TASK\n" + + "-tcl \tget list of mapped tasks\n" + + "-mctl \tmap get list of channels to be mapped\n" + + "-mcm TASK1.CHANNEL1 TASK2.CHANNEL2\tmap CHANNEL1 in same memory and buses as CHANNEL2\n" + + "-mcml\tmap get list of channels that can be used to map in same Memory\n" + + "-mcn TASK.CHANNEL BUS\tmap CHANNEL in new memory linked to bus BUS\n" + + "-mcr TASK.CHANNEL\tremove the mapping of CHANNEL\n" + + "-mcl \tmap get list of mapped channels\n" + + "-ua TASK ATTRIBUTE VALUE \tput the value VALUE of attribute ATTRIBUTE of the task TASK\n" + + "-m [PATH]\tmake the json configuration file of the pattern, you can optionally specify the path of this new file\n"; + } + + public String executeCommand(String command, Interpreter interpreter) { + /*if (!interpreter.isTToolStarted()) { + return Interpreter.TTOOL_NOT_STARTED; + }*/ + + if (tmap == null) { + if (interpreter.mgui != null) { + TURTLEPanel tp = interpreter.mgui.getCurrentTURTLEPanel(); + if (!(tp instanceof TMLArchiPanel)) { + return "Current panel does not contain TMAP (NB: you can load a textual TMAP Spec using " + DIPLO_LOAD_TMAP +" or move to Arch panel.)"; + } + if(!interpreter.mgui.checkModelingSyntax(tp, true)) { + return SYNTAX_ERROR + "in current panel (NB: you can load a textual TMAP Spec using " + DIPLO_LOAD_TMAP +")"; + } + tmap = interpreter.mgui.gtm.getTMLMapping(); + nullifyAll(); + if (tmap == null) { + return Interpreter.TMAP_NO_SPEC + "\nLoad a textual TMAP Spec using " + DIPLO_LOAD_TMAP + " command or move to Arch panel."; + } else { + for (TMLTask task : tmap.getTMLModeling().getTasks()) { + String[] taskNameSplit = task.getName().split("__"); + allTasksOfModel.add(taskNameSplit[taskNameSplit.length-1]); + if (taskNameSplit.length > 1) { + tabName = taskNameSplit[0]; + } + task.setName(taskNameSplit[taskNameSplit.length-1]); + } + for (TMLChannel ch : tmap.getTMLModeling().getChannels()) { + String[] chNameSplit = ch.getName().split("__"); + ch.setName(chNameSplit[chNameSplit.length-1]); + } + for (TMLEvent evt : tmap.getTMLModeling().getEvents()) { + String[] evtNameSplit = evt.getName().split("__"); + evt.setName(evtNameSplit[evtNameSplit.length-1]); + } + for (TMLRequest req : tmap.getTMLModeling().getRequests()) { + String[] reqNameSplit = req.getName().split("__"); + req.setName(reqNameSplit[reqNameSplit.length-1]); + } + } + } else { + return Interpreter.TTOOL_NOT_STARTED; + } + } + + String[] commands = command.split(" "); + for (int i = 0; i < commands.length; i++) { + List<String> argumentsOfOption = new ArrayList<String>(); + + switch (commands[i]) { + case "-n": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 1) { + return Interpreter.BAD; + } + listPatterns = getFoldersName(patternsPath); + if (listPatterns.contains(argumentsOfOption.get(0))) { + selectedPatternName = argumentsOfOption.get(0); + selectedPatternPath = patternsPath + selectedPatternName; + patternTasksAll = TaskPattern.parsePatternJsonFile(selectedPatternPath, selectedPatternName+".json"); + portsTaskOfModelAll = TaskPorts.getListPortsTask(tmap.getTMLModeling()); + patternConfiguration = new PatternConfiguration(); + patternTasksLeft = null; + portsTaskModelLeft = null; + portsLeftToConfig = null; + tasksLeftToMap = null; + channelsLeftToMap = null; + } else { + //selectedPatternName = null; + return PATTERN_NOT_EXIST; + } + break; + case "-p": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 1) { + return Interpreter.BAD; + } + File folderPattern = new File(argumentsOfOption.get(0)); + if (folderPattern.isDirectory()) { + selectedPatternName = argumentsOfOption.get(0).split("/")[argumentsOfOption.get(0).split("/").length-1]; + selectedPatternName = selectedPatternName.split("\\.")[0]; + selectedPatternPath = argumentsOfOption.get(0); + if (!selectedPatternName.endsWith("/")) { + selectedPatternPath += "/"; + } + patternTasksAll = TaskPattern.parsePatternJsonFile(selectedPatternPath, selectedPatternName+".json"); + portsTaskOfModelAll = TaskPorts.getListPortsTask(tmap.getTMLModeling()); + patternConfiguration = new PatternConfiguration(); + patternTasksLeft = null; + portsTaskModelLeft = null; + portsLeftToConfig = null; + tasksLeftToMap = null; + channelsLeftToMap = null; + } else { + //selectedPatternName = null; + return PATTERN_NOT_EXIST; + } + break; + case "-pal": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + listPatterns = getFoldersName(patternsPath); + interpreter.print("There is " + listPatterns.size() + " pattern(s):"); + int cont = 1; + for (String pattern : listPatterns) { + interpreter.print(cont + ". " + pattern); + cont++; + } + break; + case "-sp": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + if (selectedPatternName != null) { + interpreter.print("The selected pattern is " + selectedPatternName); + } else { + //selectedPatternName = null; + return NO_PATTERN_SELECTED; + } + break; + case "-ct": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 2) { + return Interpreter.BAD; + } + if (selectedPatternName == null) { + return NO_PATTERN_SELECTED; + } + String clonedTask = argumentsOfOption.get(0); + String selectedTaskToClone = argumentsOfOption.get(1); + if (allTasksOfModel.contains(clonedTask)) { + return CLONE_TASK_EXIST; + } + + if (PatternCloneTask.isAClonedTask(patternConfiguration.getClonedTasks(), clonedTask) != null) { + return CLONE_TASK_EXIST; + } + + if (!allTasksOfModel.contains(selectedTaskToClone)) { + return TASK_TO_CLONE_NOT_EXIST; + } + + PatternCloneTask patterClone = new PatternCloneTask(clonedTask, selectedTaskToClone); + patternConfiguration.addClonedTasks(patterClone); + portsTaskOfModelAll.put(clonedTask, TaskPorts.cloneTaskPort(portsTaskOfModelAll.get(selectedTaskToClone))); + + break; + case "-ctr": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() == 0) { + return Interpreter.BAD; + } + if (selectedPatternName == null) { + return NO_PATTERN_SELECTED; + } + for (String argumentOfOption : argumentsOfOption) { + PatternCloneTask patternCloneToRemove = PatternCloneTask.isAClonedTask(patternConfiguration.getClonedTasks(), argumentOfOption); + + if (patternCloneToRemove != null) { + patternConfiguration.removeClonedTask(patternCloneToRemove); + //portsTaskOfModelLeft.remove(patternCloneToRemove.getClonedTask()); + portsTaskOfModelAll.remove(patternCloneToRemove.getClonedTask()); + List<PatternConnection> patternConnectionsToRemove = new ArrayList<PatternConnection>(); + for (PatternConnection patternConnection: patternConfiguration.getPortsConnection()) { + if (patternConnection.getModelTaskName().equals(patternCloneToRemove.getClonedTask())) { + patternConnectionsToRemove.add(patternConnection); + } + } + patternConfiguration.getPortsConnection().removeAll(patternConnectionsToRemove); + if (patternConnectionsToRemove != null) { + patternConfiguration.getTasksMapping().clear(); + patternConfiguration.getChannelsMapping().clear(); + patternConfiguration.getPortsConfig().clear(); + } + } else { + interpreter.print("The cloned task " + argumentOfOption + "does not exist, it will not be removed."); + } + } + break; + case "-ctl": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + if (selectedPatternName == null) { + return NO_PATTERN_SELECTED; + } + interpreter.print("The cloned tasks are:"); + for (PatternCloneTask cloneTask : patternConfiguration.getClonedTasks()) { + interpreter.print(cloneTask.getStringDisplay()); + } + break; + case "-co": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() < 2 || argumentsOfOption.size() > 5) { + return Interpreter.BAD; + } + if (selectedPatternName == null) { + return NO_PATTERN_SELECTED; + } + String patternTask = null, patternPort = null, modelTask = null, modelPort =null; + Boolean isNewPort = false; + Boolean isConf = false; + int auth = -1; + for (int ind = 0; ind < argumentsOfOption.size(); ind++) { + if (ind == 0) { + String[] taskPort = argumentsOfOption.get(ind).split("\\."); + if (taskPort.length == 2) { + patternTask = taskPort[0]; + patternPort = taskPort[1]; + } else { + return Interpreter.BAD; + } + } else if (ind == 1) { + String[] taskPort = argumentsOfOption.get(ind).split("\\."); + if (taskPort.length == 2) { + modelTask = taskPort[0]; + modelPort = taskPort[1]; + } else { + return Interpreter.BAD; + } + } else { + if (argumentsOfOption.get(ind).equals("NEW")) { + isNewPort = true; + } else if (argumentsOfOption.get(ind).equals("C")) { + isConf = true; + } else if (argumentsOfOption.get(ind).equals("WA")) { + auth = PatternChannelWithSecurity.WEAK_AUTHENTICITY; + } else if (argumentsOfOption.get(ind).equals("SA")) { + auth = PatternChannelWithSecurity.STRONG_AUTHENTICITY; + } else { + return Interpreter.BAD; + } + } + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection()); + PortTaskJsonFile portPattern; + if (patternTasksLeft.containsKey(patternTask)) { + portPattern = patternTasksLeft.get(patternTask).getExternalPortByName(patternPort); + } else { + return PATTERN_TASK_NOT_EXIST; + } + if (portPattern == null) { + return PATTERN_PORT_NOT_EXIST; + } + int portModelType; + if (portsTaskModelLeft.containsKey(modelTask)) { + portModelType = portsTaskModelLeft.get(modelTask).getPortTypeByName(modelPort); + } else { + return MODEL_TASK_NOT_EXIST; + } + if (portModelType == 0 && !isNewPort) { + return MODEL_PORT_NOT_EXIST; + } + boolean samePortType = false; + if (!isNewPort) { + if (portPattern.getType().equals(PatternCreation.CHANNEL) && portPattern.getMode().equals(PatternCreation.MODE_INPUT) && portModelType == TaskPorts.WRITE_CHANNEL) { + samePortType = true; + } else if (portPattern.getType().equals(PatternCreation.CHANNEL) && portPattern.getMode().equals(PatternCreation.MODE_OUTPUT) && portModelType == TaskPorts.READ_CHANNEL) { + samePortType = true; + } else if (portPattern.getType().equals(PatternCreation.EVENT) && portPattern.getMode().equals(PatternCreation.MODE_INPUT) && portModelType == TaskPorts.SEND_EVENT) { + samePortType = true; + } else if (portPattern.getType().equals(PatternCreation.EVENT) && portPattern.getMode().equals(PatternCreation.MODE_OUTPUT) && portModelType == TaskPorts.WAIT_EVENT) { + samePortType = true; + } else { + return PORTS_TYPES_NOT_MATCH; + } + } + + if (samePortType || isNewPort) { + if (isConf) { + portPattern.setConfidentiality(PatternCreation.WITH_CONFIDENTIALITY); + } + if (auth == PatternChannelWithSecurity.NO_AUTHENTICITY) { + portPattern.setAuthenticity(PatternCreation.WITHOUT_AUTHENTICITY); + } else if (auth == PatternChannelWithSecurity.WEAK_AUTHENTICITY) { + portPattern.setAuthenticity(PatternCreation.WEAK_AUTHENTICITY); + } else if (auth == PatternChannelWithSecurity.STRONG_AUTHENTICITY) { + portPattern.setAuthenticity(PatternCreation.STRONG_AUTHENTICITY); + } + PatternConnection patternConnection = new PatternConnection(patternTask, patternPort, modelTask, modelPort, isNewPort); + patternConfiguration.addPortsConnection(patternConnection); + } + break; + case "-plnc": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + if (selectedPatternName == null) { + return NO_PATTERN_SELECTED; + } + LinkedHashMap<String, TaskPattern> patternTasksLeftCur = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + interpreter.print("The pattern's port that are still not connected:"); + for (String taskName : patternTasksLeftCur.keySet()) { + for (PortTaskJsonFile portTask : patternTasksLeftCur.get(taskName).getExternalPorts()) { + interpreter.print(taskName + "." + portTask.getName()); + } + } + break; + case "-cor": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() == 0) { + return Interpreter.BAD; + } + if (selectedPatternName == null) { + return NO_PATTERN_SELECTED; + } + List<PatternConnection> patternConnectionsToRemove = new ArrayList<PatternConnection>(); + for (String argumentOfOption : argumentsOfOption) { + String patternTaskToRemove = null, patternPortToRemove = null; + String[] taskPortToRemove = argumentOfOption.split("\\."); + if (taskPortToRemove.length == 2) { + patternTaskToRemove = taskPortToRemove[0]; + patternPortToRemove = taskPortToRemove[1]; + } else { + return Interpreter.BAD; + } + boolean taskPortExist = false; + for (PatternConnection patternConnection : patternConfiguration.getPortsConnection()) { + if (patternConnection.getPatternTaskName().equals(patternTaskToRemove) && patternConnection.getPatternChannel().equals(patternPortToRemove)) { + patternConnectionsToRemove.add(patternConnection); + taskPortExist = true; + break; + } + } + if (!taskPortExist) { + interpreter.print(argumentOfOption + " does not exist, it will not be removed."); + } + } + patternConfiguration.getPortsConnection().removeAll(patternConnectionsToRemove); + if (patternConnectionsToRemove != null) { + patternConfiguration.getTasksMapping().clear(); + patternConfiguration.getChannelsMapping().clear(); + patternConfiguration.getPortsConfig().clear(); + } + break; + case "-col": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + if (selectedPatternName == null) { + return NO_PATTERN_SELECTED; + } + interpreter.print("The connections made are:"); + for (PatternConnection patternConnection : patternConfiguration.getPortsConnection()) { + interpreter.print(patternConnection.getStringDisplay()); + } + break; + case "-pl": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 1) { + return Interpreter.BAD; + } + if (selectedPatternName == null) { + return NO_PATTERN_SELECTED; + } + String patternTaskSelected = null, patternPortSelected = null; + String[] taskPort = argumentsOfOption.get(0).split("\\."); + if (taskPort.length == 2) { + patternTaskSelected = taskPort[0]; + patternPortSelected = taskPort[1]; + } else { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection()); + PortTaskJsonFile portPatternSelected; + if (patternTasksLeft.containsKey(patternTaskSelected)) { + portPatternSelected = patternTasksLeft.get(patternTaskSelected).getExternalPortByName(patternPortSelected); + } else { + return PATTERN_TASK_NOT_EXIST; + } + if (portPatternSelected == null) { + return PATTERN_PORT_NOT_EXIST; + } + interpreter.print("The available ports in model that could be used to connect with this port are :"); + for (String taskName : portsTaskModelLeft.keySet()) { + if (portPatternSelected.getType().equals(PatternCreation.CHANNEL) && portPatternSelected.getMode().equals(PatternCreation.MODE_INPUT)) { + for (String wr : portsTaskModelLeft.get(taskName).getWriteChannels()) { + interpreter.print(taskName + "." + wr); + } + } else if (portPatternSelected.getType().equals(PatternCreation.CHANNEL) && portPatternSelected.getMode().equals(PatternCreation.MODE_OUTPUT)) { + for (String wr : portsTaskModelLeft.get(taskName).getReadChannels()) { + interpreter.print(taskName + "." + wr); + } + } else if (portPatternSelected.getType().equals(PatternCreation.EVENT) && portPatternSelected.getMode().equals(PatternCreation.MODE_INPUT)) { + for (String wr : portsTaskModelLeft.get(taskName).getSendEvents()) { + interpreter.print(taskName + "." + wr); + } + } else if (portPatternSelected.getType().equals(PatternCreation.EVENT) && portPatternSelected.getMode().equals(PatternCreation.MODE_OUTPUT)) { + for (String wr : portsTaskModelLeft.get(taskName).getWaitEvents()) { + interpreter.print(taskName + "." + wr); + } + } + } + break; + case "-t": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + + interpreter.print("This model contains " + allTasksOfModel.size() + " task(s) :"); + String printTasks = ""; + for (int ind = 0; ind < allTasksOfModel.size(); ind++) { + if (ind == 0) { + printTasks = (String) allTasksOfModel.toArray()[ind]; + } else { + printTasks = printTasks + "\t" + (String) allTasksOfModel.toArray()[ind]; + } + } + interpreter.print(printTasks); + break; + case "-b": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + List<String> listBus = new ArrayList<String>(); + for (HwNode bus : tmap.getArch().getBUSs()) { + listBus.add(bus.getName()); + } + interpreter.print("This model contains " + listBus.size() + " bus(s) :"); + String printBuses = ""; + for (int ind = 0; ind < listBus.size(); ind++) { + if (ind == 0) { + printBuses = listBus.get(ind); + } else { + printBuses = printBuses + "\t" + listBus.get(ind); + } + } + interpreter.print(printBuses); + break; + case "-cptl": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + + portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection()); + portsLeftToConfig = PatternPortsConfig.getPortsLeftToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), patternConfiguration.getPortsConfig(), tmap.getTMLModeling()); + interpreter.print("The ports that need to be configured are :"); + for (PatternPortsConfig portToConfig : portsLeftToConfig) { + interpreter.print(portToConfig.getTaskOfChannelToConfig() + "." + portToConfig.getChannelToConfig()); + } + + break; + case "-cpd": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() == 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + for (String argumentOfOption : argumentsOfOption) { + if (argumentOfOption.equals("ALL")) { + portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection()); + portsLeftToConfig = PatternPortsConfig.getPortsLeftToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), patternConfiguration.getPortsConfig(), tmap.getTMLModeling()); + for (PatternPortsConfig portConfig : portsLeftToConfig) { + portConfig.setIsChannelToRemove(true); + patternConfiguration.getPortsConfig().add(portConfig); + } + } else { + String modelTaskToConfig = null, modelPortToConfig = null; + String[] taskPortToConfig = argumentOfOption.split("\\."); + if (taskPortToConfig.length == 2) { + modelTaskToConfig = taskPortToConfig[0]; + modelPortToConfig = taskPortToConfig[1]; + portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection()); + portsLeftToConfig = PatternPortsConfig.getPortsLeftToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), patternConfiguration.getPortsConfig(), tmap.getTMLModeling()); + boolean isConfigured = false; + for (PatternPortsConfig portConfig : portsLeftToConfig) { + if (portConfig.getTaskOfChannelToConfig().equals(modelTaskToConfig) && portConfig.getChannelToConfig().equals(modelPortToConfig)) { + portConfig.setIsChannelToRemove(true); + patternConfiguration.getPortsConfig().add(portConfig); + isConfigured = true; + break; + } + } + if (!isConfigured) { + return MODEL_PORT_CONFIG_NOT_EXIST; + } + } else { + return Interpreter.BAD; + } + } + } + break; + case "-cpm": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 2) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + PatternPortsConfig portToConfig = null; + String modelTaskToConfig = null, modelPortToConfig = null; + for (int ind = 0; ind < argumentsOfOption.size(); ind++) { + if (ind == 0) { + String[] taskPortToConfig = argumentsOfOption.get(ind).split("\\."); + if (taskPortToConfig.length == 2) { + modelTaskToConfig = taskPortToConfig[0]; + modelPortToConfig = taskPortToConfig[1]; + portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection()); + portsLeftToConfig = PatternPortsConfig.getPortsLeftToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), patternConfiguration.getPortsConfig(), tmap.getTMLModeling()); + boolean isConfigured = false; + for (PatternPortsConfig portConfig : portsLeftToConfig) { + if (portConfig.getTaskOfChannelToConfig().equals(modelTaskToConfig) && portConfig.getChannelToConfig().equals(modelPortToConfig)) { + portToConfig = portConfig; + isConfigured = true; + break; + } + } + if (!isConfigured) { + return MODEL_PORT_CONFIG_NOT_EXIST; + } + } else { + return Interpreter.BAD; + } + } else if (ind == 1) { + if (portToConfig != null) { + List<PatternPortsConfig> portsToConfig = PatternPortsConfig.getPortsToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), tmap.getTMLModeling()); + List<String> portsCanBeMergedWith = PatternPortsConfig.getPortsCanBeMergedWith(portsTaskOfModelAll, portsToConfig, modelTaskToConfig); + if (portsCanBeMergedWith.contains(argumentsOfOption.get(ind))) { + portToConfig.setMergeWith(argumentsOfOption.get(ind)); + patternConfiguration.getPortsConfig().add(portToConfig); + } else { + return MODEL_PORT_MERGE_WITH_NOT_EXIST; + } + } + } + } + break; + case "-cpml": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 1) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + String[] taskPortToConfig = argumentsOfOption.get(0).split("\\."); + if (taskPortToConfig.length == 2) { + if (!portsTaskOfModelAll.containsKey(taskPortToConfig[0])) { + return TASK_NOT_EXIST; + } + portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection()); + List<PatternPortsConfig> portsToConfig = PatternPortsConfig.getPortsToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), tmap.getTMLModeling()); + List<String> portsCanBeMergedWith = PatternPortsConfig.getPortsCanBeMergedWith(portsTaskOfModelAll, portsToConfig, taskPortToConfig[0]); + interpreter.print("List of ports that can be merge with " + taskPortToConfig[0] +"." + taskPortToConfig[1] +":"); + for (String portCanBeMergedWith : portsCanBeMergedWith) { + interpreter.print(portCanBeMergedWith); + } + } else { + return Interpreter.BAD; + } + break; + case "-cpr": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() == 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + List<PatternPortsConfig> patternPortsConfigToRemove = new ArrayList<PatternPortsConfig>(); + for (int ind = 0; ind < argumentsOfOption.size(); ind++) { + String[] taskPortToRemove = argumentsOfOption.get(ind).split("\\."); + if (taskPortToRemove.length == 2) { + boolean isPortConfigToRemoveExist = false; + for (PatternPortsConfig patternPortsConfig : patternConfiguration.getPortsConfig()) { + if (patternPortsConfig.getTaskOfChannelToConfig().equals(taskPortToRemove[0]) && patternPortsConfig.getChannelToConfig().equals(taskPortToRemove[1])) { + patternPortsConfigToRemove.add(patternPortsConfig); + isPortConfigToRemoveExist = true; + break; + } + } + if (!isPortConfigToRemoveExist) { + interpreter.print(argumentsOfOption.get(ind) + " does not exist, it will not be removed."); + } + } else { + interpreter.print(argumentsOfOption.get(ind) + ": " + Interpreter.BAD); + } + } + patternConfiguration.getPortsConfig().removeAll(patternPortsConfigToRemove); + break; + case "-cpl": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + interpreter.print("List of configured ports:"); + for (PatternPortsConfig patternPortsConfig : patternConfiguration.getPortsConfig()) { + interpreter.print(patternPortsConfig.getStringDisplay()); + } + break; + case "-tctl": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + tasksLeftToMap = MappingPatternTask.getTasksLeftToMap(patternConfiguration.getTasksMapping(), MappingPatternTask.getTasksToMap(patternTasksAll, patternConfiguration.getClonedTasksName())); + interpreter.print("The tasks that need to be mapped are :"); + for (MappingPatternTask taskMap : tasksLeftToMap) { + interpreter.print(taskMap.getTaskToMapName()); + } + break; + case "-tcm": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 2) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + List<MappingPatternTask> allTasksToMap = MappingPatternTask.getTasksToMap(patternTasksAll, patternConfiguration.getClonedTasksName()); + tasksLeftToMap = MappingPatternTask.getTasksLeftToMap(patternConfiguration.getTasksMapping(), allTasksToMap); + boolean taskToMapExist = false; + MappingPatternTask taskToMap = null; + for (MappingPatternTask taskMap : tasksLeftToMap) { + if (taskMap.getTaskToMapName().equals(argumentsOfOption.get(0))) { + taskToMap = taskMap; + taskToMapExist = true; + break; + } + } + if (!taskToMapExist) { + return TASK_TO_MAP_NOT_EXIST; + } + boolean taskSameHwExist = false; + int originSameTask = 0; + if (allTasksOfModel.contains(argumentsOfOption.get(1))) { + taskSameHwExist = true; + originSameTask = MappingPatternTask.ORIGIN_MODEL; + } + if (!taskSameHwExist) { + for (MappingPatternTask taskMap : patternConfiguration.getTasksMapping()) { + if (taskMap.getTaskToMapName().equals(argumentsOfOption.get(1))) { + taskSameHwExist = true; + originSameTask = taskMap.getOrigin(); + break; + } + } + } + if (!taskSameHwExist) { + return TASK_IN_SAME_HW_MAP_NOT_EXIST; + } + if (taskSameHwExist && taskToMapExist) { + taskToMap.setSameHwAs(argumentsOfOption.get(1), originSameTask); + patternConfiguration.getTasksMapping().add(taskToMap); + } + break; + case "-tcml": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + interpreter.print("The list of tasks that can be used to map in same CPU:"); + for (String taskMap : allTasksOfModel) { + interpreter.print(taskMap); + } + for (MappingPatternTask taskMap : patternConfiguration.getTasksMapping()) { + interpreter.print(taskMap.getTaskToMapName()); + } + break; + case "-tcn": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 2) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + tasksLeftToMap = MappingPatternTask.getTasksLeftToMap(patternConfiguration.getTasksMapping(), MappingPatternTask.getTasksToMap(patternTasksAll, patternConfiguration.getClonedTasksName())); + boolean taskToMapInNewCPUExist = false; + MappingPatternTask taskToMapInNewCPU = null; + for (MappingPatternTask taskMap : tasksLeftToMap) { + if (taskMap.getTaskToMapName().equals(argumentsOfOption.get(0))) { + taskToMapInNewCPU = taskMap; + taskToMapInNewCPUExist = true; + break; + } + } + if (!taskToMapInNewCPUExist) { + return TASK_TO_MAP_NOT_EXIST; + } + boolean busNewCPUExist = false; + for (HwNode bus : tmap.getArch().getBUSs()) { + if (bus.getName().equals(argumentsOfOption.get(1))) { + busNewCPUExist = true; + break; + } + } + if (!busNewCPUExist) { + return BUS_NOT_EXIST; + } + if (taskToMapInNewCPUExist && busNewCPUExist) { + taskToMapInNewCPU.setBusNameForNewHw(argumentsOfOption.get(1)); + patternConfiguration.getTasksMapping().add(taskToMapInNewCPU); + } + break; + case "-tcr": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() == 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + List<MappingPatternTask> mappingTasksToRemove = new ArrayList<MappingPatternTask>(); + boolean isMappingTaskToRemoveExist = false; + for (int ind = 0; ind < argumentsOfOption.size(); ind++) { + for (MappingPatternTask mappingTask : patternConfiguration.getTasksMapping()) { + if (mappingTask.getTaskToMapName().equals(argumentsOfOption.get(ind))) { + mappingTasksToRemove.add(mappingTask); + isMappingTaskToRemoveExist = true; + break; + } + } + if (!isMappingTaskToRemoveExist) { + interpreter.print(argumentsOfOption.get(ind) + " does not exist, it will not be removed."); + } + } + patternConfiguration.getTasksMapping().removeAll(mappingTasksToRemove); + break; + case "-tcl": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + interpreter.print("list of mapped tasks:"); + for (MappingPatternTask mappingTask : patternConfiguration.getTasksMapping()) { + interpreter.print(mappingTask.getStringDisplay()); + } + break; + case "-mctl": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + channelsLeftToMap = MappingPatternChannel.getChannelsLeftToMap(patternConfiguration.getChannelsMapping(), MappingPatternChannel.getChannelsToMap(patternConfiguration.getPortsConnection(), patternTasksAll,patternConfiguration.getClonedTasks())); + interpreter.print("The channels that need to be mapped are :"); + for (MappingPatternChannel channelMap : channelsLeftToMap) { + interpreter.print(channelMap.getTaskOfChannelToMap() + "." + channelMap.getChannelToMapName()); + } + break; + case "-mcm": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 2) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + String[] channelTaskToMap = argumentsOfOption.get(0).split("\\."); + if (channelTaskToMap.length != 2) { + return argumentsOfOption.get(0) + ": " + Interpreter.BAD; + } + String[] channelTaskSameMem = argumentsOfOption.get(1).split("\\."); + if (channelTaskSameMem.length != 2) { + return argumentsOfOption.get(1) + ": " + Interpreter.BAD; + } + List<MappingPatternChannel> allChannelsToMap = MappingPatternChannel.getChannelsToMap(patternConfiguration.getPortsConnection(), patternTasksAll,patternConfiguration.getClonedTasks()); + channelsLeftToMap = MappingPatternChannel.getChannelsLeftToMap(patternConfiguration.getChannelsMapping(), allChannelsToMap); + boolean channelToMapExist = false; + MappingPatternChannel channelToMap = null; + for (MappingPatternChannel channelMap : channelsLeftToMap) { + if (channelMap.getTaskOfChannelToMap().equals(channelTaskToMap[0]) && channelMap.getChannelToMapName().equals(channelTaskToMap[1])) { + channelToMap = channelMap; + channelToMapExist = true; + break; + } + } + if (!channelToMapExist) { + return CHANNEL_TO_MAP_NOT_EXIST; + } + boolean channelSameHwExist = false; + int originSameChannel = 0; + for(String st : portsTaskOfModelAll.keySet()) { + if (!patternConfiguration.getClonedTasksName().contains(st)) { + for (String wc : portsTaskOfModelAll.get(st).getWriteChannels()) { + if (st.equals(channelTaskSameMem[0]) && wc.equals(channelTaskSameMem[1])) { + originSameChannel = MappingPatternTask.ORIGIN_MODEL; + channelSameHwExist = true; + } + } + } + } + if (!channelSameHwExist) { + for (MappingPatternChannel channelMap : patternConfiguration.getChannelsMapping()) { + if (channelMap.getTaskOfChannelToMap().equals(channelTaskSameMem[0]) && channelMap.getChannelToMapName().equals(channelTaskSameMem[1])) { + channelSameHwExist = true; + originSameChannel = channelMap.getOrigin(); + break; + } + } + } + if (!channelSameHwExist) { + return CHANNEL_IN_SAME_MEM_MAP_NOT_EXIST; + } + if (channelSameHwExist && channelToMapExist) { + channelToMap.setTaskAndChannelInSameMem(channelTaskSameMem[0], channelTaskSameMem[1], originSameChannel); + patternConfiguration.getChannelsMapping().add(channelToMap); + } + break; + case "-mcml": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + interpreter.print("The list of channels that can be used to map in same memory:"); + for(String st : portsTaskOfModelAll.keySet()) { + if (!patternConfiguration.getClonedTasksName().contains(st)) { + for (String wc : portsTaskOfModelAll.get(st).getWriteChannels()) { + interpreter.print(st + "." + wc); + } + } + } + for (MappingPatternChannel channelMap : patternConfiguration.getChannelsMapping()) { + interpreter.print(channelMap.getTaskOfChannelToMap() + "." + channelMap.getChannelToMapName()); + } + break; + case "-mcn": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 2) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + String[] channelTaskToMapNew = argumentsOfOption.get(0).split("\\."); + if (channelTaskToMapNew.length != 2) { + return argumentsOfOption.get(0) + ": " + Interpreter.BAD; + } + channelsLeftToMap = MappingPatternChannel.getChannelsLeftToMap(patternConfiguration.getChannelsMapping(), MappingPatternChannel.getChannelsToMap(patternConfiguration.getPortsConnection(), patternTasksAll,patternConfiguration.getClonedTasks())); + boolean channelToMapInNewMemExist = false; + MappingPatternChannel channelToMapInNewMem = null; + for (MappingPatternChannel channelMap : channelsLeftToMap) { + if (channelMap.getTaskOfChannelToMap().equals(channelTaskToMapNew[0]) && channelMap.getChannelToMapName().equals(channelTaskToMapNew[1])) { + channelToMapInNewMem = channelMap; + channelToMapInNewMemExist = true; + break; + } + } + if (!channelToMapInNewMemExist) { + return CHANNEL_TO_MAP_NOT_EXIST; + } + boolean busNewMemExist = false; + for (HwNode bus : tmap.getArch().getBUSs()) { + if (bus.getName().equals(argumentsOfOption.get(1))) { + busNewMemExist = true; + break; + } + } + if (!busNewMemExist) { + return BUS_NOT_EXIST; + } + if (channelToMapInNewMemExist && busNewMemExist) { + channelToMapInNewMem.setBusNameForNewMem(argumentsOfOption.get(1)); + patternConfiguration.getChannelsMapping().add(channelToMapInNewMem); + } + break; + case "-mcr": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() == 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + List<MappingPatternChannel> mappingChannelsToRemove = new ArrayList<MappingPatternChannel>(); + boolean isMappingChannelToRemoveExist = false; + for (int ind = 0; ind < argumentsOfOption.size(); ind++) { + String[] channelTaskToRem = argumentsOfOption.get(ind).split("\\."); + if (channelTaskToRem.length != 2) { + interpreter.print(argumentsOfOption.get(ind) + ": " + Interpreter.BAD); + break; + } + for (MappingPatternChannel mappingChannel : patternConfiguration.getChannelsMapping()) { + if (mappingChannel.getTaskOfChannelToMap().equals(channelTaskToRem[0]) && mappingChannel.getChannelToMapName().equals(channelTaskToRem[1])) { + mappingChannelsToRemove.add(mappingChannel); + isMappingChannelToRemoveExist = true; + break; + } + } + if (!isMappingChannelToRemoveExist) { + interpreter.print(argumentsOfOption.get(ind) + " does not exist, it will not be removed."); + } + } + patternConfiguration.getChannelsMapping().removeAll(mappingChannelsToRemove); + break; + case "-mcl": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + interpreter.print("list of mapped channels:"); + for (MappingPatternChannel mappedChannel : patternConfiguration.getChannelsMapping()) { + interpreter.print(mappedChannel.getStringDisplay()); + } + break; + case "-ua": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 3) { + return Interpreter.BAD; + } + String task = argumentsOfOption.get(0); + String attribute = argumentsOfOption.get(1); + String value = argumentsOfOption.get(2); + + boolean isTaskExist = false; + boolean isAttributeExist = false; + boolean isUpdated = false; + AttributeTaskJsonFile attributeTask = null; + for (String taskPattern : patternTasksAll.keySet()) { + if (taskPattern.equals(task)) { + isTaskExist = true; + for (AttributeTaskJsonFile attributeTaskJsonFile : patternTasksAll.get(taskPattern).getAttributes()) { + if (attributeTaskJsonFile.getName().equals(attribute)) { + isAttributeExist = true; + if (value.matches("-?\\d+") || value.matches("(?i)^(true|false)")) { + attributeTaskJsonFile.setValue(value); + attributeTask = attributeTaskJsonFile; + isUpdated = true; + break; + } + } + } + } + } + if (!isTaskExist) { + return TASK_NOT_EXIST; + } + if (!isAttributeExist) { + return ATTRIBUTE_NOT_EXIST; + } + if (!isUpdated) { + return VALUE_BAD; + } + if (patternConfiguration.getUpdatedPatternAttributes().get(task) != null) { + patternConfiguration.getUpdatedPatternAttributes().get(task).add(attributeTask); + } else { + List<AttributeTaskJsonFile> attributesTask = new ArrayList<AttributeTaskJsonFile>(); + attributesTask.add(attributeTask); + patternConfiguration.getUpdatedPatternAttributes().put(task, attributesTask); + } + break; + case "-m": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() > 1) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() > 1) { + return PATTERN_NOT_CONNECTED; + } + portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection()); + portsLeftToConfig = PatternPortsConfig.getPortsLeftToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), patternConfiguration.getPortsConfig(), tmap.getTMLModeling()); + if (portsLeftToConfig.size() != 0) { + return PORT_CONFIGURATION_NOT_FINISHED; + } + if (argumentsOfOption.size() == 0) { + if (selectedPatternName != null && !selectedPatternName.equals("")) { + patternConfiguration.loadChannelsWithSecurity(patternTasksAll); + GTURTLEModeling.createJsonPatternConfigFile(selectedPatternPath, selectedPatternName, patternConfiguration); + } else { + return NO_NAME_NO_TASK_FOR_PATTERN; + } + } else if (argumentsOfOption.size() == 1) { + patternConfiguration.loadChannelsWithSecurity(patternTasksAll); + GTURTLEModeling.createJsonPatternConfigFile(argumentsOfOption.get(0), patternConfiguration); + } + break; + default: + return Interpreter.BAD; + } + } + return null; + } + }; + + + // Diplodocus load TMAP + Command diplodocusLoadTMAP = new Command() { + public String getCommand() { + return DIPLO_LOAD_TMAP; + } + + public String getShortCommand() { + return "dltmap"; + } + + public String getDescription() { + return "Load a TMAP specification"; + } + + public String getUsage() { + return "[PATH]\n" + + "[PATH]\tLoad a Textual TMAP specification\n" + + "\tLoad a TMAP specification from the current panel\n"; + } + + public String executeCommand(String command, Interpreter interpreter) { + /*if (!interpreter.isTToolStarted()) { + return Interpreter.TTOOL_NOT_STARTED; + }*/ + + String[] commands = command.split(" "); + if (commands.length > 1) { + return Interpreter.BAD; + } + if (commands.length == 1 && commands[0] != "") { + String tmlFileName = commands[0].split("/")[commands[0].split("/").length-1]; + String tmlFilePath = commands[0].substring(0, commands[0].lastIndexOf("/")+1); + TMLMappingTextSpecification<Class<?>> ts = new TMLMappingTextSpecification<Class<?>>(tmlFileName); + File f = new File(commands[0]); + String spec = null; + try { + spec = FileUtils.loadFileData(f); + } catch (Exception e) { + System.out.println("Exception loading " + tmlFileName); + } + boolean parsed = ts.makeTMLMapping(spec, tmlFilePath); + tmap = ts.getTMLMapping(); + // Checking syntax + TMLSyntaxChecking syntax = new TMLSyntaxChecking(tmap); + syntax.checkSyntax(); + nullifyAll(); + } else { + if (interpreter.mgui != null) { + TURTLEPanel tp = interpreter.mgui.getCurrentTURTLEPanel(); + if (!(tp instanceof TMLArchiPanel)) { + return "Current diagram is invalid for formal verification"; + } + if(!interpreter.mgui.checkModelingSyntax(tp, true)) { + return SYNTAX_ERROR; + } + + tmap = interpreter.mgui.gtm.getTMLMapping(); + nullifyAll(); + if (tmap == null) { + return "Fail to load TMAP specification"; + } + } else { + return Interpreter.TTOOL_NOT_STARTED; + } + } + + for (TMLTask task : tmap.getTMLModeling().getTasks()) { + String[] taskNameSplit = task.getName().split("__"); + allTasksOfModel.add(taskNameSplit[taskNameSplit.length-1]); + if (taskNameSplit.length > 1) { + tabName = taskNameSplit[0]; + } + task.setName(taskNameSplit[taskNameSplit.length-1]); + } + for (TMLChannel ch : tmap.getTMLModeling().getChannels()) { + String[] chNameSplit = ch.getName().split("__"); + ch.setName(chNameSplit[chNameSplit.length-1]); + } + for (TMLEvent evt : tmap.getTMLModeling().getEvents()) { + String[] evtNameSplit = evt.getName().split("__"); + evt.setName(evtNameSplit[evtNameSplit.length-1]); + } + for (TMLRequest req : tmap.getTMLModeling().getRequests()) { + String[] reqNameSplit = req.getName().split("__"); + req.setName(reqNameSplit[reqNameSplit.length-1]); + } + + return null; + } + }; + + Command integratePattern = new Command() { + final String [] options = {"-l", "-n", "-p", "-pc", "-g", "-d"}; + public String getCommand() { + return INTEGRATE; + } + + public String getShortCommand() { + return "a"; + } + + public String getDescription() { + return "Inegrate a pattern to a model by giving a name to the pattern and the path of the configuration file"; + } + + public String getUsage() { + return "[OPTION]... [NAME] [PATH]\n" + + "-l NAME\tlist of available patterns\n" + + "-n NAME\tselect a pattern by its name\n" + + "-p PATH\tselect a pattern by the path of its folder\n" + + "-pc PATH\tpath of the configuration json file\n" + + "-g [PATH] [NAME]\tgenerate TMAP file of the model after intergrating the pattern, you can optionally specify the path of this new tmap file and its name\n" + + "-d \tdraw the new model after integrating the pattern\n"; + } + + @SuppressWarnings("unchecked") + public String executeCommand(String command, Interpreter interpreter) { + /*if (!interpreter.isTToolStarted()) { + return Interpreter.TTOOL_NOT_STARTED; + }*/ + + if (tmap == null) { + if (interpreter.mgui != null) { + TURTLEPanel tp = interpreter.mgui.getCurrentTURTLEPanel(); + if (!(tp instanceof TMLArchiPanel)) { + return "Current panel does not contain TMAP (NB: you can load a textual TMAP Spec using " + DIPLO_LOAD_TMAP +" or move to Arch panel.)"; + } + if(!interpreter.mgui.checkModelingSyntax(tp, true)) { + return SYNTAX_ERROR + "in current panel (NB: you can load a textual TMAP Spec using " + DIPLO_LOAD_TMAP +")"; + } + tmap = interpreter.mgui.gtm.getTMLMapping(); + nullifyAll(); + if (tmap == null) { + return Interpreter.TMAP_NO_SPEC + "\nLoad a textual TMAP Spec using " + DIPLO_LOAD_TMAP + " command or move to Arch panel."; + } else { + for (TMLTask task : tmap.getTMLModeling().getTasks()) { + String[] taskNameSplit = task.getName().split("__"); + allTasksOfModel.add(taskNameSplit[taskNameSplit.length-1]); + if (taskNameSplit.length > 1) { + tabName = taskNameSplit[0]; + } + task.setName(taskNameSplit[taskNameSplit.length-1]); + } + for (TMLChannel ch : tmap.getTMLModeling().getChannels()) { + String[] chNameSplit = ch.getName().split("__"); + ch.setName(chNameSplit[chNameSplit.length-1]); + } + for (TMLEvent evt : tmap.getTMLModeling().getEvents()) { + String[] evtNameSplit = evt.getName().split("__"); + evt.setName(evtNameSplit[evtNameSplit.length-1]); + } + for (TMLRequest req : tmap.getTMLModeling().getRequests()) { + String[] reqNameSplit = req.getName().split("__"); + req.setName(reqNameSplit[reqNameSplit.length-1]); + } + } + } else { + return Interpreter.TTOOL_NOT_STARTED; + } + } + String[] commands = command.split(" "); + for (int i = 0; i < commands.length; i++) { + List<String> argumentsOfOption = new ArrayList<String>(); + switch (commands[i]) { + case "-l": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + listPatterns = getFoldersName(patternsPath); + interpreter.print("There is " + listPatterns.size() + " pattern(s):"); + int cont = 1; + for (String pattern : listPatterns) { + interpreter.print(cont + ". " + pattern); + cont++; + } + break; + case "-n": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 1) { + return Interpreter.BAD; + } + listPatterns = getFoldersName(patternsPath); + if (listPatterns.contains(argumentsOfOption.get(0))) { + selectedPatternToIntergrate = argumentsOfOption.get(0); + selectedPatternPathToIntergrate = patternsPath + selectedPatternToIntergrate + "/"; + } else { + return PATTERN_NOT_EXIST; + } + break; + case "-p": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 1) { + return Interpreter.BAD; + } + File folderPattern = new File(argumentsOfOption.get(0)); + if (folderPattern.isDirectory()) { + selectedPatternToIntergrate = argumentsOfOption.get(0).split("/")[argumentsOfOption.get(0).split("/").length-1]; + selectedPatternPathToIntergrate = argumentsOfOption.get(0); + if (!selectedPatternPathToIntergrate.endsWith("/")) { + selectedPatternPathToIntergrate += "/"; + } + } else { + return PATTERN_NOT_EXIST; + } + + break; + case "-pc": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 1) { + return Interpreter.BAD; + } + Path path = Paths.get(argumentsOfOption.get(0)); + if (Files.exists(path)) { + selectedJsonFilePath = argumentsOfOption.get(0); + } else { + return CONFIG_JSON_FILE_NOT_EXIST; + } + break; + case "-g": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0 && argumentsOfOption.size() != 2) { + return Interpreter.BAD; + } + if (selectedJsonFilePath != null && selectedPatternToIntergrate != null) { + TMLMapping<?> tmapGen = GTURTLEModeling.integratePatternTMAP(tabName, selectedPatternPathToIntergrate, selectedPatternToIntergrate, selectedJsonFilePath, tmap); + if (tabName != "") { + for (TMLTask task : tmap.getTMLModeling().getTasks()) { + String[] taskNameSplit = task.getName().split("__"); + if (taskNameSplit.length == 1) { + task.setName(tabName + "__" + task.getName()); + } + } + for (TMLChannel ch : tmap.getTMLModeling().getChannels()) { + String[] channelNameSplit = ch.getName().split("__"); + if (channelNameSplit.length == 1) { + ch.setName(tabName + "__" + ch.getName()); + } + } + for (TMLEvent evt : tmap.getTMLModeling().getEvents()) { + String[] eventNameSplit = evt.getName().split("__"); + if (eventNameSplit.length == 1) { + evt.setName(tabName + "__" + evt.getName()); + } + } + for (TMLRequest req : tmap.getTMLModeling().getRequests()) { + String[] requestNameSplit = req.getName().split("__"); + if (requestNameSplit.length == 1) { + req.setName(tabName + "__" + req.getName()); + } + } + } + TMLMappingTextSpecification<Class<?>> spec = new TMLMappingTextSpecification<Class<?>>(selectedPatternToIntergrate); + spec.toTextFormat((TMLMapping<Class<?>>) tmapGen); + if (argumentsOfOption.size() == 0) { + String folderGenTmap = selectedJsonFilePath.substring(0, selectedJsonFilePath.lastIndexOf("/")); + if (!folderGenTmap.endsWith("/")) { + folderGenTmap += "/"; + } + try { + Files.createDirectories(Paths.get(folderGenTmap)); + spec.saveFile(folderGenTmap, "spec"); + } catch (Exception e) { + return "Files could not be saved: " + e.getMessage(); + } + } else if (argumentsOfOption.size() == 2) { + String folderGenTmap = argumentsOfOption.get(0); + String nameGenTmap = argumentsOfOption.get(1); + if (!folderGenTmap.endsWith("/")) { + folderGenTmap += "/"; + } + try { + Files.createDirectories(Paths.get(folderGenTmap)); + spec.saveFile(folderGenTmap, nameGenTmap); + } catch (Exception e) { + return "Files could not be saved: " + e.getMessage(); + } + } + } else { + return CONFIG_JSON_FILE_MISSING; + } + break; + case "-d": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + if (interpreter.mgui != null) { + if (selectedJsonFilePath != null && selectedPatternToIntergrate != null) { + interpreter.mgui.gtm.integratePattern(interpreter.mgui, selectedPatternPathToIntergrate, selectedPatternToIntergrate, selectedJsonFilePath); + } else { + return CONFIG_JSON_FILE_MISSING; + } + } else { + return Interpreter.TTOOL_NOT_STARTED; + } + break; + default: + return Interpreter.BAD; + } + } + return null; + } + }; + addAndSortSubcommand(createPattern); + addAndSortSubcommand(configurePattern); + addAndSortSubcommand(integratePattern); + addAndSortSubcommand(diplodocusLoadTMAP); + } + + Vector<String> getFoldersName(String path) { + Vector<String> folders = new Vector<String>(); + File directoryPath = new File(path); + String[] directories = directoryPath.list((dir, name) -> new File(dir, name).isDirectory()); + if (directories != null) { + folders = new Vector<String>(Arrays.asList(directories)); + } + return folders; + } + + private void nullifyAll() { + selectedTasks.clear(); + patternName = null; + allTasksOfModel.clear(); + listPatterns.clear(); + selectedPatternPath = null; + selectedPatternName = null; + patternConfiguration = new PatternConfiguration(); + patternTasksAll = null; + patternTasksLeft = null; + portsTaskOfModelAll = null; + portsTaskModelLeft = null; + portsLeftToConfig = null; + tasksLeftToMap = null; + channelsLeftToMap = null; + selectedPatternToIntergrate = null; + selectedJsonFilePath = null; + } +} diff --git a/src/main/java/tmltranslator/SecurityPattern.java b/src/main/java/tmltranslator/SecurityPattern.java index 455effc131e5ece6ece78e08f310aa450a5ec761..fa09f6f09c23c5e42c4d394c57b3fec910d60aac 100644 --- a/src/main/java/tmltranslator/SecurityPattern.java +++ b/src/main/java/tmltranslator/SecurityPattern.java @@ -123,6 +123,7 @@ public class SecurityPattern { this.size = secPattern.size; this.decTime = secPattern.decTime; this.encTime = secPattern.encTime; + this.originTask = secPattern.originTask; } public String toXML() { diff --git a/src/main/java/tmltranslator/TMLActivityElementChannel.java b/src/main/java/tmltranslator/TMLActivityElementChannel.java index b7aa2f39b817d53dbf2f84b6b0f7745988712acc..bc0f37b20fa65445d68d0f97e8ce5c14c230cbe1 100755 --- a/src/main/java/tmltranslator/TMLActivityElementChannel.java +++ b/src/main/java/tmltranslator/TMLActivityElementChannel.java @@ -56,7 +56,7 @@ public abstract class TMLActivityElementChannel extends TMLActivityElement { protected ArrayList<TMLChannel> channels; protected String nbOfSamples; private boolean isAttacker; - protected boolean isEncForm; //If the Cryptographic + // protected boolean isEncForm; //If the Cryptographic public TMLActivityElementChannel(String _name, Object _referenceObject) { super(_name, _referenceObject); @@ -96,13 +96,13 @@ public abstract class TMLActivityElementChannel extends TMLActivityElement { return nbOfSamples; } - public boolean getEncForm() { + /* public boolean getEncForm() { return isEncForm; } public void setEncForm(boolean form) { isEncForm = form; - } + } */ public void replaceChannelWith(TMLChannel oldChan, TMLChannel newChan) { if (channels.contains(oldChan)) { @@ -130,8 +130,8 @@ public abstract class TMLActivityElementChannel extends TMLActivityElement { if (!super.equalSpec(o)) return false; TMLActivityElementChannel tmlActEltChannel = (TMLActivityElementChannel) o; return Objects.equals(nbOfSamples, ((TMLActivityElementChannel) o).getNbOfSamples()) && - isAttacker == tmlActEltChannel.isAttacker() && - isEncForm == tmlActEltChannel.getEncForm(); + isAttacker == tmlActEltChannel.isAttacker()/* && + isEncForm == tmlActEltChannel.getEncForm() */; } @@ -139,7 +139,7 @@ public abstract class TMLActivityElementChannel extends TMLActivityElement { super.fillValues(newElt, tmlm); newElt.setNbOfSamples(getNbOfSamples()); newElt.setAttacker(isAttacker); - newElt.setEncForm(getEncForm()); + // newElt.setEncForm(getEncForm()); for(TMLChannel channel: channels) { TMLChannel ch = tmlm.getChannelByName(channel.getName()); diff --git a/src/main/java/tmltranslator/TMLChannel.java b/src/main/java/tmltranslator/TMLChannel.java index ee65c51c20fb5f32bf20693e6f64ba081feadc70..8966cacd008d338429e699d9900e2bbfa23a8499 100755 --- a/src/main/java/tmltranslator/TMLChannel.java +++ b/src/main/java/tmltranslator/TMLChannel.java @@ -80,6 +80,11 @@ public class TMLChannel extends TMLCommunicationElement { private String SP = " "; private int priority; private int vc = 0; + + //Security + private boolean ensureConf; // Ensure the confidentiality for this channel + private boolean ensureWeakAuth; // Ensure the weak authenticity for this channel + private boolean ensureStrongAuth; // Ensure the strong authenticity for this channel //A reference to the original origin and destination tasks @@ -199,6 +204,29 @@ public class TMLChannel extends TMLCommunicationElement { return vc; } + public boolean isEnsureConf() { + return ensureConf; + } + + public boolean isEnsureWeakAuth() { + return ensureWeakAuth; + } + public boolean isEnsureStrongAuth() { + return ensureStrongAuth; + } + + public void setEnsureConf(boolean _ensureConf) { + ensureConf = _ensureConf; + } + + public void setEnsureWeakAuth(boolean _ensureWeakAuth) { + ensureWeakAuth = _ensureWeakAuth; + } + + public void setEnsureStrongAuth(boolean _ensureStrongAuth) { + ensureStrongAuth = _ensureStrongAuth; + } + public void setVC(int vc) { TraceManager.addDev("Setting VC to " + vc + " for channel " + getName()); this.vc = vc; @@ -653,6 +681,9 @@ public class TMLChannel extends TMLCommunicationElement { boolean ret = checkConf == channel.checkConf && checkAuth == channel.checkAuth && + ensureConf == channel.ensureConf && + ensureWeakAuth == channel.ensureWeakAuth && + ensureStrongAuth == channel.ensureStrongAuth && size == channel.size && type == channel.type && max == channel.max && @@ -728,6 +759,9 @@ public class TMLChannel extends TMLCommunicationElement { TMLChannel newC = new TMLChannel(getName(), getReferenceObject()); newC.checkConf = isCheckConfChannel(); newC.checkAuth = isCheckAuthChannel(); + newC.ensureConf = isEnsureConf(); + newC.ensureWeakAuth = isEnsureWeakAuth(); + newC.ensureStrongAuth = isEnsureStrongAuth(); newC.port = port; newC.ports = new ArrayList<>(); diff --git a/src/main/java/tmltranslator/TMLMapping.java b/src/main/java/tmltranslator/TMLMapping.java index e224ea9e86a2cc34e1e26f9ef5059e46cf021830..bafe77601d73b03e88825a5aa6e3f718e1e7ebf3 100755 --- a/src/main/java/tmltranslator/TMLMapping.java +++ b/src/main/java/tmltranslator/TMLMapping.java @@ -2005,6 +2005,12 @@ public class TMLMapping<E> { return mappedSecurity.get(_sp); } + public void NullifyAutomata() { + aut = null; + nodesToStates = null; + commNodes = null; + } + @SuppressWarnings("unchecked") public TMLMapping deepClone() throws TMLCheckingError { diff --git a/src/main/java/tmltranslator/TMLSyntaxChecking.java b/src/main/java/tmltranslator/TMLSyntaxChecking.java index 880a60e46d33d51d91ffed8de37ca6942296099a..0a8fd981547ba2c4032fa797e2cd9207c2ff6ea0 100755 --- a/src/main/java/tmltranslator/TMLSyntaxChecking.java +++ b/src/main/java/tmltranslator/TMLSyntaxChecking.java @@ -820,7 +820,17 @@ public class TMLSyntaxChecking { public String printErrors() { String ret = "*** ERRORS:"; for (TMLError error : errors) { - ret += "ERROR / task " + error.task.getName() + " / element " + error.element.getName() + ": " + error.message + "\n"; + ret += "ERROR"; + if (error.task != null) { + ret += " / task " + error.task.getName(); + } + if (error.element != null) { + ret += " / element " + error.element.getName(); + } + if (error.message != null) { + ret += ": " + error.message; + } + ret += "\n"; } return ret; } @@ -828,7 +838,17 @@ public class TMLSyntaxChecking { public String printWarnings() { String ret = ""; for (TMLError error : warnings) { - ret += "ERROR / task " + error.task.getName() + " / element: " + error.element.getName() + ": " + error.message + "\n"; + ret += "ERROR"; + if (error.task != null) { + ret += " / task " + error.task.getName(); + } + if (error.element != null) { + ret += " / element " + error.element.getName(); + } + if (error.message != null) { + ret += ": " + error.message; + } + ret += "\n"; } return ret; } diff --git a/src/main/java/tmltranslator/compareTMLTest/CompareTMAP.java b/src/main/java/tmltranslator/compareTMLTest/CompareTMAP.java new file mode 100644 index 0000000000000000000000000000000000000000..b08417817eecb81d64c065f48951813124d6d70c --- /dev/null +++ b/src/main/java/tmltranslator/compareTMLTest/CompareTMAP.java @@ -0,0 +1,111 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.compareTMLTest; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.List; + +/** + * Class CompareTMAP + * + * Creation: 13/11/2023 + * + * @author Jawher JERRAY + * @version 1.0 13/11/2023 + */ + +public class CompareTMAP { + + public CompareTMAP () { + + } + + public boolean CompareTMAPFiles(File expected, File clone) throws Exception { + + BufferedReader expectedReader = new BufferedReader(new FileReader(expected)); + BufferedReader cloneReader = new BufferedReader(new FileReader(clone)); + + String s1; + String s2; + List<String> expectedStringArray = new ArrayList<String>(); + List<String> cloneStringArray = new ArrayList<String>(); + + while ((s1 = expectedReader.readLine()) != null) { + if (s1.indexOf("//") >= 0) { + s1 = s1.substring(0, s1.indexOf("//")); + } + if (!s1.contains("#include") && s1.length() > 0) { + s1 = s1.trim(); + expectedStringArray.add(s1); + } + } + + while ((s2 = cloneReader.readLine()) != null){ + if (s2.indexOf("//") >= 0) { + s2 = s2.substring(0, s2.indexOf("//")); + } + if (!s2.contains("#include") && s2.length() > 0) { + s2 = s2.trim(); + cloneStringArray.add(s2); + } + } + expectedReader.close(); + cloneReader.close(); + + return checkEquality(expectedStringArray, cloneStringArray); + } + + public boolean checkEquality(List<String> s1, List<String> s2) { + for (String s : s1) { + if (s2.contains(s)) { + s2.remove(s); + } + } + + if (s2.size() == 0) { + return true; + } + + return false; + } +} diff --git a/src/main/java/tmltranslator/patternhandling/AttributeTaskJsonFile.java b/src/main/java/tmltranslator/patternhandling/AttributeTaskJsonFile.java new file mode 100644 index 0000000000000000000000000000000000000000..b79e5c9dfad01952e69104ebdf6eff5699963125 --- /dev/null +++ b/src/main/java/tmltranslator/patternhandling/AttributeTaskJsonFile.java @@ -0,0 +1,80 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.patternhandling; +/** + * Class AttributeTaskJsonFile + * + * Creation: 28/08/2023 + * + * @author Jawher JERRAY + * @version 1.0 28/08/2023 + */ + +import tmltranslator.*; + + +public class AttributeTaskJsonFile { + private String name; + private String type; + private String value; + + public AttributeTaskJsonFile(String name, String type, String value) { + this.name = name; + this.type = type; + this.value = value; + } + + public String getName() { + return name; + } + + public String getType() { + return type; + } + + public String getValue() { + return value; + } + + public void setValue(String _value) { + value = _value; + } + +} diff --git a/src/main/java/tmltranslator/patternhandling/MappingPatternChannel.java b/src/main/java/tmltranslator/patternhandling/MappingPatternChannel.java new file mode 100644 index 0000000000000000000000000000000000000000..2f675da34ba042df241c73ed29f68acb71298f5a --- /dev/null +++ b/src/main/java/tmltranslator/patternhandling/MappingPatternChannel.java @@ -0,0 +1,223 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.patternhandling; +/** + * Class MappingPatternChannel + * + * Creation: 25/10/2023 + * + * @author Jawher JERRAY + * @version 1.0 25/10/2023 + */ + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +import tmltranslator.*; + + +public class MappingPatternChannel { + + public final static String TASK_CHANNEL_SEPARATOR = "::"; + public final static String MAP_CHANNEL_IN_SAME_MEMORY_SEPARATOR = " mapped in the same Memory as "; + public final static String MAP_CHANNEL_IN_NEW_MEMORY_SEPARATOR = " mapped in a new memory linked to "; + public final static int ORIGIN_PATTERN = 0; + public final static int ORIGIN_CLONE = 1; + public final static int ORIGIN_MODEL = 2; + + private String taskOfChannelToMap; + private String channelToMapName; + private int origin; + private String taskOfChannelInSameMem; + private String channelInSameMemAs; + private int sameMemAsOrigin; + private String busNameForNewMem; + + + public MappingPatternChannel(String taskOfChannelToMap, String channelToMapName, int origin) { + this.taskOfChannelToMap = taskOfChannelToMap; + this.channelToMapName = channelToMapName; + this.origin = origin; + } + + public String getTaskOfChannelToMap() { + return taskOfChannelToMap; + } + + public String getChannelToMapName() { + return channelToMapName; + } + + public String getTaskOfChannelInSameMem() { + return taskOfChannelInSameMem; + } + + public String getChannelInSameMemAs() { + return channelInSameMemAs; + } + + public String getBusNameForNewMem() { + return busNameForNewMem; + } + + public int getOrigin() { + return origin; + } + + public int getSameMemAsOrigin() { + return sameMemAsOrigin; + } + + public void setTaskOfChannelToMap(String _taskOfChannelToMap) { + taskOfChannelToMap = _taskOfChannelToMap; + } + + public void setChannelToMapName(String _channelToMapName) { + channelToMapName = _channelToMapName; + } + + public void setTaskAndChannelInSameMem(String _taskOfChannelInSameMem, String _channelInSameMemAs, int _sameMemAsOrigin) { + taskOfChannelInSameMem = _taskOfChannelInSameMem; + channelInSameMemAs = _channelInSameMemAs; + sameMemAsOrigin = _sameMemAsOrigin; + busNameForNewMem = null; + } + + public void setBusNameForNewMem(String _busNameForNewMem) { + busNameForNewMem = _busNameForNewMem; + channelInSameMemAs = null; + taskOfChannelInSameMem = null; + } + + public String getStringDisplay() { + if (channelInSameMemAs != null) { + return (taskOfChannelToMap + TASK_CHANNEL_SEPARATOR + channelToMapName + MAP_CHANNEL_IN_SAME_MEMORY_SEPARATOR + taskOfChannelInSameMem + TASK_CHANNEL_SEPARATOR + channelInSameMemAs); + } else { + return (taskOfChannelToMap + TASK_CHANNEL_SEPARATOR + channelToMapName + MAP_CHANNEL_IN_NEW_MEMORY_SEPARATOR + busNameForNewMem); + } + } + + public void setOrigin(int _origin) { + origin = _origin; + } + + public String getTaskChannelToMap() { + return (taskOfChannelToMap + TASK_CHANNEL_SEPARATOR + channelToMapName); + } + + public String getTaskChannelInSameMem() { + return (taskOfChannelInSameMem + TASK_CHANNEL_SEPARATOR + channelInSameMemAs); + } + + public static String getTaskChannel(String task, String channel) { + return (task + TASK_CHANNEL_SEPARATOR + channel); + } + + public static String[] seperateTaskAndChannel(String st) { + String[] split = st.split(TASK_CHANNEL_SEPARATOR); + String task, channel; + if (split.length == 2) { + task = split[0]; + channel = split[1]; + return new String[]{task, channel}; + } else { + return null; + } + } + + public static List<MappingPatternChannel> getChannelsToMap(List<PatternConnection> patternConnectionList, LinkedHashMap<String, TaskPattern> patternTasks, List<PatternCloneTask> patternCloneTasks) { + List<MappingPatternChannel> mappingPatternChannels = new ArrayList<MappingPatternChannel>(); + List<String> clonedTasks = new ArrayList<String>(); + for (PatternCloneTask clonedTask: patternCloneTasks) { + clonedTasks.add(clonedTask.getClonedTask()); + } + for (PatternConnection patternConnection: patternConnectionList) { + if (!patternConnection.isNewPort() && clonedTasks.contains(patternConnection.getModelTaskName())) { + MappingPatternChannel mappingPatternChannel = new MappingPatternChannel(patternConnection.getModelTaskName(), patternConnection.getModelChannelName(), ORIGIN_CLONE); + if (!mappingPatternChannels.contains(mappingPatternChannel)) { + mappingPatternChannels.add(mappingPatternChannel); + } + } + if (patternConnection.isANewChannelRequired(patternConnectionList, patternTasks, patternCloneTasks)) { + if (!patternConnection.isNewPort() && clonedTasks.contains(patternConnection.getModelTaskName())) { + } else { + for (PortTaskJsonFile portTaskJsonFile : patternTasks.get(patternConnection.getPatternTaskName()).getExternalPorts()) { + if (portTaskJsonFile.getType().equals(PatternCreation.CHANNEL) && patternConnection.getPatternChannel().equals(portTaskJsonFile.getName())) { + MappingPatternChannel mappingPatternChannel = new MappingPatternChannel(patternConnection.getPatternTaskName(), patternConnection.getPatternChannel(), ORIGIN_PATTERN); + if (!mappingPatternChannels.contains(mappingPatternChannel)) { + mappingPatternChannels.add(mappingPatternChannel); + } + } + } + } + } + } + for (String st : patternTasks.keySet()) { + for (PortTaskJsonFile portTaskJsonFile : patternTasks.get(st).getInternalPorts()) { + if (portTaskJsonFile.getType().equals(PatternCreation.CHANNEL) && portTaskJsonFile.getMode().equals(PatternCreation.MODE_OUTPUT)) { + MappingPatternChannel mappingPatternChannel = new MappingPatternChannel(st, portTaskJsonFile.getName(), ORIGIN_PATTERN); + if (!mappingPatternChannels.contains(mappingPatternChannel)) { + mappingPatternChannels.add(mappingPatternChannel); + } + } + } + } + + return mappingPatternChannels; + } + + public static List<MappingPatternChannel> getChannelsLeftToMap(List<MappingPatternChannel> _mappedChannels, List<MappingPatternChannel> _allChannelsToMap) { + List<MappingPatternChannel> channelsLeftToMap = new ArrayList<MappingPatternChannel>(); + for (MappingPatternChannel channelToMap : _allChannelsToMap) { + boolean isLeftToMap = true; + for (MappingPatternChannel mappedChannel : _mappedChannels) { + if (channelToMap.getChannelToMapName().equals(mappedChannel.getChannelToMapName()) && channelToMap.getTaskOfChannelToMap().equals(mappedChannel.getTaskOfChannelToMap())) { + isLeftToMap = false; + break; + } + } + if (isLeftToMap) { + channelsLeftToMap.add(channelToMap); + } + } + return channelsLeftToMap; + } +} diff --git a/src/main/java/tmltranslator/patternhandling/MappingPatternTask.java b/src/main/java/tmltranslator/patternhandling/MappingPatternTask.java new file mode 100644 index 0000000000000000000000000000000000000000..0b825f485db7d50209fe7ee3aa4e221a83e64f28 --- /dev/null +++ b/src/main/java/tmltranslator/patternhandling/MappingPatternTask.java @@ -0,0 +1,166 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.patternhandling; +/** + * Class MappingPatternTask + * + * Creation: 25/10/2023 + * + * @author Jawher JERRAY + * @version 1.0 25/10/2023 + */ + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +import tmltranslator.*; + + +public class MappingPatternTask { + + public final static String MAP_TASK_IN_SAME_HW_SEPARATOR = " mapped in the same HW as "; + public final static String MAP_TASK_IN_NEW_HW_SEPARATOR = " mapped in a new HW linked to "; + public final static int ORIGIN_PATTERN = 0; + public final static int ORIGIN_CLONE = 1; + public final static int ORIGIN_MODEL = 2; + + private String taskToMapName; + private String sameHwAs; + private int sameHwAsOrigin; + private String busNameForNewHw; + private int origin; + + public MappingPatternTask(String taskToMapName, int origin) { + this.taskToMapName = taskToMapName; + this.origin = origin; + } + + public String getTaskToMapName() { + return taskToMapName; + } + + public String getSameHwAs() { + return sameHwAs; + } + + public String getBusNameForNewHw() { + return busNameForNewHw; + } + + public int getOrigin() { + return origin; + } + + public int getSameHwAsOrigin() { + return sameHwAsOrigin; + } + + public void setTaskToMapName(String _taskToMapName) { + taskToMapName = _taskToMapName; + } + + public void setSameHwAs(String _sameHwAs, int _sameHwAsOrigin) { + sameHwAs = _sameHwAs; + sameHwAsOrigin = _sameHwAsOrigin; + busNameForNewHw = null; + } + + public void setBusNameForNewHw(String _busNameForNewHw) { + busNameForNewHw = _busNameForNewHw; + sameHwAs = null; + sameHwAsOrigin = -1; + } + + public void setOrigin(int _origin) { + origin = _origin; + } + + public String getStringDisplay() { + if (sameHwAs != null) { + return (taskToMapName + MAP_TASK_IN_SAME_HW_SEPARATOR + sameHwAs); + } else { + return (taskToMapName + MAP_TASK_IN_NEW_HW_SEPARATOR + busNameForNewHw); + } + } + + public static List<MappingPatternTask> getTasksToMap(LinkedHashMap<String, TaskPattern> _allPatternTasks, List<String> _cloneTasks) { + List<MappingPatternTask> tasksToMap = new ArrayList<MappingPatternTask>(); + for (String taskPattern : _allPatternTasks.keySet()) { + MappingPatternTask taskToMap = new MappingPatternTask(taskPattern, ORIGIN_PATTERN); + tasksToMap.add(taskToMap); + } + for (String taskClone : _cloneTasks) { + MappingPatternTask taskToMap = new MappingPatternTask(taskClone, ORIGIN_CLONE); + tasksToMap.add(taskToMap); + } + return tasksToMap; + } + + public static List<MappingPatternTask> getTasksLeftToMap(List<MappingPatternTask> _mappedTasks, List<MappingPatternTask> _allTasksToMap) { + List<MappingPatternTask> tasksLeftToMap = new ArrayList<MappingPatternTask>(); + for (MappingPatternTask taskToMap : _allTasksToMap) { + boolean isLeftToMap = true; + for (MappingPatternTask mappedTask : _mappedTasks) { + if (taskToMap.getTaskToMapName().equals(mappedTask.getTaskToMapName())) { + isLeftToMap = false; + break; + } + } + if (isLeftToMap) { + tasksLeftToMap.add(taskToMap); + } + } + return tasksLeftToMap; + } + + // public static List<String> getListTasksToMapWith(List<MappingPatternTask> _mappedTasks, List<String> _cloneTasks) { + // List<MappingPatternTask> tasksToMap = new ArrayList<MappingPatternTask>(); + // for (String taskPattern : _allPatternTasks.keySet()) { + // MappingPatternTask taskToMap = new MappingPatternTask(taskPattern, ORIGIN_PATTERN); + // tasksToMap.add(taskToMap); + // } + // for (String taskClone : _cloneTasks) { + // MappingPatternTask taskToMap = new MappingPatternTask(taskClone, ORIGIN_CLONE); + // tasksToMap.add(taskToMap); + // } + // return tasksToMap; + // } +} diff --git a/src/main/java/tmltranslator/patternhandling/PatternAttributeUpdate.java b/src/main/java/tmltranslator/patternhandling/PatternAttributeUpdate.java new file mode 100644 index 0000000000000000000000000000000000000000..12b1408b98f223fbd98ea3fdaeecc18a1d48c34a --- /dev/null +++ b/src/main/java/tmltranslator/patternhandling/PatternAttributeUpdate.java @@ -0,0 +1,90 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.patternhandling; +/** + * Class PatternAttributeUpdate + * + * Creation: 25/10/2023 + * + * @author Jawher JERRAY + * @version 1.0 25/10/2023 + */ + +import tmltranslator.*; + + +public class PatternAttributeUpdate { + private String taskOfAttributeToUpdate; + private String attributeName; + private String newAttributeValue; + + public PatternAttributeUpdate(String taskOfAttributeToUpdate, String attributeName, String newAttributeValue) { + this.taskOfAttributeToUpdate = taskOfAttributeToUpdate; + this.attributeName = attributeName; + this.newAttributeValue = newAttributeValue; + } + + public String getTaskOfAttributeToUpdate() { + return taskOfAttributeToUpdate; + } + + public String getAttributeName() { + return attributeName; + } + + public String getNewAttributeValue() { + return newAttributeValue; + } + + + public void setTaskOfAttributeToUpdate(String _taskOfAttributeToUpdate) { + taskOfAttributeToUpdate = _taskOfAttributeToUpdate; + } + + public void setAttributeName(String _attributeName) { + attributeName = _attributeName; + } + + public void setNewAttributeValue(String _newAttributeValue) { + newAttributeValue = _newAttributeValue; + } + + +} diff --git a/src/main/java/tmltranslator/patternhandling/PatternChannelWithSecurity.java b/src/main/java/tmltranslator/patternhandling/PatternChannelWithSecurity.java new file mode 100644 index 0000000000000000000000000000000000000000..745c561576a878ce363f9bf6675eb0e22d6369c5 --- /dev/null +++ b/src/main/java/tmltranslator/patternhandling/PatternChannelWithSecurity.java @@ -0,0 +1,111 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.patternhandling; +/** + * Class PatternChannelWithSecurity + * + * Creation: 25/10/2023 + * + * @author Jawher JERRAY + * @version 1.0 25/10/2023 + */ + +import tmltranslator.*; + + +public class PatternChannelWithSecurity { + public static final int NO_AUTHENTICITY = 0; + public static final int WEAK_AUTHENTICITY = 1; + public static final int STRONG_AUTHENTICITY = 2; + + private String channelTaskName; + private String channelName; + private String channelMode; + private Boolean isConf; + private int auth; + + public PatternChannelWithSecurity(String channelTaskName, String channelName, String channelMode) { + this.channelTaskName = channelTaskName; + this.channelName = channelName; + this.channelMode = channelMode; + } + + public String getChannelTaskName() { + return channelTaskName; + } + + public String getChannelName() { + return channelName; + } + + public String getChannelMode() { + return channelMode; + } + + public Boolean isConfidential() { + return isConf; + } + + public int getAuthenticity() { + return auth; + } + + public void setChannelTaskName(String _channelTaskName) { + channelTaskName = _channelTaskName; + } + + public void setChannelName(String _channelName) { + channelName = _channelName; + } + + public void setChannelMode(String _channelMode) { + channelMode = _channelMode; + } + + public void setIsConfidential(Boolean _isConf) { + isConf = _isConf; + } + + public void setAuthenticity(int _auth) { + auth = _auth; + } + + +} diff --git a/src/main/java/tmltranslator/patternhandling/PatternCloneTask.java b/src/main/java/tmltranslator/patternhandling/PatternCloneTask.java new file mode 100644 index 0000000000000000000000000000000000000000..e5d554ba519a83be9b72bbddfc6c4089a1f8dd55 --- /dev/null +++ b/src/main/java/tmltranslator/patternhandling/PatternCloneTask.java @@ -0,0 +1,96 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.patternhandling; +/** + * Class PatternCloneTask + * + * Creation: 25/10/2023 + * + * @author Jawher JERRAY + * @version 1.0 25/10/2023 + */ + +import java.util.List; + +import tmltranslator.*; + + +public class PatternCloneTask { + public final static String CLONE_TASK_SEPARATOR = " clone of "; + + private String clonedTask; + private String taskToClone; + + public PatternCloneTask(String clonedTask, String taskToClone) { + this.clonedTask = clonedTask; + this.taskToClone = taskToClone; + } + + public String getClonedTask() { + return clonedTask; + } + + public String getTaskToClone() { + return taskToClone; + } + + + public void setClonedTask(String _clonedTask) { + clonedTask = _clonedTask; + } + + public void setTaskToClone(String _taskToClone) { + taskToClone = _taskToClone; + } + + public String getStringDisplay() { + return (clonedTask + CLONE_TASK_SEPARATOR + taskToClone); + + } + + public static PatternCloneTask isAClonedTask(List<PatternCloneTask> clonedTasks, String taskName) { + for (PatternCloneTask patternCloneTask : clonedTasks) { + if (patternCloneTask.getClonedTask().equals(taskName)) { + return patternCloneTask; + } + } + return null; + } +} diff --git a/src/main/java/tmltranslator/patternhandling/PatternConfig2Json.java b/src/main/java/tmltranslator/patternhandling/PatternConfig2Json.java new file mode 100644 index 0000000000000000000000000000000000000000..316759b13993576593ceb5c5973765176e27a969 --- /dev/null +++ b/src/main/java/tmltranslator/patternhandling/PatternConfig2Json.java @@ -0,0 +1,507 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.patternhandling; +/** + * Class PatternConfig2Json + * Transform a Pattern configuration to Json file and vice versa + * Creation: 05/09/2023 + * + * @author Jawher JERRAY + * @version 1.0 05/09/2023 + */ + +import tmltranslator.*; + +import java.io.FileWriter; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + + +public class PatternConfig2Json { + public final static String TASK_MAPPING_ORIGIN = "Origin"; + public final static String TASK_MAPPING_ORIGIN_PATTERN = "Pattern"; + public final static String TASK_MAPPING_ORIGIN_CLONE = "Clone"; + public final static String TASK_MAPPING_ORIGIN_MODEL = "Model"; + public final static String TASK_MAPPING = "Task_Mapping"; + public final static String TASK_TO_MAP = "Task_To_Map"; + public final static String TASK_MAPPED_IN_SAME_HW_AS = "Task_Mapped_In_Same_HW_As"; + public final static String TASK_MAPPED_IN_SAME_HW_AS_ORIGIN = "Origin_Task_Mapped_In_Same_HW_As"; + public final static String TASK_MAPPED_IN_NEW_HW_CONNECTED_TO_BUS = "Task_Mapped_In_New_HW"; + + public final static String CHANNEL_MAPPING_ORIGIN = "Origin"; + public final static String CHANNEL_MAPPING_ORIGIN_PATTERN = "Pattern"; + public final static String CHANNEL_MAPPING_ORIGIN_CLONE = "Clone"; + public final static String CHANNEL_MAPPING_ORIGIN_MODEL = "Model"; + public final static String CHANNEL_MAPPING = "Channel_Mapping"; + public final static String TASK_OF_CHANNEL_TO_MAP = "Task_Of_Channel_To_Map"; + public final static String CHANNEL_TO_MAP = "Channel_To_Map"; + public final static String CHANNEL_MAPPED_IN_SAME_MEM_AS = "Channel_Mapped_In_Same_Mem_As"; + public final static String TASK_OF_CHANNEL_SAME_MEM = "Task_Of_Channel_Same_Mem_As"; + public final static String CHANNEL_MAPPED_IN_SAME_MEM_AS_ORIGIN = "Origin_Channel_Mapped_In_Same_Mem_As"; + public final static String CHANNEL_MAPPED_IN_NEW_MEM_CONNECTED_TO_BUS = "Channel_Mapped_In_New_Mem"; + + public final static String CHANNEL_CONFIG = "Channel_Configuration"; + public final static String TASK_OF_CHANNEL_TO_CONFIG = "Task_Of_Channel_To_Config"; + public final static String CHANNEL_TO_CONFIG = "Channel_To_Config"; + public final static String CHANNEL_TO_MERGE_WITH = "Channel_To_Merge_With"; + public final static String CHANNEL_TO_REMOVE = "Channel_To_Remove"; + + public final static String TASK_CLONE = "Task_Clone"; + public final static String CLONE_OF_TASK = "Clone_Of_Task"; + public final static String CLONED_TASK = "Cloned_Task"; + + public final static String CONNECTION = "Connection"; + public final static String PATTERN_TASK = "Pattern_Task"; + public final static String PATTERN_PORT = "Pattern_Port"; + public final static String MODEL_TASK = "Model_Task"; + public final static String MODEL_PORT = "Model_Port"; + public final static String NEW_PORT = "New_Port"; + + public final static String UPDATED_ATTRIBUTES_IN_PATTERN = "Updated_Attributes_In_Pattern"; + public final static String TASK_ATTRIBUTE_NAME = "Attribute_Task_Name"; + + public final static String CHANNELS_WITH_SECURITY_IN_PATTERN = "Channels_With_Security_In_Pattern"; + public final static String TASK_CHANNEL_WITH_SECURITY_NAME = "Task_Name_Channel"; + + private String patternConfigurationPathName; + private PatternConfiguration patternConfiguration; + + + public PatternConfiguration getPaternConfiguration() { + return patternConfiguration; + } + + public PatternConfig2Json(String _patternPathName, PatternConfiguration _patternConfiguration) { + this.patternConfigurationPathName = _patternPathName; + this.patternConfiguration = _patternConfiguration; + } + + public PatternConfig2Json(String _patternPathName) { + this.patternConfigurationPathName = _patternPathName; + this.patternConfiguration = new PatternConfiguration(); + } + + + public void patternConfiguration2Json() { + try { + FileWriter file = new FileWriter(patternConfigurationPathName); + JSONObject jsonPatternConfig = new JSONObject(); + + jsonPatternConfig.put(CONNECTION, addConnectionInJsonFile(patternConfiguration.getPortsConnection())); + jsonPatternConfig.put(TASK_CLONE, addClonedTasksInJsonFile(patternConfiguration.getClonedTasks())); + jsonPatternConfig.put(CHANNEL_CONFIG, addPortsConfigurationInJsonFile(patternConfiguration.getPortsConfig())); + jsonPatternConfig.put(TASK_MAPPING, addTasksMappingInJsonFile(patternConfiguration.getTasksMapping())); + jsonPatternConfig.put(CHANNEL_MAPPING, addChannelsMappingInJsonFile(patternConfiguration.getChannelsMapping())); + jsonPatternConfig.put(UPDATED_ATTRIBUTES_IN_PATTERN, addUpdatedPatternAttributesInJsonFile(patternConfiguration.getUpdatedPatternAttributes())); + jsonPatternConfig.put(CHANNELS_WITH_SECURITY_IN_PATTERN, addChannelsWithSecurityInJsonFile(patternConfiguration.getChannelsWithSecurity())); + + file.write(jsonPatternConfig.toString(1)); + file.close(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + public void json2patternConfiguration() { + Path jsonFilePath = Path.of(patternConfigurationPathName); + String jsonFilecontent = ""; + + try { + jsonFilecontent = Files.readString(jsonFilePath, Charset.defaultCharset()); + } catch (IOException ioExc) { + } + + JSONObject patternConfigurationJson = new JSONObject(jsonFilecontent); + JSONArray jsonConnection = patternConfigurationJson.getJSONArray(CONNECTION); + JSONArray jsonTaskClone = patternConfigurationJson.getJSONArray(TASK_CLONE); + JSONArray jsonChannelConfig = patternConfigurationJson.getJSONArray(CHANNEL_CONFIG); + JSONArray jsonTaskMapping = patternConfigurationJson.getJSONArray(TASK_MAPPING); + JSONArray jsonChannelMapping = patternConfigurationJson.getJSONArray(CHANNEL_MAPPING); + JSONArray jsonUpdatedAttributesPattern = patternConfigurationJson.getJSONArray(UPDATED_ATTRIBUTES_IN_PATTERN); + JSONArray jsonChannelWithSecurity = patternConfigurationJson.getJSONArray(CHANNELS_WITH_SECURITY_IN_PATTERN); + patternConfiguration.setClonedTasks(getClonedTasksFromJsonFile(jsonTaskClone)); + patternConfiguration.setPortsConnection(getConnectionFromJsonFile(jsonConnection)); + patternConfiguration.setPortsConfig(getPortsConfigurationFromJsonFile(jsonChannelConfig)); + patternConfiguration.setTasksMapping(getTasksMappingFromJsonFile(jsonTaskMapping)); + patternConfiguration.setChannelsMapping(getChannelsMappingFromJsonFile(jsonChannelMapping)); + patternConfiguration.setUpdatedPatternAttributes(getUpdatedPatternAttributesFromJsonFile(jsonUpdatedAttributesPattern)); + patternConfiguration.setChannelsWithSecurity(getChannelsWithSecurityFromJsonFile(jsonChannelWithSecurity)); + + } + + JSONArray addClonedTasksInJsonFile(List<PatternCloneTask> _clonedTasks) { + JSONArray ja = new JSONArray(); + try { + for (PatternCloneTask cloneTask : _clonedTasks) { + JSONObject jo = new JSONObject(); + jo.put(CLONE_OF_TASK, cloneTask.getTaskToClone()); + jo.put(CLONED_TASK, cloneTask.getClonedTask()); + ja.put(jo); + } + } catch (JSONException e) { + e.printStackTrace(); + } + return ja; + } + + List<PatternCloneTask> getClonedTasksFromJsonFile(JSONArray ja) { + List<PatternCloneTask> _clonedTasks = new ArrayList<PatternCloneTask>(); + for (int j = 0; j < ja.length(); j++) { + String cloneOfTask = ja.getJSONObject(j).getString(CLONE_OF_TASK); + String clonedTask = ja.getJSONObject(j).getString(CLONED_TASK); + PatternCloneTask cloneTask = new PatternCloneTask(clonedTask, cloneOfTask); + _clonedTasks.add(cloneTask); + } + return _clonedTasks; + } + + JSONArray addPortsConfigurationInJsonFile(List<PatternPortsConfig> _portsConfig) { + JSONArray ja = new JSONArray(); + try { + for (PatternPortsConfig portConfig : _portsConfig) { + JSONObject jo = new JSONObject(); + jo.put(CHANNEL_TO_CONFIG, portConfig.getChannelToConfig()); + jo.put(TASK_OF_CHANNEL_TO_CONFIG, portConfig.getTaskOfChannelToConfig()); + if (portConfig.isChannelToRemove()) { + jo.put(CHANNEL_TO_REMOVE, "true"); + } else { + jo.put(CHANNEL_TO_MERGE_WITH, portConfig.getMergeWith()); + } + ja.put(jo); + } + } catch (JSONException e) { + e.printStackTrace(); + } + return ja; + } + + List<PatternPortsConfig> getPortsConfigurationFromJsonFile(JSONArray ja) { + List<PatternPortsConfig> _portsConfig = new ArrayList<PatternPortsConfig>(); + for (int j = 0; j < ja.length(); j++) { + String taskOfChToConfig = ja.getJSONObject(j).getString(TASK_OF_CHANNEL_TO_CONFIG); + String chToConfig = ja.getJSONObject(j).getString(CHANNEL_TO_CONFIG); + PatternPortsConfig portConfig = new PatternPortsConfig(taskOfChToConfig, chToConfig); + if (ja.getJSONObject(j).has(CHANNEL_TO_MERGE_WITH)) { + portConfig.setMergeWith(ja.getJSONObject(j).getString(CHANNEL_TO_MERGE_WITH)); + }else if (ja.getJSONObject(j).has(CHANNEL_TO_REMOVE)) { + portConfig.setIsChannelToRemove(true); + } + _portsConfig.add(portConfig); + } + return _portsConfig; + } + + JSONArray addChannelsMappingInJsonFile(List<MappingPatternChannel> _channelsMapping) { + JSONArray ja = new JSONArray(); + try { + for (MappingPatternChannel channelMapping : _channelsMapping) { + JSONObject jo = new JSONObject(); + jo.put(CHANNEL_TO_MAP, channelMapping.getChannelToMapName()); + jo.put(TASK_OF_CHANNEL_TO_MAP, channelMapping.getTaskOfChannelToMap()); + if (channelMapping.getOrigin() == MappingPatternChannel.ORIGIN_CLONE) { + jo.put(CHANNEL_MAPPING_ORIGIN, CHANNEL_MAPPING_ORIGIN_CLONE); + } else if (channelMapping.getOrigin() == MappingPatternChannel.ORIGIN_PATTERN) { + jo.put(CHANNEL_MAPPING_ORIGIN, CHANNEL_MAPPING_ORIGIN_PATTERN); + } else if (channelMapping.getOrigin() == MappingPatternChannel.ORIGIN_MODEL) { + jo.put(CHANNEL_MAPPING_ORIGIN, CHANNEL_MAPPING_ORIGIN_MODEL); + } + if (channelMapping.getChannelInSameMemAs() != null && channelMapping.getTaskOfChannelInSameMem() != null) { + jo.put(CHANNEL_MAPPED_IN_SAME_MEM_AS, channelMapping.getChannelInSameMemAs()); + jo.put(TASK_OF_CHANNEL_SAME_MEM, channelMapping.getTaskOfChannelInSameMem()); + if (channelMapping.getSameMemAsOrigin() == MappingPatternChannel.ORIGIN_CLONE) { + jo.put(CHANNEL_MAPPED_IN_SAME_MEM_AS_ORIGIN, CHANNEL_MAPPING_ORIGIN_CLONE); + } else if (channelMapping.getSameMemAsOrigin() == MappingPatternChannel.ORIGIN_PATTERN) { + jo.put(CHANNEL_MAPPED_IN_SAME_MEM_AS_ORIGIN, CHANNEL_MAPPING_ORIGIN_PATTERN); + } else if (channelMapping.getSameMemAsOrigin() == MappingPatternChannel.ORIGIN_MODEL) { + jo.put(CHANNEL_MAPPED_IN_SAME_MEM_AS_ORIGIN, CHANNEL_MAPPING_ORIGIN_MODEL); + } + } + if (channelMapping.getBusNameForNewMem() != null) { + jo.put(CHANNEL_MAPPED_IN_NEW_MEM_CONNECTED_TO_BUS, channelMapping.getBusNameForNewMem()); + } + ja.put(jo); + } + } catch (JSONException e) { + e.printStackTrace(); + } + return ja; + } + + JSONArray addUpdatedPatternAttributesInJsonFile(LinkedHashMap<String, List<AttributeTaskJsonFile>> _updatedPatternAttributes) { + JSONArray ja = new JSONArray(); + try { + for (String task : _updatedPatternAttributes.keySet()) { + for (AttributeTaskJsonFile attributeTask : _updatedPatternAttributes.get(task)) { + JSONObject jo = new JSONObject(); + jo.put(TASK_ATTRIBUTE_NAME, task); + jo.put(PatternCreation.NAME, attributeTask.getName()); + jo.put(PatternCreation.TYPE, attributeTask.getType()); + jo.put(PatternCreation.VALUE, attributeTask.getValue()); + ja.put(jo); + } + } + } catch (JSONException e) { + e.printStackTrace(); + } + return ja; + } + + JSONArray addChannelsWithSecurityInJsonFile(List<PatternChannelWithSecurity> _channelsWithSec) { + JSONArray ja = new JSONArray(); + try { + for (PatternChannelWithSecurity channelWithSec : _channelsWithSec) { + JSONObject jo = new JSONObject(); + jo.put(TASK_CHANNEL_WITH_SECURITY_NAME, channelWithSec.getChannelTaskName()); + jo.put(PatternCreation.NAME, channelWithSec.getChannelName()); + jo.put(PatternCreation.MODE, channelWithSec.getChannelMode()); + if (channelWithSec.isConfidential()) { + jo.put(PatternCreation.CONFIDENTIALITY, PatternCreation.WITH_CONFIDENTIALITY); + } else { + jo.put(PatternCreation.CONFIDENTIALITY, PatternCreation.WITHOUT_CONFIDENTIALITY); + } + if (channelWithSec.getAuthenticity() == PatternChannelWithSecurity.NO_AUTHENTICITY) { + jo.put(PatternCreation.AUTHENTICITY, PatternCreation.WITHOUT_AUTHENTICITY); + } else if (channelWithSec.getAuthenticity() == PatternChannelWithSecurity.WEAK_AUTHENTICITY) { + jo.put(PatternCreation.AUTHENTICITY, PatternCreation.WEAK_AUTHENTICITY); + } else if (channelWithSec.getAuthenticity() == PatternChannelWithSecurity.STRONG_AUTHENTICITY) { + jo.put(PatternCreation.AUTHENTICITY, PatternCreation.STRONG_AUTHENTICITY); + } + ja.put(jo); + } + } catch (JSONException e) { + e.printStackTrace(); + } + return ja; + } + + List<PatternChannelWithSecurity> getChannelsWithSecurityFromJsonFile(JSONArray ja) { + List<PatternChannelWithSecurity> _channelsWithSec = new ArrayList<PatternChannelWithSecurity>(); + for (int j = 0; j < ja.length(); j++) { + String taskName = ja.getJSONObject(j).getString(TASK_CHANNEL_WITH_SECURITY_NAME); + String channelName = ja.getJSONObject(j).getString(PatternCreation.NAME); + String channelMode = ja.getJSONObject(j).getString(PatternCreation.MODE); + String channelConf = ja.getJSONObject(j).getString(PatternCreation.CONFIDENTIALITY); + String channelAuth = ja.getJSONObject(j).getString(PatternCreation.AUTHENTICITY); + PatternChannelWithSecurity channelWithSecurity = new PatternChannelWithSecurity(taskName, channelName, channelMode); + if (channelConf.toLowerCase().equals(PatternCreation.WITHOUT_CONFIDENTIALITY.toLowerCase())) { + channelWithSecurity.setIsConfidential(false); + } else if (channelConf.toLowerCase().equals(PatternCreation.WITH_CONFIDENTIALITY.toLowerCase())) { + channelWithSecurity.setIsConfidential(true); + } + if (channelAuth.toLowerCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toLowerCase())) { + channelWithSecurity.setAuthenticity(PatternChannelWithSecurity.NO_AUTHENTICITY); + } else if (channelAuth.toLowerCase().equals(PatternCreation.WEAK_AUTHENTICITY.toLowerCase())) { + channelWithSecurity.setAuthenticity(PatternChannelWithSecurity.WEAK_AUTHENTICITY); + } else if (channelAuth.toLowerCase().equals(PatternCreation.STRONG_AUTHENTICITY.toLowerCase())) { + channelWithSecurity.setAuthenticity(PatternChannelWithSecurity.STRONG_AUTHENTICITY); + } + + _channelsWithSec.add(channelWithSecurity); + } + return _channelsWithSec; + } + + LinkedHashMap<String, List<AttributeTaskJsonFile>> getUpdatedPatternAttributesFromJsonFile(JSONArray ja) { + LinkedHashMap<String, List<AttributeTaskJsonFile>> _updatedPatternAttributes = new LinkedHashMap<String, List<AttributeTaskJsonFile>>(); + for (int j = 0; j < ja.length(); j++) { + String taskName = ja.getJSONObject(j).getString(TASK_ATTRIBUTE_NAME); + String attributeName = ja.getJSONObject(j).getString(PatternCreation.NAME); + String attributeType = ja.getJSONObject(j).getString(PatternCreation.TYPE); + String attributeValue = ja.getJSONObject(j).getString(PatternCreation.VALUE); + if (_updatedPatternAttributes.containsKey(taskName)) { + AttributeTaskJsonFile attrib = new AttributeTaskJsonFile(attributeName, attributeType, attributeValue); + _updatedPatternAttributes.get(taskName).add(attrib); + } else { + List<AttributeTaskJsonFile> listAttrib = new ArrayList<AttributeTaskJsonFile>(); + AttributeTaskJsonFile attrib = new AttributeTaskJsonFile(attributeName, attributeType, attributeValue); + listAttrib.add(attrib); + _updatedPatternAttributes.put(taskName, listAttrib); + } + } + return _updatedPatternAttributes; + } + + List<MappingPatternChannel> getChannelsMappingFromJsonFile(JSONArray ja) { + List<MappingPatternChannel> _channelsMapping = new ArrayList<MappingPatternChannel>(); + for (int j = 0; j < ja.length(); j++) { + String channelToMap = ja.getJSONObject(j).getString(CHANNEL_TO_MAP); + String taskOfChannelToMap = ja.getJSONObject(j).getString(TASK_OF_CHANNEL_TO_MAP); + int originChannel = -1; + String channelToMapOrigin = ja.getJSONObject(j).getString(CHANNEL_MAPPING_ORIGIN); + if (channelToMapOrigin.equals(CHANNEL_MAPPING_ORIGIN_CLONE)) { + originChannel = MappingPatternChannel.ORIGIN_CLONE; + } else if (channelToMapOrigin.equals(CHANNEL_MAPPING_ORIGIN_PATTERN)) { + originChannel = MappingPatternChannel.ORIGIN_PATTERN; + } else if (channelToMapOrigin.equals(CHANNEL_MAPPING_ORIGIN_MODEL)) { + originChannel = MappingPatternChannel.ORIGIN_MODEL; + } + MappingPatternChannel mappingPatternChannel = new MappingPatternChannel(taskOfChannelToMap, channelToMap, originChannel); + + if (ja.getJSONObject(j).has(CHANNEL_MAPPED_IN_SAME_MEM_AS) && ja.getJSONObject(j).has(TASK_OF_CHANNEL_SAME_MEM)) { + int sameMemAsOrigin = -1; + String sameChannelMemAsOrigin = ja.getJSONObject(j).getString(CHANNEL_MAPPED_IN_SAME_MEM_AS_ORIGIN); + if (sameChannelMemAsOrigin.equals(CHANNEL_MAPPING_ORIGIN_CLONE)) { + sameMemAsOrigin = MappingPatternChannel.ORIGIN_CLONE; + } else if (sameChannelMemAsOrigin.equals(TASK_MAPPING_ORIGIN_PATTERN)) { + sameMemAsOrigin = MappingPatternChannel.ORIGIN_PATTERN; + } else if (sameChannelMemAsOrigin.equals(TASK_MAPPING_ORIGIN_MODEL)) { + sameMemAsOrigin = MappingPatternChannel.ORIGIN_MODEL; + } + mappingPatternChannel.setTaskAndChannelInSameMem(ja.getJSONObject(j).getString(TASK_OF_CHANNEL_SAME_MEM), ja.getJSONObject(j).getString(CHANNEL_MAPPED_IN_SAME_MEM_AS), sameMemAsOrigin); + }else if (ja.getJSONObject(j).has(CHANNEL_MAPPED_IN_NEW_MEM_CONNECTED_TO_BUS)) { + mappingPatternChannel.setBusNameForNewMem(ja.getJSONObject(j).getString(CHANNEL_MAPPED_IN_NEW_MEM_CONNECTED_TO_BUS)); + } + _channelsMapping.add(mappingPatternChannel); + + } + return _channelsMapping; + } + + JSONArray addTasksMappingInJsonFile(List<MappingPatternTask> _tasksMapping) { + JSONArray ja = new JSONArray(); + try { + for (MappingPatternTask taskMapping : _tasksMapping) { + JSONObject jo = new JSONObject(); + jo.put(TASK_TO_MAP, taskMapping.getTaskToMapName()); + if (taskMapping.getOrigin() == MappingPatternTask.ORIGIN_CLONE) { + jo.put(TASK_MAPPING_ORIGIN, TASK_MAPPING_ORIGIN_CLONE); + } else if (taskMapping.getOrigin() == MappingPatternTask.ORIGIN_PATTERN) { + jo.put(TASK_MAPPING_ORIGIN, TASK_MAPPING_ORIGIN_PATTERN); + } + if (taskMapping.getSameHwAs() != null) { + jo.put(TASK_MAPPED_IN_SAME_HW_AS, taskMapping.getSameHwAs()); + if (taskMapping.getSameHwAsOrigin() == MappingPatternTask.ORIGIN_CLONE) { + jo.put(TASK_MAPPED_IN_SAME_HW_AS_ORIGIN, TASK_MAPPING_ORIGIN_CLONE); + } else if (taskMapping.getSameHwAsOrigin() == MappingPatternTask.ORIGIN_PATTERN) { + jo.put(TASK_MAPPED_IN_SAME_HW_AS_ORIGIN, TASK_MAPPING_ORIGIN_PATTERN); + } else if (taskMapping.getSameHwAsOrigin() == MappingPatternTask.ORIGIN_MODEL) { + jo.put(TASK_MAPPED_IN_SAME_HW_AS_ORIGIN, TASK_MAPPING_ORIGIN_MODEL); + } + + } else if (taskMapping.getBusNameForNewHw() != null) { + jo.put(TASK_MAPPED_IN_NEW_HW_CONNECTED_TO_BUS, taskMapping.getBusNameForNewHw()); + } + ja.put(jo); + } + } catch (JSONException e) { + e.printStackTrace(); + } + return ja; + } + + List<MappingPatternTask> getTasksMappingFromJsonFile(JSONArray ja) { + List<MappingPatternTask> _tasksMapping = new ArrayList<MappingPatternTask>(); + for (int j = 0; j < ja.length(); j++) { + String taskToMap = ja.getJSONObject(j).getString(TASK_TO_MAP); + String taskToMapOrigin = ja.getJSONObject(j).getString(TASK_MAPPING_ORIGIN); + int origin = -1; + if (taskToMapOrigin.equals(TASK_MAPPING_ORIGIN_CLONE)) { + origin = MappingPatternTask.ORIGIN_CLONE; + } else if (taskToMapOrigin.equals(TASK_MAPPING_ORIGIN_PATTERN)) { + origin = MappingPatternTask.ORIGIN_PATTERN; + } + MappingPatternTask mappingPatternTask = new MappingPatternTask(taskToMap, origin); + if (ja.getJSONObject(j).has(TASK_MAPPED_IN_NEW_HW_CONNECTED_TO_BUS)) { + mappingPatternTask.setBusNameForNewHw(ja.getJSONObject(j).getString(TASK_MAPPED_IN_NEW_HW_CONNECTED_TO_BUS)); + } else if (ja.getJSONObject(j).has(TASK_MAPPED_IN_SAME_HW_AS)) { + int sameHwAsOrigin = -1; + String sameTaskHwAsOrigin = ja.getJSONObject(j).getString(TASK_MAPPED_IN_SAME_HW_AS_ORIGIN); + if (sameTaskHwAsOrigin.equals(TASK_MAPPING_ORIGIN_CLONE)) { + sameHwAsOrigin = MappingPatternTask.ORIGIN_CLONE; + } else if (sameTaskHwAsOrigin.equals(TASK_MAPPING_ORIGIN_PATTERN)) { + sameHwAsOrigin = MappingPatternTask.ORIGIN_PATTERN; + } else if (sameTaskHwAsOrigin.equals(TASK_MAPPING_ORIGIN_MODEL)) { + sameHwAsOrigin = MappingPatternTask.ORIGIN_MODEL; + } + mappingPatternTask.setSameHwAs(ja.getJSONObject(j).getString(TASK_MAPPED_IN_SAME_HW_AS), sameHwAsOrigin); + } + _tasksMapping.add(mappingPatternTask); + } + return _tasksMapping; + } + + JSONArray addConnectionInJsonFile(List<PatternConnection> _portsConnection) { + JSONArray ja = new JSONArray(); + try { + for (PatternConnection portsConnection : _portsConnection) { + JSONObject jo = new JSONObject(); + jo.put(PATTERN_TASK, portsConnection.getPatternTaskName()); + jo.put(PATTERN_PORT, portsConnection.getPatternChannel()); + jo.put(MODEL_TASK, portsConnection.getModelTaskName()); + jo.put(MODEL_PORT, portsConnection.getModelChannelName()); + + if (portsConnection.isNewPort()) { + jo.put(NEW_PORT, "true"); + } else { + jo.put(NEW_PORT, "false"); + } + ja.put(jo); + + } + } catch (JSONException e) { + e.printStackTrace(); + } + return ja; + } + + List<PatternConnection> getConnectionFromJsonFile(JSONArray ja) { + List<PatternConnection> _portsConnection = new ArrayList<PatternConnection>(); + for (int j = 0; j < ja.length(); j++) { + String patternTask = ja.getJSONObject(j).getString(PATTERN_TASK); + String patternPort = ja.getJSONObject(j).getString(PATTERN_PORT); + String modelTask = ja.getJSONObject(j).getString(MODEL_TASK); + String modelPort = ja.getJSONObject(j).getString(MODEL_PORT); + String newPort = ja.getJSONObject(j).getString(NEW_PORT); + boolean isNewPort = Boolean.parseBoolean(newPort); + PatternConnection patternConnection = new PatternConnection(patternTask, patternPort, modelTask, modelPort, isNewPort); + _portsConnection.add(patternConnection); + } + return _portsConnection; + } + +} diff --git a/src/main/java/tmltranslator/patternhandling/PatternConfiguration.java b/src/main/java/tmltranslator/patternhandling/PatternConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..87521a5f4dee88e3ec997163e599b8785b70cc65 --- /dev/null +++ b/src/main/java/tmltranslator/patternhandling/PatternConfiguration.java @@ -0,0 +1,356 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.patternhandling; +/** + * Class PatternConfiguration + * + * Creation: 07/09/2023 + * + * @author Jawher JERRAY + * @version 1.0 07/09/2023 + */ + +import java.util.*; + + +public class PatternConfiguration { + + private List<PatternConnection> portsConnection; + private List<PatternCloneTask> clonedTasks; + private List<PatternPortsConfig> portsConfig; + private List<MappingPatternTask> tasksMapping; + private List<MappingPatternChannel> channelsMapping; + private LinkedHashMap<String, List<AttributeTaskJsonFile>> updatedPatternAttributes; + private List<PatternChannelWithSecurity> channelsWithSecurity; + + public PatternConfiguration(List<PatternConnection> portsConnection, List<PatternCloneTask> clonedTasks, List<PatternPortsConfig> portsConfig, List<MappingPatternTask> tasksMapping, List<MappingPatternChannel> channelsMapping, LinkedHashMap<String, List<AttributeTaskJsonFile>> updatedPatternAttributes, List<PatternChannelWithSecurity> channelsWithSecurity) { + this.portsConnection = portsConnection; + this.clonedTasks = clonedTasks; + this.portsConfig = portsConfig; + this.tasksMapping = tasksMapping; + this.channelsMapping = channelsMapping; + this.updatedPatternAttributes = updatedPatternAttributes; + this.channelsWithSecurity = channelsWithSecurity; + } + + public PatternConfiguration() { + this.portsConnection = new ArrayList<PatternConnection>(); + this.clonedTasks = new ArrayList<PatternCloneTask>(); + this.portsConfig = new ArrayList<PatternPortsConfig>(); + this.tasksMapping = new ArrayList<MappingPatternTask>(); + this.channelsMapping = new ArrayList<MappingPatternChannel>(); + this.updatedPatternAttributes = new LinkedHashMap<String, List<AttributeTaskJsonFile>>(); + this.channelsWithSecurity = new ArrayList<PatternChannelWithSecurity>(); + } + + public List<PatternConnection> getPortsConnection() { + return portsConnection; + } + + public List<PatternCloneTask> getClonedTasks() { + return clonedTasks; + } + + public List<String> getClonedTasksName() { + List<String> cloneTasksName = new ArrayList<String>(); + for (PatternCloneTask clonedTask : clonedTasks) { + cloneTasksName.add(clonedTask.getClonedTask()); + } + return cloneTasksName; + } + + public List<PatternPortsConfig> getPortsConfig() { + return portsConfig; + } + + public List<MappingPatternTask> getTasksMapping() { + return tasksMapping; + } + + public List<MappingPatternChannel> getChannelsMapping() { + return channelsMapping; + } + + public LinkedHashMap<String, List<AttributeTaskJsonFile>> getUpdatedPatternAttributes() { + return updatedPatternAttributes; + } + + public List<PatternChannelWithSecurity> getChannelsWithSecurity() { + return channelsWithSecurity; + } + + public void setPortsConnection(List<PatternConnection> _portsConnection) { + portsConnection = _portsConnection; + } + + public void setClonedTasks(List<PatternCloneTask> _clonedTasks) { + clonedTasks = _clonedTasks; + } + + public void setPortsConfig(List<PatternPortsConfig> _portsConfig) { + portsConfig = _portsConfig; + } + + public void setTasksMapping(List<MappingPatternTask> _tasksMapping) { + tasksMapping = _tasksMapping; + } + + public void setChannelsMapping(List<MappingPatternChannel> _channelsMapping) { + channelsMapping = _channelsMapping; + } + + public void setUpdatedPatternAttributes(LinkedHashMap<String, List<AttributeTaskJsonFile>> _updatedPatternAttributes) { + updatedPatternAttributes = _updatedPatternAttributes; + } + + public void addPortsConnection(PatternConnection _portsConnection) { + portsConnection.add(_portsConnection); + } + + public void addClonedTasks(PatternCloneTask _clonedTasks) { + clonedTasks.add(_clonedTasks); + } + + public void addPortsConfig(PatternPortsConfig _portsConfig) { + portsConfig.add(_portsConfig); + } + + public void addTasksMapping(MappingPatternTask _tasksMapping) { + tasksMapping.add(_tasksMapping); + } + + public void addChannelsMapping(MappingPatternChannel _channelsMapping) { + channelsMapping.add(_channelsMapping); + } + + public void setChannelsWithSecurity(List<PatternChannelWithSecurity> _channelsWithSecurity) { + channelsWithSecurity = _channelsWithSecurity; + } + + public void removeClonedTask(PatternCloneTask _clonedTasks) { + clonedTasks.remove(_clonedTasks); + } + + public void loadChannelsWithSecurity(LinkedHashMap<String, TaskPattern> patternTasksAll) { + for (String taskName : patternTasksAll.keySet()) { + for (PortTaskJsonFile portTaskExt : patternTasksAll.get(taskName).getExternalPorts()) { + if (portTaskExt.getType().equals(PatternCreation.CHANNEL)) { + if (portTaskExt.getConfidentiality().toUpperCase().equals(PatternCreation.WITH_CONFIDENTIALITY.toUpperCase()) || !portTaskExt.getAuthenticity().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase())) { + PatternChannelWithSecurity patternChannelWithSecurity = new PatternChannelWithSecurity(taskName, portTaskExt.getName(), portTaskExt.getMode()); + if (portTaskExt.getConfidentiality().toUpperCase().equals(PatternCreation.WITH_CONFIDENTIALITY.toUpperCase())) { + patternChannelWithSecurity.setIsConfidential(true); + } else if (portTaskExt.getConfidentiality().toUpperCase().equals(PatternCreation.WITHOUT_CONFIDENTIALITY.toUpperCase())) { + patternChannelWithSecurity.setIsConfidential(false); + } + if (portTaskExt.getAuthenticity().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase())) { + patternChannelWithSecurity.setAuthenticity(PatternChannelWithSecurity.NO_AUTHENTICITY); + } else if (portTaskExt.getAuthenticity().toUpperCase().equals(PatternCreation.WEAK_AUTHENTICITY.toUpperCase())) { + patternChannelWithSecurity.setAuthenticity(PatternChannelWithSecurity.WEAK_AUTHENTICITY); + } else if (portTaskExt.getAuthenticity().toUpperCase().equals(PatternCreation.STRONG_AUTHENTICITY.toUpperCase())) { + patternChannelWithSecurity.setAuthenticity(PatternChannelWithSecurity.STRONG_AUTHENTICITY); + } + channelsWithSecurity.add(patternChannelWithSecurity); + } + } + } + for (PortTaskJsonFile portTaskInt : patternTasksAll.get(taskName).getInternalPorts()) { + if (portTaskInt.getType().equals(PatternCreation.CHANNEL)) { + if (portTaskInt.getConfidentiality().toUpperCase().equals(PatternCreation.WITH_CONFIDENTIALITY.toUpperCase()) || !portTaskInt.getAuthenticity().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase())) { + PatternChannelWithSecurity patternChannelWithSecurity = new PatternChannelWithSecurity(taskName, portTaskInt.getName(), portTaskInt.getMode()); + if (portTaskInt.getConfidentiality().toUpperCase().equals(PatternCreation.WITH_CONFIDENTIALITY.toUpperCase())) { + patternChannelWithSecurity.setIsConfidential(true); + } else if (portTaskInt.getConfidentiality().toUpperCase().equals(PatternCreation.WITHOUT_CONFIDENTIALITY.toUpperCase())) { + patternChannelWithSecurity.setIsConfidential(false); + } + if (portTaskInt.getAuthenticity().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase())) { + patternChannelWithSecurity.setAuthenticity(PatternChannelWithSecurity.NO_AUTHENTICITY); + } else if (portTaskInt.getAuthenticity().toUpperCase().equals(PatternCreation.WEAK_AUTHENTICITY.toUpperCase())) { + patternChannelWithSecurity.setAuthenticity(PatternChannelWithSecurity.WEAK_AUTHENTICITY); + } else if (portTaskInt.getAuthenticity().toUpperCase().equals(PatternCreation.STRONG_AUTHENTICITY.toUpperCase())) { + patternChannelWithSecurity.setAuthenticity(PatternChannelWithSecurity.STRONG_AUTHENTICITY); + } + channelsWithSecurity.add(patternChannelWithSecurity); + } + } + } + } + + } + /*public void loadConnectedPorts(Vector<String> connectedPortsFull) { + for (String connectedPort : connectedPortsFull) { + String[] splitO = connectedPort.split(JDialogPatternHandling.TASK_CHANNEL_SEPARATOR, 2); + String patternTaskName = splitO[0]; + String[] splitCom = splitO[1].split(JDialogPatternHandling.PORT_CONNECTION_SEPARATOR, 2); + String patternTaskPortName = splitCom[0]; + String[] splitComModel = splitCom[1].split(JDialogPatternHandling.TASK_CHANNEL_SEPARATOR, 2); + String modelTaskName = splitComModel[0]; + String[] splitComModelPort = splitComModel[1].split(JDialogPatternHandling.NEW_PORT_OPTION, 2); + String modelTaskPortName = splitComModelPort[0]; + if (portsConnection.containsKey(patternTaskName)) { + if (splitComModel[1].equals(modelTaskPortName)) { + String[] portConnecMap = new String[3]; + portConnecMap[0] = patternTaskPortName; + portConnecMap[1] = modelTaskName; + portConnecMap[2] = modelTaskPortName; + portsConnection.get(patternTaskName).add(portConnecMap); + } else { + String[] portConnecMap = new String[4]; + portConnecMap[0] = patternTaskPortName; + portConnecMap[1] = modelTaskName; + portConnecMap[2] = modelTaskPortName; + portConnecMap[3] = JDialogPatternHandling.NEW_PORT_OPTION; + portsConnection.get(patternTaskName).add(portConnecMap); + } + } else { + if (splitComModel[1].equals(modelTaskPortName)) { + String[] portConnecMap = new String[3]; + portConnecMap[0] = patternTaskPortName; + portConnecMap[1] = modelTaskName; + portConnecMap[2] = modelTaskPortName; + ArrayList<String[]> portConnecMapList = new ArrayList<String[]>(); + portConnecMapList.add(portConnecMap); + portsConnection.put(patternTaskName, portConnecMapList); + } else { + String[] portConnecMap = new String[4]; + portConnecMap[0] = patternTaskPortName; + portConnecMap[1] = modelTaskName; + portConnecMap[2] = modelTaskPortName; + portConnecMap[3] = JDialogPatternHandling.NEW_PORT_OPTION; + ArrayList<String[]> portConnecMapList = new ArrayList<String[]>(); + portConnecMapList.add(portConnecMap); + portsConnection.put(patternTaskName, portConnecMapList); + } + } + } + } + + public void loadPortsConfig(Vector<String> portsConfigFull) { + for (String configuredPort : portsConfigFull) { + String[] configuredPortSplit = configuredPort.split(JDialogPatternHandling.TASK_CHANNEL_SEPARATOR); + String[] portConfigRemoveSplit = configuredPortSplit[1].split(JDialogPatternHandling.PORT_CONFIGURATION_SEPARATOR + JDialogPatternHandling.REMOVE_PORT_OPTION); + String[] portConfigMergeSplit = configuredPortSplit[1].split(JDialogPatternHandling.PORT_CONFIGURATION_SEPARATOR + JDialogPatternHandling.MERGE_PORT_OPTION); + if (portsConfig.containsKey(configuredPortSplit[0])) { + if (!configuredPortSplit[1].equals(portConfigRemoveSplit[0])) { + Entry<String,String> portConfig = new AbstractMap.SimpleEntry<>(portConfigRemoveSplit[0], ""); + portsConfig.get(configuredPortSplit[0]).add(portConfig); + } else if (portConfigMergeSplit.length > 1) { + Entry<String,String> portConfig = new AbstractMap.SimpleEntry<>(portConfigMergeSplit[0], portConfigMergeSplit[1]); + portsConfig.get(configuredPortSplit[0]).add(portConfig); + } + } else { + if (!configuredPortSplit[1].equals(portConfigRemoveSplit[0])) { + Entry<String,String> portConfig = new AbstractMap.SimpleEntry<>(portConfigRemoveSplit[0], ""); + portsConfig.put(configuredPortSplit[0], new ArrayList<Entry<String,String>>(Arrays.asList(portConfig))); + } else if (portConfigMergeSplit.length > 1) { + Entry<String,String> portConfig = new AbstractMap.SimpleEntry<>(portConfigMergeSplit[0], portConfigMergeSplit[1]); + portsConfig.put(configuredPortSplit[0], new ArrayList<Entry<String,String>>(Arrays.asList(portConfig))); + } + } + } + } + + public void loadMappedTasks(Vector<String> mappedTasks) { + for (String mappedTask : mappedTasks) { + String[] mappedTaskSplitSameHw = mappedTask.split(JDialogPatternHandling.MAP_TASK_IN_SAME_HW_SEPARATOR); + String[] mappedTaskSplitNewHw = mappedTask.split(JDialogPatternHandling.MAP_TASK_IN_NEW_HW_SEPARATOR); + if (mappedTaskSplitSameHw.length > 1) { + Entry<String,String> taskMap = new AbstractMap.SimpleEntry<>(JDialogPatternHandling.SAME_HW, mappedTaskSplitSameHw[1]); + tasksMapping.put(mappedTaskSplitSameHw[0], taskMap); + } else if (mappedTaskSplitNewHw.length > 1) { + Entry<String,String> taskMap = new AbstractMap.SimpleEntry<>(JDialogPatternHandling.NEW_HW, mappedTaskSplitNewHw[1]); + tasksMapping.put(mappedTaskSplitNewHw[0], taskMap); + } + } + } + + public void loadMappedChannels(Vector<String> mappedChannels) { + for (String mappedChannel : mappedChannels) { + String[] mappedChannelSplit= mappedChannel.split(JDialogPatternHandling.TASK_CHANNEL_SEPARATOR, 2); + String[] mappedChannelSplitSameMem = mappedChannelSplit[1].split(JDialogPatternHandling.MAP_CHANNEL_IN_SAME_MEMORY_SEPARATOR); + String[] mappedChannelSplitNewMem = mappedChannelSplit[1].split(JDialogPatternHandling.MAP_CHANNEL_IN_NEW_MEMORY_SEPARATOR); + if (channelsMapping.containsKey(mappedChannelSplit[0])) { + if (mappedChannelSplitSameMem.length > 1) { + String[] channelMap = new String[4]; + String[] mappedChannelSplitSameMemTaskChannel = mappedChannelSplitSameMem[1].split(JDialogPatternHandling.TASK_CHANNEL_SEPARATOR, 2); + channelMap[0] = JDialogPatternHandling.SAME_MEMORY; + channelMap[1] = mappedChannelSplitSameMem[0]; + channelMap[2] = mappedChannelSplitSameMemTaskChannel[0]; + channelMap[3] = mappedChannelSplitSameMemTaskChannel[1]; + channelsMapping.get(mappedChannelSplit[0]).add(channelMap); + } else if (mappedChannelSplitNewMem.length > 1) { + String[] channelMap = new String[3]; + channelMap[0] = JDialogPatternHandling.NEW_MEMORY; + channelMap[1] = mappedChannelSplitNewMem[0]; + channelMap[2] = mappedChannelSplitNewMem[1]; + channelsMapping.get(mappedChannelSplit[0]).add(channelMap); + } + } else { + if (mappedChannelSplitSameMem.length > 1) { + String[] channelMap = new String[4]; + String[] mappedChannelSplitSameMemTaskChannel = mappedChannelSplitSameMem[1].split(JDialogPatternHandling.TASK_CHANNEL_SEPARATOR, 2); + channelMap[0] = JDialogPatternHandling.SAME_MEMORY; + channelMap[1] = mappedChannelSplitSameMem[0]; + channelMap[2] = mappedChannelSplitSameMemTaskChannel[0]; + channelMap[3] = mappedChannelSplitSameMemTaskChannel[1]; + ArrayList<String[]> channelMapList = new ArrayList<String[]>(); + channelMapList.add(channelMap); + channelsMapping.put(mappedChannelSplit[0], channelMapList); + } else if (mappedChannelSplitNewMem.length > 1) { + String[] channelMap = new String[3]; + channelMap[0] = JDialogPatternHandling.NEW_MEMORY; + channelMap[1] = mappedChannelSplitNewMem[0]; + channelMap[2] = mappedChannelSplitNewMem[1]; + ArrayList<String[]> channelMapList = new ArrayList<String[]>(); + channelMapList.add(channelMap); + channelsMapping.put(mappedChannelSplit[0], channelMapList); + } + } + } + } + + public void loadClonedTasks(Vector<String> _clonedTasks) { + for (String clonedTask : _clonedTasks) { + String[] clonedTaskSplit = clonedTask.split(JDialogPatternHandling.CLONE_TASK_SEPARATOR); + if (clonedTaskSplit.length > 1) { + clonedTasks.put(clonedTaskSplit[0], clonedTaskSplit[1]); + } + } + }*/ +} diff --git a/src/main/java/tmltranslator/patternhandling/PatternConnection.java b/src/main/java/tmltranslator/patternhandling/PatternConnection.java new file mode 100644 index 0000000000000000000000000000000000000000..55591278a4b1f1699d78bd7bc5d5f29a9a94a6d4 --- /dev/null +++ b/src/main/java/tmltranslator/patternhandling/PatternConnection.java @@ -0,0 +1,155 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.patternhandling; +/** + * Class PatternConnection + * + * Creation: 25/10/2023 + * + * @author Jawher JERRAY + * @version 1.0 25/10/2023 + */ + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +import tmltranslator.*; + + +public class PatternConnection { + //public static final int NO_AUTHENTICITY = 0; + //public static final int WEAK_AUTHENTICITY = 1; + //public static final int STRONG_AUTHENTICITY = 2; + public final static String PORT_CONNECTION_SEPARATOR = " <-> "; + public final static String NEW_PORT_OPTION = " New port"; + public final static String TASK_CHANNEL_SEPARATOR = "::"; + + private String patternTaskName; + private String patternChannel; + private String modelTaskName; + private String modelChannelName; + private Boolean isNewPort; + + public PatternConnection(String patternTaskName, String patternChannel, String modelTaskName, String modelChannelName, Boolean isNewPort) { + this.patternTaskName = patternTaskName; + this.patternChannel = patternChannel; + this.modelTaskName = modelTaskName; + this.modelChannelName = modelChannelName; + this.isNewPort = isNewPort; + } + + public String getPatternTaskName() { + return patternTaskName; + } + + public String getPatternChannel() { + return patternChannel; + } + + public String getModelTaskName() { + return modelTaskName; + } + + public String getModelChannelName() { + return modelChannelName; + } + + public Boolean isNewPort() { + return isNewPort; + } + + public void setPatternTaskName(String _patternTaskName) { + patternTaskName = _patternTaskName; + } + + public void setPatternChannel(String _patternChannel) { + patternChannel = _patternChannel; + } + + public void setModelTaskName(String _modelTaskName) { + modelTaskName = _modelTaskName; + } + + public void setModelChannelName(String _modelChannelName) { + modelChannelName = _modelChannelName; + } + + public void setIsNewPort(Boolean _isNewPort) { + isNewPort = _isNewPort; + } + + public String getStringDisplay() { + if (isNewPort) { + return (patternTaskName + TASK_CHANNEL_SEPARATOR + patternChannel + PORT_CONNECTION_SEPARATOR + modelTaskName + TASK_CHANNEL_SEPARATOR+ modelChannelName + NEW_PORT_OPTION); + } else { + return (patternTaskName + TASK_CHANNEL_SEPARATOR + patternChannel + PORT_CONNECTION_SEPARATOR + modelTaskName + TASK_CHANNEL_SEPARATOR+ modelChannelName); + } + + } + + public boolean isANewChannelRequired(List<PatternConnection> patternConnectionList, LinkedHashMap<String, TaskPattern> patternTasks, List<PatternCloneTask> patternCloneTasks) { + if (this.isNewPort()) { + return true; + } else { + List<String> similarTasks = new ArrayList<String>(); + for (PatternCloneTask patternCloneTask : patternCloneTasks) { + if (patternCloneTask.getClonedTask().equals(this.getModelTaskName())) { + for (PatternCloneTask patternCloneTask0 : patternCloneTasks) { + if (patternCloneTask.getTaskToClone().equals(patternCloneTask0.getTaskToClone())) { + similarTasks.add(patternCloneTask0.getClonedTask()); + } + } + similarTasks.add(patternCloneTask.getTaskToClone()); + } + } + for (PatternConnection patternConnection: patternConnectionList) { + if (patternConnection != this && this.getModelChannelName().equals(patternConnection.getModelChannelName()) && !this.getModelTaskName().equals(patternConnection.getModelTaskName()) && !patternConnection.isNewPort() && !similarTasks.contains(patternConnection.getModelTaskName())) { + for (PortTaskJsonFile portTaskJsonFile : patternTasks.get(this.getPatternTaskName()).getExternalPorts()) { + if (this.getPatternChannel().equals(portTaskJsonFile.getName()) && portTaskJsonFile.getMode().equals(PatternCreation.MODE_OUTPUT)) { + return true; + } + } + } + } + } + return false; + } +} diff --git a/src/main/java/tmltranslator/patternhandling/PatternCreation.java b/src/main/java/tmltranslator/patternhandling/PatternCreation.java new file mode 100644 index 0000000000000000000000000000000000000000..71dca2d4fbbf2e11dd87ec28a87012628a5a89ab --- /dev/null +++ b/src/main/java/tmltranslator/patternhandling/PatternCreation.java @@ -0,0 +1,464 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.patternhandling; +/** + * Class PatternCreation + * Pattern Creation in separate thread + * Creation: 18/08/2023 + * + * @author Jawher JERRAY + * @version 1.0 18/08/2023 + */ + +import myutil.TraceManager; +import tmltranslator.*; + +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.*; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +public class PatternCreation implements Runnable { + public final static String MODE_INPUT = "input"; + public final static String MODE_OUTPUT = "output"; + public final static String CHANNEL = "channel"; + public final static String CONFIDENTIALITY = "confidentiality"; + public final static String WITHOUT_CONFIDENTIALITY = "No"; + public final static String WITH_CONFIDENTIALITY = "Yes"; + public final static String AUTHENTICITY = "authenticity"; + public final static String STRONG_AUTHENTICITY = "strong"; + public final static String WEAK_AUTHENTICITY = "weak"; + public final static String WITHOUT_AUTHENTICITY = "No"; + public final static String EVENT = "event"; + public final static String NAME = "name"; + public final static String TYPE = "type"; + public final static String MODE = "mode"; + public final static String TASK = "task"; + public final static String VALUE = "value"; + public final static String EXTERNALPORTS = "externalPorts"; + public final static String INTERNALPORTS = "internalPorts"; + public final static String ATTRIBUTES = "attributes"; + + private List<String> selectedTasks; + private String patternName; + private String patternsPath; + private TMLMapping<?> tmap; + + public PatternCreation(List<String> _selectedTasks, String _patternName, String _patternsPath, TMLMapping<?> tmap) { + this.selectedTasks = _selectedTasks; + this.patternName = _patternName; + this.patternsPath = _patternsPath; + this.tmap = tmap; + } + + public void startThread() { + Thread t = new Thread(this); + t.start(); + try { + t.join(); + } + catch (Exception e) { + TraceManager.addDev("Error in Pattern Creation Thread"); + } + return; + } + + public void run() { + TraceManager.addDev("Creating Pattern"); + if (tmap == null) { + return; + } + + TMLModeling<?> tmlmNew = tmap.getTMLModeling(); + for (TMLTask task : tmlmNew.getTasks()) { + String[] taskNameSplit = task.getName().split("__"); + task.setName(taskNameSplit[taskNameSplit.length-1]); + } + for (TMLChannel ch : tmlmNew.getChannels()) { + String[] channelNameSplit = ch.getName().split("__"); + ch.setName(channelNameSplit[channelNameSplit.length-1]); + } + for (TMLEvent evt : tmlmNew.getEvents()) { + String[] eventNameSplit = evt.getName().split("__"); + evt.setName(eventNameSplit[eventNameSplit.length-1]); + } + for (TMLRequest req : tmlmNew.getRequests()) { + String[] requestNameSplit = req.getName().split("__"); + req.setName(requestNameSplit[requestNameSplit.length-1]); + } + if (generateTMLTxt(patternName)) { + TraceManager.addDev("Done TML generation"); + if (generatePatternFile(patternName)) { + TraceManager.addDev("Done Pattern JSON File generation"); + } + } + + } + + @SuppressWarnings("unchecked") + public boolean generateTMLTxt(String _title) { + TMLMappingTextSpecification<Class<?>> spec = new TMLMappingTextSpecification<Class<?>>(_title); + spec.toTextFormat((TMLMapping<Class<?>>) tmap); + try { + String pathNewPattern = patternsPath + patternName + "/"; + Files.createDirectories(Paths.get(pathNewPattern)); + spec.saveFile(pathNewPattern, patternName); + } catch (Exception e) { + TraceManager.addError("Files could not be saved: " + e.getMessage()); + return false; + } + return true; + } + + public boolean generatePatternFile(String _title) { + List<TMLChannel> listExternalChannels = new ArrayList<TMLChannel>(); + List<TMLEvent> listExternalEvents = new ArrayList<TMLEvent>(); + JSONArray listTasks = new JSONArray(); + try { + FileWriter file = new FileWriter(patternsPath+patternName+"/"+patternName+".json"); + for (String selectedTask1 : selectedTasks) { + TMLTask task1 = tmap.getTMLModeling().getTMLTaskByName(selectedTask1); + if (task1 != null) { + JSONArray listAttributes = new JSONArray(); + JSONArray listExternalPorts = new JSONArray(); + JSONArray listInternalPorts = new JSONArray(); + JSONObject joTask = new JSONObject(); + joTask.put(NAME, task1.getName()); + for(TMLAttribute attrib : task1.getAttributes()) { + listAttributes.put(addAttributeInJsonFile(attrib)); + } + joTask.put(ATTRIBUTES, listAttributes); + for (int i=0; i < task1.getReadChannels().size(); i++) { + for (int j=0 ; j < task1.getReadChannels().get(i).getNbOfChannels(); j++) { + Boolean channelCheck = false; + TMLChannel ch = task1.getReadChannels().get(i).getChannel(j); + if (!listExternalChannels.contains(ch)) { + for (String selectedTask2 : selectedTasks) { + if (selectedTask1 != selectedTask2) { + TMLTask task2 = tmap.getTMLModeling().getTMLTaskByName(selectedTask2); + if (task2 != null) { + channelCheck = isWriteChannelOfTask(ch, task2); + if (channelCheck) { + break; + } + } + } + } + if (!channelCheck) { + listExternalPorts.put(addChannelInJsonFile(ch, task1, MODE_INPUT)); + listExternalChannels.add(ch); + } else { + listInternalPorts.put(addChannelInJsonFile(ch, task1, MODE_INPUT)); + } + } + } + } + + for (int i=0; i < task1.getWriteChannels().size(); i++) { + for (int j=0 ; j < task1.getWriteChannels().get(i).getNbOfChannels(); j++) { + Boolean channelCheck = false; + TMLChannel ch = task1.getWriteChannels().get(i).getChannel(j); + if (!listExternalChannels.contains(ch)) { + for (String selectedTask2 : selectedTasks) { + if (selectedTask1 != selectedTask2) { + TMLTask task2 = tmap.getTMLModeling().getTMLTaskByName(selectedTask2); + if (task2 != null) { + channelCheck = isReadChannelOfTask(ch, task2); + if (channelCheck) { + break; + } + } + } + } + if (!channelCheck) { + listExternalPorts.put(addChannelInJsonFile(ch, task1, MODE_OUTPUT)); + listExternalChannels.add(ch); + } else { + listInternalPorts.put(addChannelInJsonFile(ch, task1, MODE_OUTPUT)); + } + } + } + } + + for (int i=0; i < task1.getSendEvents().size(); i++) { + TMLEvent event = task1.getSendEvents().get(i).getEvent(); + Boolean eventCheck = false; + if(!listExternalEvents.contains(event)) { + for (String selectedTask2 : selectedTasks) { + if (selectedTask1 != selectedTask2) { + TMLTask task2 = tmap.getTMLModeling().getTMLTaskByName(selectedTask2); + if (task2 != null) { + eventCheck = isWaitEventOfTask(event, task2); + if (eventCheck) { + break; + } + } + } + } + if (!eventCheck) { + listExternalPorts.put(addEventInJsonFile(event, task1, MODE_OUTPUT)); + listExternalEvents.add(event); + } else { + listInternalPorts.put(addEventInJsonFile(event, task1, MODE_OUTPUT)); + } + if (task1.getSendEvents().get(i).getEvents() != null) { + for (int j=0 ; j < task1.getSendEvents().get(i).getEvents().size(); j++) { + eventCheck = false; + event = task1.getSendEvents().get(i).getEvents().get(j); + for (String selectedTask2 : selectedTasks) { + if (selectedTask1 != selectedTask2) { + TMLTask task2 = tmap.getTMLModeling().getTMLTaskByName(selectedTask2); + if (task2 != null) { + eventCheck = isWaitEventOfTask(event, task2); + if (eventCheck) { + break; + } + } + } + } + if (!eventCheck) { + listExternalPorts.put(addEventInJsonFile(event, task1, MODE_OUTPUT)); + listExternalEvents.add(event); + } else { + listInternalPorts.put(addEventInJsonFile(event, task1, MODE_OUTPUT)); + } + } + } + } + } + + + for (int i=0; i < task1.getWaitEvents().size(); i++) { + TMLEvent event = task1.getWaitEvents().get(i).getEvent(); + Boolean eventCheck = false; + if(!listExternalEvents.contains(event)) { + for (String selectedTask2 : selectedTasks) { + if (selectedTask1 != selectedTask2) { + TMLTask task2 = tmap.getTMLModeling().getTMLTaskByName(selectedTask2); + if (task2 != null) { + eventCheck = isSendEventOfTask(event, task2); + if (eventCheck) { + break; + } + } + } + } + if (!eventCheck) { + listExternalPorts.put(addEventInJsonFile(event, task1, MODE_INPUT)); + listExternalEvents.add(event); + } else { + listInternalPorts.put(addEventInJsonFile(event, task1, MODE_INPUT)); + } + if (task1.getWaitEvents().get(i).getEvents() != null) { + for (int j=0 ; j < task1.getWaitEvents().get(i).getEvents().size(); j++) { + eventCheck = false; + event = task1.getWaitEvents().get(i).getEvents().get(j); + for (String selectedTask2 : selectedTasks) { + if (selectedTask1 != selectedTask2) { + TMLTask task2 = tmap.getTMLModeling().getTMLTaskByName(selectedTask2); + if (task2 != null) { + eventCheck = isSendEventOfTask(event, task2); + if (eventCheck) { + break; + } + } + } + } + if (!eventCheck) { + listExternalPorts.put(addEventInJsonFile(event, task1, MODE_INPUT)); + listExternalEvents.add(event); + } else { + listInternalPorts.put(addEventInJsonFile(event, task1, MODE_INPUT)); + } + } + } + } + } + joTask.put(EXTERNALPORTS, listExternalPorts); + joTask.put(INTERNALPORTS, listInternalPorts); + listTasks.put(joTask); + } + } + file.write(listTasks.toString(1)); + file.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + /* + try { + + file.write(jo.toString()); + file.close(); + } catch (IOException e) { + e.printStackTrace(); + } */ + + return true; + } + + JSONObject addChannelInJsonFile(TMLChannel ch, TMLTask task, String mode) { + JSONObject jo = new JSONObject(); + try { + jo.put(NAME, ch.getName()); + jo.put(TASK, task.getName()); + jo.put(TYPE, CHANNEL); + jo.put(MODE, mode); + jo.put(CONFIDENTIALITY, WITHOUT_CONFIDENTIALITY); + jo.put(AUTHENTICITY, WITHOUT_AUTHENTICITY); + } catch (JSONException e) { + e.printStackTrace(); + } + return jo; + } + + JSONObject addEventInJsonFile(TMLEvent evt, TMLTask task, String mode) { + JSONObject jo = new JSONObject(); + try { + jo.put(NAME, evt.getName()); + jo.put(TASK, task.getName()); + jo.put(TYPE, EVENT); + jo.put(MODE, mode); + } catch (JSONException e) { + e.printStackTrace(); + } + /*try { + file.write(jo.toString()); + //file.close(); + } catch (IOException e) { + e.printStackTrace(); + }*/ + return jo; + } + + JSONObject addAttributeInJsonFile(TMLAttribute attrib) { + JSONObject jo = new JSONObject(); + try { + jo.put(NAME, attrib.getName()); + jo.put(TYPE, attrib.getType()); + jo.put(VALUE, attrib.getInitialValue()); + } catch (JSONException e) { + e.printStackTrace(); + } + return jo; + } + + + List<TMLChannel> getListChannelsBetweenTwoTasks(TMLTask originTask, TMLTask destinationTask) { + List<TMLChannel> channels = new ArrayList<TMLChannel>(); + if (originTask.getWriteChannels().size() > 0) { + for (int i=0; i < destinationTask.getReadChannels().size(); i++) { + for (int j=0 ; j < destinationTask.getReadChannels().get(i).getNbOfChannels(); j++) { + for (int k=0; k < originTask.getWriteChannels().size(); k++) { + for (int l=0; l < originTask.getWriteChannels().get(k).getNbOfChannels(); l++) { + if (originTask.getWriteChannels().get(k).getChannel(l) == destinationTask.getReadChannels().get(i).getChannel(j)) { + TMLChannel channel = destinationTask.getReadChannels().get(i).getChannel(j); + if (!channels.contains(channel)) { + channels.add(channel); + } + } + } + } + } + } + } + return channels; + } + + Boolean isReadChannelOfTask(TMLChannel channel, TMLTask destinationTask) { + for (int i=0; i < destinationTask.getReadChannels().size(); i++) { + for (int j=0 ; j < destinationTask.getReadChannels().get(i).getNbOfChannels(); j++) { + if (channel == destinationTask.getReadChannels().get(i).getChannel(j)) { + return true; + } + } + } + return false; + } + + Boolean isWriteChannelOfTask(TMLChannel channel, TMLTask originTask) { + for (int i=0; i < originTask.getWriteChannels().size(); i++) { + for (int j=0 ; j < originTask.getWriteChannels().get(i).getNbOfChannels(); j++) { + if (channel == originTask.getWriteChannels().get(i).getChannel(j)) { + return true; + } + } + } + return false; + } + + Boolean isSendEventOfTask(TMLEvent event, TMLTask originTask) { + for (int i=0; i < originTask.getSendEvents().size(); i++) { + if (event == originTask.getSendEvents().get(i).getEvent()) { + return true; + } + if (originTask.getSendEvents().get(i).getEvents() != null) { + for (int j=0 ; j < originTask.getSendEvents().get(i).getEvents().size(); j++) { + if (event == originTask.getSendEvents().get(i).getEvents().get(j)) { + return true; + } + } + } + } + return false; + } + + Boolean isWaitEventOfTask(TMLEvent event, TMLTask destinationTask) { + for (int i=0; i < destinationTask.getWaitEvents().size(); i++) { + if (event == destinationTask.getWaitEvents().get(i).getEvent()) { + return true; + } + if (destinationTask.getWaitEvents().get(i).getEvents() != null) { + for (int j=0 ; j < destinationTask.getWaitEvents().get(i).getEvents().size(); j++) { + if (event == destinationTask.getWaitEvents().get(i).getEvents().get(j)) { + return true; + } + } + } + } + return false; + } + +} diff --git a/src/main/java/tmltranslator/patternhandling/PatternIntegration.java b/src/main/java/tmltranslator/patternhandling/PatternIntegration.java new file mode 100644 index 0000000000000000000000000000000000000000..5f710b0c3414983612c1dab564322584441e5285 --- /dev/null +++ b/src/main/java/tmltranslator/patternhandling/PatternIntegration.java @@ -0,0 +1,1943 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.patternhandling; +/** + * Class PatternIntegration + * Pattern Integration in separate thread + * Creation: 28/08/2023 + * + * @author Jawher JERRAY + * @version 1.0 28/08/2023 + */ + +import myutil.FileUtils; +import myutil.TraceManager; +import tmltranslator.*; + +import java.io.File; +import java.util.*; +import java.util.Map.Entry; + + +public class PatternIntegration implements Runnable { + private String appTab; + private String patternPath; + private String patternName; + private PatternConfiguration patternConfiguration; + private LinkedHashMap<String, TaskPattern> patternTasks; + private TMLMapping<?> tmapModel; + private TMLMapping<?> tmapPattern; + + private HashMap<String, String> tasksClonedIntoModel = new HashMap<String, String>(); + private HashMap<Entry<String, String>, String> channelsClonedIntoModel = new HashMap<Entry<String, String>, String>(); + + private HashMap<String, String> tasksOfPatternIntoModel = new HashMap<String, String>(); + private HashMap<Entry<String, String>, String> channelsOfPatternIntoModel = new HashMap<Entry<String, String>, String>(); + + private HashMap<Entry<String, String>, String> renamedModelChannels = new HashMap<Entry<String, String>, String>(); + private HashMap<TMLTask, List<TMLActivityElement>> clonedTasksToRemElems = new HashMap<TMLTask, List<TMLActivityElement>>(); + + public PatternIntegration(String _appTab, String _patternPath, String _patternName, PatternConfiguration _patternConfiguration, LinkedHashMap<String, TaskPattern> _patternTasks, TMLMapping<?> _tmapModel) { + this.appTab = _appTab; + this.patternPath = _patternPath; + this.patternName = _patternName; + this.patternConfiguration = _patternConfiguration; + this.patternTasks = _patternTasks; + this.tmapModel = _tmapModel; + } + + public TMLMapping<?> startThread() { + Thread t = new Thread(this); + t.start(); + try { + t.join(); + } + catch (Exception e) { + TraceManager.addDev("Error in Pattern Integration Thread"); + } + return tmapModel; + } + + public void run() { + TraceManager.addDev("Integrating Pattern"); + if (tmapModel == null) { + return; + } + tmapModel = removePrefixNames(tmapModel); + tmapPattern = getTMLMappingOfPattern(patternPath, patternName); + tmapPattern = removePrefixNames(tmapPattern); + tmapModel = addClonedTask(tmapModel, patternConfiguration); + renamePatternTasksName(); + renamePatternChannelsName(); + tmapPattern = updatePatternTasksAttributes(tmapPattern, patternConfiguration.getUpdatedPatternAttributes()); + tmapModel = addPatternTasksInModel(tmapModel, tmapPattern, patternTasks); + tmapModel = addPatternInternalChannelsInModel(tmapModel, tmapPattern, patternTasks); + //tmapModel = addNewPortToTasks(tmapModel, patternConfiguration.getPortsConnection(), patternTasks); + tmapModel = makeConnectionBetweenPatternAndModel(tmapModel, tmapPattern, patternConfiguration.getPortsConnection(), patternTasks, patternConfiguration.getClonedTasks()); + tmapModel = configDisconnectedChannels(tmapModel, patternConfiguration.getPortsConfig()); + tmapModel = removeNotUsedChannelsInClonedTask(tmapModel, clonedTasksToRemElems); + tmapModel = mapTasksInArch(tmapModel, patternConfiguration.getTasksMapping()); + tmapModel = mapTasksInArchAuto(tmapModel, tmapPattern, patternConfiguration.getTasksMapping(), patternConfiguration, patternTasks); + tmapModel = mapChannelsInArch(tmapModel, patternConfiguration.getChannelsMapping()); + tmapModel = mapChannelsInArchAuto(tmapModel, tmapPattern, patternConfiguration.getTasksMapping(), patternConfiguration.getChannelsMapping(), patternConfiguration, patternTasks); + tmapModel = generateSecurityForChannels(tmapModel, tmapPattern, patternConfiguration, patternTasks, appTab); + tmapModel = putBackPrefixNames(tmapModel, appTab); + } + + public TMLMapping<?> addClonedTask(TMLMapping<?> _tmapModel, PatternConfiguration _patternConfiguration) { + TMLModeling<?> _tmlmModel = _tmapModel.getTMLModeling(); + for (PatternCloneTask patternCloneTask : _patternConfiguration.getClonedTasks()) { + try { + String clonedTask = patternCloneTask.getClonedTask(); + String taskToClone = patternCloneTask.getTaskToClone(); + TMLModeling<?> _tmlmModelClone = _tmlmModel.deepClone(); + TMLTask taskClone = _tmlmModelClone.getTMLTaskByName(taskToClone); + + if (taskClone != null) { + taskClone.setName(clonedTask); + if (_tmlmModel.getTMLTaskByName(taskClone.getName()) != null || tasksClonedIntoModel.containsValue(taskClone.getName()) || tasksOfPatternIntoModel.containsValue(taskClone.getName())) { + int indexTask = 0; + String taskNameWithIndex = taskClone.getName() + indexTask; + while (_tmlmModel.getTMLTaskByName(taskNameWithIndex) != null || tasksClonedIntoModel.containsValue(taskNameWithIndex) || tasksOfPatternIntoModel.containsValue(taskNameWithIndex)) { + indexTask += 1; + taskNameWithIndex= taskClone.getName() + indexTask; + } + taskClone.setName(taskNameWithIndex); + tasksClonedIntoModel.put(clonedTask, taskNameWithIndex); + } else { + tasksClonedIntoModel.put(clonedTask, clonedTask); + } + //List<String> usedChannelsOfClonedTask = new ArrayList<String>(); + //Map<String, String> oldNewChannelsClonedTaskName = new HashMap<String, String>(); + //Map<String, String> oldNewEventsClonedTaskName = new HashMap<String, String>(); + List<TMLActivityElement> aeElemsToRemove = new ArrayList<TMLActivityElement>(); + for (PatternConnection patternConnection : _patternConfiguration.getPortsConnection()) { + if (patternConnection.getModelTaskName().equals(clonedTask) && !patternConnection.isNewPort()) { + String modelChannelName = patternConnection.getModelChannelName(); + if (_tmlmModel.getChannelByName(modelChannelName) != null) { + int indexChannel = 0; + String channelNameWithIndex = modelChannelName + indexChannel; + while (_tmlmModel.getChannelByName(channelNameWithIndex) != null || channelsClonedIntoModel.containsValue(channelNameWithIndex) || channelsOfPatternIntoModel.containsValue(channelNameWithIndex)) { + indexChannel += 1; + channelNameWithIndex = modelChannelName + indexChannel; + } + //oldNewChannelsClonedTaskName.put(modelChannelName, channelNameWithIndex); + //TraceManager.addDev("Channel : old =" + modelChannelName + " New=" + channelNameWithIndex); + //patternConnection.setModelChannelName(channelNameWithIndex); + channelsClonedIntoModel.put(Map.entry(clonedTask, modelChannelName), channelNameWithIndex); + } else if (_tmlmModel.getEventByName(modelChannelName) != null) { + int indexEvent = 0; + String eventNameWithIndex = modelChannelName + indexEvent; + while (_tmlmModel.getEventByName(eventNameWithIndex) != null || channelsClonedIntoModel.containsValue(eventNameWithIndex) || channelsOfPatternIntoModel.containsValue(eventNameWithIndex)) { + indexEvent += 1; + eventNameWithIndex = modelChannelName + indexEvent; + } + //oldNewEventsClonedTaskName.put(modelChannelName, eventNameWithIndex); + //patternConnection.setModelChannelName(eventNameWithIndex); + channelsClonedIntoModel.put(Map.entry(clonedTask, modelChannelName), eventNameWithIndex); + } else if (channelsClonedIntoModel.containsValue(modelChannelName) || channelsOfPatternIntoModel.containsValue(modelChannelName)){ + int index = 0; + String nameWithIndex = modelChannelName + index; + while (channelsClonedIntoModel.containsValue(nameWithIndex) || channelsOfPatternIntoModel.containsValue(nameWithIndex)) { + index += 1; + nameWithIndex = modelChannelName + index; + } + channelsClonedIntoModel.put(Map.entry(clonedTask, modelChannelName), nameWithIndex); + } else { + channelsClonedIntoModel.put(Map.entry(clonedTask, modelChannelName), modelChannelName); + } + } else if (patternConnection.getModelTaskName().equals(clonedTask) && patternConnection.isNewPort()) { + + } + } + /*for (MappingPatternChannel mappingPatternChannel : _patternConfiguration.getChannelsMapping()) { + //for (String[] st : _patternConfiguration.getChannelsMapping().get(taskOfChannelToMap)) { + if (mappingPatternChannel.getTaskOfChannelToMap().equals(clonedTask)) { + if (oldNewChannelsClonedTaskName.keySet().contains(st[1])) { + st[1] = oldNewChannelsClonedTaskName.get(st[1]); + } else if (oldNewEventsClonedTaskName.keySet().contains(st[1])) { + st[1] = oldNewEventsClonedTaskName.get(st[1]); + } + } + if (st.length == 4) { + if (st[2].equals(clonedTask)) { + if (oldNewChannelsClonedTaskName.keySet().contains(st[3])) { + st[3] = oldNewChannelsClonedTaskName.get(st[3]); + } else if (oldNewEventsClonedTaskName.keySet().contains(st[3])) { + st[3] = oldNewEventsClonedTaskName.get(st[3]); + } + } + } + //} + }*/ + for (TMLActivityElement ae : taskClone.getActivityDiagram().getElements()) { + if (ae instanceof TMLActivityElementChannel) { + TMLActivityElementChannel aeChannel = (TMLActivityElementChannel) ae; + for (int i=0; i < aeChannel.getNbOfChannels(); i++) { + if (channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeChannel.getChannel(i).getName())) == null) { + //TMLActivityElement prevElem = taskClone.getActivityDiagram().getPrevious(ae); + //prevElem.setNewNext(ae, ae.getNextElement(0)); + aeElemsToRemove.add(ae); + } else { + + for (TMLPort port : aeChannel.getChannel(i).getOriginPorts()) { + port.setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeChannel.getChannel(i).getName()))); + } + for (TMLPort port : aeChannel.getChannel(i).getDestinationPorts()) { + port.setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeChannel.getChannel(i).getName()))); + } + if (aeChannel.getChannel(i).getOriginPort() != null) { + aeChannel.getChannel(i).getOriginPort().setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeChannel.getChannel(i).getName()))); + //TraceManager.addDev("Port Origin New Name = " + aeChannel.getChannel(i).getOriginPort().getName()); + } + if (aeChannel.getChannel(i).getDestinationPort() != null) { + aeChannel.getChannel(i).getDestinationPort().setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeChannel.getChannel(i).getName()))); + } + //TraceManager.addDev("Name Channel Clone Before =" + aeChannel.getChannel(i).getName()); + aeChannel.getChannel(i).setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeChannel.getChannel(i).getName()))); + //TraceManager.addDev("Name Channel Clone After =" + aeChannel.getChannel(i).getName()); + if (_tmlmModel.getChannelByName(aeChannel.getChannel(i).getName()) == null) { + _tmlmModel.addChannel(aeChannel.getChannel(i)); + //channelsFromClonedToMap.add(aeChannel.getChannel(i)); + } + } + } + } else if (ae instanceof TMLActivityElementEvent) { + TMLActivityElementEvent aeEvent = (TMLActivityElementEvent) ae; + //if (!oldNewEventsClonedTaskName.keySet().contains(aeEvent.getEvent().getName())) { + if (channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeEvent.getEvent().getName())) == null) { + //TMLActivityElement prevElem = taskClone.getActivityDiagram().getPrevious(ae); + //prevElem.setNewNext(ae, ae.getNextElement(0)); + aeElemsToRemove.add(ae); + } else { + + for (TMLPort port : aeEvent.getEvent().getOriginPorts()) { + port.setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeEvent.getEvent().getName()))); + } + for (TMLPort port : aeEvent.getEvent().getDestinationPorts()) { + port.setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeEvent.getEvent().getName()))); + } + if (aeEvent.getEvent().getOriginPort() != null) { + aeEvent.getEvent().getOriginPort().setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeEvent.getEvent().getName()))); + } + if (aeEvent.getEvent().getDestinationPort() != null) { + aeEvent.getEvent().getDestinationPort().setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeEvent.getEvent().getName()))); + } + aeEvent.getEvent().setName(channelsClonedIntoModel.get(Map.entry(taskClone.getName(), aeEvent.getEvent().getName()))); + if (_tmlmModel.getEventByName(aeEvent.getEvent().getName()) == null) { + _tmlmModel.addEvent(aeEvent.getEvent()); + } + } + } + } + /*for (TMLActivityElement ae : aeElemsToRemove) { + taskClone.getActivityDiagram().removeElement(ae); + }*/ + clonedTasksToRemElems.put(taskClone, aeElemsToRemove); + _tmlmModel.addTask(taskClone); + } + } catch (TMLCheckingError err) { + + } + } + return _tmapModel; + } + + public TMLMapping<?> removeNotUsedChannelsInClonedTask(TMLMapping<?> _tmapModel, HashMap<TMLTask, List<TMLActivityElement>> _clonedTaskToRemoveElems) { + for (TMLTask taskClone : _clonedTaskToRemoveElems.keySet()) { + //TraceManager.addDev("removeNotUsed: taskClone=" + taskClone.getName()); + List<TMLActivityElement> _aeElemsToRemove = _clonedTaskToRemoveElems.get(taskClone); + for (TMLActivityElement ae : _aeElemsToRemove) { + TMLActivityElement prevElem = taskClone.getActivityDiagram().getPrevious(ae); + prevElem.setNewNext(ae, ae.getNextElement(0)); + } + for (TMLActivityElement ae : _aeElemsToRemove) { + taskClone.getActivityDiagram().removeElement(ae); + } + } + return _tmapModel; + } + + public void renamePatternTasksName() { + TMLModeling<?> tmlmModel = tmapModel.getTMLModeling(); + //TMLModeling<?> tmlmPattern = tmapPattern.getTMLModeling(); + String[] patternTasksKeys = patternTasks.keySet().toArray(new String[patternTasks.keySet().size()]); + //List<String> newTasksNames = new ArrayList<String>(); + //for (int i = 0; i < patternTasks.keySet().size(); i++) { + for (String taskName : patternTasksKeys) { + //String taskName = patternTasksKeys[i]; + if (tmlmModel.getTMLTaskByName(taskName) != null || tasksOfPatternIntoModel.containsValue(taskName) || tasksClonedIntoModel.containsValue(taskName)) { + int indexTask = 0; + String taskNameWithIndex = taskName + indexTask; + while (tmlmModel.getTMLTaskByName(taskNameWithIndex) != null || tasksOfPatternIntoModel.containsValue(taskNameWithIndex) || tasksClonedIntoModel.containsValue(taskNameWithIndex)) { + indexTask += 1; + taskNameWithIndex= taskName + indexTask; + } + tasksOfPatternIntoModel.put(taskName, taskNameWithIndex); + /*TMLTask taskPattern = tmlmPattern.getTMLTaskByName(taskName); + taskPattern.setName(taskNameWithIndex); + if (patternConfiguration.getPortsConnection().containsKey(taskName)) { + patternConfiguration.getPortsConnection().put(taskNameWithIndex, patternConfiguration.getPortsConnection().remove(taskName)); + } + if (patternConfiguration.getTasksMapping().containsKey(taskName)) { + patternConfiguration.getTasksMapping().put(taskNameWithIndex, patternConfiguration.getTasksMapping().remove(taskName)); + } + if (patternConfiguration.getChannelsMapping().containsKey(taskName)) { + patternConfiguration.getChannelsMapping().put(taskNameWithIndex, patternConfiguration.getChannelsMapping().remove(taskName)); + } + if (patternConfiguration.getUpdatedPatternAttributes().containsKey(taskName)) { + patternConfiguration.getUpdatedPatternAttributes().put(taskNameWithIndex, patternConfiguration.getUpdatedPatternAttributes().remove(taskName)); + } + if (patternConfiguration.getChannelsWithSecurity().containsKey(taskName)) { + patternConfiguration.getChannelsWithSecurity().put(taskNameWithIndex, patternConfiguration.getChannelsWithSecurity().remove(taskName)); + } + if (patternTasks.containsKey(taskName)) { + patternTasks.put(taskNameWithIndex, patternTasks.remove(taskName)); + }*/ + + } else { + tasksOfPatternIntoModel.put(taskName, taskName); + } + } + } + + public void renamePatternChannelsName() { + TMLModeling<?> tmlmModel = tmapModel.getTMLModeling(); + //Map<String, String> oldNewChannelName = new HashMap<String,String>(); + //Map<String, String> oldNewEventName = new HashMap<String,String>(); + for (String taskName : patternTasks.keySet()) { + TaskPattern tp = patternTasks.get(taskName); + for (int i = 0 ; i < tp.getInternalPorts().size() ; i++) { + PortTaskJsonFile extPort = tp.getInternalPorts().get(i); + if (extPort.getMode().equals(PatternCreation.MODE_OUTPUT)) { + if (tmlmModel.getChannelByName(extPort.getName()) != null) { + int indexChannel = 0; + String channelNameWithIndex = extPort.getName() + indexChannel; + while (tmlmModel.getChannelByName(channelNameWithIndex) != null || channelsOfPatternIntoModel.containsValue(channelNameWithIndex) || channelsClonedIntoModel.containsValue(channelNameWithIndex)) { + indexChannel += 1; + channelNameWithIndex= extPort.getName() + indexChannel; + } + /*TMLChannel channelPattern = tmlmPattern.getChannelByName(extPort.name); + oldNewChannelName.put(extPort.name, channelNameWithIndex); + channelPattern.setName(channelNameWithIndex); + if (patternConfiguration.getChannelsMapping().containsKey(taskName)) { + for (String[] cm : patternConfiguration.getChannelsMapping().get(taskName)) { + if (cm[0].equals(extPort.name)) { + cm[0] = channelNameWithIndex; + } + } + } + if (patternConfiguration.getChannelsWithSecurity().containsKey(taskName)) { + for (PortTaskJsonFile portTask : patternConfiguration.getChannelsWithSecurity().get(taskName)) { + if (portTask.getName().equals(extPort.name)) { + portTask.name = channelNameWithIndex; + } + } + } + extPort.name = channelNameWithIndex;*/ + channelsOfPatternIntoModel.put(Map.entry(taskName, extPort.getName()), channelNameWithIndex); + + } else if (tmlmModel.getEventByName(extPort.getName()) != null) { + int indexEvent = 0; + String eventNameWithIndex = extPort.getName() + indexEvent; + while (tmlmModel.getEventByName(eventNameWithIndex) != null || channelsOfPatternIntoModel.containsValue(eventNameWithIndex) || channelsClonedIntoModel.containsValue(eventNameWithIndex)) { + indexEvent += 1; + eventNameWithIndex= extPort.getName() + indexEvent; + } + /*TMLEvent eventPattern = tmlmPattern.getEventByName(extPort.name); + oldNewEventName.put(extPort.name, eventNameWithIndex); + eventPattern.setName(eventNameWithIndex); + extPort.name = eventNameWithIndex;*/ + channelsOfPatternIntoModel.put(Map.entry(taskName, extPort.getName()), eventNameWithIndex); + } else if (channelsOfPatternIntoModel.containsValue(extPort.getName()) || channelsClonedIntoModel.containsValue(extPort.getName())) { + int index = 0; + String nameWithIndex = extPort.getName() + index; + while (channelsOfPatternIntoModel.containsValue(nameWithIndex) || channelsClonedIntoModel.containsValue(nameWithIndex)) { + index += 1; + nameWithIndex= extPort.getName() + index; + } + channelsOfPatternIntoModel.put(Map.entry(taskName, extPort.getName()), nameWithIndex); + } else { + channelsOfPatternIntoModel.put(Map.entry(taskName, extPort.getName()), extPort.getName()); + } + } + } + } + for (PatternConnection patternConnection : patternConfiguration.getPortsConnection()) { + if (patternConnection.isANewChannelRequired(patternConfiguration.getPortsConnection(), patternTasks, patternConfiguration.getClonedTasks())) { + if (tmlmModel.getChannelByName(patternConnection.getPatternChannel()) != null) { + int indexChannel = 0; + String channelNameWithIndex = patternConnection.getPatternChannel() + indexChannel; + while (tmlmModel.getChannelByName(channelNameWithIndex) != null || channelsOfPatternIntoModel.containsValue(channelNameWithIndex) || channelsClonedIntoModel.containsValue(channelNameWithIndex)) { + indexChannel += 1; + channelNameWithIndex= patternConnection.getPatternChannel() + indexChannel; + } + channelsOfPatternIntoModel.put(Map.entry(patternConnection.getPatternTaskName(), patternConnection.getPatternChannel()), channelNameWithIndex); + + } else if (tmlmModel.getEventByName(patternConnection.getPatternChannel()) != null) { + int indexEvent = 0; + String eventNameWithIndex = patternConnection.getPatternChannel() + indexEvent; + while (tmlmModel.getEventByName(eventNameWithIndex) != null || channelsOfPatternIntoModel.containsValue(eventNameWithIndex) || channelsClonedIntoModel.containsValue(eventNameWithIndex)) { + indexEvent += 1; + eventNameWithIndex= patternConnection.getPatternChannel() + indexEvent; + } + channelsOfPatternIntoModel.put(Map.entry(patternConnection.getPatternTaskName(), patternConnection.getPatternChannel()), eventNameWithIndex); + } else if (channelsOfPatternIntoModel.containsValue(patternConnection.getPatternChannel()) || channelsClonedIntoModel.containsValue(patternConnection.getPatternChannel())) { + int index = 0; + String nameWithIndex = patternConnection.getPatternChannel() + index; + while (channelsOfPatternIntoModel.containsValue(nameWithIndex) || channelsClonedIntoModel.containsValue(nameWithIndex)) { + index += 1; + nameWithIndex= patternConnection.getPatternChannel() + index; + } + channelsOfPatternIntoModel.put(Map.entry(patternConnection.getPatternTaskName(), patternConnection.getPatternChannel()), nameWithIndex); + } else { + channelsOfPatternIntoModel.put(Map.entry(patternConnection.getPatternTaskName(), patternConnection.getPatternChannel()), patternConnection.getPatternChannel()); + } + } + } + } + + public TMLMapping<?> updatePatternTasksAttributes(TMLMapping<?> _tmapPattern, LinkedHashMap<String, List<AttributeTaskJsonFile>> _updatedPatternAttributes) { + TMLModeling<?> _tmlmPattern = _tmapPattern.getTMLModeling(); + for (String taskName : _updatedPatternAttributes.keySet()) { + TMLTask taskPattern = _tmlmPattern.getTMLTaskByName(taskName); + if (taskPattern != null) { + for (int i = 0; i < _updatedPatternAttributes.get(taskName).size(); i++) { + TMLAttribute attribTaskPattern = taskPattern.getAttributeByName(_updatedPatternAttributes.get(taskName).get(i).getName()); + attribTaskPattern.initialValue = _updatedPatternAttributes.get(taskName).get(i).getValue(); + } + } + } + return _tmapPattern; + } + + public TMLMapping<?> addPatternTasksInModel(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, LinkedHashMap<String, TaskPattern> _patternTasks) { + TMLModeling<?> _tmlmModel = _tmapModel.getTMLModeling(); + TMLModeling<?> _tmlmPattern = _tmapPattern.getTMLModeling(); + try { + TMLModeling<?> _tmlmPatternClone = _tmlmPattern.deepClone(); + for (String taskName : _patternTasks.keySet()) { + TMLTask taskPattern = _tmlmPatternClone.getTMLTaskByName(taskName); + if (taskPattern != null) { + if (_tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(taskName)) == null) { + taskPattern.setName(tasksOfPatternIntoModel.get(taskName)); + _tmlmModel.addTask(taskPattern); + } + } + } + } catch (TMLCheckingError err) { + + } + return _tmapModel; + } + + public TMLMapping<?> addPatternInternalChannelsInModel(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, LinkedHashMap<String, TaskPattern> _patternTasks) { + TMLModeling<?> _tmlmModel = _tmapModel.getTMLModeling(); + TMLModeling<?> _tmlmPattern = _tmapPattern.getTMLModeling(); + try { + TMLModeling<?> _tmlmPatternClone = _tmlmPattern.deepClone(); + for (String taskName : _patternTasks.keySet()) { + for (PortTaskJsonFile portTask : _patternTasks.get(taskName).getInternalPorts()) { + TMLChannel channelPattern = _tmlmPatternClone.getChannelByName(portTask.getName()); + TMLEvent eventPattern = _tmlmPatternClone.getEventByName(portTask.getName()); + if (portTask.getMode().equals(PatternCreation.MODE_OUTPUT)) { + if (channelPattern != null) { + if (_tmlmModel.getChannelByName(channelsOfPatternIntoModel.get(Map.entry(taskName, portTask.getName()))) == null) { + channelPattern.setName(channelsOfPatternIntoModel.get(Map.entry(taskName, portTask.getName()))); + channelPattern.setTasks(_tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(channelPattern.getOriginTask().getName())), _tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(channelPattern.getDestinationTask().getName()))); + channelPattern.setPorts(new TMLPort(channelPattern.getName(), channelPattern.getReferenceObject()), new TMLPort(channelPattern.getName(), channelPattern.getReferenceObject())); + _tmlmModel.addChannel(channelPattern); + for (TMLActivityElement elem : channelPattern.getDestinationTask().getActivityDiagram().getElements()) { + if (elem instanceof TMLActivityElementChannel) { + TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) elem; + for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { + if (acElemChannel.getChannel(indexChannel).getName().equals(portTask.getName())) { + acElemChannel.replaceChannelWith(acElemChannel.getChannel(indexChannel), channelPattern); + } + } + } + } + for (TMLActivityElement elem : channelPattern.getOriginTask().getActivityDiagram().getElements()) { + if (elem instanceof TMLActivityElementChannel) { + TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) elem; + for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { + if (acElemChannel.getChannel(indexChannel).getName().equals(portTask.getName())) { + acElemChannel.replaceChannelWith(acElemChannel.getChannel(indexChannel), channelPattern); + } + } + } + } + //channelsFromPatternToMap.add(channelPattern); + } + } else if (eventPattern != null) { + if (_tmlmModel.getEventByName(channelsOfPatternIntoModel.get(Map.entry(taskName, portTask.getName()))) == null) { + eventPattern.setName(channelsOfPatternIntoModel.get(Map.entry(taskName, portTask.getName()))); + eventPattern.setTasks(_tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(eventPattern.getOriginTask().getName())), _tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(eventPattern.getDestinationTask().getName()))); + eventPattern.setPorts(new TMLPort(eventPattern.getName(), eventPattern.getReferenceObject()), new TMLPort(eventPattern.getName(), eventPattern.getReferenceObject())); + _tmlmModel.addEvent(eventPattern); + for (TMLActivityElement elem : eventPattern.getDestinationTask().getActivityDiagram().getElements()) { + if (elem instanceof TMLActivityElementEvent) { + TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) elem; + if (acElemEvent.getEvent().getName().equals(portTask.getName())) { + acElemEvent.replaceEventWith(acElemEvent.getEvent(), eventPattern); + } + } + } + for (TMLActivityElement elem : eventPattern.getOriginTask().getActivityDiagram().getElements()) { + if (elem instanceof TMLActivityElementEvent) { + TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) elem; + if (acElemEvent.getEvent().getName().equals(portTask.getName())) { + acElemEvent.replaceEventWith(acElemEvent.getEvent(), eventPattern); + } + } + } + } + } + } + } + } + } catch (TMLCheckingError err) { + + } + return _tmapModel; + } + + /*public TMLMapping<?> updatePatternTasksAttributes(TMLMapping<?> _tmapPattern, LinkedHashMap<String, TaskPattern> _patternTasks) { + TMLModeling<?> _tmlmPattern = _tmapPattern.getTMLModeling(); + for (String taskName : _patternTasks.keySet()) { + TMLTask taskPattern = _tmlmPattern.getTMLTaskByName(taskName); + if (taskPattern != null) { + for (int i=0; i < _patternTasks.get(taskName).getAttributes().size(); i++) { + TMLAttribute attribTaskPattern = taskPattern.getAttributeByName(_patternTasks.get(taskName).getAttributes().get(i).getName()); + attribTaskPattern.initialValue = _patternTasks.get(taskName).getAttributes().get(i).getValue(); + } + } + } + return _tmapPattern; + }*/ + + + public TMLMapping<?> addNewPortToATask(TMLMapping<?> _tmapModel, LinkedHashMap<String, TaskPattern> _patternTasks, TMLTask _taskToAddPort, String _patternTaskName, String _portPatternName, String _portTolink) { + TMLModeling<?> _tmlmModel = _tmapModel.getTMLModeling(); + TaskPattern tp = _patternTasks.get(_patternTaskName); + TMLActivity adTaskToAddPort = _taskToAddPort.getActivityDiagram(); + List<TMLActivityElement> actElemsToAdd = new ArrayList<TMLActivityElement>(); + TMLChannel channelInModel = _tmlmModel.getChannelByName(channelsOfPatternIntoModel.get(Map.entry(_patternTaskName, _portPatternName))); + TMLEvent eventInModel = _tmlmModel.getEventByName(channelsOfPatternIntoModel.get(Map.entry(_patternTaskName, _portPatternName))); + for (PortTaskJsonFile pTaskJson : tp.getExternalPorts()) { + if (pTaskJson.getName().equals(_portPatternName)) { + if (pTaskJson.getMode().equals(PatternCreation.MODE_INPUT)) { + if (pTaskJson.getType().equals(PatternCreation.CHANNEL)) { + _taskToAddPort.addWriteTMLChannel(channelInModel); + for (TMLActivityElement acElem : adTaskToAddPort.getElements()) { + if (acElem instanceof TMLActivityElementChannel) { + TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) acElem; + for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { + if (acElemChannel.getChannel(indexChannel).getName().equals(_portTolink)) { + TMLActivityElement prevElem = adTaskToAddPort.getPrevious(acElem); + TMLWriteChannel wrChannel = new TMLWriteChannel(channelInModel.getName(), adTaskToAddPort.getReferenceObject()); + wrChannel.setNbOfSamples("1"); /// TO UPDATE + wrChannel.addChannel(channelInModel); + wrChannel.addNext(acElem); + prevElem.setNewNext(acElem, wrChannel); + //adTaskToAddPort.addElement(wrChannel); + actElemsToAdd.add(wrChannel); + } + } + } else if (acElem instanceof TMLActivityElementEvent) { + TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) acElem; + if (acElemEvent.getEvent().getName().equals(_portTolink)) { + TMLActivityElement prevElem = adTaskToAddPort.getPrevious(acElem); + TMLWriteChannel wrChannel = new TMLWriteChannel(channelInModel.getName(), adTaskToAddPort.getReferenceObject()); + wrChannel.setNbOfSamples("1"); /// TO UPDATE + wrChannel.addChannel(channelInModel); + wrChannel.addNext(acElem); + prevElem.setNewNext(acElem, wrChannel); + //adTaskToAddPort.addElement(wrChannel); + actElemsToAdd.add(wrChannel); + } + } + } + } else if (pTaskJson.getType().equals(PatternCreation.EVENT)) { + _taskToAddPort.addTMLEvent(eventInModel); + eventInModel.setOriginTask(_taskToAddPort); + for (TMLActivityElement acElem : adTaskToAddPort.getElements()) { + if (acElem instanceof TMLActivityElementEvent) { + TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) acElem; + if (acElemEvent.getEvent().getName().equals(_portTolink)) { + TMLActivityElement prevElem = adTaskToAddPort.getPrevious(acElem); + TMLSendEvent sdEvent = new TMLSendEvent(eventInModel.getName(), adTaskToAddPort.getReferenceObject()); + sdEvent.setEvent(eventInModel); + for (TMLWaitEvent we : eventInModel.getDestinationTask().getWaitEvents()) { + if (we.getEvent().getName().equals(eventInModel.getName())) { + for (String param : we.getVectorAllParams()) { + if (param.matches("-?\\d+") || param.matches("(?i)^(true|false)")) { + sdEvent.addParam(param); + } else { + sdEvent.addParam(param); + if (_taskToAddPort.getAttributeByName(param) == null) { + _taskToAddPort.addAttribute(eventInModel.getDestinationTask().getAttributeByName(param).deepClone(_tmlmModel)); + } + } + + } + } + } + sdEvent.addNext(acElem); + prevElem.setNewNext(acElem, sdEvent); + //adTaskToAddPort.addElement(sdEvent); + actElemsToAdd.add(sdEvent); + } + } else if (acElem instanceof TMLActivityElementChannel) { + TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) acElem; + for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { + if (acElemChannel.getChannel(indexChannel).getName().equals(_portTolink)) { + TMLActivityElement prevElem = adTaskToAddPort.getPrevious(acElem); + TMLSendEvent sdEvent = new TMLSendEvent(eventInModel.getName(), adTaskToAddPort.getReferenceObject()); + sdEvent.setEvent(eventInModel); + for (TMLWaitEvent we : eventInModel.getDestinationTask().getWaitEvents()) { + if (we.getEvent().getName().equals(eventInModel.getName())) { + for (String param : we.getVectorAllParams()) { + if (param.matches("-?\\d+") || param.matches("(?i)^(true|false)")) { + sdEvent.addParam(param); + } else { + sdEvent.addParam(param); + if (_taskToAddPort.getAttributeByName(param) == null) { + _taskToAddPort.addAttribute(eventInModel.getDestinationTask().getAttributeByName(param).deepClone(_tmlmModel)); + } + } + + } + } + } + sdEvent.addNext(acElem); + prevElem.setNewNext(acElem, sdEvent); + //adTaskToAddPort.addElement(sdEvent); + actElemsToAdd.add(sdEvent); + } + } + } + } + } + } else if (pTaskJson.getMode().equals(PatternCreation.MODE_OUTPUT)) { + if (pTaskJson.getType().equals(PatternCreation.CHANNEL)) { + _taskToAddPort.addReadTMLChannel(channelInModel); + for (TMLActivityElement acElem : adTaskToAddPort.getElements()) { + if (acElem instanceof TMLActivityElementChannel) { + TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) acElem; + for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { + if (acElemChannel.getChannel(indexChannel).getName().equals(_portTolink)) { + TMLActivityElement prevElem = adTaskToAddPort.getPrevious(acElem); + TMLReadChannel rdChannel = new TMLReadChannel(channelInModel.getName(), adTaskToAddPort.getReferenceObject()); + rdChannel.setNbOfSamples("1"); /// TO UPDATE + rdChannel.addChannel(channelInModel); + rdChannel.addNext(acElem); + prevElem.setNewNext(acElem, rdChannel); + //adTaskToAddPort.addElement(rdChannel); + actElemsToAdd.add(rdChannel); + } + } + } else if (acElem instanceof TMLActivityElementEvent) { + TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) acElem; + if (acElemEvent.getEvent().getName().equals(_portTolink)) { + TMLActivityElement prevElem = adTaskToAddPort.getPrevious(acElem); + TMLReadChannel rdChannel = new TMLReadChannel(channelInModel.getName(), adTaskToAddPort.getReferenceObject()); + rdChannel.setNbOfSamples("1"); /// TO UPDATE + rdChannel.addChannel(channelInModel); + rdChannel.addNext(acElem); + prevElem.setNewNext(acElem, rdChannel); + //adTaskToAddPort.addElement(rdChannel); + actElemsToAdd.add(rdChannel); + } + } + } + } else if (pTaskJson.getType().equals(PatternCreation.EVENT)) { + _taskToAddPort.addTMLEvent(eventInModel); + eventInModel.setDestinationTask(_taskToAddPort); + for (TMLActivityElement acElem : adTaskToAddPort.getElements()) { + if (acElem instanceof TMLActivityElementEvent) { + TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) acElem; + if (acElemEvent.getEvent().getName().equals(_portTolink)) { + TMLActivityElement prevElem = adTaskToAddPort.getPrevious(acElem); + TMLWaitEvent wtEvent = new TMLWaitEvent(eventInModel.getName(), adTaskToAddPort.getReferenceObject()); + wtEvent.setEvent(eventInModel); + for (TMLSendEvent sd : eventInModel.getOriginTask().getSendEvents()) { + if (sd.getEvent().getName().equals(eventInModel.getName())) { + for (int indexParam=0; indexParam < sd.getNbOfParams(); indexParam++) { + String param = sd.getParam(indexParam); + if (param.matches("-?\\d+") || param.matches("(?i)^(true|false)")) { + String paramName = eventInModel.getName()+indexParam; + if (_taskToAddPort.getAttributeByName(paramName) == null) { + TMLAttribute attribParam = new TMLAttribute(paramName, eventInModel.getParams().get(indexParam).deepClone(_tmlmModel), ""); + _taskToAddPort.addAttribute(attribParam); + } + wtEvent.addParam(paramName); + } else { + wtEvent.addParam(param); + if (_taskToAddPort.getAttributeByName(param) == null) { + _taskToAddPort.addAttribute(eventInModel.getOriginTask().getAttributeByName(param).deepClone(_tmlmModel)); + } + } + } + } + } + wtEvent.addNext(acElem); + prevElem.setNewNext(acElem, wtEvent); + //adTaskToAddPort.addElement(wtEvent); + actElemsToAdd.add(wtEvent); + } + } else if (acElem instanceof TMLActivityElementChannel) { + TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) acElem; + for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { + if (acElemChannel.getChannel(indexChannel).getName().equals(_portTolink)) { + TMLActivityElement prevElem = adTaskToAddPort.getPrevious(acElem); + TMLWaitEvent wtEvent = new TMLWaitEvent(eventInModel.getName(), adTaskToAddPort.getReferenceObject()); + wtEvent.setEvent(eventInModel); + for (TMLSendEvent sd : eventInModel.getOriginTask().getSendEvents()) { + if (sd.getEvent().getName().equals(eventInModel.getName())) { + for (int indexParam=0; indexParam < sd.getNbOfParams(); indexParam++) { + String param = sd.getParam(indexParam); + if (param.matches("-?\\d+") || param.matches("(?i)^(true|false)")) { + String paramName = eventInModel.getName()+indexParam; + if (_taskToAddPort.getAttributeByName(paramName) == null) { + TMLAttribute attribParam = new TMLAttribute(paramName, eventInModel.getParams().get(indexParam).deepClone(_tmlmModel), ""); + _taskToAddPort.addAttribute(attribParam); + } + wtEvent.addParam(paramName); + } else { + wtEvent.addParam(param); + if (_taskToAddPort.getAttributeByName(param) == null) { + _taskToAddPort.addAttribute(eventInModel.getOriginTask().getAttributeByName(param).deepClone(_tmlmModel)); + } + } + } + } + } + wtEvent.addNext(acElem); + prevElem.setNewNext(acElem, wtEvent); + //adTaskToAddPort.addElement(wtEvent); + actElemsToAdd.add(wtEvent); + } + } + } + } + } + } + + } + } + for (TMLActivityElement actElem : actElemsToAdd) { + adTaskToAddPort.addElement(actElem); + } + return _tmapModel; + } + + /*public TMLMapping<?> addNewPortToTasks(TMLMapping<?> _tmapModel, LinkedHashMap<String,List<String[]>> _portsConnection, LinkedHashMap<String, TaskPattern> _patternTasks) { + TMLModeling<?> _tmlmModel = _tmapModel.getTMLModeling(); + for (String patternTaskName : _portsConnection.keySet()) { + for (String[] elemP : _portsConnection.get(patternTaskName)) { + TraceManager.addDev("elemP[0]= " + elemP[0]); + TraceManager.addDev("elemP[1]= " + elemP[1]); + TraceManager.addDev("elemP[2]= " + elemP[2]); + + if (elemP.length == 4) { + TMLTask taskToAddPort = _tmlmModel.getTMLTaskByName(elemP[1]); + TaskPattern tp = _patternTasks.get(patternTaskName); + TMLActivity adTaskToAddPort = taskToAddPort.getActivityDiagram(); + for (PortTaskJsonFile pTaskJson : tp.externalPorts) { + if (pTaskJson.name.equals(elemP[0])) { + if (pTaskJson.getMode().equals(PatternCreation.MODE_INPUT)) { + if (pTaskJson.getType().equals(PatternCreation.CHANNEL)) { + taskToAddPort.addWriteTMLChannel(_tmlmModel.getChannelByName(elemP[0])); + for (TMLActivityElement acElem : adTaskToAddPort.getElements()) { + if (acElem instanceof TMLActivityElementChannel) { + TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) acElem; + for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { + if (acElemChannel.getChannel(indexChannel).getName().equals(elemP[2])) { + TMLActivityElement prevElem = adTaskToAddPort.getPrevious(acElem); + TMLWriteChannel wrChannel = new TMLWriteChannel(_tmlmModel.getChannelByName(elemP[0]).getName(), adTaskToAddPort.getReferenceObject()); + wrChannel.setNbOfSamples("1"); /// TO UPDATE + wrChannel.addChannel(_tmlmModel.getChannelByName(elemP[0])); + wrChannel.addNext(acElem); + prevElem.setNewNext(acElem, wrChannel); + adTaskToAddPort.addElement(wrChannel); + } + } + } + } + } else if (pTaskJson.getType().equals(PatternCreation.EVENT)) { + taskToAddPort.addTMLEvent(_tmlmModel.getEventByName(elemP[0])); + _tmlmModel.getEventByName(elemP[0]).setOriginTask(taskToAddPort); + for (TMLActivityElement acElem : adTaskToAddPort.getElements()) { + if (acElem instanceof TMLActivityElementEvent) { + TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) acElem; + if (acElemEvent.getEvent().getName().equals(elemP[2])) { + TMLActivityElement prevElem = adTaskToAddPort.getPrevious(acElem); + TMLSendEvent sdEvent = new TMLSendEvent(_tmlmModel.getEventByName(elemP[0]).getName(), adTaskToAddPort.getReferenceObject()); + sdEvent.setEvent(_tmlmModel.getEventByName(elemP[0])); + sdEvent.addNext(acElem); + prevElem.setNewNext(acElem, sdEvent); + adTaskToAddPort.addElement(sdEvent); + } + } + } + } + } else if (pTaskJson.getMode().equals(PatternCreation.MODE_OUTPUT)) { + if (pTaskJson.getType().equals(PatternCreation.CHANNEL)) { + taskToAddPort.addReadTMLChannel(_tmlmModel.getChannelByName(elemP[0])); + for (TMLActivityElement acElem : adTaskToAddPort.getElements()) { + if (acElem instanceof TMLActivityElementChannel) { + TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) acElem; + for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { + if (acElemChannel.getChannel(indexChannel).getName().equals(elemP[2])) { + TMLActivityElement prevElem = adTaskToAddPort.getPrevious(acElem); + TMLReadChannel rdChannel = new TMLReadChannel(_tmlmModel.getChannelByName(elemP[0]).getName(), adTaskToAddPort.getReferenceObject()); + rdChannel.setNbOfSamples("1"); /// TO UPDATE + rdChannel.addChannel(_tmlmModel.getChannelByName(elemP[0])); + rdChannel.addNext(acElem); + prevElem.setNewNext(acElem, rdChannel); + adTaskToAddPort.addElement(rdChannel); + } + } + } + } + } else if (pTaskJson.getType().equals(PatternCreation.EVENT)) { + taskToAddPort.addTMLEvent(_tmlmModel.getEventByName(elemP[0])); + _tmlmModel.getEventByName(elemP[0]).setDestinationTask(taskToAddPort); + for (TMLActivityElement acElem : adTaskToAddPort.getElements()) { + if (acElem instanceof TMLActivityElementEvent) { + TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) acElem; + if (acElemEvent.getEvent().getName().equals(elemP[2])) { + TMLActivityElement prevElem = adTaskToAddPort.getPrevious(acElem); + TMLWaitEvent wtEvent = new TMLWaitEvent(_tmlmModel.getEventByName(elemP[0]).getName(), adTaskToAddPort.getReferenceObject()); + wtEvent.setEvent(_tmlmModel.getEventByName(elemP[0])); + wtEvent.addNext(acElem); + prevElem.setNewNext(acElem, wtEvent); + adTaskToAddPort.addElement(wtEvent); + } + } + } + } + } + + } + } + } + } + } + return _tmapModel; + }*/ + + public TMLMapping<?> makeConnectionBetweenPatternAndModel(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, List<PatternConnection> _portsConnection, LinkedHashMap<String, TaskPattern> _patternTasks, List<PatternCloneTask> _patternCloneTasks) { + TMLModeling<?> _tmlmModel = _tmapModel.getTMLModeling(); + TMLModeling<?> _tmlmPattern = _tmapPattern.getTMLModeling(); + for (PatternConnection portConnection : _portsConnection) { + String patternTaskName = portConnection.getPatternTaskName(); + String patternTaskPortName = portConnection.getPatternChannel(); + String modelTaskName = portConnection.getModelTaskName(); + String modelTaskPortName = portConnection.getModelChannelName(); + + PortTaskJsonFile relatedPortInPattern = null; + + for (PortTaskJsonFile portTaskJsonFile : _patternTasks.get(patternTaskName).getExternalPorts()) { + if (portTaskJsonFile.getName().equals(patternTaskPortName)) { + relatedPortInPattern = portTaskJsonFile; + break; + } + } + + TMLTask patternTaskInModel = _tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(patternTaskName)); + + if (tasksClonedIntoModel.containsKey(modelTaskName)) { + modelTaskName = tasksClonedIntoModel.get(modelTaskName); + if (!portConnection.isNewPort()) { + modelTaskPortName = channelsClonedIntoModel.get(Map.entry(modelTaskName, modelTaskPortName)); + } + } + TMLTask modelTask = _tmlmModel.getTMLTaskByName(modelTaskName); + + TMLChannel chInModel = _tmlmModel.getChannelByName(modelTaskPortName); + TMLEvent evtInModel = _tmlmModel.getEventByName(modelTaskPortName); + + TMLChannel chInPattern = _tmlmPattern.getChannelByName(patternTaskPortName); + TMLEvent evtInPattern = _tmlmPattern.getEventByName(patternTaskPortName); + + if (portConnection.isANewChannelRequired(_portsConnection, patternTasks, _patternCloneTasks)) { + if (chInPattern != null) { + //TraceManager.addDev("New channel !"); + try { + TMLChannel chToAdd = chInPattern.deepClone(_tmlmPattern); + chToAdd.setName(channelsOfPatternIntoModel.get(Map.entry(patternTaskName, patternTaskPortName))); + if (relatedPortInPattern.getMode().equals(PatternCreation.MODE_INPUT)) { + chToAdd.setDestinationTask(patternTaskInModel); + chToAdd.setOriginTask(modelTask); + } else if (relatedPortInPattern.getMode().equals(PatternCreation.MODE_OUTPUT)) { + chToAdd.setDestinationTask(modelTask); + chToAdd.setOriginTask(patternTaskInModel); + } + chToAdd.setPorts(new TMLPort(chToAdd.getName(), chToAdd.getReferenceObject()), new TMLPort(chToAdd.getName(), chToAdd.getReferenceObject())); + _tmlmModel.addChannel(chToAdd); + + for (TMLActivityElement ae : patternTaskInModel.getActivityDiagram().getElements()) { + if (ae instanceof TMLActivityElementChannel) { + TMLActivityElementChannel aeCh = (TMLActivityElementChannel) ae; + if (aeCh.getChannel(0).getName().equals(chInPattern.getName())) { + aeCh.replaceChannelWith(aeCh.getChannel(0), chToAdd); + //TraceManager.addDev("Pattern Task : Replace channel : " + chInPattern.getName() + " with : " + chToAdd.getName()); + } + } + } + if (portConnection.isNewPort()) { + String modelTaskNameForNewPort = modelTaskPortName; + if (renamedModelChannels.containsKey(Map.entry(portConnection.getModelTaskName(), portConnection.getModelChannelName()))) { + modelTaskNameForNewPort = renamedModelChannels.get(Map.entry(portConnection.getModelTaskName(), portConnection.getModelChannelName())); + } + _tmapModel = addNewPortToATask(_tmapModel, _patternTasks, modelTask, patternTaskName, patternTaskPortName, modelTaskNameForNewPort); + } else { + for (TMLActivityElement ae : modelTask.getActivityDiagram().getElements()) { + if (ae instanceof TMLActivityElementChannel) { + TMLActivityElementChannel aeCh = (TMLActivityElementChannel) ae; + if (aeCh.getChannel(0).getName().equals(chInModel.getName())) { + aeCh.replaceChannelWith(aeCh.getChannel(0), chToAdd); + //TraceManager.addDev("model Task : Replace channel : " + chInModel.getName() + " with : " + chToAdd.getName()); + renamedModelChannels.put(Map.entry(portConnection.getModelTaskName(), portConnection.getModelChannelName()), chToAdd.getName()); + } + } + } + } + } catch (TMLCheckingError err) { + } + } else if (evtInPattern != null) { + //TraceManager.addDev("New event !"); + try { + TMLEvent evtToAdd = evtInPattern.deepClone(_tmlmPattern); + evtToAdd.setName(channelsOfPatternIntoModel.get(Map.entry(patternTaskName, patternTaskPortName))); + if (relatedPortInPattern.getMode().equals(PatternCreation.MODE_INPUT)) { + evtToAdd.setDestinationTask(patternTaskInModel); + evtToAdd.setOriginTask(modelTask); + } else if (relatedPortInPattern.getMode().equals(PatternCreation.MODE_OUTPUT)) { + evtToAdd.setDestinationTask(modelTask); + evtToAdd.setOriginTask(patternTaskInModel); + } + evtToAdd.setPorts(new TMLPort(evtToAdd.getName(), evtToAdd.getReferenceObject()), new TMLPort(evtToAdd.getName(), evtToAdd.getReferenceObject())); + _tmlmModel.addEvent(evtToAdd); + + for (TMLActivityElement ae : patternTaskInModel.getActivityDiagram().getElements()) { + if (ae instanceof TMLActivityElementEvent) { + TMLActivityElementEvent aeEvt = (TMLActivityElementEvent) ae; + if (aeEvt.getEvent().getName().equals(evtInPattern.getName())) { + aeEvt.replaceEventWith(aeEvt.getEvent(), evtToAdd); + //TraceManager.addDev("Pattern Task : Replace event : " + evtInPattern.getName() + " with : " + evtToAdd.getName()); + } + } + } + if (portConnection.isNewPort()) { + String modelTaskNameForNewPort = modelTaskPortName; + if (renamedModelChannels.containsKey(Map.entry(portConnection.getModelTaskName(), portConnection.getModelChannelName()))) { + modelTaskNameForNewPort = renamedModelChannels.get(Map.entry(portConnection.getModelTaskName(), portConnection.getModelChannelName())); + } + _tmapModel = addNewPortToATask(_tmapModel, _patternTasks, modelTask, patternTaskName, patternTaskPortName, modelTaskNameForNewPort); + } else { + for (TMLActivityElement ae : modelTask.getActivityDiagram().getElements()) { + if (ae instanceof TMLActivityElementEvent) { + TMLActivityElementEvent aeEvt = (TMLActivityElementEvent) ae; + if (aeEvt.getEvent().getName().equals(evtInModel.getName())) { + aeEvt.replaceEventWith(aeEvt.getEvent(), evtToAdd); + //TraceManager.addDev("model Task : Replace event : " + evtInModel.getName() + " with : " + evtToAdd.getName()); + renamedModelChannels.put(Map.entry(portConnection.getModelTaskName(), portConnection.getModelChannelName()), evtToAdd.getName()); + } + } + } + } + } catch (TMLCheckingError err) { + } + } + } else { + if (chInModel != null) { + //TraceManager.addDev("Existant channel !"); + if (relatedPortInPattern.getMode().equals(PatternCreation.MODE_INPUT)) { + chInModel.setDestinationTask(patternTaskInModel); + chInModel.setPorts(chInModel.getOriginPort(), new TMLPort(chInModel.getName(), chInModel.getReferenceObject())); + } else if (relatedPortInPattern.getMode().equals(PatternCreation.MODE_OUTPUT)) { + chInModel.setOriginTask(patternTaskInModel); + chInModel.setPorts(new TMLPort(chInModel.getName(), chInModel.getReferenceObject()), chInModel.getDestinationPort()); + } + + for (TMLActivityElement ae : patternTaskInModel.getActivityDiagram().getElements()) { + if (ae instanceof TMLActivityElementChannel) { + TMLActivityElementChannel aeCh = (TMLActivityElementChannel) ae; + if (aeCh.getChannel(0).getName().equals(chInPattern.getName())) { + aeCh.replaceChannelWith(aeCh.getChannel(0), chInModel); + //TraceManager.addDev("Replace channel : " + chInPattern.getName() + " with : " + chInModel.getName()); + } + } + } + } + if (evtInModel != null) { + //TraceManager.addDev("Existant event !"); + if (relatedPortInPattern.getMode().equals(PatternCreation.MODE_INPUT)) { + evtInModel.setDestinationTask(patternTaskInModel); + evtInModel.setPorts(evtInModel.getOriginPort(), new TMLPort(evtInModel.getName(), evtInModel.getReferenceObject())); + } else if (relatedPortInPattern.getMode().equals(PatternCreation.MODE_OUTPUT)) { + evtInModel.setOriginTask(patternTaskInModel); + evtInModel.setPorts(new TMLPort(evtInModel.getName(), evtInModel.getReferenceObject()), evtInModel.getDestinationPort()); + } + + for (TMLActivityElement ae : patternTaskInModel.getActivityDiagram().getElements()) { + if (ae instanceof TMLActivityElementEvent) { + TMLActivityElementEvent aeEvt = (TMLActivityElementEvent) ae; + if (aeEvt.getEvent().getName().equals(evtInPattern.getName())) { + aeEvt.replaceEventWith(aeEvt.getEvent(), evtInModel); + //TraceManager.addDev("Replace event : " + evtInPattern.getName() + " with : " + evtInModel.getName()); + } + } + } + } + } + } + return _tmapModel; + } + + public TMLMapping<?> configDisconnectedChannels(TMLMapping<?> _tmapModel, List<PatternPortsConfig> _portsConfig) { + TMLModeling<?> _tmlmModel = _tmapModel.getTMLModeling(); + + for (PatternPortsConfig portConfig : _portsConfig) { + TMLTask task = _tmlmModel.getTMLTaskByName(portConfig.getTaskOfChannelToConfig()); + //String portName = portDecision.getKey(); + //String decision = portDecision.getValue(); + + if (task != null) { + TMLActivity adTask = task.getActivityDiagram(); + TMLActivityElement elemMerge = null; + String mergeWith = portConfig.getMergeWith(); + if (mergeWith != null) { + if (renamedModelChannels.containsKey(Map.entry(portConfig.getTaskOfChannelToConfig(), mergeWith))) { + mergeWith = renamedModelChannels.get(Map.entry(portConfig.getTaskOfChannelToConfig(), mergeWith)); + } + for (TMLActivityElement acElem : adTask.getElements()) { + if (acElem instanceof TMLActivityElementChannel) { + TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) acElem; + for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { + if (acElemChannel.getChannel(indexChannel).getName().equals(mergeWith)) { + try { + elemMerge = acElem.deepClone(_tmlmModel); + } catch (TMLCheckingError err) { + + } + break; + } + } + } else if (acElem instanceof TMLActivityElementEvent) { + TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) acElem; + if (acElemEvent.getEvent().getName().equals(mergeWith)) { + try { + elemMerge = acElem.deepClone(_tmlmModel); + } catch (TMLCheckingError err) { + + } + break; + } + } + } + } + + List<TMLActivityElement> elemsToRemove = new ArrayList<TMLActivityElement>(); + for (int ind = 0; ind < adTask.getElements().size() ; ind ++) { + TMLActivityElement acElem = adTask.getElements().get(ind); + if (acElem instanceof TMLActivityElementChannel) { + TMLActivityElementChannel acElemChannel = (TMLActivityElementChannel) acElem; + for (int indexChannel = 0 ; indexChannel < acElemChannel.getNbOfChannels() ; indexChannel++) { + if (acElemChannel.getChannel(indexChannel).getName().equals(portConfig.getChannelToConfig())) { + TMLActivityElement prevElem = adTask.getPrevious(acElem); + TMLActivityElement nextElem = acElem.getNextElement(0); + if (elemMerge == null) { + while (nextElem instanceof TMLActivityElementChannel && ((TMLActivityElementChannel)nextElem).getChannel(0).getName().equals(portConfig.getChannelToConfig())) { + elemsToRemove.add(nextElem); + nextElem = nextElem.getNextElement(0); + } + prevElem.setNewNext(acElem, nextElem); + elemsToRemove.add(acElem); + } else { + try { + TMLActivityElement newNextElem = elemMerge.deepClone(_tmlmModel); + prevElem.setNewNext(acElem, newNextElem); + newNextElem.clearNexts(); + newNextElem.addNext(nextElem); + elemsToRemove.add(acElem); + adTask.addElement(newNextElem); + } catch (TMLCheckingError err) { + + } + + } + } + } + } else if (acElem instanceof TMLActivityElementEvent) { + TMLActivityElementEvent acElemEvent = (TMLActivityElementEvent) acElem; + if (acElemEvent.getEvent().getName().equals(portConfig.getChannelToConfig())) { + TMLActivityElement prevElem = adTask.getPrevious(acElem); + TMLActivityElement nextElem = acElem.getNextElement(0); + if (elemMerge == null) { + while (nextElem instanceof TMLActivityElementEvent && ((TMLActivityElementEvent)nextElem).getEvent().getName().equals(portConfig.getChannelToConfig())) { + elemsToRemove.add(nextElem); + nextElem = nextElem.getNextElement(0); + } + prevElem.setNewNext(acElem, nextElem); + elemsToRemove.add(acElem); + } else { + try { + TMLActivityElement newNextElem = elemMerge.deepClone(_tmlmModel); + prevElem.setNewNext(acElem, newNextElem); + newNextElem.clearNexts(); + newNextElem.addNext(nextElem); + elemsToRemove.add(acElem); + } catch (TMLCheckingError err) { + + } + } + } + } + } + for (TMLActivityElement elemToRemove : elemsToRemove) { + //TraceManager.addDev("elemToRemove = " + elemToRemove.getName()); + adTask.removeElement(elemToRemove); + } + } + + } + return _tmapModel; + } + + public TMLMapping<?> mapTasksInArch(TMLMapping<?> _tmapModel, List<MappingPatternTask> _tasksMapping) { + TMLArchitecture _tmlarchModel = _tmapModel.getArch(); + for (MappingPatternTask taskMapping : _tasksMapping) { + if (taskMapping.getOrigin() == MappingPatternTask.ORIGIN_CLONE) { + TMLTask taskCloneToMap = _tmapModel.getTaskByName(tasksClonedIntoModel.get(taskMapping.getTaskToMapName())); + if (taskCloneToMap != null) { + if (taskMapping.getSameHwAs() != null) { + String sameTaskName = taskMapping.getSameHwAs(); + int sameTaskOrigin = taskMapping.getSameHwAsOrigin(); + TMLTask inSameTask = null; + if (sameTaskOrigin == MappingPatternTask.ORIGIN_MODEL) { + inSameTask = _tmapModel.getTaskByName(sameTaskName); + } else if (sameTaskOrigin == MappingPatternTask.ORIGIN_CLONE) { + inSameTask = _tmapModel.getTaskByName(tasksClonedIntoModel.get(sameTaskName)); + } else if (sameTaskOrigin == MappingPatternTask.ORIGIN_PATTERN) { + inSameTask = _tmapModel.getTaskByName(tasksOfPatternIntoModel.get(sameTaskName)); + } + if (inSameTask != null) { + HwExecutionNode hwMapTask = _tmapModel.getHwNodeOf(inSameTask); + if (hwMapTask != null) { + _tmapModel.addTaskToHwExecutionNode(taskCloneToMap, hwMapTask); + } + } + } else if (taskMapping.getBusNameForNewHw() != null) { + HwBus bus = _tmlarchModel.getHwBusByName(taskMapping.getBusNameForNewHw()); + if (bus != null) { + String nameCPU = "CPU_" + tasksClonedIntoModel.get(taskMapping.getTaskToMapName()); + HwNode node = _tmlarchModel.getHwNodeByName(nameCPU); + if (node != null) { + int indexCPU = 0; + String nameCPUWithIndex = nameCPU + indexCPU; + while(_tmlarchModel.getHwNodeByName(nameCPUWithIndex) != null) { + indexCPU += 1; + nameCPUWithIndex = nameCPU + indexCPU; + } + nameCPU = nameCPUWithIndex; + } + HwCPU _newCpu = new HwCPU(nameCPU); + _tmapModel.addTaskToHwExecutionNode(taskCloneToMap, _newCpu); + _tmlarchModel.addHwNode(_newCpu); + HwLink linkNewCPUWithBus = new HwLink("link_" + _newCpu.getName() + "_to_" + bus.getName()); + linkNewCPUWithBus.bus = bus; + linkNewCPUWithBus.hwnode = _newCpu; + _tmlarchModel.addHwLink(linkNewCPUWithBus); + } + } + } + } else if (taskMapping.getOrigin() == MappingPatternTask.ORIGIN_PATTERN) { + TMLTask taskPatternToMap = _tmapModel.getTaskByName(tasksOfPatternIntoModel.get(taskMapping.getTaskToMapName())); + if (taskPatternToMap != null) { + if (taskMapping.getSameHwAs() != null) { + String sameTaskName = taskMapping.getSameHwAs(); + int sameTaskOrigin = taskMapping.getSameHwAsOrigin(); + TMLTask inSameTask = null; + if (sameTaskOrigin == MappingPatternTask.ORIGIN_MODEL) { + inSameTask = _tmapModel.getTaskByName(sameTaskName); + } else if (sameTaskOrigin == MappingPatternTask.ORIGIN_CLONE) { + inSameTask = _tmapModel.getTaskByName(tasksClonedIntoModel.get(sameTaskName)); + } else if (sameTaskOrigin == MappingPatternTask.ORIGIN_PATTERN) { + inSameTask = _tmapModel.getTaskByName(tasksOfPatternIntoModel.get(sameTaskName)); + } + if (inSameTask != null) { + HwExecutionNode hwMapTask = _tmapModel.getHwNodeOf(inSameTask); + if (hwMapTask != null) { + _tmapModel.addTaskToHwExecutionNode(taskPatternToMap, hwMapTask); + } + } + } else if (taskMapping.getBusNameForNewHw() != null) { + HwBus bus = _tmlarchModel.getHwBusByName(taskMapping.getBusNameForNewHw()); + if (bus != null) { + String nameCPU = "CPU_" + tasksOfPatternIntoModel.get(taskMapping.getTaskToMapName()); + HwNode node = _tmlarchModel.getHwNodeByName(nameCPU); + if (node != null) { + int indexCPU = 0; + String nameCPUWithIndex = nameCPU + indexCPU; + while(_tmlarchModel.getHwNodeByName(nameCPUWithIndex) != null) { + indexCPU += 1; + nameCPUWithIndex = nameCPU + indexCPU; + } + nameCPU = nameCPUWithIndex; + } + HwCPU _newCpu = new HwCPU(nameCPU); + _tmapModel.addTaskToHwExecutionNode(taskPatternToMap, _newCpu); + _tmlarchModel.addHwNode(_newCpu); + HwLink linkNewCPUWithBus = new HwLink("link_" + _newCpu.getName() + "_to_" + bus.getName()); + linkNewCPUWithBus.bus = bus; + linkNewCPUWithBus.hwnode = _newCpu; + _tmlarchModel.addHwLink(linkNewCPUWithBus); + } + } + } + } + + + + } + return _tmapModel; + } + + public TMLMapping<?> mapTasksInArchAuto(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, List<MappingPatternTask> _mappingPatternTasks, PatternConfiguration _patternConfiguration, LinkedHashMap<String, TaskPattern> _patternTasks) { + TMLModeling<?> tmlmModel = _tmapModel.getTMLModeling(); + TMLModeling<?> tmlmPattern = _tmapPattern.getTMLModeling(); + Map<TMLTask, TMLTask> correspTasks = correspondenceForTasks(_tmapModel, _tmapPattern, _patternConfiguration, _patternTasks); + Set<String> mappedTasks = new HashSet<String>(); + for (MappingPatternTask mappingPatternTask : _mappingPatternTasks) { + mappedTasks.add(mappingPatternTask.getTaskToMapName()); + } + Map<TMLTask, TMLTask> correspondenceForClonedTasks = correspondenceForClonedTasks(_tmapModel, _tmapPattern, mappedTasks, _patternConfiguration, _patternTasks); + /*for (TMLTask correspTask : correspTasks.keySet()) { + TraceManager.addDev("correspTask: In pattern :" + correspTask.getName() + " In model : " + correspTasks.get(correspTask).getName()); + } + for (TMLTask correspTask : correspondenceForClonedTasks.keySet()) { + TraceManager.addDev("correspondenceForClonedTasks: In Model :" + correspTask.getName() + " In pattern : " + correspondenceForClonedTasks.get(correspTask).getName()); + }*/ + LinkedHashMap<String, TaskPattern> _patternTasksSorted = new LinkedHashMap<String, TaskPattern>(); + LinkedHashMap<String, TaskPattern> _patternTasksInEnd = new LinkedHashMap<String, TaskPattern>(); + for (String taskName : _patternTasks.keySet()) { + if (_patternTasks.get(taskName).getExternalPorts().size() == 0) { + _patternTasksInEnd.put(taskName, _patternTasks.get(taskName)); + } else { + _patternTasksSorted.put(taskName, _patternTasks.get(taskName)); + } + } + _patternTasksSorted.putAll(_patternTasksInEnd); + for (String taskName : _patternTasksSorted.keySet()) { + TMLTask task = tmlmPattern.getTMLTaskByName(taskName); + boolean taskIsMapped = false; + if (task != null && !mappedTasks.contains(taskName)) { + HwExecutionNode hwMapTask = _tmapPattern.getHwNodeOf(task); + HashSet<TMLTask> tasksInThisCPU = _tmapPattern.getLisMappedTasks(hwMapTask); + for (TMLTask taskInCPU : tasksInThisCPU) { + if (correspTasks.containsKey(taskInCPU)) { + TMLTask taskInModel = correspTasks.get(taskInCPU); + HwExecutionNode hwMapTaskInModel = _tmapModel.getHwNodeOf(taskInModel); + if (hwMapTaskInModel != null) { + TMLTask taskToMap = tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(taskName)); + _tmapModel.addTaskToHwExecutionNode(taskToMap, hwMapTaskInModel); + taskIsMapped = true; + break; + } + } + } + if (!taskIsMapped) { + String nameNewCPU = hwMapTask.getName(); + HwExecutionNode newCPU = _tmapModel.getHwExecutionNodeByName(nameNewCPU); + int ind = 0; + while (newCPU != null) { + nameNewCPU = hwMapTask.getName() + ind; + newCPU = _tmapModel.getHwExecutionNodeByName(nameNewCPU); + ind += 1; + } + HwCPU _newCpu = new HwCPU(nameNewCPU); + TMLTask taskToMap = tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(taskName)); + _tmapModel.addTaskToHwExecutionNode(taskToMap, _newCpu); + _tmapModel.getArch().addHwNode(_newCpu); + HwBus bus = null; + for (TMLChannel ch : tmlmModel.getChannelsFromMe(taskToMap)) { + if (bus == null) { + TMLTask taskInConn = ch.getDestinationTask(); + HwExecutionNode hwOfTaskInConn = _tmapModel.getHwNodeOf(taskInConn); + if (hwOfTaskInConn != null) { + for (HwLink link : _tmapModel.getArch().getHwLinks()) { + if (link.hwnode == hwOfTaskInConn) { + bus = link.bus; + break; + } + } + } + } + } + + for (TMLChannel ch : tmlmModel.getChannelsToMe(taskToMap)) { + if (bus == null) { + TMLTask taskInConn = ch.getOriginTask(); + HwExecutionNode hwOfTaskInConn = _tmapModel.getHwNodeOf(taskInConn); + if (hwOfTaskInConn != null) { + for (HwLink link : _tmapModel.getArch().getHwLinks()) { + if (link.hwnode == hwOfTaskInConn) { + bus = link.bus; + break; + } + } + } + } + } + + if (bus == null) { + int nbConnections = 0 ; + for (HwNode busModel : _tmapModel.getArch().getBUSs()) { + if (busModel instanceof HwBus) { + int curNbConnections = 0 ; + for (HwLink link : _tmapModel.getArch().getHwLinks()) { + if (link.bus == busModel) { + nbConnections += 1; + } + } + if (curNbConnections > nbConnections) { + bus = (HwBus) busModel; + nbConnections = curNbConnections; + } + } + } + } + + HwLink linkNewCPUWithBus = new HwLink("link_" + _newCpu.getName() + "_to_" + bus.getName()); + linkNewCPUWithBus.bus = bus; + linkNewCPUWithBus.hwnode = _newCpu; + _tmapModel.getArch().addHwLink(linkNewCPUWithBus); + } + } + } + + for (PatternCloneTask patternCloneTask : _patternConfiguration.getClonedTasks()) { + String taskName = tasksClonedIntoModel.get(patternCloneTask.getClonedTask()); + TMLTask task = tmlmModel.getTMLTaskByName(taskName); + boolean taskIsMapped = false; + if (task != null && !mappedTasks.contains(patternCloneTask.getClonedTask())) { + TMLTask taskInPattern = correspondenceForClonedTasks.get(task); + + HwExecutionNode hwMapTask = _tmapPattern.getHwNodeOf(taskInPattern); + HashSet<TMLTask> tasksInThisCPU = _tmapPattern.getLisMappedTasks(hwMapTask); + for (TMLTask taskInCPU : tasksInThisCPU) { + if (correspTasks.containsKey(taskInCPU)) { + TMLTask taskInModel = correspTasks.get(taskInCPU); + HwExecutionNode hwMapTaskInModel = _tmapModel.getHwNodeOf(taskInModel); + if (hwMapTaskInModel != null) { + _tmapModel.addTaskToHwExecutionNode(task, hwMapTaskInModel); + taskIsMapped = true; + break; + } + } + } + if (!taskIsMapped) { + String nameNewCPU = hwMapTask.getName(); + HwExecutionNode newCPU = _tmapModel.getHwExecutionNodeByName(nameNewCPU); + int ind = 0; + while (newCPU != null) { + nameNewCPU = hwMapTask.getName() + ind; + newCPU = _tmapModel.getHwExecutionNodeByName(nameNewCPU); + ind += 1; + } + HwCPU _newCpu = new HwCPU(nameNewCPU); + TMLTask taskToMap = tmlmModel.getTMLTaskByName(taskName); + _tmapModel.addTaskToHwExecutionNode(taskToMap, _newCpu); + _tmapModel.getArch().addHwNode(_newCpu); + + HwBus bus = null; + for (TMLChannel ch : tmlmModel.getChannelsFromMe(taskToMap)) { + if (bus == null) { + TMLTask taskInConn = ch.getDestinationTask(); + HwExecutionNode hwOfTaskInConn = _tmapModel.getHwNodeOf(taskInConn); + if (hwOfTaskInConn != null) { + for (HwLink link : _tmapModel.getArch().getHwLinks()) { + if (link.hwnode == hwOfTaskInConn) { + bus = link.bus; + break; + } + } + } + } + + } + for (TMLChannel ch : tmlmModel.getChannelsToMe(taskToMap)) { + if (bus == null) { + TMLTask taskInConn = ch.getOriginTask(); + HwExecutionNode hwOfTaskInConn = _tmapModel.getHwNodeOf(taskInConn); + if (hwOfTaskInConn != null) { + for (HwLink link : _tmapModel.getArch().getHwLinks()) { + if (link.hwnode == hwOfTaskInConn) { + bus = link.bus; + break; + } + } + } + } + } + if (bus == null) { + int nbConnections = 0 ; + for (HwNode busModel : _tmapModel.getArch().getBUSs()) { + if (busModel instanceof HwBus) { + int curNbConnections = 0 ; + for (HwLink link : _tmapModel.getArch().getHwLinks()) { + if (link.bus == busModel) { + nbConnections += 1; + } + } + if (curNbConnections > nbConnections) { + bus = (HwBus) busModel; + nbConnections = curNbConnections; + } + } + } + } + HwLink linkNewCPUWithBus = new HwLink("link_" + _newCpu.getName() + "_to_" + bus.getName()); + linkNewCPUWithBus.bus = bus; + linkNewCPUWithBus.hwnode = _newCpu; + _tmapModel.getArch().addHwLink(linkNewCPUWithBus); + } + } + } + return _tmapModel; + } + + // Find correspondence between Tasks of the pattern model and the cloned tasks of current Model + public Map<TMLTask, TMLTask> correspondenceForClonedTasks(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, Set<String> mappedTasks, PatternConfiguration _patternConfiguration, LinkedHashMap<String, TaskPattern> _patternTasks) { + TMLModeling<?> tmlmModel = _tmapModel.getTMLModeling(); + TMLModeling<?> tmlmPattern = _tmapPattern.getTMLModeling(); + List <String> clonedTasksToMap = new ArrayList<String>(); + // List <TMLTask> patternTasksToMap = new ArrayList<TMLTask>(); + for (PatternCloneTask patternCloneTask : _patternConfiguration.getClonedTasks()) { + String taskName = patternCloneTask.getClonedTask(); + TMLTask task = tmlmModel.getTMLTaskByName(tasksClonedIntoModel.get(taskName)); + if (task != null && !mappedTasks.contains(taskName)) { + clonedTasksToMap.add(task.getName()); + } + } + /* for (String taskName : _patternTasks.keySet()) { + TMLTask task = tmlmModel.getTMLTaskByName(taskName); + if (task != null && !mappedTasks.contains(taskName)) { + patternTasksToMap.add(task); + } + } */ + Map<TMLTask, TMLTask> correspTasks = new HashMap<TMLTask, TMLTask>(); + for (PatternConnection patternConnection : _patternConfiguration.getPortsConnection()) { + String taskPatternName = patternConnection.getPatternTaskName(); + if (clonedTasksToMap.contains(tasksClonedIntoModel.get(patternConnection.getModelTaskName()))) { + String modeChInPattern = ""; + String typeChInPattern = ""; + for (PortTaskJsonFile pt : _patternTasks.get(taskPatternName).getExternalPorts()) { + if (pt.getName().equals(patternConnection.getPatternChannel())) { + modeChInPattern = pt.getMode(); + typeChInPattern = pt.getType(); + break; + } + } + if (typeChInPattern.equals(PatternCreation.CHANNEL)) { + TMLChannel chInPattern = tmlmPattern.getChannelByName(patternConnection.getPatternChannel()); + if (chInPattern != null) { + if (modeChInPattern.equals(PatternCreation.MODE_INPUT)) { + correspTasks.put(tmlmModel.getTMLTaskByName(tasksClonedIntoModel.get(patternConnection.getModelTaskName())), chInPattern.getOriginTask()); + } else if (modeChInPattern.equals(PatternCreation.MODE_OUTPUT)) { + correspTasks.put(tmlmModel.getTMLTaskByName(tasksClonedIntoModel.get(patternConnection.getModelTaskName())), chInPattern.getDestinationTask()); + } + + } + } else if (typeChInPattern.equals(PatternCreation.EVENT)) { + TMLEvent evtInPattern = tmlmPattern.getEventByName(patternConnection.getPatternChannel()); + if (evtInPattern != null) { + if (modeChInPattern.equals(PatternCreation.MODE_INPUT)) { + correspTasks.put(tmlmModel.getTMLTaskByName(tasksClonedIntoModel.get(patternConnection.getModelTaskName())), evtInPattern.getOriginTask()); + } else if (modeChInPattern.equals(PatternCreation.MODE_OUTPUT)) { + correspTasks.put(tmlmModel.getTMLTaskByName(tasksClonedIntoModel.get(patternConnection.getModelTaskName())), evtInPattern.getDestinationTask()); + } + } + } + } + } + return correspTasks; + } + + // Find correspondence between Tasks of the pattern model and the tasks of current Model + public Map<TMLTask, TMLTask> correspondenceForTasks(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, PatternConfiguration _patternConfiguration, LinkedHashMap<String, TaskPattern> _patternTasks) { + TMLModeling<?> tmlmModel = _tmapModel.getTMLModeling(); + TMLModeling<?> tmlmPattern = _tmapPattern.getTMLModeling(); + Map<TMLTask, TMLTask> correspTasks = new HashMap<TMLTask, TMLTask>(); + for (PatternConnection patternConnection : _patternConfiguration.getPortsConnection()) { + String taskPatternName = patternConnection.getPatternTaskName(); + String modelTask = patternConnection.getModelTaskName(); + if (tasksClonedIntoModel.containsKey(modelTask)) { + modelTask = tasksClonedIntoModel.get(modelTask); + } + String modeChInPattern = ""; + String typeChInPattern = ""; + for (PortTaskJsonFile pt : _patternTasks.get(taskPatternName).getExternalPorts()) { + if (pt.getName().equals(patternConnection.getPatternChannel())) { + modeChInPattern = pt.getMode(); + typeChInPattern = pt.getType(); + break; + } + } + if (typeChInPattern.equals(PatternCreation.CHANNEL)) { + TMLChannel chInPattern = tmlmPattern.getChannelByName(patternConnection.getPatternChannel()); + if (chInPattern != null) { + if (modeChInPattern.equals(PatternCreation.MODE_INPUT)) { + correspTasks.put(chInPattern.getOriginTask(), tmlmModel.getTMLTaskByName(modelTask)); + } else if (modeChInPattern.equals(PatternCreation.MODE_OUTPUT)) { + correspTasks.put(chInPattern.getDestinationTask(), tmlmModel.getTMLTaskByName(modelTask)); + } + } + } else if (typeChInPattern.equals(PatternCreation.EVENT)) { + TMLEvent evtInPattern = tmlmPattern.getEventByName(patternConnection.getPatternChannel()); + if (evtInPattern != null) { + if (modeChInPattern.equals(PatternCreation.MODE_INPUT)) { + correspTasks.put(evtInPattern.getOriginTask(), tmlmModel.getTMLTaskByName(modelTask)); + } else if (modeChInPattern.equals(PatternCreation.MODE_OUTPUT)) { + correspTasks.put(evtInPattern.getDestinationTask(), tmlmModel.getTMLTaskByName(modelTask)); + } + } + } + } + for (String patternTask: _patternTasks.keySet()) { + correspTasks.put(tmlmPattern.getTMLTaskByName(patternTask), tmlmModel.getTMLTaskByName(tasksOfPatternIntoModel.get(patternTask))); + } + return correspTasks; + } + + + public TMLMapping<?> mapChannelsInArch(TMLMapping<?> _tmapModel, List<MappingPatternChannel> _channelMapping) { + TMLArchitecture _tmlarchModel = _tmapModel.getArch(); + for (MappingPatternChannel channelMapping : _channelMapping) { + String channelToMapName = channelMapping.getChannelToMapName(); + String taskOfChannelToMap = channelMapping.getTaskOfChannelToMap(); + /*if (renamedChannels.containsKey(channelToMapName)) { + channelToMapName = renamedChannels.get(channelToMapName); + }*/ + String channelToMapNameInModel = channelToMapName; + if (channelMapping.getOrigin() == MappingPatternChannel.ORIGIN_CLONE && channelsClonedIntoModel.containsKey(Map.entry(taskOfChannelToMap, channelToMapName))) { + channelToMapNameInModel = channelsClonedIntoModel.get(Map.entry(taskOfChannelToMap, channelToMapName)); + } else if (channelMapping.getOrigin() == MappingPatternChannel.ORIGIN_PATTERN && channelsOfPatternIntoModel.containsKey(Map.entry(taskOfChannelToMap, channelToMapName))) { + channelToMapNameInModel = channelsOfPatternIntoModel.get(Map.entry(taskOfChannelToMap, channelToMapName)); + } + TMLChannel channelToMap = _tmapModel.getChannelByName(channelToMapNameInModel); + if (channelToMap != null) { + if (channelMapping.getChannelInSameMemAs() != null) { + String sameChannel = channelMapping.getChannelInSameMemAs(); + String sameChannelTask = channelMapping.getTaskOfChannelInSameMem(); + String sameChannelInModel = sameChannel; + if (channelMapping.getSameMemAsOrigin() == MappingPatternChannel.ORIGIN_CLONE && channelsClonedIntoModel.containsKey(Map.entry(sameChannelTask, sameChannel))) { + sameChannelInModel = channelsClonedIntoModel.get(Map.entry(sameChannelTask, sameChannel)); + } else if (channelMapping.getSameMemAsOrigin() == MappingPatternChannel.ORIGIN_PATTERN && channelsOfPatternIntoModel.containsKey(Map.entry(sameChannelTask, sameChannel))) { + sameChannelInModel = channelsOfPatternIntoModel.get(Map.entry(sameChannelTask, sameChannel)); + } + TMLChannel inSameChannel = _tmapModel.getChannelByName(sameChannelInModel); + if (inSameChannel != null) { + HwMemory memoryOfSameChannel = _tmapModel.getMemoryOfChannel(inSameChannel); + if (memoryOfSameChannel != null) { + _tmapModel.addCommToHwCommNode(channelToMap, memoryOfSameChannel); + } + for (HwCommunicationNode mappedNode : _tmapModel.getAllCommunicationNodesOfChannel(inSameChannel)) { + if (mappedNode instanceof HwBus) { + _tmapModel.addCommToHwCommNode(channelToMap, mappedNode); + } + } + } + } else if (channelMapping.getBusNameForNewMem() != null) { + String busName = channelMapping.getBusNameForNewMem(); + HwBus bus = _tmlarchModel.getHwBusByName(busName); + if (bus != null) { + String nameMem = "Memory_" + channelToMapName; + HwNode node = _tmlarchModel.getHwNodeByName(nameMem); + if (node != null) { + int indexMem = 0; + String nameMemWithIndex = nameMem + indexMem; + while(_tmlarchModel.getHwNodeByName(nameMemWithIndex) != null) { + indexMem += 1; + nameMemWithIndex = nameMem + indexMem; + } + nameMem = nameMemWithIndex; + } + HwMemory _newMem = new HwMemory(nameMem); + _tmapModel.addCommToHwCommNode(channelToMap, _newMem); + _tmapModel.addCommToHwCommNode(channelToMap, bus); + _tmlarchModel.addHwNode(_newMem); + HwLink linkNewMemWithBus = new HwLink("link_" + _newMem.getName() + "_to_" + bus.getName()); + linkNewMemWithBus.bus = bus; + linkNewMemWithBus.hwnode = _newMem; + _tmlarchModel.addHwLink(linkNewMemWithBus); + } + } + } + } + return _tmapModel; + } + + public TMLMapping<?> mapChannelsInArchAuto(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, List<MappingPatternTask> _mappingPatternTasks, List<MappingPatternChannel> _mappingPatternChannels, PatternConfiguration _patternConfiguration, LinkedHashMap<String, TaskPattern> _patternTasks) { + Map<TMLChannel, TMLChannel> correspChannels = correspondenceForChannels(_tmapModel, _tmapPattern, _patternConfiguration, _patternTasks); + /*for (TMLChannel corresp : correspChannels.keySet()) { + TraceManager.addDev("chInPattern=" + corresp.getName() + " chInModel=" + correspChannels.get(corresp).getName()); + }*/ + List<MappingPatternChannel> allChannelsToMap = MappingPatternChannel.getChannelsToMap(_patternConfiguration.getPortsConnection(), _patternTasks, _patternConfiguration.getClonedTasks()); + List<MappingPatternChannel> channelsToMapAuto = new ArrayList<MappingPatternChannel>(); + for (MappingPatternChannel mappingPatternChannel : allChannelsToMap) { + boolean isMapped = false; + for (MappingPatternChannel mappedPatternChannel : _mappingPatternChannels) { + if (mappingPatternChannel.getChannelToMapName().equals(mappedPatternChannel.getChannelToMapName()) && mappingPatternChannel.getTaskOfChannelToMap().equals(mappedPatternChannel.getTaskOfChannelToMap())) { + isMapped = true; + break; + } + } + if (!isMapped) { + channelsToMapAuto.add(mappingPatternChannel); + } + } + for (MappingPatternChannel mappingPatternChannel : channelsToMapAuto) { + String chToMapName = mappingPatternChannel.getChannelToMapName(); + String taskOfChToMapName = mappingPatternChannel.getTaskOfChannelToMap(); + TMLChannel chToMap = null; + TMLChannel chInPattern = null; + if (mappingPatternChannel.getOrigin() == MappingPatternChannel.ORIGIN_CLONE) { + String chToMapNameInModel = channelsClonedIntoModel.get(Map.entry(taskOfChToMapName, chToMapName)); + chToMap = _tmapModel.getChannelByName(chToMapNameInModel); + chInPattern = getKeyByValue(correspChannels, chToMap); + } else if (mappingPatternChannel.getOrigin() == MappingPatternChannel.ORIGIN_PATTERN) { + chInPattern = _tmapPattern.getChannelByName(chToMapName); + chToMap = _tmapModel.getChannelByName(channelsOfPatternIntoModel.get(Map.entry(taskOfChToMapName, chToMapName))); + } + if (chToMap != null && chInPattern != null) { + ArrayList<HwCommunicationNode> hwComsOfChannel = _tmapPattern.getAllCommunicationNodesOfChannel(chInPattern); + Boolean chIsMappedToMem = false; + Boolean chIsMappedToBuses = false; + for (HwCommunicationNode hwComOfChannel : hwComsOfChannel) { + if (hwComOfChannel instanceof HwMemory) { + if (!chIsMappedToMem) { + HashSet<TMLElement> channelsInThisHwCom = _tmapPattern.getLisMappedChannels(hwComOfChannel); + for (TMLElement elemInHwCom : channelsInThisHwCom) { + if (elemInHwCom instanceof TMLChannel) { + TMLChannel channelInHwCom = (TMLChannel) elemInHwCom; + if (channelInHwCom != chInPattern && correspChannels.containsKey(channelInHwCom)) { + TMLChannel channelInModel = correspChannels.get(channelInHwCom); + ArrayList<HwCommunicationNode> hwsMapChannelInModel = _tmapModel.getAllCommunicationNodesOfChannel(channelInModel); + if (hwsMapChannelInModel.size() > 0) { + for (HwCommunicationNode hwMapChannelInModel : hwsMapChannelInModel) { + if ((!chIsMappedToMem) && (hwMapChannelInModel instanceof HwMemory) && !(_tmapModel.isCommNodeMappedOn(chToMap, hwMapChannelInModel))) { + _tmapModel.addCommToHwCommNode(chToMap, hwMapChannelInModel); + chIsMappedToMem = true; + break; + } + } + } + } + } + } + } + } else { + if (!chIsMappedToBuses) { + HashSet<TMLElement> channelsInThisHwCom = _tmapPattern.getLisMappedChannels(hwComOfChannel); + for (TMLElement elemInHwCom : channelsInThisHwCom) { + if (elemInHwCom instanceof TMLChannel) { + TMLChannel channelInHwCom = (TMLChannel) elemInHwCom; + if (channelInHwCom != chInPattern && correspChannels.containsKey(channelInHwCom)) { + TMLChannel channelInModel = correspChannels.get(channelInHwCom); + ArrayList<HwCommunicationNode> hwsMapChannelInModel = _tmapModel.getAllCommunicationNodesOfChannel(channelInModel); + if (hwsMapChannelInModel.size() > 0) { + for (HwCommunicationNode hwMapChannelInModel : hwsMapChannelInModel) { + if (!(hwMapChannelInModel instanceof HwMemory) && !(_tmapModel.isCommNodeMappedOn(chToMap, hwMapChannelInModel))) { + _tmapModel.addCommToHwCommNode(chToMap, hwMapChannelInModel); + } + } + //break; + } + } + } + } + } + } + } + if (!chIsMappedToMem) { + HwMemory memMapChannel = _tmapPattern.getMemoryOfChannel(chInPattern); + String nameNewMem = memMapChannel.getName(); + HwCommunicationNode newMem = _tmapModel.getHwCommunicationNodeByName(nameNewMem); + int ind = 0; + while (newMem != null) { + nameNewMem = memMapChannel.getName() + ind; + newMem = _tmapModel.getHwCommunicationNodeByName(nameNewMem); + ind += 1; + } + HwMemory _newMem = new HwMemory(nameNewMem); + _tmapModel.addCommToHwCommNode(chToMap, _newMem); + _tmapModel.getArch().addHwNode(_newMem); + HwBus bus = null; + TMLTask taskInConn = chToMap.getDestinationTask(); + HwExecutionNode hwOfTaskInConn = _tmapModel.getHwNodeOf(taskInConn); + if (hwOfTaskInConn != null) { + for (HwLink link : _tmapModel.getArch().getHwLinks()) { + if (link.hwnode == hwOfTaskInConn) { + bus = link.bus; + break; + } + } + } + if (bus == null) { + taskInConn = chToMap.getOriginTask(); + hwOfTaskInConn = _tmapModel.getHwNodeOf(taskInConn); + if (hwOfTaskInConn != null) { + for (HwLink link : _tmapModel.getArch().getHwLinks()) { + if (link.hwnode == hwOfTaskInConn) { + bus = link.bus; + break; + } + } + } + } + if (bus == null) { + int nbConnections = 0 ; + for (HwNode busModel : _tmapModel.getArch().getBUSs()) { + if (busModel instanceof HwBus) { + int curNbConnections = 0 ; + for (HwLink link : _tmapModel.getArch().getHwLinks()) { + if (link.bus == busModel) { + nbConnections += 1; + } + } + if (curNbConnections > nbConnections) { + bus = (HwBus) busModel; + nbConnections = curNbConnections; + } + } + } + + } + + HwLink linkNewMemWithBus = new HwLink("link_" + _newMem.getName() + "_to_" + bus.getName()); + linkNewMemWithBus.bus = bus; + linkNewMemWithBus.hwnode = _newMem; + _tmapModel.addCommToHwCommNode(chToMap, bus); + _tmapModel.getArch().addHwLink(linkNewMemWithBus); + } + } + } + + return _tmapModel; + } + + // Find correspondence between Channels of the pattern model and the channels of cloned tasks of current Model + /*public Map<TMLChannel, TMLChannel> correspondenceForClonedChannels(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, Set<String> mappedTasks, PatternConfiguration _patternConfiguration) { + TMLModeling<?> tmlmModel = _tmapModel.getTMLModeling(); + TMLModeling<?> tmlmPattern = _tmapPattern.getTMLModeling(); + List <String> clonedChannelsToMap = new ArrayList<String>(); + // List <TMLTask> patternTasksToMap = new ArrayList<TMLTask>(); + for (String taskName : _patternConfiguration.getClonedTasks().keySet()) { + TMLTask task = tmlmModel.getTMLTaskByName(taskName); + if (task != null && !mappedTasks.contains(taskName)) { + clonedChannelsToMap.add(task.getName()); + } + } + Map<TMLChannel, TMLChannel> correspChannels = new HashMap<TMLChannel, TMLChannel>(); + for (String taskPatternName : _patternConfiguration.getPortsConnection().keySet()) { + for (String[] pc : _patternConfiguration.getPortsConnection().get(taskPatternName)) { + if (clonedChannelsToMap.contains(pc[1])) { + TMLChannel chInPattern = tmlmPattern.getChannelByName(pc[0]); + if (chInPattern != null) { + String nameChInModel = pc[2]; + if (renamedChannels.containsKey(nameChInModel)) { + nameChInModel = renamedChannels.get(nameChInModel); + } + correspChannels.put(tmlmModel.getChannelByName(nameChInModel), chInPattern); + } + } + } + } + return correspChannels; + }*/ + + // Find correspondence between channels of the pattern model and the channels of current Model + public Map<TMLChannel, TMLChannel> correspondenceForChannels(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, PatternConfiguration _patternConfiguration, LinkedHashMap<String, TaskPattern> _patternTasks) { + TMLModeling<?> tmlmModel = _tmapModel.getTMLModeling(); + TMLModeling<?> tmlmPattern = _tmapPattern.getTMLModeling(); + Map<TMLChannel, TMLChannel> correspChannels = new HashMap<TMLChannel, TMLChannel>(); + for (Entry<String, String> chTask : channelsOfPatternIntoModel.keySet()) { + TMLChannel chInPattern = tmlmPattern.getChannelByName(chTask.getValue()); + TMLChannel chInModel = tmlmModel.getChannelByName(channelsOfPatternIntoModel.get(chTask)); + if (chInModel != null && chInPattern != null) { + correspChannels.put(chInPattern, chInModel); + } + } + for (PatternConnection patternConnection : _patternConfiguration.getPortsConnection()) { + if (!patternConnection.isANewChannelRequired(_patternConfiguration.getPortsConnection(), _patternTasks, _patternConfiguration.getClonedTasks())) { + String chNameInModel = patternConnection.getModelChannelName(); + String taskNameInModel = patternConnection.getModelTaskName(); + if (channelsClonedIntoModel.containsKey(Map.entry(taskNameInModel, chNameInModel))) { + chNameInModel = channelsClonedIntoModel.get(Map.entry(taskNameInModel, chNameInModel)); + } + + TMLChannel chInPattern = tmlmPattern.getChannelByName(patternConnection.getPatternChannel()); + TMLChannel chInModel = tmlmModel.getChannelByName(chNameInModel); + if (chInModel != null && chInPattern != null) { + correspChannels.put(chInPattern, chInModel); + } + } + } + return correspChannels; + } + + public TMLMapping<?> generateSecurityForChannels(TMLMapping<?> _tmapModel, TMLMapping<?> _tmapPattern, PatternConfiguration _patternConfiguration, LinkedHashMap<String, TaskPattern> _patternTasks, String _appTabName) { + boolean hasSecChannel = false; + Map<TMLChannel, TMLChannel> correspChannels = correspondenceForChannels(_tmapModel, _tmapPattern, _patternConfiguration, _patternTasks); + for (PatternChannelWithSecurity channelWithSec : _patternConfiguration.getChannelsWithSecurity()) { + TMLChannel chSec = correspChannels.get(_tmapPattern.getChannelByName(channelWithSec.getChannelName())); + if (chSec != null) { + if (channelWithSec.isConfidential()) { + chSec.setEnsureConf(true); + chSec.checkConf = true; + } + if (channelWithSec.getAuthenticity() == PatternChannelWithSecurity.WEAK_AUTHENTICITY) { + chSec.setEnsureWeakAuth(true); + chSec.checkAuth = true; + } + if (channelWithSec.getAuthenticity() == PatternChannelWithSecurity.STRONG_AUTHENTICITY) { + chSec.setEnsureStrongAuth(true); + chSec.setEnsureWeakAuth(true); + chSec.checkAuth = true; + } + hasSecChannel = true; + } + } + if (hasSecChannel) { + TraceManager.addDev("hasSecChannel"); + if (_appTabName != "") { + _tmapModel = putBackPrefixNames(_tmapModel, _appTabName); + + SecurityGenerationForTMAP secgen = new SecurityGenerationForTMAP(_appTabName, _tmapModel, "100", "0", "100", new HashMap<String, java.util.List<String>>()); + _tmapModel = secgen.startThread(); + _tmapModel = secgen.autoMapKeys(); + _tmapModel = removePrefixNames(_tmapModel); + } + } + return _tmapModel; + } + + public static <T, E> T getKeyByValue(Map<T, E> map, E value) { + for (Entry<T, E> entry : map.entrySet()) { + if (Objects.equals(value, entry.getValue())) { + return entry.getKey(); + } + } + return null; + } + + public TMLMapping<?> putBackPrefixNames(TMLMapping<?> _tmapModel, String _appTabName) { + if (_appTabName != "") { + for (TMLTask task : _tmapModel.getTMLModeling().getTasks()) { + String[] taskNameSplit = task.getName().split("__"); + if (taskNameSplit.length == 1) { + task.setName(_appTabName + "__" + task.getName()); + } + } + for (TMLChannel ch : _tmapModel.getTMLModeling().getChannels()) { + String[] channelNameSplit = ch.getName().split("__"); + if (channelNameSplit.length == 1) { + ch.setName(_appTabName + "__" + ch.getName()); + } + } + for (TMLEvent evt : _tmapModel.getTMLModeling().getEvents()) { + String[] eventNameSplit = evt.getName().split("__"); + if (eventNameSplit.length == 1) { + evt.setName(_appTabName + "__" + evt.getName()); + } + } + for (TMLRequest req : _tmapModel.getTMLModeling().getRequests()) { + String[] requestNameSplit = req.getName().split("__"); + if (requestNameSplit.length == 1) { + req.setName(_appTabName + "__" + req.getName()); + } + } + } + return _tmapModel; + } + + public TMLMapping<?> removePrefixNames(TMLMapping<?> _tmapModel) { + for (TMLTask task : _tmapModel.getTMLModeling().getTasks()) { + String[] taskNameSplit = task.getName().split("__"); + task.setName(taskNameSplit[taskNameSplit.length-1]); + } + for (TMLChannel ch : _tmapModel.getTMLModeling().getChannels()) { + String[] channelNameSplit = ch.getName().split("__"); + ch.setName(channelNameSplit[channelNameSplit.length-1]); + } + for (TMLEvent evt : _tmapModel.getTMLModeling().getEvents()) { + String[] eventNameSplit = evt.getName().split("__"); + evt.setName(eventNameSplit[eventNameSplit.length-1]); + } + for (TMLRequest req : _tmapModel.getTMLModeling().getRequests()) { + String[] requestNameSplit = req.getName().split("__"); + req.setName(requestNameSplit[requestNameSplit.length-1]); + } + return _tmapModel; + } + + @SuppressWarnings("unchecked") + public TMLMapping<?> getTMLMappingOfPattern(String _path, String fileName) { + TMLMappingTextSpecification<Class<?>> tmts = new TMLMappingTextSpecification<Class<?>>(fileName); + File f = new File(_path + fileName + ".tmap"); + String spec = null; + try { + spec = FileUtils.loadFileData(f); + } catch (Exception e) { + System.out.println("Exception executing: loading " + fileName); + } + boolean parsed = tmts.makeTMLMapping(spec, _path); + TMLMapping<?> _tmapPattern = tmts.getTMLMapping(); + // Checking syntax + TMLSyntaxChecking syntax = new TMLSyntaxChecking(_tmapPattern); + syntax.checkSyntax(); + return _tmapPattern; + } +} diff --git a/src/main/java/tmltranslator/patternhandling/PatternPortsConfig.java b/src/main/java/tmltranslator/patternhandling/PatternPortsConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..5fbca829d5b92dfe9fcaf996ba165ce643f646bf --- /dev/null +++ b/src/main/java/tmltranslator/patternhandling/PatternPortsConfig.java @@ -0,0 +1,288 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.patternhandling; +/** + * Class PatternPortsConfig + * + * Creation: 25/10/2023 + * + * @author Jawher JERRAY + * @version 1.0 25/10/2023 + */ + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +import tmltranslator.*; + + +public class PatternPortsConfig { + public final static String REMOVE_PORT_OPTION = " Remove"; + public final static String MERGE_PORT_OPTION = " Merge with "; + public final static String TASK_CHANNEL_SEPARATOR = "::"; + + private String taskOfChannelToConfig; + private String channelToConfig; + private Boolean isChannelToRemove; + private String mergeWith; + + public PatternPortsConfig(String taskOfChannelToConfig, String channelToConfig) { + this.taskOfChannelToConfig = taskOfChannelToConfig; + this.channelToConfig = channelToConfig; + } + + public String getTaskOfChannelToConfig() { + return taskOfChannelToConfig; + } + + public String getChannelToConfig() { + return channelToConfig; + } + + public Boolean isChannelToRemove() { + return isChannelToRemove; + } + + public String getMergeWith() { + return mergeWith; + } + + + public void setTaskOfChannelToConfig(String _taskOfChannelToConfig) { + taskOfChannelToConfig = _taskOfChannelToConfig; + } + + public void setChannelToConfig(String _channelToConfig) { + channelToConfig = _channelToConfig; + } + + public void setIsChannelToRemove(Boolean _isChannelToRemove) { + isChannelToRemove = _isChannelToRemove; + mergeWith = null; + } + + public void setMergeWith(String _mergeWith) { + mergeWith = _mergeWith; + isChannelToRemove = false; + } + + public String getStringDisplay() { + if (isChannelToRemove) { + return (taskOfChannelToConfig + TASK_CHANNEL_SEPARATOR + channelToConfig + REMOVE_PORT_OPTION); + } else { + return (taskOfChannelToConfig + TASK_CHANNEL_SEPARATOR + channelToConfig + MERGE_PORT_OPTION + mergeWith); + } + } + + public String getTaskChannelToConfig() { + return (taskOfChannelToConfig + TASK_CHANNEL_SEPARATOR + channelToConfig); + } + + public static String[] seperateTaskAndChannel(String st) { + String[] split = st.split(TASK_CHANNEL_SEPARATOR); + String task, channel; + if (split.length == 2) { + task = split[0]; + channel = split[1]; + return new String[]{task, channel}; + } else { + return null; + } + } + + public static List<PatternPortsConfig> getPortsToConfig(LinkedHashMap<String, TaskPorts> _portsTaskOfModelAll, LinkedHashMap<String, TaskPorts> _portsTaskOfModelLeft, List<String> clonedTasks, TMLModeling<?> tmlmodel) { + List<PatternPortsConfig> portsToConf = new ArrayList<PatternPortsConfig>(); + for (String task : _portsTaskOfModelLeft.keySet()) { + if (!clonedTasks.contains(task)) { + TMLTask tmlTask = tmlmodel.getTMLTaskByName(task); + TaskPorts pt = _portsTaskOfModelLeft.get(task); + if (tmlTask != null) { + for (String wc : pt.getWriteChannels()) { + for (int i = 0; i < tmlTask.getWriteChannels().size() ; i++) { + if (tmlTask.getWriteChannels().get(i).getChannel(0).getName().equals(wc)) { + for (String taskAll : _portsTaskOfModelAll.keySet()) { + if (!clonedTasks.contains(taskAll) && _portsTaskOfModelAll.get(taskAll).getReadChannels().contains(wc) && !_portsTaskOfModelLeft.get(taskAll).getReadChannels().contains(wc)) { + PatternPortsConfig patternPortsConfig = new PatternPortsConfig(task, wc); + if (!portsToConf.contains(patternPortsConfig)) { + portsToConf.add(patternPortsConfig); + } + } + } + } + } + } + + for (String rc : pt.getReadChannels()) { + for (int i = 0; i < tmlTask.getReadChannels().size() ; i++) { + if (tmlTask.getReadChannels().get(i).getChannel(0).getName().equals(rc)) { + for (String taskAll : _portsTaskOfModelAll.keySet()) { + if (!clonedTasks.contains(taskAll) && _portsTaskOfModelAll.get(taskAll).getWriteChannels().contains(rc) && !_portsTaskOfModelLeft.get(taskAll).getWriteChannels().contains(rc)) { + PatternPortsConfig patternPortsConfig = new PatternPortsConfig(task, rc); + if (!portsToConf.contains(patternPortsConfig)) { + portsToConf.add(patternPortsConfig); + } + } + } + } + } + } + + for (String se : pt.getSendEvents()) { + for (int i = 0; i < tmlTask.getSendEvents().size() ; i++) { + if (tmlTask.getSendEvents().get(i).getEvent().getName().equals(se)) { + for (String taskAll : _portsTaskOfModelAll.keySet()) { + if (!clonedTasks.contains(taskAll) && _portsTaskOfModelAll.get(taskAll).getWaitEvents().contains(se) && !_portsTaskOfModelLeft.get(taskAll).getWaitEvents().contains(se)) { + PatternPortsConfig patternPortsConfig = new PatternPortsConfig(task, se); + if (!portsToConf.contains(patternPortsConfig)) { + portsToConf.add(patternPortsConfig); + } + } + } + } + } + } + for (String we : pt.getWaitEvents()) { + for (int i = 0; i < tmlTask.getWaitEvents().size() ; i++) { + if (tmlTask.getWaitEvents().get(i).getEvent().getName().equals(we)) { + for (String taskAll : _portsTaskOfModelAll.keySet()) { + if (!clonedTasks.contains(taskAll) && _portsTaskOfModelAll.get(taskAll).getSendEvents().contains(we) && !_portsTaskOfModelLeft.get(taskAll).getSendEvents().contains(we)) { + PatternPortsConfig patternPortsConfig = new PatternPortsConfig(task, we); + if (!portsToConf.contains(patternPortsConfig)) { + portsToConf.add(patternPortsConfig); + } + } + } + } + } + } + + } + } + } + + return portsToConf; + } + + public static List<PatternPortsConfig> getPortsLeftToConfig(LinkedHashMap<String, TaskPorts> _portsTaskOfModelAll, LinkedHashMap<String, TaskPorts> _portsTaskOfModelLeft, List<String> _clonedTasks, List<PatternPortsConfig> _configuredPorts, TMLModeling<?> tmlmodel) { + List<PatternPortsConfig> portsLeftToConf = new ArrayList<PatternPortsConfig>(); + List<PatternPortsConfig> portsToConfig = PatternPortsConfig.getPortsToConfig(_portsTaskOfModelAll, _portsTaskOfModelLeft, _clonedTasks, tmlmodel); + for (PatternPortsConfig portToConfig : portsToConfig) { + boolean isToConfig = true; + for (PatternPortsConfig portConfigured : _configuredPorts) { + if (portToConfig.getTaskOfChannelToConfig().equals(portConfigured.getTaskOfChannelToConfig()) && portToConfig.getChannelToConfig().equals(portConfigured.getChannelToConfig())) { + isToConfig = false; + break; + } + } + if (isToConfig) { + portsLeftToConf.add(portToConfig); + } + } + return portsLeftToConf; + } + + public static List<String> getPortsCanBeMergedWith(LinkedHashMap<String, TaskPorts> _portsTaskOfModelAll, List<PatternPortsConfig> _allPortsToConfig, String _taskOfPortToConfig) { + List<String> portsCanBeMergedWith = new ArrayList<String>(); + if (_portsTaskOfModelAll.containsKey(_taskOfPortToConfig)) { + for (String wr : _portsTaskOfModelAll.get(_taskOfPortToConfig).getWriteChannels()) { + boolean canBeMergedWith = true; + for (PatternPortsConfig portToConfig : _allPortsToConfig) { + if (portToConfig.getTaskOfChannelToConfig().equals(_taskOfPortToConfig) && portToConfig.getChannelToConfig().equals(wr)) { + canBeMergedWith = false; + break; + } + } + if (canBeMergedWith) { + portsCanBeMergedWith.add(wr); + } + } + for (String wr : _portsTaskOfModelAll.get(_taskOfPortToConfig).getWriteChannels()) { + boolean canBeMergedWith = true; + for (PatternPortsConfig portToConfig : _allPortsToConfig) { + if (portToConfig.getTaskOfChannelToConfig().equals(_taskOfPortToConfig) && portToConfig.getChannelToConfig().equals(wr)) { + canBeMergedWith = false; + break; + } + } + if (canBeMergedWith) { + portsCanBeMergedWith.add(wr); + } + } + for (String rd : _portsTaskOfModelAll.get(_taskOfPortToConfig).getReadChannels()) { + boolean canBeMergedWith = true; + for (PatternPortsConfig portToConfig : _allPortsToConfig) { + if (portToConfig.getTaskOfChannelToConfig().equals(_taskOfPortToConfig) && portToConfig.getChannelToConfig().equals(rd)) { + canBeMergedWith = false; + break; + } + } + if (canBeMergedWith) { + portsCanBeMergedWith.add(rd); + } + } + for (String sd : _portsTaskOfModelAll.get(_taskOfPortToConfig).getSendEvents()) { + boolean canBeMergedWith = true; + for (PatternPortsConfig portToConfig : _allPortsToConfig) { + if (portToConfig.getTaskOfChannelToConfig().equals(_taskOfPortToConfig) && portToConfig.getChannelToConfig().equals(sd)) { + canBeMergedWith = false; + break; + } + } + if (canBeMergedWith) { + portsCanBeMergedWith.add(sd); + } + } + for (String we : _portsTaskOfModelAll.get(_taskOfPortToConfig).getWaitEvents()) { + boolean canBeMergedWith = true; + for (PatternPortsConfig portToConfig : _allPortsToConfig) { + if (portToConfig.getTaskOfChannelToConfig().equals(_taskOfPortToConfig) && portToConfig.getChannelToConfig().equals(we)) { + canBeMergedWith = false; + break; + } + } + if (canBeMergedWith) { + portsCanBeMergedWith.add(we); + } + } + } + return portsCanBeMergedWith; + } +} diff --git a/src/main/java/tmltranslator/patternhandling/PortTaskJsonFile.java b/src/main/java/tmltranslator/patternhandling/PortTaskJsonFile.java new file mode 100644 index 0000000000000000000000000000000000000000..3fa86c34bb28fd124253deb7f2d7dc38f24c7678 --- /dev/null +++ b/src/main/java/tmltranslator/patternhandling/PortTaskJsonFile.java @@ -0,0 +1,93 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.patternhandling; +/** + * Class PortTaskJsonFile + * + * Creation: 28/08/2023 + * + * @author Jawher JERRAY + * @version 1.0 28/08/2023 + */ + +import tmltranslator.*; + + +public class PortTaskJsonFile { + private String name; + private String type; + private String mode; + private String confidentiality; + private String authenticity; + + public PortTaskJsonFile(String name, String type, String mode) { + this.name = name; + this.type = type; + this.mode = mode; + } + + public String getName() { + return name; + } + + public String getType() { + return type; + } + + public String getMode() { + return mode; + } + + public String getConfidentiality() { + return confidentiality; + } + + public String getAuthenticity() { + return authenticity; + } + public void setConfidentiality(String _confidentiality) { + confidentiality = _confidentiality; + } + + public void setAuthenticity(String _authenticity) { + authenticity = _authenticity; + } + +} diff --git a/src/main/java/tmltranslator/patternhandling/SecurityGenerationForTMAP.java b/src/main/java/tmltranslator/patternhandling/SecurityGenerationForTMAP.java new file mode 100644 index 0000000000000000000000000000000000000000..05da50072671cc83fade4553583f820982d405c7 --- /dev/null +++ b/src/main/java/tmltranslator/patternhandling/SecurityGenerationForTMAP.java @@ -0,0 +1,2303 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.patternhandling; +/** + * Class SecurityGenerationForTMAP + * + * Creation: 28/09/2023 + * + * @author Jawher JERRAY + * @version 1.0 28/09/2023 + */ + +import avatartranslator.AvatarPragmaAuthenticity; +import avatartranslator.AvatarPragmaSecret; +import avatartranslator.AvatarSpecification; +import avatartranslator.toproverif.AVATAR2ProVerif; +import common.ConfigurationTTool; +import launcher.RshClient; +import myutil.TraceManager; +import proverifspec.ProVerifOutputAnalyzer; +import proverifspec.ProVerifQueryAuthResult; +import proverifspec.ProVerifQueryResult; +import proverifspec.ProVerifSpec; +import tmltranslator.*; +import tmltranslator.toavatarsec.TML2Avatar; +import ui.TGComponent; + +import java.io.Reader; +import java.util.*; + + +public class SecurityGenerationForTMAP implements Runnable { + private String appName; + private TMLMapping<?> tmap; + private String encComp; + private String overhead; + private String decComp; + private Map<String, List<String>> selectedCPUTasks; + private int channelIndex = 0; + + private AVATAR2ProVerif avatar2proverif; + + private Map<String, Integer> channelIndexMap = new HashMap<String, Integer>(); + + private Map<String, List<HSMChannel>> hsmChannelMap = new HashMap<String, List<HSMChannel>>(); + + private Map<String, String> taskHSMMap = new HashMap<String, String>(); + private List<String> hsmTasks = new ArrayList<String>(); + + private Map<String, SecurityPattern> channelSecMap = new HashMap<String, SecurityPattern>(); + private TMLMapping<?> newMap; + + public SecurityGenerationForTMAP(String appName, TMLMapping<?> tmap, String encComp, String overhead, String decComp, Map<String, List<String>> selectedCPUTasks) { + this.appName = appName; + this.tmap = tmap; + this.newMap = tmap; + this.overhead = overhead; + this.decComp = decComp; + this.encComp = encComp; + this.selectedCPUTasks = selectedCPUTasks; + } + + public void proverifAnalysis(TMLMapping<?> tmap, List<String> nonAuthChans, List<String> nonConfChans, boolean checkAuthProverif) { + if (tmap == null) { + TraceManager.addDev("No mapping"); + return; + } + + //Perform ProVerif Analysis + + Object o = null; + if (tmap.getTMLModeling().getReference() instanceof TGComponent) { + o = ((TGComponent)(tmap.getTMLModeling().getReference())).getTDiagramPanel().tp; + } + + TML2Avatar t2a = new TML2Avatar(newMap, false, true, o); + AvatarSpecification avatarspec = t2a.generateAvatarSpec("1", checkAuthProverif); + if (avatarspec == null) { + TraceManager.addDev("No avatar spec"); + return; + } + + avatar2proverif = new AVATAR2ProVerif(avatarspec); + try { + ProVerifSpec proverif = avatar2proverif.generateProVerif(true, true, 3, true, true); + //warnings = avatar2proverif.getWarnings(); + + if (!avatar2proverif.saveInFile("pvspec")) { + return; + } + + RshClient rshc = new RshClient(ConfigurationTTool.ProVerifVerifierHost); + + rshc.setCmd(ConfigurationTTool.ProVerifVerifierPath + " -in pitype pvspec"); + rshc.sendExecuteCommandRequest(); + Reader data = rshc.getDataReaderFromProcess(); + + + ProVerifOutputAnalyzer pvoa = avatar2proverif.getOutputAnalyzer(); + pvoa.analyzeOutput(data, true); + + if (pvoa.getResults().size() == 0) { + TraceManager.addDev("SECGEN ERROR: No security results"); + } + + + Map<AvatarPragmaSecret, ProVerifQueryResult> confResults = pvoa.getConfidentialityResults(); + + for (AvatarPragmaSecret pragma : confResults.keySet()) { + TraceManager.addDev("SECGEN: Pragma " + pragma); + if (confResults.get(pragma).isProved() && !confResults.get(pragma).isSatisfied()) { + nonConfChans.add(pragma.getArg().getBlock().getName() + "__" + pragma.getArg().getName()); + TraceManager.addDev("SECGEN:" + pragma.getArg().getBlock().getName() + "." + pragma.getArg().getName() + " is not secret"); + + TMLChannel chan = tmap.getTMLModeling().getChannelByShortName(pragma.getArg().getName().replaceAll("_chData", "")); + + if (chan == null) { + chan = tmap.getTMLModeling().getChannelByOriginPortName(pragma.getArg().getName().replaceAll("_chData", "")); + } + + if (chan == null) { + TraceManager.addDev("SECGEN: NULL Channel"); + continue; + } + + if (chan.isBasicChannel()) { + TraceManager.addDev("SECGEN: Channel added to nonConfCh"); + nonConfChans.add(chan.getOriginTask().getName() + "__" + pragma.getArg().getName()); + + } else { + for (TMLTask originTask : chan.getOriginTasks()) { + nonConfChans.add(originTask.getName() + "__" + pragma.getArg().getName()); + } + } + } + } + + Map<AvatarPragmaAuthenticity, ProVerifQueryAuthResult> authResults = pvoa.getAuthenticityResults(); + for (AvatarPragmaAuthenticity pragma : authResults.keySet()) { + if (authResults.get(pragma).isProved() && !authResults.get(pragma).isSatisfied()) { + nonAuthChans.add(pragma.getAttrA().getAttribute().getBlock().getName() + "__" + pragma.getAttrA().getAttribute().getName().replaceAll("_chData", "")); + nonAuthChans.add(pragma.getAttrB().getAttribute().getBlock().getName() + "__" + pragma.getAttrB().getAttribute().getName().replaceAll("_chData", "")); + } + } + + } catch (Exception e) { + System.out.println("SECGEN EXCEPTION " + e); + + } + } + + public TMLMapping<?> startThread() { + Thread t = new Thread(this); + t.start(); + try { + t.join(); + } catch (Exception e) { + TraceManager.addDev("SECGEN. Error in Security Generation Thread"); + System.out.println("SECGEN. Error in Security Generation Thread"); + } + return tmap; + } + + public boolean portInTask(TMLTask task, String portName) { + TMLActivity adTask = task.getActivityDiagram(); + for (TMLActivityElement elem : adTask.getElements()) { + if (elem instanceof TMLWriteChannel) { + TMLWriteChannel writeChannel = (TMLWriteChannel) elem; + for (int i = 0; i < writeChannel.getNbOfChannels(); i++) { + if (writeChannel.getChannel(i).getName().replaceAll(appName + "__", "").equals(portName)) { + return true; + } + } + } else if (elem instanceof TMLReadChannel) { + TMLReadChannel readChannel = (TMLReadChannel) elem; + for (int i = 0; i < readChannel.getNbOfChannels(); i++) { + if (readChannel.getChannel(i).getName().replaceAll(appName + "__", "").equals(portName)) { + return true; + } + } + } + } + return false; + } + + public void run() { + String title = appName; + // oldmodel = tmap.getTMLModeling(); + Map<TMLTask, HashSet<TMLTask>> toSecure = new HashMap<TMLTask, HashSet<TMLTask>>(); + Map<TMLTask, HashSet<TMLTask>> toSecureRev = new HashMap<TMLTask, HashSet<TMLTask>>(); + Map<TMLTask, HashSet<String>> secOutChannels = new HashMap<TMLTask, HashSet<String>>(); + Map<TMLTask, HashSet<String>> secInChannels = new HashMap<TMLTask, HashSet<String>>(); + Map<TMLTask, HashSet<String>> nonceOutChannels = new HashMap<TMLTask, HashSet<String>>(); + Map<TMLTask, HashSet<String>> nonceInChannels = new HashMap<TMLTask, HashSet<String>>(); + Map<TMLTask, HashSet<String>> macOutChannels = new HashMap<TMLTask, HashSet<String>>(); + Map<TMLTask, HashSet<String>> macInChannels = new HashMap<TMLTask, HashSet<String>>(); + + Map<TMLTask, HashSet<String>> hsmSecInChannels = new HashMap<TMLTask, HashSet<String>>(); + Map<TMLTask, HashSet<String>> hsmSecOutChannels = new HashMap<TMLTask, HashSet<String>>(); + + //TraceManager.addDev("mapping " + tmap.getSummaryTaskMapping()); + + // Map<String, HSMChannel> secChannels = new HashMap<String, HSMChannel>(); + //Map<String, HSMChannel> hsmChannels = new HashMap<String, HSMChannel>(); + + + for (String cpuName : selectedCPUTasks.keySet()) { + for (String task : selectedCPUTasks.get(cpuName)) { + hsmTasks.add(task); + taskHSMMap.put(task, cpuName); + } + hsmChannelMap.put(cpuName, new ArrayList<HSMChannel>()); + + } + + TMLModeling<?> tmlmodel = tmap.getTMLModeling(); + //Proverif Analysis channels + List<String> nonAuthChans = new ArrayList<String>(); + List<String> nonConfChans = new ArrayList<String>(); + boolean checkAuthProverif = false; + for (TMLChannel ch : tmlmodel.getChannels()) { + if (ch.isEnsureWeakAuth() || ch.isEnsureStrongAuth()) { + checkAuthProverif = true; + break; + } + } + proverifAnalysis(tmap, nonAuthChans, nonConfChans, checkAuthProverif); + + + List<TMLChannel> channels = tmlmodel.getChannels(); + for (TMLChannel channel : channels) { + for (TMLPortWithSecurityInformation p : channel.ports) { + channel.checkConf = channel.checkConf || p.getCheckConf(); + channel.checkAuth = channel.checkAuth || p.getCheckAuth(); + } + } + + //System.out.println("Nonauth " + nonAuthChans); + //System.out.println("NonConf " + nonConfChans); + + //Create clone of Component Diagram + Activity diagrams to secure + // TMLComponentDesignPanel tmlcdp = tmap.getTMLCDesignPanel(); + + //TMLComponentTaskDiagramPanel tcdp = tmlcdp.tmlctdp; + //Create clone of architecture panel and tmap tasks to it + //newarch.renameMapping(tabName, tabName + "_" + name); + + for (TMLTask task : tmap.getTMLModeling().getTasks()) { + HashSet<String> tmp = new HashSet<String>(); + HashSet<String> tmp2 = new HashSet<String>(); + HashSet<TMLTask> tmp3 = new HashSet<TMLTask>(); + HashSet<TMLTask> tmp4 = new HashSet<TMLTask>(); + HashSet<String> tmp5 = new HashSet<String>(); + HashSet<String> tmp6 = new HashSet<String>(); + HashSet<String> tmp7 = new HashSet<String>(); + HashSet<String> tmp8 = new HashSet<String>(); + HashSet<String> tmp9 = new HashSet<String>(); + HashSet<String> tmp10 = new HashSet<String>(); + + + secInChannels.put(task, tmp); + secOutChannels.put(task, tmp2); + toSecure.put(task, tmp3); + toSecureRev.put(task, tmp4); + nonceInChannels.put(task, tmp5); + nonceOutChannels.put(task, tmp6); + macInChannels.put(task, tmp7); + macOutChannels.put(task, tmp8); + + hsmSecInChannels.put(task, tmp9); + hsmSecOutChannels.put(task, tmp10); + + } + //ToSecure keeps a tmap of origin task: {dest task} for which security operators need to be added + //ToSecureRev keeps a tmap of dest task: {origin task} for which security operators need to be added + + //SecOutChannels are channels which need symmetric encryption operators added + //SecInChannels are channels which need sym decryption operators added + //nonceInChannels are channels which need to send a nonce before receiving the channel data + //nonceOutChannels are channels which need to receive a nonce before sending the channel data + //macInChannels are channels which need verifymac operators added + //macOutChannels are channels which need mac operators added + + //hsmSecInChannels need to send data to the hsm to decrypt after receiving channel data + //hsmSecOutChannels need to send data to the hsm to encrypt before sending channel data + + //With the proverif results, check which channels need to be secured + for (TMLTask task : tmap.getTMLModeling().getTasks()) { + //Check if all channel operators are secured + TMLActivity taskAD = task.getActivityDiagram(); //FIXME getActivityDiagramName( task ) ) + if (taskAD == null) { + TraceManager.addDev("SECGEN. Null Activity Diagram for " + task.getName()); + continue; + } + + for (TMLChannel chan : tmlmodel.getChannels(task)) { + //Origin and Destination ports can have different names. Therefore, we need to put both names in the list of channels to secure. + List<String> portNames = new ArrayList<String>(); + boolean nonConf = false; + boolean nonAuth = false; + + if (chan.isBasicChannel()) { + portNames.add(chan.getOriginPort().getName()); + portNames.add(chan.getDestinationPort().getName()); + if (nonConfChans.contains(chan.getOriginTask().getName().split("__")[1] + "__" + chan.getOriginPort().getName() + "_chData")) { + nonConf = true; + TraceManager.addDev("SECGEN. non conf basic ch = true"); + } + + if (nonAuthChans.contains(chan.getDestinationTask().getName().split("__")[1] + "__" + title + "__" + chan.getDestinationPort().getName())) { + nonAuth = true; + } + + //When port names are different + if (nonAuthChans.contains(chan.getDestinationTask().getName().split("__")[1] + "__" + chan.getDestinationPort().getName())) { + nonAuth = true; + } + } else { + for (TMLPort port : chan.getOriginPorts()) { + for (TMLTask origTask : chan.getOriginTasks()) { + if (nonConfChans.contains(origTask.getName().split("__")[1] + "__" + port.getName() + "_chData")) { + nonConf = true; + TraceManager.addDev("SECGEN. non conf port ch = true"); + } + } + portNames.add(port.getName()); + } + + + for (TMLTask destTask : chan.getDestinationTasks()) { + for (TMLPort port : chan.getDestinationPorts()) { + if (nonAuthChans.contains(destTask.getName().split("__")[1] + "__" + title + "__" + port.getName())) { + nonAuth = true; + } + if (!portNames.contains(port.getName())) { + portNames.add(port.getName()); + } + } + //System.out.println(destTask.getName().split("__")[1] + "__" + chan.getName()); + if (nonAuthChans.contains(destTask.getName().split("__")[1] + "__" + chan.getDestinationPort().getName())) { + nonAuth = true; + } + + } + //When port names are different + + } + + String secName = chan.getName().split("__")[chan.getName().split("__").length - 1]; + + for (String chanName : portNames) { + //Classify channels based on the type of security requirements and unsatisfied properties + if (chan.isBasicChannel()) { + if (chan.isEnsureConf() && nonConf) { + toSecure.get(chan.getOriginTask()).add(chan.getDestinationTask()); + if (chan.isEnsureStrongAuth()) { + if (!toSecureRev.get(chan.getDestinationTask()).contains(chan.getOriginTask())) { + toSecureRev.get(chan.getDestinationTask()).add(chan.getOriginTask()); + } + } + if (hsmTasks.contains(chan.getOriginTask().getName().split("__")[1])) { + SecurityPattern secPattern = new SecurityPattern("hsmSec_" + secName, SecurityPattern.SYMMETRIC_ENC_PATTERN, overhead, "", encComp, decComp, "", "", ""); + secPattern.originTask = "HSM_" + taskHSMMap.get(chan.getOriginTask().getName().replaceAll(title + "__", "")); + channelSecMap.put(chanName, secPattern); + if (!hsmSecOutChannels.get(chan.getOriginTask()).contains(chanName) && portInTask(chan.getOriginTask(), chanName)) { + HSMChannel hsmchan = new HSMChannel(chanName, chan.getOriginTask().getName().split("__")[1], HSMChannel.SENC); + hsmChannelMap.get(taskHSMMap.get(chan.getOriginTask().getName().split("__")[1])).add(hsmchan); + hsmSecOutChannels.get(chan.getOriginTask()).add(chanName); + + if (chan.isEnsureStrongAuth()) { + nonceOutChannels.get(chan.getOriginTask()).add(chanName); + hsmchan.nonceName = "nonce_" + chan.getDestinationTask().getName().split("__")[1] + "_" + chan.getOriginTask().getName().split("__")[1]; + } + } + } else { + if (!secOutChannels.get(chan.getOriginTask()).contains(chanName)) { + secOutChannels.get(chan.getOriginTask()).add(chanName); + SecurityPattern secPattern = new SecurityPattern("autoEncrypt_" + secName, SecurityPattern.SYMMETRIC_ENC_PATTERN, overhead, "", encComp, decComp, "", "", ""); + secPattern.originTask = chan.getOriginTask().getName().replaceAll(title + "__", ""); + channelSecMap.put(chanName, secPattern); + if (chan.isEnsureStrongAuth()) { + nonceOutChannels.get(chan.getOriginTask()).add(chanName); + } + } + } + + if (hsmTasks.contains(chan.getDestinationTask().getName().split("__")[1])) { + if (!hsmSecInChannels.get(chan.getDestinationTask()).contains(chanName) && portInTask(chan.getDestinationTask(), chanName)) { + HSMChannel hsmchan = new HSMChannel(chanName, chan.getDestinationTask().getName().split("__")[1], HSMChannel.DEC); + hsmChannelMap.get(taskHSMMap.get(chan.getDestinationTask().getName().split("__")[1])).add(hsmchan); + hsmSecInChannels.get(chan.getDestinationTask()).add(chanName); + if (chan.isEnsureStrongAuth()) { + nonceInChannels.get(chan.getDestinationTask()).add(chanName); + hsmchan.nonceName = "nonce_" + chan.getDestinationTask().getName().split("__")[1] + "_" + chan.getOriginTask().getName().split("__")[1]; + } + } + } else { + if (!secInChannels.get(chan.getDestinationTask()).contains(chanName)) { + secInChannels.get(chan.getDestinationTask()).add(chanName); + if (chan.isEnsureStrongAuth()) { + nonceInChannels.get(chan.getDestinationTask()).add(chanName); + } + } + } + + } else if (chan.isEnsureWeakAuth() && nonAuth) { + toSecure.get(chan.getOriginTask()).add(chan.getDestinationTask()); + if (chan.isEnsureStrongAuth()) { + if (!toSecureRev.get(chan.getDestinationTask()).contains(chan.getOriginTask())) { + toSecureRev.get(chan.getDestinationTask()).add(chan.getOriginTask()); + } + /*} + else { + TMLChannel chantmp = oldmodel.getChannelByShortName("__"+chan.getName()); + System.out.println("Channel found "+ chantmp); + }*/ + + } + if (hsmTasks.contains(chan.getOriginTask().getName().split("__")[1])) { + SecurityPattern secPattern = new SecurityPattern("hsmSec_" + secName, SecurityPattern.SYMMETRIC_ENC_PATTERN, overhead, "", encComp, decComp, "", "", ""); + secPattern.originTask = "HSM_" + taskHSMMap.get(chan.getOriginTask().getName().replaceAll(title + "__", "")); + channelSecMap.put(chanName, secPattern); + if (!hsmSecOutChannels.get(chan.getOriginTask()).contains(chanName) && portInTask(chan.getOriginTask(), chanName)) { + HSMChannel hsmchan = new HSMChannel(chanName, chan.getOriginTask().getName().split("__")[1], HSMChannel.MAC); + hsmChannelMap.get(taskHSMMap.get(chan.getOriginTask().getName().split("__")[1])).add(hsmchan); + hsmSecOutChannels.get(chan.getOriginTask()).add(chanName); + + if (chan.isEnsureStrongAuth()) { + nonceOutChannels.get(chan.getOriginTask()).add(chanName); + hsmchan.nonceName = "nonce_" + chan.getDestinationTask().getName().split("__")[1] + "_" + chan.getOriginTask().getName().split("__")[1]; + } + } + } else { + if (!macInChannels.get(chan.getOriginTask()).contains(chanName)) { + macOutChannels.get(chan.getOriginTask()).add(chanName); + SecurityPattern secPattern = new SecurityPattern("autoEncrypt_" + secName, SecurityPattern.SYMMETRIC_ENC_PATTERN, overhead, "", encComp, decComp, "", "", ""); + secPattern.originTask = chan.getOriginTask().getName().replaceAll(title + "__", ""); + channelSecMap.put(chanName, secPattern); + if (chan.isEnsureStrongAuth()) { + nonceOutChannels.get(chan.getOriginTask()).add(chanName); + } + } + } + + if (hsmTasks.contains(chan.getDestinationTask().getName().split("__")[1])) { + if (!hsmSecInChannels.get(chan.getDestinationTask()).contains(chanName) && portInTask(chan.getDestinationTask(), chanName)) { + HSMChannel hsmchan = new HSMChannel(chanName, chan.getDestinationTask().getName().split("__")[1], HSMChannel.DEC); + hsmChannelMap.get(taskHSMMap.get(chan.getDestinationTask().getName().split("__")[1])).add(hsmchan); + hsmSecInChannels.get(chan.getDestinationTask()).add(chanName); + if (chan.isEnsureStrongAuth()) { + nonceInChannels.get(chan.getDestinationTask()).add(chanName); + hsmchan.nonceName = "nonce_" + chan.getDestinationTask().getName().split("__")[1] + "_" + chan.getOriginTask().getName().split("__")[1]; + } + } + } else { + if (!secInChannels.get(chan.getDestinationTask()).contains(chanName)) { + secInChannels.get(chan.getDestinationTask()).add(chanName); + if (chan.isEnsureStrongAuth()) { + nonceInChannels.get(chan.getDestinationTask()).add(chanName); + } + } + } + } + } else { + //Ignore strong authenticity for fork and join channels + //Only add hsm channel for own port + for (TMLTask orig : chan.getOriginTasks()) { + for (TMLTask dest : chan.getDestinationTasks()) { + if (chan.isEnsureConf() && nonConf) { + toSecure.get(orig).add(dest); + /*if (chan.checkAuth && autoStrongAuth) { + if (!toSecureRev.get(dest).contains(orig)) { + toSecureRev.get(dest).add(orig); + } + }*/ + if (hsmTasks.contains(orig.getName().split("__")[1])) { + SecurityPattern secPattern = new SecurityPattern("hsmSec_" + secName, SecurityPattern.SYMMETRIC_ENC_PATTERN, overhead, "", encComp, decComp, "", "", ""); + secPattern.originTask = "HSM_" + taskHSMMap.get(orig.getName().replaceAll(title + "__", "")); + channelSecMap.put(chanName, secPattern); + if (!hsmSecOutChannels.get(orig).contains(chanName) && portInTask(orig, chanName)) { + HSMChannel hsmchan = new HSMChannel(chanName, orig.getName().split("__")[1], HSMChannel.SENC); + hsmChannelMap.get(taskHSMMap.get(orig.getName().split("__")[1])).add(hsmchan); + hsmSecOutChannels.get(orig).add(chanName); + + /* if (chan.checkAuth && autoStrongAuth) { + nonceOutChannels.get(orig).add(chanName); + hsmchan.nonceName="nonce_" + dest.getName().split("__")[1] + "_" + orig.getName().split("__")[1]; + }*/ + } + } else { + if (!secOutChannels.get(orig).contains(chanName)) { + secOutChannels.get(orig).add(chanName); + SecurityPattern secPattern = new SecurityPattern("autoEncrypt_" + secName, SecurityPattern.SYMMETRIC_ENC_PATTERN, overhead, "", encComp, decComp, "", "", ""); + secPattern.originTask = orig.getName().replaceAll(title + "__", ""); + channelSecMap.put(chanName, secPattern); + /* if (chan.checkAuth && autoStrongAuth) { + nonceOutChannels.get(orig).add(chanName); + }*/ + } + } + + if (hsmTasks.contains(dest.getName().split("__")[1])) { + if (!hsmSecInChannels.get(dest).contains(chanName) && portInTask(dest, chanName)) { + HSMChannel hsmchan = new HSMChannel(chanName, dest.getName().split("__")[1], HSMChannel.DEC); + hsmChannelMap.get(taskHSMMap.get(dest.getName().split("__")[1])).add(hsmchan); + hsmSecInChannels.get(dest).add(chanName); + /* if (chan.checkAuth && autoStrongAuth) { + nonceInChannels.get(dest).add(chanName); + hsmchan.nonceName="nonce_" + dest.getName().split("__")[1] + "_" + orig.getName().split("__")[1]; + }*/ + } + } else { + if (!secInChannels.get(dest).contains(chanName)) { + secInChannels.get(dest).add(chanName); + /*if (chan.checkAuth && autoStrongAuth) { + nonceInChannels.get(dest).add(chanName); + }*/ + } + } + + } else if (chan.isEnsureWeakAuth() && nonAuth) { + toSecure.get(orig).add(dest); + /* if (autoStrongAuth) { + /* if (chan.getOriginTask().getReferenceObject() instanceof TMLCPrimitiveComponent && chan.getDestinationTask().getReferenceObject() instanceof TMLCPrimitiveComponent) {*/ + /*if (!toSecureRev.get(dest).contains(orig)) { + toSecureRev.get(dest).add(orig); + }*/ + /*} + else { + TMLChannel chantmp = oldmodel.getChannelByShortName("__"+chan.getName()); + System.out.println("Channel found "+ chantmp); + } + + }*/ + if (hsmTasks.contains(orig.getName().split("__")[1])) { + SecurityPattern secPattern = new SecurityPattern("hsmSec_" + secName, SecurityPattern.SYMMETRIC_ENC_PATTERN, overhead, "", encComp, decComp, "", "", ""); + secPattern.originTask = "HSM_" + taskHSMMap.get(orig.getName().replaceAll(title + "__", "")); + channelSecMap.put(chanName, secPattern); + if (!hsmSecOutChannels.get(orig).contains(chanName) && portInTask(orig, chanName)) { + HSMChannel hsmchan = new HSMChannel(chanName, orig.getName().split("__")[1], HSMChannel.MAC); + hsmChannelMap.get(taskHSMMap.get(orig.getName().split("__")[1])).add(hsmchan); + hsmSecOutChannels.get(orig).add(chanName); + + /*if (autoStrongAuth) { + nonceOutChannels.get(orig).add(chanName); + hsmchan.nonceName="nonce_" + dest.getName().split("__")[1] + "_" + orig.getName().split("__")[1]; + }*/ + } + } else { + if (!macInChannels.get(orig).contains(chanName)) { + macOutChannels.get(orig).add(chanName); + SecurityPattern secPattern = new SecurityPattern("autoEncrypt_" + secName, SecurityPattern.SYMMETRIC_ENC_PATTERN, overhead, "", encComp, decComp, "", "", ""); + secPattern.originTask = orig.getName().replaceAll(title + "__", ""); + channelSecMap.put(chanName, secPattern); + /* if (autoStrongAuth) { + nonceOutChannels.get(orig).add(chanName); + }*/ + } + } + + if (hsmTasks.contains(dest.getName().split("__")[1])) { + + if (!hsmSecInChannels.get(dest).contains(chanName) && portInTask(dest, chanName)) { + HSMChannel hsmchan = new HSMChannel(chanName, dest.getName().split("__")[1], HSMChannel.DEC); + hsmChannelMap.get(taskHSMMap.get(dest.getName().split("__")[1])).add(hsmchan); + hsmSecInChannels.get(dest).add(chanName); + /*if (chan.checkAuth && autoStrongAuth) { + nonceInChannels.get(dest).add(chanName); + hsmchan.nonceName="nonce_" + dest.getName().split("__")[1] + "_" + orig.getName().split("__")[1]; + }*/ + } + } else { + if (!secInChannels.get(dest).contains(chanName)) { + secInChannels.get(dest).add(chanName); + /*if (chan.checkAuth && autoStrongAuth) { + nonceInChannels.get(dest).add(chanName); + }*/ + } + } + } + } + } + } + + } + } + } + + // System.out.println("hsmchannelmap" + hsmChannelMap); + for (String chSec : channelSecMap.keySet()) { + TraceManager.addDev("secChannelMap: key=" + chSec + " value= " + channelSecMap.get(chSec).name); + } + for (TMLTask tk : macOutChannels.keySet()) { + TraceManager.addDev("macoutchans: key= " + tk.getName() + " value= " + macOutChannels.get(tk)); + } + for (TMLTask tk : macInChannels.keySet()) { + TraceManager.addDev("macinchans: key= " + tk.getName() + " value= " + macInChannels.get(tk)); + } + for (TMLTask tk : secInChannels.keySet()) { + TraceManager.addDev("nonsecin: key= " + tk.getName() + " value= " + secInChannels.get(tk)); + } + for (TMLTask tk : secOutChannels.keySet()) { + TraceManager.addDev("nonsecout: key= " + tk.getName() + " value= " + secOutChannels.get(tk)); + } + for (TMLTask tk : nonceInChannels.keySet()) { + TraceManager.addDev("noncein: key= " + tk.getName() + " value= " + nonceInChannels.get(tk)); + } + for (TMLTask tk : nonceOutChannels.keySet()) { + TraceManager.addDev("nonceout: key= " + tk.getName() + " value= " + nonceOutChannels.get(tk)); + } + for (TMLTask tk : hsmSecInChannels.keySet()) { + TraceManager.addDev("hsmsecin: key= " + tk.getName() + " value= " + hsmSecInChannels.get(tk)); + } + for (TMLTask tk : hsmSecOutChannels.keySet()) { + TraceManager.addDev("hsmsecout: key= " + tk.getName() + " value= " + hsmSecOutChannels.get(tk)); + } + for (TMLTask tk : toSecureRev.keySet()) { + TraceManager.addDev("tosecrev: key= " + tk.getName() + " value= " + toSecureRev.get(tk)); + } + //Add a HSM Task for each selected CPU on the component diagram, add associated channels, etc + Map<String, List<TMLChannel>> hsmChannelsToMap = new HashMap<String, List<TMLChannel>>(); + //Map<TMLChannel, Set<TMLChannel>> mapHSMChannelsInSameBusesAs = new HashMap<TMLChannel, Set<TMLChannel>>(); + for (String cpuName : selectedCPUTasks.keySet()) { + TMLTask hsm = new TMLTask("HSM_" + cpuName, tmap.getTMLModeling().getTasks().get(0).getReferenceObject(), null); + + TMLAttribute index = new TMLAttribute("channelIndex", new TMLType(TMLType.NATURAL), "0"); + hsm.addAttribute(index); + tmlmodel.addTask(hsm); + + //Find all associated tasks + List<TMLTask> comps = new ArrayList<TMLTask>(); + //Find the component to add a HSM to + + for (TMLTask task : tmlmodel.getTasks()) { + for (String compName : selectedCPUTasks.get(cpuName)) { + if (task.getName().replaceAll(title + "__", "").equals(compName)) { + comps.add(task); + break; + } + } + } + if (comps.size() == 0) { + //System.out.println("No Components found"); + continue; + } + + for (TMLTask comp : comps) { + + //Map<String, HSMChannel> compChannels = new HashMap<String, HSMChannel>(); + //String compName = comp.getValue(); + + List<ChannelData> hsmChans = new ArrayList<ChannelData>(); + ChannelData chd = new ChannelData("startHSM_" + cpuName, false, false); + hsmChans.add(chd); + for (HSMChannel hsmChan : hsmChannelMap.get(cpuName)) { + if (!hsmChan.task.equals(comp.getName().replaceAll(title + "__", ""))) { + continue; + } + if (!channelIndexMap.containsKey(hsmChan.name)) { + channelIndexMap.put(hsmChan.name, channelIndex); + channelIndex++; + } + chd = new ChannelData("data_" + hsmChan.name + "_" + hsmChan.task, false, true); + hsmChans.add(chd); + chd = new ChannelData("retData_" + hsmChan.name + "_" + hsmChan.task, true, true); + hsmChans.add(chd); + } + for (ChannelData hsmChan : hsmChans) { + if (!hsmChan.isChan) { + TMLRequest request = new TMLRequest(hsmChan.name, hsm.getReferenceObject()); + if (hsmChan.isOrigin) { + request.addOriginTask(hsm); + request.setDestinationTask(comp); + } else { + request.addOriginTask(comp); + request.setDestinationTask(hsm); + } + hsm.setRequest(request); + comp.setRequest(request); + request.addParam(new TMLType(TMLType.NATURAL)); + tmlmodel.addRequest(request); + } else { + TMLChannel channel = new TMLChannel(hsmChan.name, hsm.getReferenceObject()); + channel.setPorts(new TMLPort(channel.getName(), channel.getReferenceObject()), new TMLPort(channel.getName(), channel.getReferenceObject())); + if (hsmChan.isOrigin) { + channel.setOriginTask(hsm); + channel.setDestinationTask(comp); + comp.addReadTMLChannel(channel); + hsm.addWriteTMLChannel(channel); + } else { + channel.setOriginTask(comp); + channel.setDestinationTask(hsm); + hsm.addReadTMLChannel(channel); + comp.addWriteTMLChannel(channel); + } + + if (hsmChannelsToMap.containsKey(cpuName)) { + if (!hsmChannelsToMap.get(cpuName).contains(channel)) { + hsmChannelsToMap.get(cpuName).add(channel); + } + } else { + List<TMLChannel> hsmChannels = new ArrayList<TMLChannel>(); + + hsmChannels.add(channel); + hsmChannelsToMap.put(cpuName, hsmChannels); + } + + /*Set<TMLChannel> channelsWithSameMapping = new HashSet<TMLChannel>(); + for (TMLReadChannel rdCh: comp.getReadChannels()) { + for(int i=0; i<rdCh.getNbOfChannels(); i++) { + if (rdCh.getChannel(i).isEnsureConf() || rdCh.getChannel(i).isEnsureWeakAuth()) { + if (!channelsWithSameMapping.contains(rdCh.getChannel(i))) { + channelsWithSameMapping.add(rdCh.getChannel(i)); + } + } + } + } + + for (TMLWriteChannel wrCh: comp.getWriteChannels()) { + for(int i=0; i<wrCh.getNbOfChannels(); i++) { + if (wrCh.getChannel(i).isEnsureConf() || wrCh.getChannel(i).isEnsureWeakAuth()) { + if (!channelsWithSameMapping.contains(wrCh.getChannel(i))) { + channelsWithSameMapping.add(wrCh.getChannel(i)); + } + } + } + } + if (mapHSMChannelsInSameBusesAs.containsKey(channel)) { + mapHSMChannelsInSameBusesAs.get(channel).addAll(channelsWithSameMapping); + } else { + mapHSMChannelsInSameBusesAs.put(channel, channelsWithSameMapping); + }*/ + + //hsm.addTMLChannel(channel); /// IN TMLChannel and WriteTMLChannel ?? + + //comp.addTMLChannel(channel); + tmlmodel.addChannel(channel); + } + } + } + } + + /*for (TMLChannel ch : mapHSMChannelsInSameBusesAs.keySet()) { + for (TMLChannel chAs : mapHSMChannelsInSameBusesAs.get(ch)) { + for (HwCommunicationNode comm : tmap.getAllCommunicationNodesOfChannel(chAs)) { + if (comm instanceof HwBus) { + if (!tmap.isCommNodeMappedOn(ch, comm)) { + tmap.addCommToHwCommNode(ch, comm); + } + } + } + } + }*/ + + for (TMLTask task : toSecureRev.keySet()) { + // TraceManager.addDev("Adding nonces to " + task.getName()); + List<TMLChannel> chans = tmlmodel.getChannelsFromMe(task); + for (TMLTask task2 : toSecureRev.get(task)) { + boolean addChan = true; + for (TMLChannel chan : chans) { + if (chan.getDestinationTask() == task2) { + addChan = false; + } + } + if (addChan) { + TMLChannel channel = new TMLChannel("nonceCh" + task.getName().split("__")[1] + "_" + task2.getName().split("__")[1], task.getReferenceObject()); + if (tmlmodel.getChannelByName(channel.getName()) == null) { + if (hsmTasks.contains(task.getName().replaceAll(title + "__", ""))) { + channel.setOriginTask(tmap.getTaskByName("HSM_" + taskHSMMap.get(task.getName().replaceAll(title + "__", "")))); + tmap.getTaskByName("HSM_" + taskHSMMap.get(task.getName().replaceAll(title + "__", ""))).addWriteTMLChannel(channel); + } else { + channel.setOriginTask(task); + task.addWriteTMLChannel(channel); + } + + if (hsmTasks.contains(task2.getName().replaceAll(title + "__", ""))) { + channel.setDestinationTask(tmap.getTaskByName("HSM_" + taskHSMMap.get(task2.getName().replaceAll(title + "__", "")))); + tmap.getTaskByName("HSM_" + taskHSMMap.get(task2.getName().replaceAll(title + "__", ""))).addReadTMLChannel(channel); + } else { + channel.setDestinationTask(task2); + task2.addReadTMLChannel(channel); + } + + channel.setPorts(new TMLPort(channel.getName(), channel.getReferenceObject()), new TMLPort(channel.getName(), channel.getReferenceObject())); + tmlmodel.addChannel(channel); + } + + } + } + } + + for (String cpuName : selectedCPUTasks.keySet()) { + buildHSMActivityDiagram(cpuName); + //Add a private bus to Hardware Accelerator with the task for hsm + + //Find the CPU the task is mapped to + TMLArchitecture arch = tmap.getArch(); + HwCPU cpu = arch.getHwCPUByName(cpuName); + + if (cpu == null) { + return; + } + + //Add new memory + HwMemory mem = new HwMemory("HSMMemory_" + cpuName); + arch.addHwNode(mem); + + //Add Hardware Accelerator + HwA hwa = new HwA("HSM_" + cpuName); + arch.addHwNode(hwa); + + //Add hsm task to hwa + TMLTask task = tmap.getTaskByName("HSM_" + cpuName); + if (task != null) { + tmap.addTaskToHwExecutionNode(task, hwa); + } + //Add bus to be connecting to the HWA + HwBus bus = new HwBus("HSMBus_" + cpuName); + bus.privacy = HwBus.BUS_PRIVATE; + arch.addHwNode(bus); + + //Add bridge to be connecting to the 2 buses + HwBridge bridge = new HwBridge("HSMBridge_" + cpuName); + arch.addHwNode(bridge); + + //get bus connected to CPU + HwBus busOfCPU = null; + for (HwLink link : tmap.getArch().getHwLinks()) { + if (link.hwnode == cpu) { + busOfCPU = link.bus; + break; + } + } + + for (TMLChannel ch : hsmChannelsToMap.get(cpuName)) { + tmap.addCommToHwCommNode(ch, mem); + tmap.addCommToHwCommNode(ch, bus); + tmap.addCommToHwCommNode(ch, busOfCPU); + } + + //Connect new Bus and Bridge + HwLink linkBridgeWithNewBus = new HwLink("link_" + bridge.getName() + "_to_" + bus.getName()); + linkBridgeWithNewBus.bus = bus; + linkBridgeWithNewBus.hwnode = bridge; + arch.addHwLink(linkBridgeWithNewBus); + + //Connect the Bus of CPU and Bridge + if (busOfCPU != null) { + HwLink linkBridgeWithBus = new HwLink("link_" + bridge.getName() + "_to_" + busOfCPU.getName()); + linkBridgeWithBus.bus = busOfCPU; + linkBridgeWithBus.hwnode = bridge; + arch.addHwLink(linkBridgeWithBus); + } + + //Connect Bus and HWA + HwLink linkHWAWithBus = new HwLink("link_" + hwa.getName() + "_to_" + bus.getName()); + linkHWAWithBus.bus = bus; + linkHWAWithBus.hwnode = hwa; + arch.addHwLink(linkHWAWithBus); + + //Connect Bus and Memory + HwLink linkMemoryWithBus = new HwLink("link_" + mem.getName() + "_to_" + bus.getName()); + linkMemoryWithBus.bus = bus; + linkMemoryWithBus.hwnode = mem; + arch.addHwLink(linkMemoryWithBus); + } + + for (TMLTask task : toSecureRev.keySet()) { + // TraceManager.addDev("Adding nonces to " + task.getName()); + + for (TMLTask task2 : toSecureRev.get(task)) { + TMLChannel channel = tmlmodel.getChannelByName("nonceCh" + task.getName().split("__")[1] + "_" + task2.getName().split("__")[1]); + + List<TMLChannel> chans, chans2; + + chans = tmlmodel.getChannelsToMe(task); + HwMemory memToPutChannel = null; + for (TMLChannel chan : chans) { + if (chan.isCheckAuthChannel()) { + for (HwCommunicationNode mappedNode : tmap.getAllCommunicationNodesOfChannel(chan)) { + if (!(mappedNode instanceof HwMemory)) { + if (!tmap.isCommNodeMappedOn(channel, mappedNode)) { + tmap.addCommToHwCommNode(channel, mappedNode); + } + } + } + HwMemory memoryOfChannel = tmap.getMemoryOfChannel(chan); + if (memoryOfChannel != null) { + memToPutChannel = memoryOfChannel; + } + } + } + + if (hsmTasks.contains(task.getName().replaceAll(title + "__", ""))) { + chans = tmlmodel.getChannelsFromMe(tmap.getTaskByName("HSM_" + taskHSMMap.get(task.getName().replaceAll(title + "__", "")))); + for (TMLChannel chan : chans) { + for (HwCommunicationNode mappedNode : tmap.getAllCommunicationNodesOfChannel(chan)) { + if (!(mappedNode instanceof HwMemory)) { + if (!tmap.isCommNodeMappedOn(channel, mappedNode)) { + tmap.addCommToHwCommNode(channel, mappedNode); + } + } + } + HwMemory memoryOfChannel = tmap.getMemoryOfChannel(chan); + if (memoryOfChannel != null) { + memToPutChannel = memoryOfChannel; + } + } + } + if (memToPutChannel != null) { + if (!tmap.isCommNodeMappedOn(channel, memToPutChannel)) { + tmap.addCommToHwCommNode(channel, memToPutChannel); + } + } + chans2 = tmlmodel.getChannelsFromMe(task2); + for (TMLChannel chan2 : chans2) { + if (chan2.isCheckAuthChannel()) { + for (HwCommunicationNode mappedNode : tmap.getAllCommunicationNodesOfChannel(chan2)) { + if (!(mappedNode instanceof HwMemory)) { + if (!tmap.isCommNodeMappedOn(channel, mappedNode)) { + tmap.addCommToHwCommNode(channel, mappedNode); + } + } + } + } + } + + if (hsmTasks.contains(task2.getName().replaceAll(title + "__", ""))) { + chans2 = tmlmodel.getChannelsToMe(tmap.getTaskByName("HSM_" + taskHSMMap.get(task2.getName().replaceAll(title + "__", "")))); + for (TMLChannel chan2 : chans2) { + for (HwCommunicationNode mappedNode : tmap.getAllCommunicationNodesOfChannel(chan2)) { + if (!(mappedNode instanceof HwMemory)) { + if (!tmap.isCommNodeMappedOn(channel, mappedNode)) { + tmap.addCommToHwCommNode(channel, mappedNode); + } + } + } + } + } + } + } + + + // } + //Add encryption/nonces to activity diagram + for (TMLTask task : toSecure.keySet()) { + TraceManager.addDev("Securing task " + task.getName()); + TMLActivity taskAD = task.getActivityDiagram(); + if (taskAD == null) { + continue; + } + + TMLActivityElement fromStart = taskAD.getFirst(); + //TGConnectingPoint point = new TGConnectingPoint(null, 0, 0, false, false); + + //Find states immediately before the write channel operator + //For each occurence of a write channel operator, add encryption/nonces before it + + + for (String channel : secOutChannels.get(task)) { + Set<TMLActivityElement> channelInstances = new HashSet<TMLActivityElement>(); + TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + channel); + if (tmlc == null) { + //Find by origin port instead + tmlc = tmlmodel.getChannelByOriginPortName(channel); + } + if (tmlc == null) { + continue; + } + //First, find the connector that points to it. We will add the encryption, nonce operators directly before the write channel operator + for (TMLActivityElement elem : taskAD.getElements()) { + if (elem instanceof TMLWriteChannel) { + TMLWriteChannel writeChannel = (TMLWriteChannel) elem; + for (int i = 0; i < writeChannel.getNbOfChannels(); i++) { + if (writeChannel.getChannel(i).getName().equals(tmlc.getName()) && writeChannel.securityPattern == null) { + if (fromStart != null) { + channelInstances.add(elem); + } + } + } + } + } + for (TMLActivityElement elem : channelInstances) { + + //Add encryption operator + TMLExecC encC = new TMLExecC(channelSecMap.get(channel).name, taskAD.getReferenceObject()); + encC.securityPattern = new SecurityPattern(channelSecMap.get(channel)); + encC.securityPattern.setProcess(SecurityPattern.ENCRYPTION_PROCESS); + encC.setAction(Integer.toString(channelSecMap.get(channel).encTime)); + tmlmodel.addSecurityPattern(channelSecMap.get(channel)); + if (tmlmodel.securityTaskMap.containsKey(channelSecMap.get(channel))) { + if (!tmlmodel.securityTaskMap.get(channelSecMap.get(channel)).contains(task)) { + tmlmodel.securityTaskMap.get(channelSecMap.get(channel)).add(task); + } + } else { + List<TMLTask> listTask = new ArrayList<TMLTask>(); + listTask.add(task); + tmlmodel.securityTaskMap.put(channelSecMap.get(channel), listTask); + } + + TMLActivityElement prevElem = taskAD.getPrevious(elem); + if (nonceOutChannels.get(task).contains(channel)) { + SecurityPattern secPatternNonce = new SecurityPattern("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1], SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", ""); + if (tmlc != null) { + encC.securityPattern.nonce = secPatternNonce.getName(); + } + boolean addNewReadNonce = true; + for (TMLActivityElement elemT : taskAD.getElements()) { + if (elemT instanceof TMLReadChannel) { + TMLReadChannel readElem = (TMLReadChannel) elemT; + if (readElem.securityPattern != null) { + if(readElem.securityPattern.getName().equals(secPatternNonce.getName())) { + addNewReadNonce = false; + break; + } + } + } + } + if (addNewReadNonce) { + //Receive any nonces if ensuring authenticity + TMLReadChannel rd = new TMLReadChannel("", taskAD.getReferenceObject()); + //System.out.println("tmlc " + tmlc); + // System.out.println("Checking "+ tmlc.getDestinationTask() + " " + tmlc.getOriginTask()); + List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask()); + + if (matches.size() > 0) { + rd.setName(matches.get(0).getName().replaceAll(title + "__", "")); + if (tmlmodel.getChannelByName(rd.getName()) != null) { + rd.addChannel(tmlmodel.getChannelByName(rd.getName())); + } else if (tmlmodel.getChannelByShortName(rd.getName()) != null) { + rd.addChannel(tmlmodel.getChannelByShortName(rd.getName())); + } + } else { + rd.setName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); + if (tmlmodel.getChannelByName(rd.getName()) != null) { + rd.addChannel(tmlmodel.getChannelByName(rd.getName())); + } else if (tmlmodel.getChannelByShortName(rd.getName()) != null) { + rd.addChannel(tmlmodel.getChannelByShortName(rd.getName())); + } + } + secPatternNonce.originTask = rd.getChannel(0).getOriginTask().getName().replaceAll(title + "__", ""); + rd.securityPattern = secPatternNonce; + rd.setNbOfSamples("1"); + TMLActivityElement nextFirst = taskAD.getFirst().getNextElement(0); + taskAD.getFirst().setNewNext(nextFirst, rd); + rd.addNext(nextFirst); + taskAD.addElement(rd); + //Move encryption operator after receive nonce component + + } + } + prevElem = taskAD.getPrevious(elem); + prevElem.setNewNext(elem, encC); + encC.addNext(elem); + taskAD.addElement(encC); + + //Add security contexts to write channels + for (TMLActivityElement elemAC : taskAD.getElements()) { + if (elemAC instanceof TMLWriteChannel) { + TMLWriteChannel wChannel = (TMLWriteChannel) elemAC; + for (int i=0; i < wChannel.getNbOfChannels(); i++) { + if (channel.equals(wChannel.getChannel(i).getName().replaceAll(title + "__", "")) && wChannel.securityPattern == null) { + wChannel.securityPattern = channelSecMap.get(channel); + // wChannel.setEncForm(true); + } + } + } + } + } + } + + for (String channel : macOutChannels.get(task)) { + //Add MAC before writechannel + TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + channel); + //First, find the connector that points to it. We will add the encryption, nonce operators directly before the write channel operator + if (tmlc == null) { + tmlc = tmlmodel.getChannelByOriginPortName(channel); + } + if (tmlc == null) { + continue; + } + Set<TMLActivityElement> channelInstances = new HashSet<TMLActivityElement>(); + for (TMLActivityElement elem : taskAD.getElements()) { + if (elem instanceof TMLWriteChannel) { + TMLWriteChannel writeChannel = (TMLWriteChannel) elem; + for (int i=0; i < writeChannel.getNbOfChannels(); i++) { + if (writeChannel.getChannel(i).getName().equals(tmlc.getName()) && writeChannel.securityPattern == null) { + fromStart = taskAD.getPrevious(elem); + if (fromStart != null) { + channelInstances.add(elem); + } + } + } + } + } + for (TMLActivityElement elem : channelInstances) { + //SecurityPattern secPattern = new SecurityPattern(channelSecMap.get(channel), SecurityPattern.MAC_PATTERN, overhead, overhead, encComp, decComp, "", "", ""); + channelSecMap.get(channel).type = SecurityPattern.MAC_PATTERN; + TMLExecC encC = new TMLExecC(channelSecMap.get(channel).name, taskAD.getReferenceObject()); + encC.securityPattern = new SecurityPattern(channelSecMap.get(channel)); + encC.securityPattern.setProcess(SecurityPattern.ENCRYPTION_PROCESS); + encC.setAction(Integer.toString(channelSecMap.get(channel).encTime)); + tmlmodel.addSecurityPattern(channelSecMap.get(channel)); + if (tmlmodel.securityTaskMap.containsKey(channelSecMap.get(channel))) { + if (!tmlmodel.securityTaskMap.get(channelSecMap.get(channel)).contains(task)) { + tmlmodel.securityTaskMap.get(channelSecMap.get(channel)).add(task); + } + } else { + List<TMLTask> listTask = new ArrayList<TMLTask>(); + listTask.add(task); + tmlmodel.securityTaskMap.put(channelSecMap.get(channel), listTask); + } + + TMLActivityElement prevElem = taskAD.getPrevious(elem); + if (nonceOutChannels.get(task).contains(channel)) { + SecurityPattern secPatternNonce = new SecurityPattern("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1], SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", ""); + if (tmlc != null) { + encC.securityPattern.nonce = secPatternNonce.getName(); + } + boolean addNewReadNonce = true; + for (TMLActivityElement elemT : taskAD.getElements()) { + if (elemT instanceof TMLReadChannel) { + TMLReadChannel readElem = (TMLReadChannel) elemT; + if (readElem.securityPattern != null) { + if(readElem.securityPattern.getName().equals(secPatternNonce.getName())) { + addNewReadNonce = false; + break; + } + } + } + } + if (addNewReadNonce) { + //If we need to receive a nonce + TMLReadChannel rd = new TMLReadChannel("", taskAD.getReferenceObject()); + //Receive any nonces if ensuring authenticity + List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask()); + if (matches.size() > 0) { + rd.setName(matches.get(0).getName().replaceAll(title + "__", "")); + if (tmlmodel.getChannelByName(rd.getName()) != null) { + rd.addChannel(tmlmodel.getChannelByName(rd.getName())); + } else if (tmlmodel.getChannelByShortName(rd.getName()) != null) { + rd.addChannel(tmlmodel.getChannelByShortName(rd.getName())); + } + } else { + rd.setName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); + if (tmlmodel.getChannelByName(rd.getName()) != null) { + rd.addChannel(tmlmodel.getChannelByName(rd.getName())); + } else if (tmlmodel.getChannelByShortName(rd.getName()) != null) { + rd.addChannel(tmlmodel.getChannelByShortName(rd.getName())); + } + } + secPatternNonce.originTask = rd.getChannel(0).getOriginTask().getName().replaceAll(title + "__", ""); + rd.securityPattern = secPatternNonce; + rd.setNbOfSamples("1"); + TMLActivityElement nextFirst = taskAD.getFirst().getNextElement(0); + taskAD.getFirst().setNewNext(nextFirst, rd); + rd.addNext(nextFirst); + taskAD.addElement(rd); + + } + } + //Add encryption operator + prevElem = taskAD.getPrevious(elem); + prevElem.setNewNext(elem, encC); + encC.addNext(elem); + taskAD.addElement(encC); + //Add security contexts to write channels + for (TMLActivityElement elemA : taskAD.getElements()) { + if (elemA instanceof TMLWriteChannel) { + TMLWriteChannel wChannel = (TMLWriteChannel) elemA; + for (int i=0; i < wChannel.getNbOfChannels(); i++) { + if (channel.equals(wChannel.getChannel(i).getName().replaceAll(title + "__", "")) && wChannel.securityPattern == null) { + wChannel.securityPattern = channelSecMap.get(channel); + // wChannel.setEncForm(true); + } + } + } + } + } + } + for (String channel : hsmSecOutChannels.get(task)) { + Set<TMLActivityElement> channelInstances = new HashSet<TMLActivityElement>(); + for (TMLActivityElement elem : taskAD.getElements()) { + if (elem instanceof TMLWriteChannel) { + TMLWriteChannel writeChannel = (TMLWriteChannel) elem; + for (int i=0; i < writeChannel.getNbOfChannels(); i++) { + if (writeChannel.getChannel(i).getName().replaceAll(title + "__", "").equals(channel) && writeChannel.securityPattern == null) { + fromStart = taskAD.getPrevious(elem); + if (fromStart != null) { + channelInstances.add(elem); + } + } + } + } + } + for (TMLActivityElement chan : channelInstances) { + TMLWriteChannel writeChannel = (TMLWriteChannel) chan; + String chanName = writeChannel.getChannel(0).getName().replaceAll(title + "__", ""); + TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + chanName); + + if (tmlc == null) { + tmlc = tmlmodel.getChannelByOriginPortName(channel); + } + if (tmlc == null) { + continue; + } + writeChannel.securityPattern = channelSecMap.get(channel); + // writeChannel.setEncForm(true); + fromStart = taskAD.getPrevious(chan); + + TMLSendRequest reqSend = new TMLSendRequest("startHSM_" + taskHSMMap.get(task.getName().split("__")[1]), taskAD.getReferenceObject()); + + TMLRequest req = tmlmodel.getRequestByName(reqSend.getName()); + if (req != null) { + reqSend.setRequest(req); + } + + if (reqSend.getNbOfParams() > 0) { + reqSend.setParam(Integer.toString(channelIndexMap.get(chanName)), 0); + } else { + reqSend.addParam(Integer.toString(channelIndexMap.get(chanName))); + } + + fromStart.setNewNext(chan, reqSend); + taskAD.addElement(reqSend); + //Add write channel operator + TMLWriteChannel wr = new TMLWriteChannel("data_" + chanName + "_" + task.getName().split("__")[1], taskAD.getReferenceObject()); + if (tmlmodel.getChannelByName(wr.getName()) != null) { + wr.addChannel(tmlmodel.getChannelByName(wr.getName())); + } else if (tmlmodel.getChannelByShortName(wr.getName()) != null) { + wr.addChannel(tmlmodel.getChannelByShortName(wr.getName())); + } + wr.setNbOfSamples("1"); + // wr.setEncForm(false); + //wr.securityPattern = channelSecMap.get(chanName); + taskAD.addElement(wr); + reqSend.addNext(wr); + wr.addNext(chan); + //Receive any nonces if ensuring authenticity + /* if (nonceOutChannels.get(task).contains(channel)) { + //Read nonce from rec task + + List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask()); + TMLReadChannel rd = new TMLReadChannel("", taskAD.getReferenceObject()); + if (matches.size() > 0) { + rd.setName(matches.get(0).getName().replaceAll(title + "__", "")); + if (tmlmodel.getChannelByName(rd.getName()) != null) { + rd.addChannel(tmlmodel.getChannelByName(rd.getName())); + } else if (tmlmodel.getChannelByShortName(rd.getName()) != null) { + rd.addChannel(tmlmodel.getChannelByShortName(rd.getName())); + } + } else { + rd.setName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); + if (tmlmodel.getChannelByName(rd.getName()) != null) { + rd.addChannel(tmlmodel.getChannelByName(rd.getName())); + } else if (tmlmodel.getChannelByShortName(rd.getName()) != null) { + rd.addChannel(tmlmodel.getChannelByShortName(rd.getName())); + } + } + SecurityPattern secPatternNonce = new SecurityPattern("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1], SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", ""); + secPatternNonce.originTask = rd.getChannel(0).getOriginTask().getName().replaceAll(title + "__", ""); + rd.securityPattern = secPatternNonce; + rd.setNbOfSamples("1"); + taskAD.addElement(rd); + fromStart.setNewNext(reqSend, rd); + rd.addNext(reqSend); + //wr.setNewNext(chan, rd); + + TMLWriteChannel wr2 = new TMLWriteChannel("data_" + chanName + "_" + task.getName().split("__")[1], taskAD.getReferenceObject()); + if (tmlmodel.getChannelByName(wr2.getName()) != null) { + wr2.addChannel(tmlmodel.getChannelByName(wr2.getName())); + } else if (tmlmodel.getChannelByShortName(wr2.getName()) != null) { + wr2.addChannel(tmlmodel.getChannelByShortName(wr2.getName())); + } + wr2.setNbOfSamples("1"); + wr2.securityPattern = secPatternNonce; + taskAD.addElement(wr2); + reqSend.setNewNext(wr, wr2); + wr2.addNext(wr); + } */ + + //Read channel operator to receive hsm data + TMLReadChannel rd2 = new TMLReadChannel("retData_" + chanName + "_" + task.getName().split("__")[1], taskAD.getReferenceObject()); + if (tmlmodel.getChannelByName(rd2.getName()) != null) { + rd2.addChannel(tmlmodel.getChannelByName(rd2.getName())); + } else if (tmlmodel.getChannelByShortName(rd2.getName()) != null) { + rd2.addChannel(tmlmodel.getChannelByShortName(rd2.getName())); + } + rd2.securityPattern = channelSecMap.get(chanName); + rd2.setNbOfSamples("1"); + taskAD.addElement(rd2); + + fromStart = taskAD.getPrevious(chan); + fromStart.setNewNext(chan, rd2); + rd2.addNext(chan); + } + } + + for (String channel : hsmSecInChannels.get(task)) { + //System.out.println("Checking hsmsecinchannel " + channel + " " + task.getName()); + Set<TMLActivityElement> channelInstances = new HashSet<TMLActivityElement>(); + //TGConnector conn = new TGConnectorTMLAD(0, 0, 0, 0, 0, 0, false, null, tad, null, null, new Vector<Point>()); + //TGConnectingPoint next = new TGConnectingPoint(null, 0, 0, false, false); + for (TMLActivityElement elem : taskAD.getElements()) { + if (elem instanceof TMLReadChannel) { + TMLReadChannel readChannel = (TMLReadChannel) elem; + for (int i=0; i<readChannel.getNbOfChannels(); i++) { + if (readChannel.getChannel(i).getName().replaceAll(title + "__", "").equals(channel) && readChannel.securityPattern == null) { + fromStart = taskAD.getPrevious(elem); + if (fromStart != null) { + channelInstances.add(elem); + } + } + } + } + } + //System.out.println("matches " + channelInstances); + for (TMLActivityElement chan : channelInstances) { + TMLReadChannel readChannel = (TMLReadChannel) chan; + String chanName = readChannel.getChannel(0).getName().replaceAll(title + "__", ""); + TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + chanName); + if (tmlc == null) { + tmlc = tmlmodel.getChannelByDestinationPortName(channel); + } + if (tmlc == null) { + continue; + } + readChannel.securityPattern = channelSecMap.get(chanName); + // readChannel.setEncForm(true); + + fromStart = taskAD.getPrevious(chan); + TMLActivityElement nextReadCh = chan.getNextElement(0); + + TMLSendRequest reqSend = new TMLSendRequest("startHSM_" + taskHSMMap.get(task.getName().split("__")[1]), taskAD.getReferenceObject()); + TMLRequest req = tmlmodel.getRequestByName(reqSend.getName()); + if (req != null) { + reqSend.setRequest(req); + } + if (reqSend.getNbOfParams() > 0) { + reqSend.setParam(Integer.toString(channelIndexMap.get(chanName)), 0); + } else { + reqSend.addParam(Integer.toString(channelIndexMap.get(chanName))); + } + taskAD.addElement(reqSend); + fromStart.setNewNext(chan, reqSend); + reqSend.addNext(chan); + + //Add write channel operator + TMLWriteChannel wr = new TMLWriteChannel("data_" + chanName + "_" + task.getName().split("__")[1], taskAD.getReferenceObject()); + if (tmlmodel.getChannelByName(wr.getName()) != null) { + wr.addChannel(tmlmodel.getChannelByName(wr.getName())); + } else if (tmlmodel.getChannelByShortName(wr.getName()) != null) { + wr.addChannel(tmlmodel.getChannelByShortName(wr.getName())); + } + wr.securityPattern = channelSecMap.get(chanName); + wr.setNbOfSamples("1"); + taskAD.addElement(wr); + + //Add connector between request and write + chan.setNewNext(nextReadCh, wr); + + + /*if (nonceInChannels.get(task).contains(channel)) { + //Create a nonce operator and a write channel operator + TMLExecC nonce = new TMLExecC("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1], taskAD.getReferenceObject()); + SecurityPattern secNonce = new SecurityPattern(nonce.getName(), SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", ""); + + nonce.securityPattern = secNonce; + nonce.securityPattern.setProcess(SecurityPattern.ENCRYPTION_PROCESS); + nonce.setAction(Integer.toString(secNonce.encTime)); + + tmlmodel.addSecurityPattern(secNonce); + if (tmlmodel.securityTaskMap.containsKey(secNonce)) { + if (!tmlmodel.securityTaskMap.get(secNonce).contains(task)) { + tmlmodel.securityTaskMap.get(secNonce).add(task); + } + } else { + List<TMLTask> listTask = new ArrayList<TMLTask>(); + listTask.add(task); + tmlmodel.securityTaskMap.put(secNonce, listTask); + } + + taskAD.addElement(nonce); + fromStart.setNewNext(chan, nonce); + + TMLWriteChannel wr3 = new TMLWriteChannel("", taskAD.getReferenceObject()); + //Send nonce along channel, the newly created nonce channel or an existing channel with the matching sender and receiver + //Find matching channels + List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask()); + + if (matches.size() > 0) { + wr3.setName(matches.get(0).getName().replaceAll(title + "__", "")); + if (tmlmodel.getChannelByName(wr3.getName()) != null) { + wr3.addChannel(tmlmodel.getChannelByName(wr3.getName())); + } else if (tmlmodel.getChannelByShortName(wr3.getName()) != null) { + wr3.addChannel(tmlmodel.getChannelByShortName(wr3.getName())); + } + } else { + wr3.setName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); + if (tmlmodel.getChannelByName(wr3.getName()) != null) { + wr3.addChannel(tmlmodel.getChannelByName(wr3.getName())); + } else if (tmlmodel.getChannelByShortName(wr3.getName()) != null) { + wr3.addChannel(tmlmodel.getChannelByShortName(wr3.getName())); + } + } + //send the nonce along the channel + secNonce.originTask = wr3.getChannel(0).getOriginTask().getName().replaceAll(title + "__", ""); + wr3.securityPattern = secNonce; + + wr3.setNbOfSamples("1"); + taskAD.addElement(wr3); + nonce.addNext(wr3); + wr3.addNext(chan); + + //Also send nonce to hsm + TMLWriteChannel wr2 = new TMLWriteChannel("data_" + chanName + "_" + task.getName().split("__")[1], taskAD.getReferenceObject()); + if (tmlmodel.getChannelByName(wr2.getName()) != null) { + wr2.addChannel(tmlmodel.getChannelByName(wr2.getName())); + } else if (tmlmodel.getChannelByShortName(wr2.getName()) != null) { + wr2.addChannel(tmlmodel.getChannelByShortName(wr2.getName())); + } + wr2.securityPattern = secNonce; + wr2.setNbOfSamples("1"); + taskAD.addElement(wr2); + + reqSend.setNewNext(wr, wr2); + wr2.addNext(wr); + }*/ + + + //Add read channel operator + + TMLReadChannel rd = new TMLReadChannel("retData_" + chanName + "_" + task.getName().split("__")[1], taskAD.getReferenceObject()); + if (tmlmodel.getChannelByName(rd.getName()) != null) { + rd.addChannel(tmlmodel.getChannelByName(rd.getName())); + } else if (tmlmodel.getChannelByShortName(rd.getName()) != null) { + rd.addChannel(tmlmodel.getChannelByShortName(rd.getName())); + } + //rd.securityPattern = channelSecMap.get(chanName); + rd.setNbOfSamples("1"); + // rd.setEncForm(false); + taskAD.addElement(rd); + + wr.addNext(rd); + rd.addNext(nextReadCh); + + } + } + for (String channel : macInChannels.get(task)) { + //Add decryptmac after readchannel + Set<TMLActivityElement> channelInstances = new HashSet<TMLActivityElement>(); + //Find read channel operator + TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + channel); + if (tmlc == null) { + tmlc = tmlmodel.getChannelByDestinationPortName(channel); + } + if (tmlc == null) { + continue; + } + for (TMLActivityElement elem : taskAD.getElements()) { + if (elem instanceof TMLReadChannel) { + TMLReadChannel readChannel = (TMLReadChannel) elem; + for (int i = 0; i<readChannel.getNbOfChannels(); i++) { + if (readChannel.getChannel(i).getName().equals(tmlc.getName()) && readChannel.securityPattern == null) { + fromStart = taskAD.getPrevious(elem); + if (fromStart != null) { + channelInstances.add(elem); + } + } + } + } + } + for (TMLActivityElement elem : channelInstances) { + fromStart = taskAD.getPrevious(elem); + + TMLReadChannel readChannel = (TMLReadChannel) elem; + readChannel.securityPattern = channelSecMap.get(readChannel.getChannel(0).getName().replaceAll(title + "__", "")); + //Create nonce and send it + if (nonceInChannels.get(task).contains(channel)) { + TMLExecC nonce = new TMLExecC("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1], taskAD.getReferenceObject()); + SecurityPattern secNonce = new SecurityPattern(nonce.getName(), SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", ""); + nonce.securityPattern = secNonce; + nonce.securityPattern.setProcess(SecurityPattern.ENCRYPTION_PROCESS); + nonce.setAction(Integer.toString(secNonce.encTime)); + boolean addNewExecCNonce = true; + for (TMLActivityElement elemT : taskAD.getElements()) { + if (elemT instanceof TMLExecC) { + TMLExecC exeCElem = (TMLExecC) elemT; + if (exeCElem.securityPattern != null) { + if(exeCElem.securityPattern.getName().equals(secNonce.getName())) { + addNewExecCNonce = false; + break; + } + } + } + } + if (addNewExecCNonce) { + //Create a nonce operator and a write channel operator + tmlmodel.addSecurityPattern(secNonce); + if (tmlmodel.securityTaskMap.containsKey(secNonce)) { + if (!tmlmodel.securityTaskMap.get(secNonce).contains(task)) { + tmlmodel.securityTaskMap.get(secNonce).add(task); + } + } else { + List<TMLTask> listTask = new ArrayList<TMLTask>(); + listTask.add(task); + tmlmodel.securityTaskMap.put(secNonce, listTask); + } + TMLActivityElement first = taskAD.getFirst(); + TMLActivityElement nextFirst = first.getNextElement(0); + taskAD.addElement(nonce); + first.setNewNext(nextFirst, nonce); + TMLWriteChannel wr = new TMLWriteChannel("", taskAD.getReferenceObject()); + //Send nonce along channel, the newly created nonce channel or an existing channel with the matching sender and receiver + //Find matching channels + List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask()); + + if (matches.size() > 0) { + wr.setName(matches.get(0).getName().replaceAll(title + "__", "")); + if (tmlmodel.getChannelByName(wr.getName()) != null) { + wr.addChannel(tmlmodel.getChannelByName(wr.getName())); + } else if (tmlmodel.getChannelByShortName(wr.getName()) != null) { + wr.addChannel(tmlmodel.getChannelByShortName(wr.getName())); + } + } else { + wr.setName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); + if (tmlmodel.getChannelByName(wr.getName()) != null) { + wr.addChannel(tmlmodel.getChannelByName(wr.getName())); + } else if (tmlmodel.getChannelByShortName(wr.getName()) != null) { + wr.addChannel(tmlmodel.getChannelByShortName(wr.getName())); + } + } + secNonce.originTask = wr.getChannel(0).getOriginTask().getName().replaceAll(title + "__", ""); + //send the nonce along the channel + wr.setNbOfSamples("1"); + wr.securityPattern = secNonce; + taskAD.addElement(wr); + nonce.addNext(wr); + wr.addNext(nextFirst); + } + } + + //Add decryption operator if it does not already exist + TMLExecC dec = new TMLExecC(channelSecMap.get(readChannel.getChannel(0).getName().replaceAll(title + "__", "")).name, taskAD.getReferenceObject()); + dec.securityPattern = new SecurityPattern(channelSecMap.get(readChannel.getChannel(0).getName().replaceAll(title + "__", ""))); + dec.setAction(Integer.toString(dec.securityPattern.encTime)); + tmlmodel.addSecurityPattern(channelSecMap.get(readChannel.getChannel(0).getName().replaceAll(title + "__", ""))); + if (tmlmodel.securityTaskMap.containsKey(channelSecMap.get(readChannel.getChannel(0).getName().replaceAll(title + "__", "")))) { + if (!tmlmodel.securityTaskMap.get(channelSecMap.get(readChannel.getChannel(0).getName().replaceAll(title + "__", ""))).contains(task)) { + tmlmodel.securityTaskMap.get(channelSecMap.get(readChannel.getChannel(0).getName().replaceAll(title + "__", ""))).add(task); + } + } else { + List<TMLTask> listTask = new ArrayList<TMLTask>(); + listTask.add(task); + tmlmodel.securityTaskMap.put(channelSecMap.get(readChannel.getChannel(0).getName().replaceAll(title + "__", "")), listTask); + } + dec.securityPattern.setProcess(SecurityPattern.DECRYPTION_PROCESS); + taskAD.addElement(dec); + dec.addNext(readChannel.getNextElement(0)); + readChannel.setNewNext(readChannel.getNextElement(0), dec); + //Shift everything down + for (TMLActivityElement elemA : taskAD.getElements()) { + if (elemA instanceof TMLReadChannel) { + TMLReadChannel rdOfSameCh = (TMLReadChannel) elemA; + for (int i=0; i<rdOfSameCh.getNbOfChannels(); i++) { + if (channel.equals(rdOfSameCh.getChannel(i).getName().replaceAll(title + "__", "")) && rdOfSameCh.securityPattern == null) { + rdOfSameCh.securityPattern = channelSecMap.get(channel); + // rdOfSameCh.setEncForm(true); + } + } + } + } + } + } + for (String channel : secInChannels.get(task)) { + TraceManager.addDev("securing channel " + channel); + //Find read channel operator + TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + channel); + if (tmlc == null) { + tmlc = tmlmodel.getChannelByDestinationPortName(channel); + } + if (tmlc == null) { + continue; + } + HashSet<TMLActivityElement> channelInstances = new HashSet<TMLActivityElement>(); + for (TMLActivityElement elem : taskAD.getElements()) { + if (elem instanceof TMLReadChannel) { + TMLReadChannel readChannel = (TMLReadChannel) elem; + for (int i=0; i<readChannel.getNbOfChannels(); i++) { + if (readChannel.getChannel(i).getName().equals(tmlc.getName()) && readChannel.securityPattern == null) { + fromStart = taskAD.getPrevious(elem); + if (fromStart != null) { + channelInstances.add(elem); + } + } + } + } + } + + for (TMLActivityElement elem : channelInstances) { + TMLReadChannel readChannel = (TMLReadChannel) elem; + fromStart = taskAD.getPrevious(elem); + if (nonceInChannels.get(task).contains(channel)) { + //Create a nonce operator and a write channel operator + TMLExecC nonce = new TMLExecC("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1], taskAD.getReferenceObject()); + SecurityPattern secNonce = new SecurityPattern(nonce.getName(), SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", ""); + nonce.securityPattern = secNonce; + nonce.securityPattern.setProcess(SecurityPattern.ENCRYPTION_PROCESS); + nonce.setAction(Integer.toString(secNonce.encTime)); + boolean addNewExecCNonce = true; + for (TMLActivityElement elemT : taskAD.getElements()) { + if (elemT instanceof TMLExecC) { + TMLExecC exeCElem = (TMLExecC) elemT; + if (exeCElem.securityPattern != null) { + if(exeCElem.securityPattern.getName().equals(secNonce.getName())) { + addNewExecCNonce = false; + break; + } + } + } + } + if (addNewExecCNonce) { + tmlmodel.addSecurityPattern(secNonce); + if (tmlmodel.securityTaskMap.containsKey(secNonce)) { + if (!tmlmodel.securityTaskMap.get(secNonce).contains(task)) { + tmlmodel.securityTaskMap.get(secNonce).add(task); + } + } else { + List<TMLTask> listTask = new ArrayList<TMLTask>(); + listTask.add(task); + tmlmodel.securityTaskMap.put(secNonce, listTask); + } + + taskAD.addElement(nonce); + TMLActivityElement first = taskAD.getFirst(); + TMLActivityElement nextFirst = first.getNextElement(0); + first.setNewNext(nextFirst, nonce); + TMLWriteChannel wr = new TMLWriteChannel("", taskAD.getReferenceObject()); + //Send nonce along channel, the newly created nonce channel or an existing channel with the matching sender and receiver + //Find matching channels + List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask()); + + if (matches.size() > 0) { + wr.setName(matches.get(0).getName().replaceAll(title + "__", "")); + if (tmlmodel.getChannelByName(wr.getName()) != null) { + wr.addChannel(tmlmodel.getChannelByName(wr.getName())); + } else if (tmlmodel.getChannelByShortName(wr.getName()) != null) { + wr.addChannel(tmlmodel.getChannelByShortName(wr.getName())); + } + } else { + wr.setName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); + if (tmlmodel.getChannelByName(wr.getName()) != null) { + wr.addChannel(tmlmodel.getChannelByName(wr.getName())); + } else if (tmlmodel.getChannelByShortName(wr.getName()) != null) { + wr.addChannel(tmlmodel.getChannelByShortName(wr.getName())); + } + } + secNonce.originTask = wr.getChannel(0).getOriginTask().getName().replaceAll(title + "__", ""); + //send the nonce along the channel + wr.setNbOfSamples("1"); + wr.securityPattern = secNonce; + taskAD.addElement(wr); + nonce.addNext(wr); + wr.addNext(nextFirst); + } + } + + //Now add the decrypt operator + String readChShortName = readChannel.getChannel(0).getName().replaceAll(title + "__", ""); + readChannel.securityPattern = channelSecMap.get(readChShortName); + // readChannel.setEncForm(true); + //Add decryption operator if it does not already exist + TMLExecC dec = new TMLExecC(channelSecMap.get(readChShortName).name, taskAD.getReferenceObject()); + dec.securityPattern = new SecurityPattern(channelSecMap.get(readChShortName)); + dec.securityPattern.setProcess(SecurityPattern.DECRYPTION_PROCESS); + dec.setAction(Integer.toString(channelSecMap.get(readChShortName).encTime)); + + tmlmodel.addSecurityPattern(channelSecMap.get(readChShortName)); + if (tmlmodel.securityTaskMap.containsKey(channelSecMap.get(readChShortName))) { + if (!tmlmodel.securityTaskMap.get(channelSecMap.get(readChShortName)).contains(task)) { + tmlmodel.securityTaskMap.get(channelSecMap.get(readChShortName)).add(task); + } + } else { + List<TMLTask> listTask = new ArrayList<TMLTask>(); + listTask.add(task); + tmlmodel.securityTaskMap.put(channelSecMap.get(readChShortName), listTask); + } + + taskAD.addElement(dec); + dec.addNext(readChannel.getNextElement(0)); + readChannel.setNewNext(readChannel.getNextElement(0), dec); + //Shift everything down + for (TMLActivityElement elemA : taskAD.getElements()) { + if (elemA instanceof TMLReadChannel) { + TMLReadChannel rdOfSameCh = (TMLReadChannel) elemA; + for (int i=0; i < rdOfSameCh.getNbOfChannels(); i++) { + String readSameChShortName = rdOfSameCh.getChannel(i).getName().replaceAll(title + "__", ""); + if (channel.equals(readSameChShortName) && rdOfSameCh.securityPattern == null) { + rdOfSameCh.securityPattern = channelSecMap.get(readSameChShortName); + // rdOfSameCh.setEncForm(true); + } + } + } + } + } + } + } + return; + } + + public void buildHSMActivityDiagram(String cpuName) { + TMLModeling<?> tmlmodel = tmap.getTMLModeling(); + //Build HSM Activity diagram + TMLTask task = tmap.getTaskByName("HSM_" + cpuName); + TMLActivity taskAD = task.getActivityDiagram(); + if (taskAD == null) { + return; + } + + TMLActivityElement start = taskAD.getFirst(); + if (start == null) { + start = new TMLStartState("start", taskAD.getReferenceObject()); + taskAD.setFirst(start); + } + + //fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); + + if (hsmChannelMap.get(cpuName).size() == 0) { + TMLStopState stop = new TMLStopState("stop", taskAD.getReferenceObject()); + taskAD.addElement(stop); + //Connect stop and start + start.addNext(stop); + return; + } + TMLActionState req = new TMLActionState("action", taskAD.getReferenceObject()); + if (task.getAttributeByName("channelIndex") == null) { + TMLAttribute attrib = new TMLAttribute("channelIndex", new TMLType(TMLType.NATURAL), "0"); + task.addAttribute(attrib); + } + if (task.getAttributeByName("arg0__req") == null) { + TMLAttribute attrib = new TMLAttribute("arg0__req", new TMLType(TMLType.NATURAL), "0"); + task.addAttribute(attrib); + } + req.setAction("channelIndex = arg0__req"); + taskAD.addElement(req); + //Connect start and readrequest + start.addNext(req); + + TMLActivityElement lastCurElem = req; + List<String> readNonces = new ArrayList<String>(); + List<String> writeNonces = new ArrayList<String>(); + for (HSMChannel ch : hsmChannelMap.get(cpuName)) { + if (!ch.nonceName.equals("")) { + if (ch.secType == HSMChannel.DEC) { + TMLExecC nonce = new TMLExecC("nonce_" + ch.task + "_" + tmlmodel.getChannelByShortName(ch.name).getOriginTask().getName().replaceAll(appName + "__", ""), taskAD.getReferenceObject()); + SecurityPattern secNonce = new SecurityPattern(nonce.getName(), SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", ""); + nonce.securityPattern = secNonce; + nonce.securityPattern.setProcess(SecurityPattern.ENCRYPTION_PROCESS); + nonce.setAction(Integer.toString(secNonce.encTime)); + if (!writeNonces.contains(nonce.getName())) { + tmlmodel.addSecurityPattern(secNonce); + if (tmlmodel.securityTaskMap.containsKey(secNonce)) { + if (!tmlmodel.securityTaskMap.get(secNonce).contains(task)) { + tmlmodel.securityTaskMap.get(secNonce).add(task); + } + } else { + List<TMLTask> listTask = new ArrayList<TMLTask>(); + listTask.add(task); + tmlmodel.securityTaskMap.put(secNonce, listTask); + } + + taskAD.addElement(nonce); + + if (lastCurElem.getNbNext()>0) { + lastCurElem.setNewNext(lastCurElem.getNextElement(0), nonce); + } else { + lastCurElem.addNext(nonce); + } + TMLWriteChannel wr = new TMLWriteChannel("", taskAD.getReferenceObject()); + wr.setName("nonceCh" + ch.task + "_" + tmlmodel.getChannelByShortName(ch.name).getOriginTask().getName().split("__")[1]); + if (tmlmodel.getChannelByName(wr.getName()) != null) { + wr.addChannel(tmlmodel.getChannelByName(wr.getName())); + } else if (tmlmodel.getChannelByShortName(wr.getName()) != null) { + wr.addChannel(tmlmodel.getChannelByShortName(wr.getName())); + } + secNonce.originTask = task.getName(); + //send the nonce along the channel + wr.setNbOfSamples("1"); + wr.securityPattern = secNonce; + taskAD.addElement(wr); + nonce.addNext(wr); + lastCurElem = wr; + writeNonces.add(nonce.getName()); + } + } else { + SecurityPattern secPatternNonce = new SecurityPattern("nonce_" + tmlmodel.getChannelByShortName(ch.name).getDestinationTask().getName().replaceAll(appName + "__", "") + "_" + ch.task, SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", ""); + if (!readNonces.contains(secPatternNonce.getName())) { + //If we need to receive a nonce + TMLReadChannel rd = new TMLReadChannel("", taskAD.getReferenceObject()); + //Receive any nonces if ensuring authenticity + rd.setName("nonceCh" + tmlmodel.getChannelByShortName(ch.name).getDestinationTask().getName().replaceAll(appName + "__", "") + "_" + ch.task); + if (tmlmodel.getChannelByName(rd.getName()) != null) { + rd.addChannel(tmlmodel.getChannelByName(rd.getName())); + } else if (tmlmodel.getChannelByShortName(rd.getName()) != null) { + rd.addChannel(tmlmodel.getChannelByShortName(rd.getName())); + } + secPatternNonce.originTask = rd.getChannel(0).getOriginTask().getName().replaceAll(appName + "__", ""); + rd.securityPattern = secPatternNonce; + rd.setNbOfSamples("1"); + if (lastCurElem.getNbNext() > 0) { + lastCurElem.setNewNext(lastCurElem.getNextElement(0), rd); + } else { + lastCurElem.addNext(rd); + } + lastCurElem = rd; + taskAD.addElement(rd); + readNonces.add(secPatternNonce.getName()); + } + } + } + } + + + TMLChoice choice = new TMLChoice("choice", taskAD.getReferenceObject()); + taskAD.addElement(choice); + + //Connect lastCurElem and choice + lastCurElem.addNext(choice); + + //Allows 9 channels max to simplify the diagram + + //If more than 3 channels, build 2 levels of choices + + if (hsmChannelMap.get(cpuName).size() > 3) { + TMLChoice choice2 = new TMLChoice("choice2", taskAD.getReferenceObject()); + int i = 0; + for (HSMChannel ch : hsmChannelMap.get(cpuName)) { + if (i > 8) { + break; + } + if (i % 3 == 0) { + //Add a new choice every third channel + choice2 = new TMLChoice("choice2", taskAD.getReferenceObject()); + taskAD.addElement(choice2); + //Connect new choice operator to top choice + choice.addGuard(""); + choice.addNext(choice2); + } + choice2.addGuard("[channelIndex==" + channelIndexMap.get(ch.name) + "]"); + + if (choice.getGuard(choice.getNbGuard()-1).length() == 2) { + choice.setGuardAt(choice.getNbGuard()-1,"[(" + choice2.getGuard(choice2.getNbGuard()-1).substring(1, choice2.getGuard(choice2.getNbGuard()-1).length()-1) + ")]"); + } else { + choice.setGuardAt(choice.getNbGuard()-1, choice.getGuard(choice.getNbGuard()-1).substring(0, choice.getGuard(choice.getNbGuard()-1).length()-1) + " or (" + choice2.getGuard(choice2.getNbGuard()-1).substring(1, choice2.getGuard(choice2.getNbGuard()-1).length()-1) + ")]"); + } + + TMLActivityElement prevRd = choice2; + //If needed, receive nonce from task + /*if (!ch.nonceName.equals("")) { + //Connect choice and readchannel + TMLReadChannel rdNonce = new TMLReadChannel(("data_" + ch.name + "_" + ch.task), taskAD.getReferenceObject()); + rdNonce.addChannel(tmlmodel.getChannelByName("data_" + ch.name + "_" + ch.task)); + rdNonce.securityPattern = new SecurityPattern(ch.nonceName, SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", ""); + rdNonce.securityPattern.originTask = rdNonce.getChannel(0).getOriginTask().getName().replaceAll(appName + "__", ""); + rdNonce.setNbOfSamples("1"); + taskAD.addElement(rdNonce); + + //choice2.getNextElement(choice2.getNbNext()-1).addNext(rd); + choice2.addNext(rdNonce); + prevRd = rdNonce; + }*/ + + TMLReadChannel rd = new TMLReadChannel("data_" + ch.name + "_" + ch.task, taskAD.getReferenceObject()); + rd.addChannel(tmlmodel.getChannelByName("data_" + ch.name + "_" + ch.task)); + // + rd.setNbOfSamples("1"); + taskAD.addElement(rd); + prevRd.addNext(rd); + //Recieve plaintext data if encrypting + /* if (ch.secType != HSMChannel.DEC) { + rd.setEncForm(false); + } */ + + TMLWriteChannel wr = new TMLWriteChannel("retData_" + ch.name + "_" + ch.task, taskAD.getReferenceObject()); + wr.addChannel(tmlmodel.getChannelByName("retData_" + ch.name + "_" + ch.task)); + taskAD.addElement(wr); + wr.setNbOfSamples("1"); + if (ch.secType == HSMChannel.DEC) { + rd.securityPattern = channelSecMap.get(ch.name); + TMLExecC dec = new TMLExecC(channelSecMap.get(ch.name).name, taskAD.getReferenceObject()); + dec.securityPattern = new SecurityPattern(channelSecMap.get(ch.name)); + dec.securityPattern.setProcess(SecurityPattern.DECRYPTION_PROCESS); + dec.setAction(Integer.toString(channelSecMap.get(ch.name).encTime)); + + tmlmodel.addSecurityPattern(channelSecMap.get(ch.name)); + if (tmlmodel.securityTaskMap.containsKey(channelSecMap.get(ch.name))) { + if (!tmlmodel.securityTaskMap.get(channelSecMap.get(ch.name)).contains(task)) { + tmlmodel.securityTaskMap.get(channelSecMap.get(ch.name)).add(task); + } + } else { + List<TMLTask> listTask = new ArrayList<TMLTask>(); + listTask.add(task); + tmlmodel.securityTaskMap.put(channelSecMap.get(ch.name), listTask); + } + + taskAD.addElement(dec); + rd.addNext(dec); + + //Connect decrypt and writechannel + dec.addNext(wr); + //Add Stop + TMLStopState stop = new TMLStopState("stop", taskAD.getReferenceObject()); + taskAD.addElement(stop); + + //Connext stop and write channel + wr.addNext(stop); + } else { + wr.securityPattern = channelSecMap.get(ch.name); + TMLExecC enc = new TMLExecC(channelSecMap.get(ch.name).name, taskAD.getReferenceObject()); + enc.securityPattern = new SecurityPattern(channelSecMap.get(ch.name)); + enc.securityPattern.setProcess(SecurityPattern.ENCRYPTION_PROCESS); + enc.setAction(Integer.toString(channelSecMap.get(ch.name).encTime)); + + tmlmodel.addSecurityPattern(channelSecMap.get(ch.name)); + if (tmlmodel.securityTaskMap.containsKey(channelSecMap.get(ch.name))) { + if (!tmlmodel.securityTaskMap.get(channelSecMap.get(ch.name)).contains(task)) { + tmlmodel.securityTaskMap.get(channelSecMap.get(ch.name)).add(task); + } + } else { + List<TMLTask> listTask = new ArrayList<TMLTask>(); + listTask.add(task); + tmlmodel.securityTaskMap.put(channelSecMap.get(ch.name), listTask); + } + + if (ch.secType == HSMChannel.SENC) { + enc.securityPattern.type = SecurityPattern.SYMMETRIC_ENC_PATTERN; + } else if (ch.secType == HSMChannel.AENC) { + enc.securityPattern.type = SecurityPattern.ASYMMETRIC_ENC_PATTERN; + } else if (ch.secType == HSMChannel.MAC) { + enc.securityPattern.type = SecurityPattern.MAC_PATTERN; + } else if (ch.secType == HSMChannel.NONCE) { + enc.securityPattern.type = SecurityPattern.NONCE_PATTERN; + } + + enc.securityPattern.overhead = Integer.parseInt(overhead); + enc.securityPattern.encTime = Integer.parseInt(encComp); + enc.securityPattern.decTime = Integer.parseInt(decComp); + enc.securityPattern.nonce = ch.nonceName; + taskAD.addElement(enc); + + //Connect encrypt and readchannel + rd.addNext(enc); + //Connect encrypt and writechannel + enc.addNext(wr); + + //Add Stop + TMLStopState stop = new TMLStopState("stop", taskAD.getReferenceObject()); + taskAD.addElement(stop); + + //Connext stop and write channel + wr.addNext(stop); + } + i++; + } + } else { + + for (HSMChannel ch : hsmChannelMap.get(cpuName)) { + //Add guard as channelindex + choice.addGuard("[channelIndex==" + channelIndexMap.get(ch.name) + "]"); + + TMLActivityElement prevRd = choice; + //If needed, receive nonce from task + /*if (!ch.nonceName.equals("")) { + TMLReadChannel rdNonce = new TMLReadChannel(("data_" + ch.name + "_" + ch.task), taskAD.getReferenceObject()); + rdNonce.addChannel(tmlmodel.getChannelByName("data_" + ch.name + "_" + ch.task)); + rdNonce.securityPattern = new SecurityPattern(ch.nonceName, SecurityPattern.NONCE_PATTERN, overhead, "", encComp, decComp, "", "", ""); + rdNonce.securityPattern.originTask = rdNonce.getChannel(0).getOriginTask().getName().replaceAll(appName + "__", ""); + rdNonce.setNbOfSamples("1"); + taskAD.addElement(rdNonce); + + choice.addNext(rdNonce); + prevRd = rdNonce; + }*/ + + TMLReadChannel rd = new TMLReadChannel("data_" + ch.name + "_" + ch.task, taskAD.getReferenceObject()); + rd.addChannel(tmlmodel.getChannelByName("data_" + ch.name + "_" + ch.task)); + + rd.setNbOfSamples("1"); + taskAD.addElement(rd); + + //Recieve plaintext data if encrypting + /* if (ch.secType != HSMChannel.DEC) { + rd.setEncForm(false); + } */ + + //Connect choice and readchannel + prevRd.addNext(rd); + + //Send data back to task + TMLWriteChannel wr = new TMLWriteChannel("retData_" + ch.name + "_" + ch.task, taskAD.getReferenceObject()); + wr.addChannel(tmlmodel.getChannelByName("retData_" + ch.name + "_" + ch.task)); + + //Return plaintext data if decrypting + /* if (ch.secType == HSMChannel.DEC) { + wr.setEncForm(false); + } */ + wr.setNbOfSamples("1"); + + taskAD.addElement(wr); + if (ch.secType == HSMChannel.DEC) { + rd.securityPattern = channelSecMap.get(ch.name); + TraceManager.addDev("Add Decrypt operator"); + //Add Decrypt operator + TMLExecC dec = new TMLExecC(channelSecMap.get(ch.name).name, taskAD.getReferenceObject()); + dec.securityPattern = new SecurityPattern(channelSecMap.get(ch.name)); + dec.securityPattern.setProcess(SecurityPattern.DECRYPTION_PROCESS); + dec.setAction(Integer.toString(channelSecMap.get(ch.name).encTime)); + + tmlmodel.addSecurityPattern(channelSecMap.get(ch.name)); + if (tmlmodel.securityTaskMap.containsKey(channelSecMap.get(ch.name))) { + if (!tmlmodel.securityTaskMap.get(channelSecMap.get(ch.name)).contains(task)) { + tmlmodel.securityTaskMap.get(channelSecMap.get(ch.name)).add(task); + } + } else { + List<TMLTask> listTask = new ArrayList<TMLTask>(); + listTask.add(task); + tmlmodel.securityTaskMap.put(channelSecMap.get(ch.name), listTask); + } + + taskAD.addElement(dec); + + //Connect decrypt and readchannel + rd.addNext(dec); + + //Connect decrypt and writechannel + dec.addNext(wr); + + //Add Stop + TMLStopState stop = new TMLStopState("stop", taskAD.getReferenceObject()); + taskAD.addElement(stop); + + //Connect stop and write channel + wr.addNext(stop); + + } else { + wr.securityPattern = channelSecMap.get(ch.name); + TraceManager.addDev("Add Encrypt operator"); + TMLExecC enc = new TMLExecC(channelSecMap.get(ch.name).name, taskAD.getReferenceObject()); + enc.securityPattern = new SecurityPattern(channelSecMap.get(ch.name)); + enc.securityPattern.setProcess(SecurityPattern.ENCRYPTION_PROCESS); + enc.setAction(Integer.toString(channelSecMap.get(ch.name).encTime)); + + tmlmodel.addSecurityPattern(channelSecMap.get(ch.name)); + if (tmlmodel.securityTaskMap.containsKey(channelSecMap.get(ch.name))) { + if (!tmlmodel.securityTaskMap.get(channelSecMap.get(ch.name)).contains(task)) { + tmlmodel.securityTaskMap.get(channelSecMap.get(ch.name)).add(task); + } + } else { + List<TMLTask> listTask = new ArrayList<TMLTask>(); + listTask.add(task); + tmlmodel.securityTaskMap.put(channelSecMap.get(ch.name), listTask); + } + + if (ch.secType == HSMChannel.SENC) { + enc.securityPattern.type = SecurityPattern.SYMMETRIC_ENC_PATTERN; + } else if (ch.secType == HSMChannel.AENC) { + enc.securityPattern.type = SecurityPattern.ASYMMETRIC_ENC_PATTERN; + } else if (ch.secType == HSMChannel.MAC) { + enc.securityPattern.type = SecurityPattern.MAC_PATTERN; + } else if (ch.secType == HSMChannel.NONCE) { + enc.securityPattern.type = SecurityPattern.NONCE_PATTERN; + } + + enc.securityPattern.overhead = Integer.parseInt(overhead); + enc.securityPattern.encTime = Integer.parseInt(encComp); + enc.securityPattern.decTime = Integer.parseInt(decComp); + enc.securityPattern.nonce = ch.nonceName; + taskAD.addElement(enc); + + //Connect encrypt and readchannel + rd.addNext(enc); + + //Connect encrypt and writechannel + enc.addNext(wr); + + //Add Stop + TMLStopState stop = new TMLStopState("stop", taskAD.getReferenceObject()); + taskAD.addElement(stop); + //Connect stop and write channel + wr.addNext(stop); + } + } + + } + } + + public TMLMapping<?> autoMapKeys() { + if (tmap == null) { + return tmap; + } + //Find all Security Patterns, if they don't have an associated memory at encrypt and decrypt, tmap them + TMLModeling<?> tmlm = tmap.getTMLModeling(); + if (tmlm.securityTaskMap == null) { + return tmap; + } + for (SecurityPattern sp : tmlm.securityTaskMap.keySet()) { + if (sp.type.equals(SecurityPattern.SYMMETRIC_ENC_PATTERN) || sp.type.equals(SecurityPattern.MAC_PATTERN) || sp.type.equals(SecurityPattern.ASYMMETRIC_ENC_PATTERN)) { + for (TMLTask t : tmlm.securityTaskMap.get(sp)) { + HwExecutionNode node1 = tmap.getHwNodeOf(t); + boolean taskMappedToCPU = false; + if (node1 != null) { + if (node1 instanceof HwExecutionNode) { + HwExecutionNode cpuNode = node1; + taskMappedToCPU = true; + boolean keyMappedtoMem = false; + HwLink lastLink = null; + for (int i=0; i < tmap.getArch().getHwLinks().size(); i++) { + HwLink link = tmap.getArch().getHwLinks().get(i); + if (!keyMappedtoMem && link.hwnode == node1) { + lastLink = link; + if (link.bus.privacy == 1) { + HwBus curBus = link.bus; + boolean keyFound = false; + HwMemory memNodeToMap = null; + outer: + for (HwLink linkBus : tmap.getArch().getHwLinks()) { + if (linkBus.bus == curBus) { + if (linkBus.hwnode instanceof HwMemory) { + memNodeToMap = (HwMemory) linkBus.hwnode; + List<SecurityPattern> keys = tmap.getMappedPatterns(memNodeToMap); + if (keys.contains(sp)) { + keyFound = true; + keyMappedtoMem = true; + break outer; + } + } + } + } + if (!keyFound) { + if (memNodeToMap != null) { + TraceManager.addDev("Adding " + sp.name + " key to " + memNodeToMap.getName()); + tmap.addSecurityPattern(memNodeToMap, sp); + keyMappedtoMem = true; + } else { + HwMemory newHwMemory = new HwMemory(cpuNode.getName() + "KeysMemory"); + TraceManager.addDev("Creating new memory: " + newHwMemory.getName()); + tmap.getArch().addHwNode(newHwMemory); + + //Connect Bus and Memory + HwLink linkNewMemWithBus = new HwLink("link_" + newHwMemory.getName() + "_to_" + curBus.getName()); + linkNewMemWithBus.setNodes(curBus, newHwMemory); + tmap.getArch().getHwLinks().add(linkNewMemWithBus); + tmap.addSecurityPattern(newHwMemory, sp); + TraceManager.addDev("Adding " + sp.name + " key to " + newHwMemory.getName()); + keyMappedtoMem = true; + } + } + } + } + } + if (!keyMappedtoMem) { + if (lastLink != null) { + HwBus lastBusNode = lastLink.bus; + HwExecutionNode cpuArchiNode = cpuNode; + + HwBridge newBridge = new HwBridge(cpuNode.getName() + "KeysBrigde"); + tmap.getArch().addHwNode(newBridge); + + HwBus newPrivateBus = new HwBus(cpuNode.getName() + "KeysPrivateBus"); + newPrivateBus.privacy = HwBus.BUS_PRIVATE; + for (TMLElement elem : tmap.getLisMappedChannels(lastBusNode)) { + if (elem instanceof TMLChannel) { + tmap.addCommToHwCommNode(elem, newPrivateBus); + } + } + tmap.getArch().addHwNode(newPrivateBus); + + HwMemory memNodeToMap = new HwMemory(cpuNode.getName() + "KeysMemory"); + TraceManager.addDev("Creating new memory: " + memNodeToMap.getName()); + tmap.getArch().addHwNode(memNodeToMap); + + tmap.addSecurityPattern(memNodeToMap, sp); + TraceManager.addDev("Adding " + sp.name + " key to " + memNodeToMap.getName()); + keyMappedtoMem = true; + + //Connect Bus and Memory + HwLink newLinkBusMemory = new HwLink("Link_"+newPrivateBus.getName() + "_" + memNodeToMap.getName()); + newLinkBusMemory.setNodes(newPrivateBus, memNodeToMap); + tmap.getArch().addHwLink(newLinkBusMemory); + + //Connect new Private Bus and Bridge + HwLink newLinkPrivateBusBridge = new HwLink("Link_"+newPrivateBus.getName() + "_" + newBridge.getName()); + newLinkPrivateBusBridge.setNodes(newPrivateBus, newBridge); + tmap.getArch().addHwLink(newLinkPrivateBusBridge); + + //Connect Public Bus and Bridge + HwLink newLinkPublicBusBridge = new HwLink("Link_"+lastBusNode.getName() + "_" + newBridge.getName()); + newLinkPublicBusBridge.setNodes(lastLink.bus, newBridge); + tmap.getArch().addHwLink(newLinkPublicBusBridge); + + //Connect new Private Bus and CPU + HwLink newLinkPrivateBusCPU = new HwLink("Link_"+newPrivateBus.getName() + "_" + cpuArchiNode.getName()); + newLinkPrivateBusCPU.setNodes(newPrivateBus, cpuArchiNode); + tmap.getArch().addHwLink(newLinkPrivateBusCPU); + + + //Disconnect Public Bus and CPU + HwLink linkToRemove = null; + for (HwLink li: tmap.getArch().getHwLinks()) { + if (li.bus == lastLink.bus && li.hwnode == cpuNode) { + TraceManager.addDev("Disconnect :" + li.bus.getName() + " and " + li.hwnode.getName()); + linkToRemove = li; + break; + } + } + if (linkToRemove != null) { + tmap.getArch().getHwLinks().remove(linkToRemove); + } + } + } + } + } + if (!taskMappedToCPU) { + TraceManager.addDev(t.getTaskName() + " has to be mapped to a CPU!"); + } + } + } + } + TraceManager.addDev("Mapping finished"); + return tmap; + } + + class HSMChannel { + public static final int SENC = 0; + public static final int NONCE_ENC = 1; + public static final int MAC = 2; + public static final int DEC = 3; + public static final int AENC = 4; + public static final int NONCE = 5; + public String name; + public String task; + public String securityContext = ""; + public int secType; + public String nonceName = ""; + + public HSMChannel(String n, String t, int type) { + name = n; + task = t; + secType = type; + } + } + + class ChannelData { + public String name; + public boolean isOrigin; + public boolean isChan; + + public ChannelData(String n, boolean orig, boolean isCh) { + name = n; + isOrigin = orig; + isChan = isCh; + } + + } + +} diff --git a/src/main/java/tmltranslator/patternhandling/TMRGeneration.java b/src/main/java/tmltranslator/patternhandling/TMRGeneration.java new file mode 100644 index 0000000000000000000000000000000000000000..1bb60747a4773e1d14a98010d207cf63570c521d --- /dev/null +++ b/src/main/java/tmltranslator/patternhandling/TMRGeneration.java @@ -0,0 +1,856 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.patternhandling; +/** + * Class TMRGeneration + * TMR Generation in separate thread + * Creation: 26/07/2023 + * + * @author Jawher JERRAY + * @version 1.0 26/07/2023 + */ + +import myutil.TraceManager; +import tmltranslator.*; + +import java.util.*; + +public class TMRGeneration implements Runnable { + private Map<String, List<String>> selectedSensorsTasks; + private String selectedRecieverTask; + private String interpretersCompTime; + private String voterCompTime; + private String voterTimeOut; + private TMLMapping<?> tmap; + + public TMRGeneration(Map<String, List<String>> selectedSensorsTasks, String selectedRecieverTask, String interpretersCompTime, String voterCompTime, String voterTimeOut, TMLMapping<?> tmap) { + this.selectedSensorsTasks = selectedSensorsTasks; + this.selectedRecieverTask = selectedRecieverTask; + this.interpretersCompTime = interpretersCompTime; + this.voterCompTime = voterCompTime; + this.voterTimeOut = voterTimeOut; + this.tmap = tmap; + } + + public TMLMapping<?> startThread() { + Thread t = new Thread(this); + t.start(); + try { + t.join(); + } + catch (Exception e) { + TraceManager.addDev("Error in TMR Generation Thread"); + } + return tmap; + } + + public void run() { + TraceManager.addDev("Adding TMR"); + if (tmap == null) { + return; + } + + TMLModeling<?> tmlmNew = tmap.getTMLModeling(); + for (TMLTask task : tmlmNew.getTasks()) { + int index = task.getName().indexOf("__"); + if (index > 0) { + task.setName(task.getName().substring(index + 2)); + } + } + for (TMLChannel ch : tmlmNew.getChannels()) { + int index = ch.getName().indexOf("__"); + if (index > 0) { + ch.setName(ch.getName().substring(index + 2)); + } + } + for (TMLEvent evt : tmlmNew.getEvents()) { + int index = evt.getName().indexOf("__"); + if (index > 0) { + evt.setName(evt.getName().substring(index + 2)); + } + } + for (TMLRequest req : tmlmNew.getRequests()) { + int index = req.getName().indexOf("__"); + if (index > 0) { + req.setName(req.getName().substring(index + 2)); + } + } + + List<String> parameters = new ArrayList<String>(); + parameters.add(interpretersCompTime); + parameters.add(voterTimeOut); + parameters.add(voterCompTime); + + if (selectedSensorsTasks.size() == 1) { + String taskMainSensor = selectedSensorsTasks.keySet().iterator().next(); + for (int indexI=0; indexI < 2; indexI++) { + List<TMLChannel> channelsSensor = new ArrayList<TMLChannel>(); + for (String channelSensorName: selectedSensorsTasks.get(taskMainSensor)) { + TMLChannel channelSensor = tmlmNew.getChannelByName(channelSensorName); + channelsSensor.add(channelSensor); + } + String newSensorName = taskMainSensor + "_duplicate" + (indexI+1); + tmap = duplicateSensor(tmap, channelsSensor, newSensorName); + } + } + List <String> sensorsTask = new ArrayList<String>(selectedSensorsTasks.keySet()); + for (int i=0 ; i < selectedSensorsTasks.get(sensorsTask.get(0)).size() ; i++) { + List<TMLChannel> channelsSensorReceiverList = new ArrayList<TMLChannel>(); + for (String taskSensor: selectedSensorsTasks.keySet()) { + TMLChannel channelSensor = tmlmNew.getChannelByName((selectedSensorsTasks.get(taskSensor)).get(i)); + channelsSensorReceiverList.add(channelSensor); + } + tmap = tmrIntegration(tmap, channelsSensorReceiverList, parameters); + } + } + + TMLMapping<?> duplicateSensor(TMLMapping<?> _tmap, List<TMLChannel> _channelsBetweenSensorAndReceiver, String newSensorName) { + + if (_channelsBetweenSensorAndReceiver.size() == 0) { + TraceManager.addDev("No channels between sensors and receiver"); + return _tmap; + } + // Check if all channels have the same Destination Task (the same receiver) + TMLTask receiverTask = _channelsBetweenSensorAndReceiver.get(0).getDestinationTask(); + boolean _isSameDestTask = true; + for (int i = 1 ; i < _channelsBetweenSensorAndReceiver.size() ; i++) { + if (_channelsBetweenSensorAndReceiver.get(i).getDestinationTask() != receiverTask) { + _isSameDestTask = false; + break; + } + } + if (!_isSameDestTask) { + TraceManager.addDev("Sensors are not connected to the same receiver"); + return _tmap; + } + TMLTask sensorTask = _channelsBetweenSensorAndReceiver.get(0).getOriginTask(); + + TMLModeling<?> _tmlm = _tmap.getTMLModeling(); + TMLTask duplicatedSensorTask = new TMLTask(newSensorName, receiverTask.getReferenceObject(), null); + _tmlm.addTask(duplicatedSensorTask); + + // Add attributes of Sensor to the new one + duplicatedSensorTask.getAttributes().addAll(sensorTask.getAttributes()); + Map<TMLChannel, TMLChannel> channelsSensorReceiver = new HashMap<TMLChannel, TMLChannel>(); + for (TMLChannel channelSensorReceiver : _channelsBetweenSensorAndReceiver) { + // Create new channel between new sensor and receiver + TMLChannel channelDuplicatedSensorToReceiver = new TMLChannel(newSensorName.toLowerCase() + channelSensorReceiver.getName() + "_Data", duplicatedSensorTask.getReferenceObject()); + + channelDuplicatedSensorToReceiver.setPorts(new TMLPort(channelDuplicatedSensorToReceiver.getName(), channelDuplicatedSensorToReceiver.getReferenceObject()), new TMLPort(channelDuplicatedSensorToReceiver.getName(), channelDuplicatedSensorToReceiver.getReferenceObject())); + + channelDuplicatedSensorToReceiver.setOriginTask(duplicatedSensorTask); + channelDuplicatedSensorToReceiver.setDestinationTask(receiverTask); + channelDuplicatedSensorToReceiver.setType(channelSensorReceiver.getType()); + channelDuplicatedSensorToReceiver.setSize(channelSensorReceiver.getSize()); + channelDuplicatedSensorToReceiver.setMax(channelSensorReceiver.getMax()); + // set Duplicated Sensor as Origin of channelDuplicatedSensorToReceiver + duplicatedSensorTask.addWriteTMLChannel(channelDuplicatedSensorToReceiver); + // set Receiver as Destination of channelDuplicatedSensorToReceiver + receiverTask.addReadTMLChannel(channelDuplicatedSensorToReceiver); + _tmlm.addChannel(channelDuplicatedSensorToReceiver); + channelsSensorReceiver.put(channelSensorReceiver, channelDuplicatedSensorToReceiver); + if (selectedSensorsTasks.containsKey(newSensorName)) { + selectedSensorsTasks.get(newSensorName).add(channelDuplicatedSensorToReceiver.getName()); + } else { + List<String> newSensorChannelsName = new ArrayList<String>(); + newSensorChannelsName.add(channelDuplicatedSensorToReceiver.getName()); + selectedSensorsTasks.put(newSensorName, newSensorChannelsName); + } + } + + //Build Activity Diagram for duplicatedSensorTask + TMLActivity duplicatedSensorTaskA = duplicatedSensorTask.getActivityDiagram(); + + Map<TMLActivityElement, TMLActivityElement> replaceElem = new HashMap<TMLActivityElement, TMLActivityElement>(); + Map<TMLActivityElement, TMLActivityElement> changeElemNext = new HashMap<TMLActivityElement, TMLActivityElement>(); + Map<TMLActivityElement, TMLActivityElement> corrElemNext = new HashMap<TMLActivityElement, TMLActivityElement>(); + Vector<TMLActivityElement> duplElements = new Vector<TMLActivityElement>(); + for (int i=0; i < sensorTask.getActivityDiagram().getElements().size(); i++) { + try { + TMLActivityElement duplElement = sensorTask.getActivityDiagram().get(i).deepClone(_tmlm); + duplElement.setReferenceObject(duplicatedSensorTaskA.getReferenceObject()); + duplElements.add(duplElement); + corrElemNext.put(sensorTask.getActivityDiagram().get(i), duplElement); + } catch (TMLCheckingError ex) { + + } + + } + + for (int i=0; i < sensorTask.getActivityDiagram().getElements().size(); i++) { + for (int j=0; j < sensorTask.getActivityDiagram().get(i).getNbNext(); j++) { + duplElements.elementAt(i).addNext(corrElemNext.get(sensorTask.getActivityDiagram().get(i).getNextElement(j))); + } + } + + for (int i=0; i < duplElements.size(); i++) { + TMLActivityElement elemDuplSens = duplElements.elementAt(i); + if (elemDuplSens instanceof TMLWriteChannel) { + TMLWriteChannel elemDuplSensWr = (TMLWriteChannel) sensorTask.getActivityDiagram().get(i); + if (elemDuplSensWr.getChannel(0).getDestinationTask() == receiverTask && channelsSensorReceiver.containsKey(elemDuplSensWr.getChannel(0))) { + TMLChannel linkCh = channelsSensorReceiver.get(elemDuplSensWr.getChannel(0)); + TMLWriteChannel wrChannel = new TMLWriteChannel(linkCh.getName(), duplicatedSensorTaskA.getReferenceObject()); + wrChannel.setNbOfSamples(elemDuplSensWr.getNbOfSamples()); + wrChannel.addChannel(linkCh); + for (TMLActivityElement nextElem : elemDuplSens.getNexts()) { + wrChannel.addNext(nextElem); + } + duplicatedSensorTaskA.addElement(wrChannel); + replaceElem.put(elemDuplSens, wrChannel); + } else { + TMLActivityElement elemDuplSensNext = elemDuplSens.getNextElement(0); + while(elemDuplSensNext instanceof TMLActivityElementEvent || (elemDuplSensNext instanceof TMLActivityElementChannel && ((TMLWriteChannel)elemDuplSensNext).getChannel(0).getDestinationTask() != receiverTask) || elemDuplSensNext instanceof TMLSendRequest) { + elemDuplSensNext = elemDuplSensNext.getNextElement(0); + } + changeElemNext.put(elemDuplSens, elemDuplSensNext); + } + } else if (elemDuplSens instanceof TMLActivityElementEvent || elemDuplSens instanceof TMLActivityElementChannel || elemDuplSens instanceof TMLSendRequest) { + TMLActivityElement elemDuplSensNext = elemDuplSens.getNextElement(0); + while(elemDuplSensNext instanceof TMLActivityElementEvent || (elemDuplSensNext instanceof TMLActivityElementChannel && ((TMLWriteChannel)elemDuplSensNext).getChannel(0).getDestinationTask() != receiverTask) || elemDuplSensNext instanceof TMLSendRequest) { + elemDuplSensNext = elemDuplSensNext.getNextElement(0); + } + changeElemNext.put(elemDuplSens, elemDuplSensNext); + } else { + duplicatedSensorTaskA.addElement(elemDuplSens); + } + } + + for (int i=0; i < duplicatedSensorTaskA.getElements().size(); i++) { + for (int j=0; j < duplicatedSensorTaskA.get(i).getNbNext(); j++) { + if (changeElemNext.containsKey(duplicatedSensorTaskA.get(i).getNextElement(j))) { + duplicatedSensorTaskA.get(i).setNewNext(duplicatedSensorTaskA.get(i).getNextElement(j), changeElemNext.get(duplicatedSensorTaskA.get(i).getNextElement(j))); + } + if (replaceElem.containsKey(duplicatedSensorTaskA.get(i).getNextElement(j))) { + duplicatedSensorTaskA.get(i).setNewNext(duplicatedSensorTaskA.get(i).getNextElement(j), replaceElem.get(duplicatedSensorTaskA.get(i).getNextElement(j))); + } + } + } + boolean findStart = false; + for (int i=0; i < duplicatedSensorTaskA.getElements().size(); i++) { + TMLActivityElement elemDuplSens = duplicatedSensorTaskA.get(i); + if (elemDuplSens instanceof TMLStartState) { + duplicatedSensorTaskA.setFirst(elemDuplSens); + findStart = true; + break; + } + } + if (!findStart) { + TMLStartState startDuplicatedSensor = new TMLStartState("start", duplicatedSensorTaskA.getReferenceObject()); + duplicatedSensorTaskA.setFirst(startDuplicatedSensor); + for (int i=0; i < sensorTask.getActivityDiagram().getFirst().getNbNext(); i++) { + TMLActivityElement nextStart = corrElemNext.get(sensorTask.getActivityDiagram().getFirst().getNextElement(i)); + if (changeElemNext.containsKey(nextStart)) { + nextStart = changeElemNext.get(nextStart); + } + if (replaceElem.containsKey(nextStart)) { + nextStart = changeElemNext.get(nextStart); + } + startDuplicatedSensor.addNext(nextStart); + } + } + + for (int i=0; i < duplicatedSensorTaskA.getElements().size(); i++) { + if (duplicatedSensorTaskA.get(i) instanceof TMLDelay) { + TMLDelay delay = (TMLDelay)duplicatedSensorTaskA.get(i); + delay.setMaxDelay("10"); + delay.setMinDelay("10"); + delay.setValue("10"); + } + } + + // Update Architecture + HwExecutionNode hwOfSensor = _tmap.getHwNodeOf(sensorTask); + if (hwOfSensor != null) { + _tmap.addTaskToHwExecutionNode(duplicatedSensorTask, hwOfSensor); + } + for (TMLChannel ch : _channelsBetweenSensorAndReceiver) { + for (HwCommunicationNode commNode : _tmap.getAllCommunicationNodesOfChannel(ch)) { + _tmap.addCommToHwCommNode(channelsSensorReceiver.get(ch), commNode); + } + } + + return _tmap; + } + + TMLMapping<?> tmrIntegration(TMLMapping<?> _tmap, List<TMLChannel> _channelsBetweenSensorsAndReceiver, List<String> _parameters) { + if (_channelsBetweenSensorsAndReceiver.size() == 0) { + TraceManager.addDev("No channels between sensors and receiver"); + return _tmap; + } + // Check if all channels have the same Destination Task (the same receiver) + TMLTask receiverTask = _channelsBetweenSensorsAndReceiver.get(0).getDestinationTask(); + boolean _isSameDestTask = true; + for (int i = 1 ; i < _channelsBetweenSensorsAndReceiver.size() ; i++) { + if (_channelsBetweenSensorsAndReceiver.get(i).getDestinationTask() != receiverTask) { + _isSameDestTask = false; + break; + } + } + if (!_isSameDestTask) { + TraceManager.addDev("Sensors are not connected to the same receiver"); + return _tmap; + } + TMLModeling<?> _tmlm = _tmap.getTMLModeling(); + // List Sensors Tasks + List<TMLTask> sensorsTasks = new ArrayList<TMLTask>(); + for (TMLChannel channelSensorReceiver : _channelsBetweenSensorsAndReceiver) { + sensorsTasks.add(channelSensorReceiver.getOriginTask()); + } + // Create an Interpreter Task for each sensor + List<TMLTask> interpretersTasks = new ArrayList<TMLTask>(); + for (TMLChannel channelSensorReceiver : _channelsBetweenSensorsAndReceiver) { + TMLTask sensorTask = channelSensorReceiver.getOriginTask(); + TMLTask interpreterTask = new TMLTask("Interpreter_" + channelSensorReceiver.getName(), receiverTask.getReferenceObject(), null); + TMLAttribute calTime = new TMLAttribute("calculationTimeInterpreter", new TMLType(TMLType.NATURAL), _parameters.get(0)); + interpreterTask.addAttribute(calTime); + _tmlm.addTask(interpreterTask); + + // Add attributes of Sensor to Interpreter + interpreterTask.getAttributes().addAll(sensorTask.getAttributes()); + + // set channel Destination (that was between Sensor and receiver) to Interpreter + channelSensorReceiver.setDestinationTask(interpreterTask); + channelSensorReceiver.setPorts(channelSensorReceiver.getOriginPort(), new TMLPort(channelSensorReceiver.getName(), channelSensorReceiver.getReferenceObject())); + interpreterTask.addReadTMLChannel(channelSensorReceiver); + + // Create new channel between interpreter and voter + TMLChannel channelInterpreterToVoter = new TMLChannel(channelSensorReceiver.getOriginPort().getName() + "_ChInterpreter", interpreterTask.getReferenceObject()); + channelInterpreterToVoter.setPorts(new TMLPort(channelInterpreterToVoter.getName(), channelInterpreterToVoter.getReferenceObject()), new TMLPort(channelInterpreterToVoter.getName(), channelInterpreterToVoter.getReferenceObject())); + // set Interpreter as Origin of channelInterpreterToVoter + channelInterpreterToVoter.setOriginTask(interpreterTask); + channelInterpreterToVoter.setType(TMLChannel.BRBW); + channelInterpreterToVoter.setSize(channelSensorReceiver.getSize()); + channelInterpreterToVoter.setMax(channelSensorReceiver.getMax()); + interpreterTask.addWriteTMLChannel(channelInterpreterToVoter); + _tmlm.addChannel(channelInterpreterToVoter); + + // Create new event between interpreter and voter + TMLEvent evtInterpreter = new TMLEvent(channelSensorReceiver.getOriginPort().getName() + "_EvtInterpreter", interpreterTask.getReferenceObject(), 1, true); + evtInterpreter.setPorts(new TMLPort(evtInterpreter.getName(), evtInterpreter.getReferenceObject()), new TMLPort(evtInterpreter.getName(), evtInterpreter.getReferenceObject())); + // set Interpreter as Origin of evtInterpreter + evtInterpreter.setOriginTask(interpreterTask); + interpreterTask.addTMLEvent(evtInterpreter); + _tmlm.addEvent(evtInterpreter); + + //Build Activity Diagram for Interpreter + TMLActivity interpreterA = interpreterTask.getActivityDiagram(); + TMLStartState startInterpreter = new TMLStartState("start", interpreterA.getReferenceObject()); + interpreterA.setFirst(startInterpreter); + // Add New loop Forever + TMLForLoop lForEverLoop = new TMLForLoop("loopForever", interpreterA.getReferenceObject()); + lForEverLoop.setInfinite(true); + interpreterA.addElement(lForEverLoop); + startInterpreter.addNext(lForEverLoop); + + // Add New Read Channel + TMLReadChannel readChannel = new TMLReadChannel(channelSensorReceiver.getOriginPort().getName(), interpreterA.getReferenceObject()); + readChannel.setNbOfSamples("1"); + readChannel.addChannel(channelSensorReceiver); + interpreterA.addElement(readChannel); + lForEverLoop.addNext(readChannel); + + // Add New ExecC Opt + TMLExecC execCOpt = new TMLExecC("execC", interpreterA.getReferenceObject()); + execCOpt.setValue(calTime.getName()); + execCOpt.setAction(calTime.getName()); + interpreterA.addElement(execCOpt); + readChannel.addNext(execCOpt); + + // Add New Send Event + TMLSendEvent sendEvt = new TMLSendEvent("evt_" + channelSensorReceiver.getOriginPort().getName(), interpreterA.getReferenceObject()); + sendEvt.setEvent(evtInterpreter); + interpreterA.addElement(sendEvt); + execCOpt.addNext(sendEvt); + + // Add New Write Channel + TMLWriteChannel writeChInterpreter = new TMLWriteChannel("res_" + channelSensorReceiver.getOriginPort().getName(), interpreterA.getReferenceObject()); + writeChInterpreter.setNbOfSamples("1"); + writeChInterpreter.addChannel(channelInterpreterToVoter); + interpreterA.addElement(writeChInterpreter); + sendEvt.addNext(writeChInterpreter); + + //Add Stop + TMLStopState stop = new TMLStopState("stop", interpreterA.getReferenceObject()); + interpreterA.addElement(stop); + writeChInterpreter.addNext(stop); + + //Add Stop for LoopforEver + TMLStopState stopLoopInterpreter = new TMLStopState("stop", interpreterA.getReferenceObject()); + interpreterA.addElement(stopLoopInterpreter); + lForEverLoop.addNext(stopLoopInterpreter); + + interpretersTasks.add(interpreterTask); + } + + // Add a Timer Task for Voter + String prefixName = ""; + for (TMLTask sensorTask : sensorsTasks) { + prefixName += sensorTask.getName() + "_"; + } + //prefixName = prefixName.substring(0, prefixName.length() - 1); + prefixName += _channelsBetweenSensorsAndReceiver.get(0).getName(); + String timerTaskName = "Timer_" + prefixName; + TMLTask timerTask = new TMLTask(timerTaskName, receiverTask.getReferenceObject(), null); + TMLAttribute timeOutReceivingData = new TMLAttribute("dataReceivingTimeout", new TMLType(TMLType.NATURAL), _parameters.get(1)); + + timerTask.addAttribute(timeOutReceivingData); + _tmlm.addTask(timerTask); + + // Create new Event evtTimeout + TMLEvent evtTimer = new TMLEvent("evtTimeout_" + prefixName, timerTask.getReferenceObject(), 1, true); + evtTimer.setPorts(new TMLPort(evtTimer.getName(), evtTimer.getReferenceObject()), new TMLPort(evtTimer.getName(), evtTimer.getReferenceObject())); + // set Origin of Event to Timer + evtTimer.setOriginTask(timerTask); + timerTask.addTMLEvent(evtTimer); + _tmlm.addEvent(evtTimer); + + // Build Activity Diagram For Timer + TMLActivity timerA = timerTask.getActivityDiagram(); + TMLStartState startTimer = new TMLStartState("start", timerA.getReferenceObject()); + timerA.setFirst(startTimer); + // Add new Loop Forever + TMLForLoop lForEverLoopTimer = new TMLForLoop("foreverLoop", timerA.getReferenceObject()); + lForEverLoopTimer.setInfinite(true); + timerA.addElement(lForEverLoopTimer); + startTimer.addNext(lForEverLoopTimer); + + // Add new Delay + TMLDelay delayTimeOut = new TMLDelay("delay", timerA.getReferenceObject()); + delayTimeOut.setActiveDelay(true); + delayTimeOut.setMaxDelay(timeOutReceivingData.getName()); + delayTimeOut.setMinDelay(timeOutReceivingData.getName()); + delayTimeOut.setUnit("ns"); + timerA.addElement(delayTimeOut); + lForEverLoopTimer.addNext(delayTimeOut); + + // Add new Send Event + TMLSendEvent sendEventTimer = new TMLSendEvent("send" + evtTimer.getName(), timerA.getReferenceObject()); + sendEventTimer.setEvent(evtTimer); + timerA.addElement(sendEventTimer); + delayTimeOut.addNext(sendEventTimer); + + // Add new Stop + TMLStopState stopTimer = new TMLStopState("stop", timerA.getReferenceObject()); + timerA.addElement(stopTimer); + sendEventTimer.addNext(stopTimer); + + //Add Stop for LoopforEver + TMLStopState stopLoopTimer = new TMLStopState("stop", timerA.getReferenceObject()); + timerA.addElement(stopLoopTimer); + lForEverLoopTimer.addNext(stopLoopTimer); + + + // Create Voter + String voterTaskName = "Voter_" + prefixName; + TMLTask voterTask = new TMLTask(voterTaskName, receiverTask.getReferenceObject(), null); + TMLAttribute computationTimeVoter = new TMLAttribute("computationTimeVoter", new TMLType(TMLType.NATURAL), _parameters.get(2)); + voterTask.addAttribute(computationTimeVoter); + TMLAttribute resVoter = new TMLAttribute("res_" + prefixName , new TMLType(TMLType.BOOLEAN)); + voterTask.addAttribute(resVoter); + _tmlm.addTask(voterTask); + + // set evtTimer as Destination Event to Voter Task (from Timer) + evtTimer.setDestinationTask(voterTask); + voterTask.addTMLEvent(evtTimer); + + // set Destination Event and channel to Voter task (From interpreters) + for (TMLTask interpreterTask : interpretersTasks) { + // Destination event + interpreterTask.getSendEvents().get(0).getEvent().setDestinationTask(voterTask); + voterTask.addTMLEvent(interpreterTask.getSendEvents().get(0).getEvent()); + + //Destination channel + interpreterTask.getWriteChannels().get(0).getChannel(0).setDestinationTask(voterTask); + voterTask.addReadTMLChannel(interpreterTask.getWriteChannels().get(0).getChannel(0)); + interpreterTask.getWriteChannels().get(0).getChannel(0).setPorts(new TMLPort(interpreterTask.getWriteChannels().get(0).getChannel(0).getName(), interpreterTask.getWriteChannels().get(0).getChannel(0).getReferenceObject()), new TMLPort(interpreterTask.getWriteChannels().get(0).getChannel(0).getName(), interpreterTask.getWriteChannels().get(0).getChannel(0).getReferenceObject())); + } + + //Create new Event moveto_FAIL_SAFE + TMLEvent evtResVoter = new TMLEvent("moveto_FAIL_SAFE_" + prefixName, voterTask.getReferenceObject(), 1, true); + evtResVoter.setPorts(new TMLPort(evtResVoter.getName(), evtResVoter.getReferenceObject()), new TMLPort(evtResVoter.getName(), evtResVoter.getReferenceObject())); + evtResVoter.addParam(new TMLType(TMLType.BOOLEAN)); + // set Voter as Origin of evtResVoter + evtResVoter.setOriginTask(voterTask); + voterTask.addTMLEvent(evtResVoter); + _tmlm.addEvent(evtResVoter); + + // Create new Channel between Voter and Receiver Task + TMLChannel channelResultVoterReceiver = new TMLChannel("result_" + prefixName, voterTask.getReferenceObject()); + channelResultVoterReceiver.setPorts(new TMLPort(channelResultVoterReceiver.getName(), channelResultVoterReceiver.getReferenceObject()), new TMLPort(channelResultVoterReceiver.getName(), channelResultVoterReceiver.getReferenceObject())); + channelResultVoterReceiver.setType(TMLChannel.BRBW); + channelResultVoterReceiver.setSize(_channelsBetweenSensorsAndReceiver.get(0).getSize()); + channelResultVoterReceiver.setMax(_channelsBetweenSensorsAndReceiver.get(0).getMax()); + + // set Voter as Origin of channelResultVoterReceiver + channelResultVoterReceiver.setOriginTask(voterTask); + voterTask.addWriteTMLChannel(channelResultVoterReceiver); + _tmlm.addChannel(channelResultVoterReceiver); + + // Build Activity Diagram For Voter + TMLActivity voterA = voterTask.getActivityDiagram(); + TMLStartState startVoter = new TMLStartState("start", voterA.getReferenceObject()); + voterA.setFirst(startVoter); + // Add new Loop Forever + TMLForLoop lForEverLoopVoter = new TMLForLoop("foreverLoop", voterA.getReferenceObject()); + lForEverLoopVoter.setInfinite(true); + voterA.addElement(lForEverLoopVoter); + startVoter.addNext(lForEverLoopVoter); + + // Add new Loop + TMLForLoop loopEvtsVoter = new TMLForLoop("loop", voterA.getReferenceObject()); + String counterEvtsFromInterpreters = "counter_" + prefixName; + TMLAttribute counterEvtsFromInterpretersAttrib = new TMLAttribute(counterEvtsFromInterpreters, new TMLType(TMLType.NATURAL), "0"); + voterTask.addAttribute(counterEvtsFromInterpretersAttrib); + + loopEvtsVoter.setInit(counterEvtsFromInterpreters + " = 0"); + loopEvtsVoter.setCondition(counterEvtsFromInterpreters + "<" + _channelsBetweenSensorsAndReceiver.size()); + loopEvtsVoter.setIncrement(""); + voterA.addElement(loopEvtsVoter); + lForEverLoopVoter.addNext(loopEvtsVoter); + + + // Add new Select Event + TMLSelectEvt selectEvtVoter = new TMLSelectEvt("selectEvent", voterA.getReferenceObject()); + voterA.addElement(selectEvtVoter); + loopEvtsVoter.addNext(selectEvtVoter); + List<String> boolAttributesForEvtsName = new ArrayList<String>(); + for (TMLTask interpreterTask : interpretersTasks) { + // Add new Wait event from an interpreter + TMLWaitEvent waitEventFromInterpreter = new TMLWaitEvent("waitEventFromInterpreter", voterA.getReferenceObject()); + waitEventFromInterpreter.setEvent(interpreterTask.getEventSet().iterator().next()); + voterA.addElement(waitEventFromInterpreter); + selectEvtVoter.addNext(waitEventFromInterpreter); + + // Add new Read Channel from an interpreter + TMLReadChannel readChFromInterpreter = new TMLReadChannel("readChannelFromInterpreter", voterA.getReferenceObject()); + readChFromInterpreter.setNbOfSamples("1"); + readChFromInterpreter.addChannel(interpreterTask.getWriteChannels().get(0).getChannel(0)); + voterA.addElement(readChFromInterpreter); + waitEventFromInterpreter.addNext(readChFromInterpreter); + + // Add new Choice + TMLChoice choiceVoter = new TMLChoice("choice", voterA.getReferenceObject()); + + TMLAttribute isEventAlreadyReceived = new TMLAttribute("isEvt"+ interpreterTask.getName()+"Received", new TMLType(TMLType.BOOLEAN), "false"); + voterTask.addAttribute(isEventAlreadyReceived); + + choiceVoter.addGuard(isEventAlreadyReceived.getName()+" == false"); + voterA.addElement(choiceVoter); + readChFromInterpreter.addNext(choiceVoter); + + // Add new Action State increment counter + TMLActionState actionIncrementCounterVoter = new TMLActionState("actionState", voterA.getReferenceObject()); + actionIncrementCounterVoter.setAction(counterEvtsFromInterpreters + " = " + counterEvtsFromInterpreters + " + 1"); + voterA.addElement(actionIncrementCounterVoter); + choiceVoter.addNext(actionIncrementCounterVoter); + + // Add new Action State put attrib isEventAlreadyReceived to True + TMLActionState actionFromAttribIsEventAlreadyReceived = new TMLActionState("actionState", voterA.getReferenceObject()); + actionFromAttribIsEventAlreadyReceived.setAction(isEventAlreadyReceived.getName() + " = true"); + boolAttributesForEvtsName.add(isEventAlreadyReceived.getName()); + voterA.addElement(actionFromAttribIsEventAlreadyReceived); + actionIncrementCounterVoter.addNext(actionFromAttribIsEventAlreadyReceived); + + // Add new Stop + TMLStopState stopVoter = new TMLStopState("stop", voterA.getReferenceObject()); + voterA.addElement(stopVoter); + actionFromAttribIsEventAlreadyReceived.addNext(stopVoter); + + } + + // Add new Wait event from an Timer + TMLWaitEvent waitEventFromTimer = new TMLWaitEvent("waitEventFromTimer", voterA.getReferenceObject()); + waitEventFromTimer.setEvent(evtTimer); + voterA.addElement(waitEventFromTimer); + selectEvtVoter.addNext(waitEventFromTimer); + + // Add new Action State change counter + TMLActionState actionChangeCounterVoter = new TMLActionState("actionChangeCounterVoter", voterA.getReferenceObject()); + actionChangeCounterVoter.setAction(counterEvtsFromInterpreters + " = " + _channelsBetweenSensorsAndReceiver.size()); + voterA.addElement(actionChangeCounterVoter); + waitEventFromTimer.addNext(actionChangeCounterVoter); + + // Add new Stop + TMLStopState stopVoterAfterTimerEvt = new TMLStopState("stop", voterA.getReferenceObject()); + voterA.addElement(stopVoterAfterTimerEvt); + actionChangeCounterVoter.addNext(stopVoterAfterTimerEvt); + + // Add new Sequence + TMLSequence squenceVoter = new TMLSequence("sequence", voterA.getReferenceObject()); + voterA.addElement(squenceVoter); + loopEvtsVoter.addNext(squenceVoter); + + for (String boolAttributesForEvt : boolAttributesForEvtsName) { + // Add new Action State put attributes isEventAlreadyReceived to False + TMLActionState actionFromAttribIsEventAlreadyReceived = new TMLActionState("actionState" + boolAttributesForEvt, voterA.getReferenceObject()); + actionFromAttribIsEventAlreadyReceived.setAction(boolAttributesForEvt + " = false"); + voterA.getElements().lastElement().addNext(actionFromAttribIsEventAlreadyReceived); + voterA.addElement(actionFromAttribIsEventAlreadyReceived); + } + + // Add New ExecC Opt for Voter + TMLExecC execCOptVoter = new TMLExecC("execC", voterA.getReferenceObject()); + execCOptVoter.setValue(computationTimeVoter.getName()); + execCOptVoter.setAction(computationTimeVoter.getName()); + voterA.getElements().lastElement().addNext(execCOptVoter); + voterA.addElement(execCOptVoter); + + + // Add New Choice for Voter + TMLChoice choiceResVoter = new TMLChoice("choice", voterA.getReferenceObject()); + voterA.addElement(choiceResVoter); + execCOptVoter.addNext(choiceResVoter); + + // Add new Action State put result to True + TMLActionState actionResAttribToTrue = new TMLActionState("actionResAttribToTrue", voterA.getReferenceObject()); + actionResAttribToTrue.setAction(resVoter.getName() + " = true"); + voterA.addElement(actionResAttribToTrue); + choiceResVoter.addGuard(""); + choiceResVoter.addNext(actionResAttribToTrue); + + // Add new Stop + TMLStopState stopAfterResTrueVoter = new TMLStopState("stop", voterA.getReferenceObject()); + voterA.addElement(stopAfterResTrueVoter); + actionResAttribToTrue.addNext(stopAfterResTrueVoter); + + // Add new Action State put result to False + TMLActionState actionResAttribToFalse = new TMLActionState("actionResAttribToFalse", voterA.getReferenceObject()); + actionResAttribToFalse.setAction(resVoter.getName() + " = false"); + voterA.addElement(actionResAttribToFalse); + choiceResVoter.addGuard(""); + choiceResVoter.addNext(actionResAttribToFalse); + + // Add new Stop + TMLStopState stopAfterResFalseVoter = new TMLStopState("stop", voterA.getReferenceObject()); + voterA.addElement(stopAfterResFalseVoter); + actionResAttribToFalse.addNext(stopAfterResFalseVoter); + + // Add new Send Event with res in Parameter + TMLSendEvent sendEventResVoter = new TMLSendEvent("send" + evtResVoter.getName(), voterA.getReferenceObject()); + sendEventResVoter.addParam(resVoter.getName()); + sendEventResVoter.setEvent(evtResVoter); + voterA.addElement(sendEventResVoter); + squenceVoter.addNext(sendEventResVoter); + + // Add new Write Channel + TMLWriteChannel writeChVoter = new TMLWriteChannel("write" + channelResultVoterReceiver.getName(), voterA.getReferenceObject()); + writeChVoter.setNbOfSamples("1"); + writeChVoter.addChannel(channelResultVoterReceiver); + voterA.addElement(writeChVoter); + sendEventResVoter.addNext(writeChVoter); + + // Add new Stop + TMLStopState stopVoter = new TMLStopState("stop", voterA.getReferenceObject()); + voterA.addElement(stopVoter); + writeChVoter.addNext(stopVoter); + + //Add Stop for LoopforEver + TMLStopState stopLoopVoter = new TMLStopState("stop", voterA.getReferenceObject()); + voterA.addElement(stopLoopVoter); + lForEverLoopVoter.addNext(stopLoopVoter); + + + // Receiver Updates + + //Add Attribute + receiverTask.addAttribute(resVoter); + + // Add new Read Channel to Receiver from Voter + channelResultVoterReceiver.setDestinationTask(receiverTask); + receiverTask.addReadTMLChannel(channelResultVoterReceiver); + + + // Add new Wait Event to Receiver from Voter + evtResVoter.setDestinationTask(receiverTask); + receiverTask.addTMLEvent(evtResVoter); + + + // Update Activity Diagram Receiver + TMLActivity receiverA = receiverTask.getActivityDiagram(); + + int index_ch = 0; + List<TMLActivityElement> elemsToAdd = new ArrayList<TMLActivityElement>(); + List<TMLActivityElement> elemsToRemove = new ArrayList<TMLActivityElement>(); + for (TMLChannel ch : _channelsBetweenSensorsAndReceiver) { + for (TMLActivityElement elemReceiverA : receiverA.getElements()) { + if (elemReceiverA instanceof TMLReadChannel) { + TMLReadChannel readElemReceiverA = (TMLReadChannel) elemReceiverA; + if (readElemReceiverA.hasChannel(ch)) { + List <TMLActivityElement> nextElems = elemReceiverA.getNexts(); + TMLActivityElement prevElem = receiverA.getPrevious(elemReceiverA); + if (index_ch == 0) { + // Replace the channel from the first sensor connected to the receiver into the result Channel from Voter + + // Add new Wait event to Receiver from Voter + TMLWaitEvent waitEventFromVoter = new TMLWaitEvent("waitEventFromVoter", receiverA.getReferenceObject()); + waitEventFromVoter.setEvent(evtResVoter); + waitEventFromVoter.addParam(resVoter.getName()); + prevElem.setNewNext(elemReceiverA, waitEventFromVoter); + elemsToAdd.add(waitEventFromVoter); + + // Replace the Read Channel of Receiver to the channel from Voter + readElemReceiverA.replaceChannelWith(ch, channelResultVoterReceiver); + waitEventFromVoter.addNext(readElemReceiverA); + } else { + // Delete channels connected to the receiver from the other sensors + prevElem.removeNext(elemReceiverA); + for (TMLActivityElement nextElem : nextElems) { + prevElem.addNext(nextElem); + } + elemsToRemove.add(readElemReceiverA); + } + } + } + } + index_ch += 1; + } + for (TMLActivityElement elemToAdd : elemsToAdd) { + receiverA.addElement(elemToAdd); + } + for (TMLActivityElement elemToRemove : elemsToRemove) { + receiverA.removeElement(elemToRemove); + } + + // Remove from receiver channels that come from sensors + for (TMLChannel ch : receiverTask.getReadTMLChannels()) { + if (_channelsBetweenSensorsAndReceiver.contains(ch)) { + receiverTask.getReadTMLChannels().remove(ch); + } + } + + // Update Architecture + TMLArchitecture _tmlarch = _tmap.getArch(); + // New CPU for the Voter and interpreters Tasks + HwCPU _cpuVoter = new HwCPU("CPU_" + voterTaskName); + // New Memory for the Voter and interpreters Channels + HwMemory _memoryVoter = new HwMemory("Memory_" + voterTaskName); + // New Bridge for the Voter and interpreters Channels + HwBridge _bridgeVoter = new HwBridge("Brigde_" + voterTaskName); + // New Bus for the Voter and interpreters Channels + HwBus _busVoter = new HwBus("Bus_" + voterTaskName); + + //Update Memory Voter properties + HwMemory memoryOfChannelSensor = _tmap.getMemoryOfChannel(_channelsBetweenSensorsAndReceiver.get(0)); + if (memoryOfChannelSensor != null) { + _memoryVoter.byteDataSize = memoryOfChannelSensor.byteDataSize; + _memoryVoter.clockRatio = memoryOfChannelSensor.clockRatio; + _memoryVoter.bufferType = memoryOfChannelSensor.bufferType; + } + HwExecutionNode hwOfReceiver = _tmap.getHwNodeOf(receiverTask); + if (hwOfReceiver != null) { + if (hwOfReceiver instanceof HwCPU) { + HwCPU cpuOfReceiver = (HwCPU) hwOfReceiver; + //Update CPU Voter properties + _cpuVoter.byteDataSize = cpuOfReceiver.byteDataSize; + _cpuVoter.pipelineSize = cpuOfReceiver.pipelineSize; + _cpuVoter.goIdleTime = cpuOfReceiver.goIdleTime; + _cpuVoter.taskSwitchingTime = cpuOfReceiver.taskSwitchingTime; + _cpuVoter.branchingPredictionPenalty = cpuOfReceiver.branchingPredictionPenalty; + _cpuVoter.execiTime = cpuOfReceiver.execiTime; + HwLink linkBridgeVoterBusReceiver = new HwLink("link"); + for (HwLink link : _tmlarch.getHwLinks()) { + if (link.hwnode == cpuOfReceiver) { + HwBus busOfReceiver = link.bus; + // Add link BridgeVoter and BusReceiver + linkBridgeVoterBusReceiver = new HwLink("link_" + _bridgeVoter.getName() + "_to_" + busOfReceiver.getName()); + linkBridgeVoterBusReceiver.bus = busOfReceiver; + linkBridgeVoterBusReceiver.hwnode = _bridgeVoter; + + } + } + if (linkBridgeVoterBusReceiver.bus != null) { + _tmlarch.addHwLink(linkBridgeVoterBusReceiver); + } + } + } + // Add New HWs to the architecture + _tmlarch.addHwNode(_cpuVoter); + _tmlarch.addHwNode(_memoryVoter); + _tmlarch.addHwNode(_bridgeVoter); + _tmlarch.addHwNode(_busVoter); + + // Add link CPUVoter and BusVoter + HwLink linkCPUBusVoter = new HwLink("link_" + _cpuVoter.getName() + "_to_" + _busVoter.getName()); + linkCPUBusVoter.bus = _busVoter; + linkCPUBusVoter.hwnode = _cpuVoter; + _tmlarch.addHwLink(linkCPUBusVoter); + // Add link MemoryVoter and BusVoter + HwLink linkMemoryBusVoter = new HwLink("link_" + _memoryVoter.getName() + "_to_" + _busVoter.getName()); + linkMemoryBusVoter.bus = _busVoter; + linkMemoryBusVoter.hwnode = _memoryVoter; + _tmlarch.addHwLink(linkMemoryBusVoter); + // Add link BridgeVoter and BusVoter + HwLink linkBridgeBusVoter = new HwLink("link_" + _bridgeVoter.getName() + "_to_" + _busVoter.getName()); + linkBridgeBusVoter.bus = _busVoter; + linkBridgeBusVoter.hwnode = _bridgeVoter; + _tmlarch.addHwLink(linkBridgeBusVoter); + + // Mapping Voter, Timer and interpreters Tasks To CPUVoter + _tmap.addTaskToHwExecutionNode(voterTask, _cpuVoter); + _tmap.addTaskToHwExecutionNode(timerTask, _cpuVoter); + + for (TMLTask interpreterTask : interpretersTasks) { + _tmap.addTaskToHwExecutionNode(interpreterTask, _cpuVoter); + } + + // Mapping Voter and interpreters Channels To MemoryVoter + for (TMLTask interpreterTask : interpretersTasks) { + for (TMLChannel writeChannelInterpreter : interpreterTask.getWriteTMLChannels()) { + _tmap.addCommToHwCommNode(writeChannelInterpreter, _memoryVoter); + _tmap.addCommToHwCommNode(writeChannelInterpreter, _busVoter); + for (HwCommunicationNode mappedNode : _tmap.getAllCommunicationNodesOfChannel(_channelsBetweenSensorsAndReceiver.get(0))) { + if (mappedNode instanceof HwBus) { + _tmap.addCommToHwCommNode(writeChannelInterpreter, mappedNode); + } + } + } + } + + _tmap.addCommToHwCommNode(channelResultVoterReceiver, _memoryVoter); + _tmap.addCommToHwCommNode(channelResultVoterReceiver, _busVoter); + for (HwCommunicationNode mappedNode : _tmap.getAllCommunicationNodesOfChannel(_channelsBetweenSensorsAndReceiver.get(0))) { + if (mappedNode instanceof HwBus) { + _tmap.addCommToHwCommNode(channelResultVoterReceiver, mappedNode); + } + } + + return _tmap; + } +} diff --git a/src/main/java/tmltranslator/patternhandling/TaskPattern.java b/src/main/java/tmltranslator/patternhandling/TaskPattern.java new file mode 100644 index 0000000000000000000000000000000000000000..cb48dfaf28a131eec3a614f7060f7403b052cb2c --- /dev/null +++ b/src/main/java/tmltranslator/patternhandling/TaskPattern.java @@ -0,0 +1,216 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.patternhandling; +/** + * Class TaskPattern + * + * Creation: 28/08/2023 + * + * @author Jawher JERRAY + * @version 1.0 28/08/2023 + */ + +import tmltranslator.*; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; + +import org.json.JSONArray; + + +public class TaskPattern { + private List<AttributeTaskJsonFile> attributes; + private List<PortTaskJsonFile> internalPorts; + private List<PortTaskJsonFile> externalPorts; + + public TaskPattern(List<AttributeTaskJsonFile> attributes, List<PortTaskJsonFile> internalPorts, List<PortTaskJsonFile> externalPorts) { + this.attributes = attributes; + this.internalPorts = internalPorts; + this.externalPorts = externalPorts; + } + + public List<AttributeTaskJsonFile> getAttributes() { + return attributes; + } + + public List<PortTaskJsonFile> getInternalPorts() { + return internalPorts; + } + + public List<PortTaskJsonFile> getExternalPorts() { + return externalPorts; + } + + public static LinkedHashMap<String, TaskPattern> parsePatternJsonFile(String pathPatternFoler, String fileName) { + Path jsonFilePath = Path.of(pathPatternFoler+"/"+fileName); + String jsonFilecontent = ""; + LinkedHashMap<String, TaskPattern> tasksPattern = new LinkedHashMap<String, TaskPattern>(); + try { + jsonFilecontent = Files.readString(jsonFilePath, Charset.defaultCharset()); + } catch (IOException ioExc) { + } + + JSONArray patternTasks = new JSONArray(jsonFilecontent); + for (int i = 0; i < patternTasks.length(); i++) { + String taskName = patternTasks.getJSONObject(i).getString(PatternCreation.NAME); + + JSONArray attributes = patternTasks.getJSONObject(i).getJSONArray(PatternCreation.ATTRIBUTES); + List<AttributeTaskJsonFile> attributeTaskList = new ArrayList<AttributeTaskJsonFile>(); + for (int j = 0; j < attributes.length(); j++) { + String attribName = attributes.getJSONObject(j).getString(PatternCreation.NAME); + String attribType = attributes.getJSONObject(j).getString(PatternCreation.TYPE); + String attribValue = attributes.getJSONObject(j).getString(PatternCreation.VALUE); + AttributeTaskJsonFile attributeTaskJsonFile = new AttributeTaskJsonFile(attribName, attribType, attribValue); + attributeTaskList.add(attributeTaskJsonFile); + } + //patternTasksAttributes.put(taskName, attributeTaskList); + + JSONArray externalPorts = patternTasks.getJSONObject(i).getJSONArray(PatternCreation.EXTERNALPORTS); + List<PortTaskJsonFile> externalPortsTaskList = new ArrayList<PortTaskJsonFile>(); + for (int j = 0; j < externalPorts.length(); j++) { + String externalPortName = externalPorts.getJSONObject(j).getString(PatternCreation.NAME); + String externalPortType = externalPorts.getJSONObject(j).getString(PatternCreation.TYPE); + String externalPortMode = externalPorts.getJSONObject(j).getString(PatternCreation.MODE); + PortTaskJsonFile externalPortTaskJsonFile = new PortTaskJsonFile(externalPortName, externalPortType, externalPortMode); + if (externalPorts.getJSONObject(j).has(PatternCreation.CONFIDENTIALITY)) { + externalPortTaskJsonFile.setConfidentiality(externalPorts.getJSONObject(j).getString(PatternCreation.CONFIDENTIALITY)); + } + if (externalPorts.getJSONObject(j).has(PatternCreation.AUTHENTICITY)) { + externalPortTaskJsonFile.setAuthenticity(externalPorts.getJSONObject(j).getString(PatternCreation.AUTHENTICITY)); + } + externalPortsTaskList.add(externalPortTaskJsonFile); + } + //patternTasksExternalPorts.put(taskName, externalPortsTaskList); + + JSONArray internalPorts = patternTasks.getJSONObject(i).getJSONArray(PatternCreation.INTERNALPORTS); + List<PortTaskJsonFile> internalPortsTaskList = new ArrayList<PortTaskJsonFile>(); + for (int j = 0; j < internalPorts.length(); j++) { + String internalPortName = internalPorts.getJSONObject(j).getString(PatternCreation.NAME); + String internalPortType = internalPorts.getJSONObject(j).getString(PatternCreation.TYPE); + String internalPortMode = internalPorts.getJSONObject(j).getString(PatternCreation.MODE); + PortTaskJsonFile internalPortTaskJsonFile = new PortTaskJsonFile(internalPortName, internalPortType, internalPortMode); + if (internalPorts.getJSONObject(j).has(PatternCreation.CONFIDENTIALITY)) { + internalPortTaskJsonFile.setConfidentiality(internalPorts.getJSONObject(j).getString(PatternCreation.CONFIDENTIALITY)); + } + if (internalPorts.getJSONObject(j).has(PatternCreation.AUTHENTICITY)) { + internalPortTaskJsonFile.setAuthenticity(internalPorts.getJSONObject(j).getString(PatternCreation.AUTHENTICITY)); + } + internalPortsTaskList.add(internalPortTaskJsonFile); + } + //patternTasksInternalPorts.put(taskName, internalPortsTaskList); + TaskPattern taskPattern = new TaskPattern(attributeTaskList, internalPortsTaskList, externalPortsTaskList); + tasksPattern.put(taskName, taskPattern); + } + return tasksPattern; + } + + public void removeExternalPort(String port) { + PortTaskJsonFile exPortToRemove = null; + for (PortTaskJsonFile exPort : externalPorts) { + if (exPort.getName().equals(port)) { + exPortToRemove = exPort; + } + } + externalPorts.remove(exPortToRemove); + } + + public static LinkedHashMap<String, TaskPattern> getPatternTasksLeft(LinkedHashMap<String, TaskPattern> _patternTasksAll, List<PatternConnection> patternConnections) { + LinkedHashMap<String, TaskPattern> patternTasksLeft = new LinkedHashMap<String, TaskPattern>(); + for (String taskPattern: _patternTasksAll.keySet()) { + for (PortTaskJsonFile portTask : _patternTasksAll.get(taskPattern).getExternalPorts()) { + boolean isPortMapped = false; + for (PatternConnection patternConnection: patternConnections) { + if (taskPattern.equals(patternConnection.getPatternTaskName()) && portTask.getName().equals(patternConnection.getPatternChannel())) { + isPortMapped = true; + break; + } + } + if (!isPortMapped) { + if (patternTasksLeft.containsKey(taskPattern)) { + patternTasksLeft.get(taskPattern).getExternalPorts().add(portTask); + } else { + List<PortTaskJsonFile> portsExternal = new ArrayList<PortTaskJsonFile>(); + List<PortTaskJsonFile> portsInternal = new ArrayList<PortTaskJsonFile>(); + List<AttributeTaskJsonFile> attributes = new ArrayList<AttributeTaskJsonFile>(); + portsExternal.add(portTask); + TaskPattern tp = new TaskPattern(attributes, portsInternal, portsExternal); + patternTasksLeft.put(taskPattern, tp); + } + } + } + } + /*for (String taskPattern: _patternTasksAll.keySet()) { + TaskPattern tp = new TaskPattern(_patternTasksAll.get(taskPattern).getAttributes(), _patternTasksAll.get(taskPattern).getInternalPorts(), _patternTasksAll.get(taskPattern).getExternalPorts()); + patternTasksLeft.put(taskPattern, tp); + } + + for (String taskPattern: _patternTasksAll.keySet()) { + TraceManager.addDev("_patternTasks: task=" + taskPattern); + for (PortTaskJsonFile portTask : _patternTasksAll.get(taskPattern).getExternalPorts()) { + TraceManager.addDev("Port=" + portTask.getName()); + } + if (_patternTasksAll.get(taskPattern).getExternalPorts().size() == 0) { + patternTasksLeft.remove(taskPattern); + } + } + for (PatternConnection patternConnection: patternConnections) { + TraceManager.addDev("patternConnection=" + patternConnection.getStringDisplay()); + if (patternTasksLeft.containsKey(patternConnection.getPatternTaskName())) { + patternTasksLeft.get(patternConnection.getPatternTaskName()).removeExternalPort(patternConnection.getPatternChannel()); + if (patternTasksLeft.get(patternConnection.getPatternTaskName()).getExternalPorts().size() == 0) { + patternTasksLeft.remove(patternConnection.getPatternTaskName()); + } + } + }*/ + return patternTasksLeft; + } + + public PortTaskJsonFile getExternalPortByName(String portName) { + for (PortTaskJsonFile exPort : externalPorts) { + if (exPort.getName().equals(portName)) { + return exPort; + } + } + return null; + } +} diff --git a/src/main/java/tmltranslator/patternhandling/TaskPorts.java b/src/main/java/tmltranslator/patternhandling/TaskPorts.java new file mode 100644 index 0000000000000000000000000000000000000000..4365b9a5f9407291450cf792d53006be4f48e62d --- /dev/null +++ b/src/main/java/tmltranslator/patternhandling/TaskPorts.java @@ -0,0 +1,223 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + + +package tmltranslator.patternhandling; +/** + * Class TaskPorts + * + * Creation: 07/09/2023 + * + * @author Jawher JERRAY + * @version 1.0 07/09/2023 + */ + +import tmltranslator.*; + +import java.util.*; + +public class TaskPorts { + public final static int WRITE_CHANNEL = 1; + public final static int READ_CHANNEL = 2; + public final static int SEND_EVENT = 3; + public final static int WAIT_EVENT = 4; + + private List<String> writeChannels = new ArrayList<String>(); + private List<String> readChannels = new ArrayList<String>(); + private List<String> sendEvents = new ArrayList<String>(); + private List<String> waitEvents = new ArrayList<String>(); + + public TaskPorts(List<String> writeChannels, List<String> readChannels, List<String> sendEvents, List<String> waitEvents) { + this.writeChannels = writeChannels; + this.readChannels = readChannels; + this.sendEvents = sendEvents; + this.waitEvents = waitEvents; + } + + + public List<String> getWriteChannels() { + return writeChannels; + } + + public List<String> getReadChannels() { + return readChannels; + } + + public List<String> getSendEvents() { + return sendEvents; + } + + public List<String> getWaitEvents() { + return waitEvents; + } + + public void removePort(String port) { + writeChannels.remove(port); + readChannels.remove(port); + sendEvents.remove(port); + waitEvents.remove(port); + } + + public static LinkedHashMap<String, TaskPorts> getListPortsTask(TMLModeling<?> tmlmodel) { + LinkedHashMap<String, TaskPorts> listPortsTask = new LinkedHashMap<String, TaskPorts>(); + for (TMLTask task : tmlmodel.getTasks()) { + List<String> writeChannels = new ArrayList<String>(); + List<String> readChannels = new ArrayList<String>(); + List<String> sendEvents = new ArrayList<String>(); + List<String> waitEvents = new ArrayList<String>(); + + for (TMLWriteChannel wc : task.getWriteChannels()) { + if (!writeChannels.contains(wc.getChannel(0).getName())) { + writeChannels.add(wc.getChannel(0).getName()); + } + } + for (TMLReadChannel rc : task.getReadChannels()) { + if (!readChannels.contains(rc.getChannel(0).getName())) { + readChannels.add(rc.getChannel(0).getName()); + } + } + for (TMLSendEvent se : task.getSendEvents()) { + if (!sendEvents.contains(se.getEvent().getName())) { + sendEvents.add(se.getEvent().getName()); + } + } + for (TMLWaitEvent we : task.getWaitEvents()) { + if (!waitEvents.contains(we.getEvent().getName())) { + waitEvents.add(we.getEvent().getName()); + } + } + TaskPorts portTask = new TaskPorts(writeChannels, readChannels, sendEvents, waitEvents); + listPortsTask.put(task.getName(), portTask); + } + return listPortsTask; + } + + public static TaskPorts cloneTaskPort(TaskPorts taskPorts) { + List<String> wcs = new ArrayList<String>(taskPorts.getWriteChannels()); + List<String> rcs = new ArrayList<String>(taskPorts.getReadChannels()); + List<String> ses = new ArrayList<String>(taskPorts.getSendEvents()); + List<String> wes = new ArrayList<String>(taskPorts.getWaitEvents()); + return new TaskPorts(wcs, rcs, ses, wes); + } + + public int getPortTypeByName(String portName) { + if (writeChannels.contains(portName)) { + return WRITE_CHANNEL; + } else if (readChannels.contains(portName)) { + return READ_CHANNEL; + } else if (sendEvents.contains(portName)) { + return SEND_EVENT; + } else if (waitEvents.contains(portName)) { + return WAIT_EVENT; + } + return 0; + } + + public static LinkedHashMap<String, TaskPorts> getPortsTaskOfModelLeft(LinkedHashMap<String, TaskPorts> _portsTaskOfModelAll, List<PatternConnection> patternConnections) { + + LinkedHashMap<String, TaskPorts> portsTaskModelLeft = new LinkedHashMap<String, TaskPorts>(); + for (String task: _portsTaskOfModelAll.keySet()) { + List<String> wcs = new ArrayList<String>(); + List<String> rcs = new ArrayList<String>(); + List<String> ses = new ArrayList<String>(); + List<String> wes = new ArrayList<String>(); + TaskPorts tp = new TaskPorts(wcs, rcs, ses, wes); + portsTaskModelLeft.put(task, tp); + for (String wr : _portsTaskOfModelAll.get(task).getWriteChannels()) { + boolean isMappedPort = false; + for (PatternConnection patternConnection: patternConnections) { + if (patternConnection.getModelTaskName().equals(task) && patternConnection.getModelChannelName().equals(wr) && !patternConnection.isNewPort()) { + isMappedPort = true; + break; + } + } + if (!isMappedPort) { + portsTaskModelLeft.get(task).getWriteChannels().add(wr); + } + } + for (String rd : _portsTaskOfModelAll.get(task).getReadChannels()) { + boolean isMappedPort = false; + for (PatternConnection patternConnection: patternConnections) { + if (patternConnection.getModelTaskName().equals(task) && patternConnection.getModelChannelName().equals(rd) && !patternConnection.isNewPort()) { + isMappedPort = true; + break; + } + } + if (!isMappedPort) { + portsTaskModelLeft.get(task).getReadChannels().add(rd); + } + } + for (String se : _portsTaskOfModelAll.get(task).getSendEvents()) { + boolean isMappedPort = false; + for (PatternConnection patternConnection: patternConnections) { + if (patternConnection.getModelTaskName().equals(task) && patternConnection.getModelChannelName().equals(se) && !patternConnection.isNewPort()) { + isMappedPort = true; + break; + } + } + if (!isMappedPort) { + portsTaskModelLeft.get(task).getSendEvents().add(se); + } + } + for (String we : _portsTaskOfModelAll.get(task).getWaitEvents()) { + boolean isMappedPort = false; + for (PatternConnection patternConnection: patternConnections) { + if (patternConnection.getModelTaskName().equals(task) && patternConnection.getModelChannelName().equals(we) && !patternConnection.isNewPort()) { + isMappedPort = true; + break; + } + } + if (!isMappedPort) { + portsTaskModelLeft.get(task).getWaitEvents().add(we); + } + } + } + /*LinkedHashMap<String, TaskPorts> portsTaskModelLeft = new LinkedHashMap<String, TaskPorts>(_portsTaskOfModelAll); + for (PatternConnection patternConnection: patternConnections) { + if (portsTaskModelLeft.containsKey(patternConnection.getModelTaskName())) { + portsTaskModelLeft.get(patternConnection.getModelTaskName()).removePort(patternConnection.getModelChannelName()); + } + } + for (PatternConnection patternConnection: patternConnections) { + if (portsTaskModelLeft.containsKey(patternConnection.getModelTaskName())) { + portsTaskModelLeft.get(patternConnection.getModelTaskName()).removePort(patternConnection.getModelChannelName()); + } + }*/ + return portsTaskModelLeft; + } +} \ No newline at end of file diff --git a/src/main/java/tmltranslator/toavatar/FullTML2Avatar.java b/src/main/java/tmltranslator/toavatar/FullTML2Avatar.java index 5c52f962a13035ea127dd03b402f569957686905..406a4befd47f7076fdc06e2845f4989e59c0ea85 100644 --- a/src/main/java/tmltranslator/toavatar/FullTML2Avatar.java +++ b/src/main/java/tmltranslator/toavatar/FullTML2Avatar.java @@ -48,6 +48,8 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.batik.anim.timing.Trace; + /** * Class FullTML2Avatar * Creation: 29/02/2016 @@ -374,17 +376,19 @@ public class FullTML2Avatar { block.addAttribute(loop_index); for (TMLAttribute attr : task.getAttributes()) { - AvatarType type; - if (attr.getType().getType() == TMLType.NATURAL) { - type = AvatarType.INTEGER; - } else if (attr.getType().getType() == TMLType.BOOLEAN) { - type = AvatarType.BOOLEAN; - } else { - type = AvatarType.UNDEFINED; + if (!attr.getName().endsWith("__req")) { + AvatarType type; + if (attr.getType().getType() == TMLType.NATURAL) { + type = AvatarType.INTEGER; + } else if (attr.getType().getType() == TMLType.BOOLEAN) { + type = AvatarType.BOOLEAN; + } else { + type = AvatarType.UNDEFINED; + } + AvatarAttribute avattr = new AvatarAttribute(attr.getName(), type, block, null); + avattr.setInitialValue(attr.getInitialValue()); + block.addAttribute(avattr); } - AvatarAttribute avattr = new AvatarAttribute(reworkStringName(attr.getName()), type, block, null); - avattr.setInitialValue(attr.getInitialValue()); - block.addAttribute(avattr); } //AvatarTransition last; AvatarStateMachine asm = block.getStateMachine(); diff --git a/src/main/java/tmltranslator/toavatarsec/TML2Avatar.java b/src/main/java/tmltranslator/toavatarsec/TML2Avatar.java index b129bb5da5dcdfe492a09c13e98fa262a7082c38..54912cb5aee10dff1a478b27e901055d3d83a05e 100644 --- a/src/main/java/tmltranslator/toavatarsec/TML2Avatar.java +++ b/src/main/java/tmltranslator/toavatarsec/TML2Avatar.java @@ -78,6 +78,7 @@ public class TML2Avatar { boolean security = false; private TMLMapping<?> tmlmap; private TMLModeling<?> tmlmodel; + private Set<SecurityPattern> keysPublicBus = new HashSet<SecurityPattern>(); private Map<SecurityPattern, List<AvatarAttribute>> symKeys = new HashMap<SecurityPattern, List<AvatarAttribute>>(); private Map<SecurityPattern, List<AvatarAttribute>> pubKeys = new HashMap<SecurityPattern, List<AvatarAttribute>>(); private Map<String, String> nameMap = new HashMap<String, String>(); @@ -104,6 +105,12 @@ public class TML2Avatar { for (TMLTask t1 : tmlmodel.getTasks()) { List<SecurityPattern> keys = new ArrayList<SecurityPattern>(); accessKeys.put(t1, keys); + for (HwLink link : links) { + if (link.bus.privacy == HwBus.BUS_PUBLIC && link.hwnode instanceof HwMemory) { + List<SecurityPattern> patterns = tmlmap.getMappedPatterns((HwMemory) link.hwnode); + keysPublicBus.addAll(patterns); + } + } HwExecutionNode node1 = tmlmap.getHwNodeOf(t1); //Try to find memory using only private buses from origin @@ -1310,7 +1317,7 @@ public class TML2Avatar { } secChannelMap.get(ae.securityPattern.name).add(ch.getName()); - if (aec.getEncForm()) { + if (!ae.securityPattern.type.equals(SecurityPattern.NONCE_PATTERN)) { as.addValue(ae.securityPattern.name + "_encrypted"); AvatarAttribute data = new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null); block.addAttribute(data); @@ -1406,7 +1413,7 @@ public class TML2Avatar { AvatarAttribute attr = block.getAvatarAttributeWithName(ch.getOriginPort().getName() + "_chData"); if (attr != null) { attrsToCheck.add(ch.getOriginPort().getName() + "_chData"); - avspec.addPragma(new AvatarPragmaSecret("#Confidentiality " + block.getName() + "." + ch.getName() + + avspec.addPragma(new AvatarPragmaSecret("#Confidentiality " + block.getName() + "." + ch.getOriginPort().getName() + "_chData", ch.getReferenceObject(), attr)); } } @@ -1451,7 +1458,7 @@ public class TML2Avatar { } else { //send encrypted data // - if (aec.getEncForm()) { + if (!ae.securityPattern.type.equals(SecurityPattern.NONCE_PATTERN)) { as.addValue(ae.securityPattern.name + "_encrypted"); AvatarAttribute data = new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null); block.addAttribute(data); @@ -1875,17 +1882,19 @@ public class TML2Avatar { AvatarAttribute loop_index = new AvatarAttribute("loop_index", AvatarType.INTEGER, block, null); block.addAttribute(loop_index); for (TMLAttribute attr : task.getAttributes()) { - AvatarType type; - if (attr.getType().getType() == TMLType.NATURAL) { - type = AvatarType.INTEGER; - } else if (attr.getType().getType() == TMLType.BOOLEAN) { - type = AvatarType.BOOLEAN; - } else { - type = AvatarType.UNDEFINED; + if (!attr.getName().endsWith("__req")) { + AvatarType type; + if (attr.getType().getType() == TMLType.NATURAL) { + type = AvatarType.INTEGER; + } else if (attr.getType().getType() == TMLType.BOOLEAN) { + type = AvatarType.BOOLEAN; + } else { + type = AvatarType.UNDEFINED; + } + AvatarAttribute avattr = new AvatarAttribute(attr.getName(), type, block, null); + avattr.setInitialValue(attr.getInitialValue()); + block.addAttribute(avattr); } - AvatarAttribute avattr = new AvatarAttribute(attr.getName(), type, block, null); - avattr.setInitialValue(attr.getInitialValue()); - block.addAttribute(avattr); } //AvatarTransition last; AvatarStateMachine asm = block.getStateMachine(); @@ -1895,6 +1904,27 @@ public class TML2Avatar { //Create iteration attribute AvatarAttribute req_loop_index = new AvatarAttribute("req_loop_index", AvatarType.INTEGER, block, null); block.addAttribute(req_loop_index); + for (Object obj : tmlmodel.getRequestsToMe(task)) { + TMLRequest req = (TMLRequest) obj; + for (int i = 0; i < req.getNbOfParams(); i++) { + if (block.getAvatarAttributeWithName(req.getParam(i)) == null) { + AvatarType type; + if (req.getParam(i).matches("-?\\d+")) { + type = AvatarType.INTEGER; + } else if (req.getParam(i).matches("(?i)^(true|false)")) { + type = AvatarType.BOOLEAN; + } else { + type = AvatarType.UNDEFINED; + } + String nameNewAtt = "arg"+ (i+1) +"_req"; + if (block.getAvatarAttributeWithName(nameNewAtt) == null) { + AvatarAttribute avattr = new AvatarAttribute(nameNewAtt, type, block, null); + avattr.setInitialValue(req.getParam(i)); + block.addAttribute(avattr); + } + } + } + } //TMLRequest request= tmlmodel.getRequestToMe(task); //Oh this is fun...let's restructure the state machine @@ -1922,7 +1952,7 @@ public class TML2Avatar { for (AvatarStateMachineElement e : elementList) { e.setName(processName(e.getName(), e.getID())); - stateObjectMap.put(task.getName().split("__")[1] + "__" + e.getName(), e.getReferenceObject()); + stateObjectMap.put(task.getName().split("__")[task.getName().split("__").length-1] + "__" + e.getName(), e.getReferenceObject()); if (e instanceof AvatarStopState) { //ignore it @@ -1976,25 +2006,8 @@ public class TML2Avatar { block.addAttribute(requestData);*/ for (int i = 0; i < req.getNbOfParams(); i++) { if (block.getAvatarAttributeWithName(req.getParam(i)) == null) { - //Throw Error - AvatarType type; - if (req.getParam(i).matches("-?\\d+")) { - type = AvatarType.INTEGER; - } else if (req.getParam(i).matches("(?i)^(true|false)")) { - type = AvatarType.BOOLEAN; - } else { - type = AvatarType.UNDEFINED; - } - String nameNewAtt = req.getName() + "_" + req.getID() + "_" + i + "_" + req.getParam(i); - if (block.getAvatarAttributeWithName(nameNewAtt) == null) { - AvatarAttribute avattr = new AvatarAttribute(nameNewAtt, type, block, null); - avattr.setInitialValue(req.getParam(i)); - block.addAttribute(avattr); - as.addValue(avattr.getName()); - TraceManager.addDev("Missing Attribute " + req.getParam(i)); - } else { - as.addValue(block.getAvatarAttributeWithName(nameNewAtt).getName()); - } + String nameNewAtt = "arg"+ (i+1) +"_req"; + as.addValue(block.getAvatarAttributeWithName(nameNewAtt).getName()); } else { // Add parameter to signal and actiononsignal as.addValue(req.getParam(i)); @@ -2030,7 +2043,7 @@ public class TML2Avatar { for (AvatarStateMachineElement e : elementList) { e.setName(processName(e.getName(), e.getID())); asm.addElement(e); - stateObjectMap.put(task.getName().split("__")[1] + "__" + e.getName(), e.getReferenceObject()); + stateObjectMap.put(task.getName().split("__")[task.getName().split("__").length-1] + "__" + e.getName(), e.getReferenceObject()); } asm.setStartState((AvatarStartState) elementList.get(0)); } @@ -2065,7 +2078,6 @@ public class TML2Avatar { } - // Add authenticity pragmas for (String s : signalAuthOriginMap.keySet()) { for (AvatarAttributeState attributeStateOrigin : signalAuthOriginMap.get(s)) { @@ -2463,7 +2475,20 @@ public class TML2Avatar { for (AvatarAttribute key : symKeys.get(sp)) { keys = keys + " " + key.getBlock().getName() + "." + key.getName(); } - avspec.addPragma(new AvatarPragmaInitialKnowledge("#InitialSessionKnowledge " + keys, null, symKeys.get(sp), true)); + avspec.addPragma(new AvatarPragmaInitialKnowledge("#InitialSystemKnowledge " + keys, null, symKeys.get(sp), true)); + } + } + + for (SecurityPattern sp : keysPublicBus) { + for (TMLTask taskPattern : tmlmodel.securityTaskMap.get(sp)) { + AvatarBlock b = taskBlockMap.get(taskPattern); + AvatarAttribute attrib = b.getAvatarAttributeWithName("key_"+sp.getName()); + if (attrib!=null) { + LinkedList<AvatarAttribute> arguments = new LinkedList<AvatarAttribute>(); + arguments.add(attrib); + avspec.addPragma(new AvatarPragmaPublic("#Public " + b.getName() + "." + attrib.getName(), null, arguments)); + } + } } for (SecurityPattern sp : pubKeys.keySet()) { diff --git a/src/main/java/ui/ActionPerformer.java b/src/main/java/ui/ActionPerformer.java index 33c663d9e1fe2537c2c8c0308020dc9dee6885c3..3e11a673fb801e37cbd5857a85d770c1c0d2b531 100644 --- a/src/main/java/ui/ActionPerformer.java +++ b/src/main/java/ui/ActionPerformer.java @@ -367,6 +367,8 @@ public class ActionPerformer { mgui.avatarStaticAnalysis(); } else if (command.equals(mgui.actions[TGUIAction.ACT_AVATAR_EXECUTABLE_GENERATION].getActionCommand())) { mgui.avatarExecutableCodeGeneration(); + } else if (command.equals(mgui.actions[TGUIAction.ACT_PATTERN_HANDLING].getActionCommand())) { + mgui.patternHandling(); // AVATAR BD } else if (command.equals(mgui.actions[TGUIAction.ABD_BLOCK].getActionCommand())) { diff --git a/src/main/java/ui/ActivityDiagram2TMLTranslator.java b/src/main/java/ui/ActivityDiagram2TMLTranslator.java index 33d77df48c7e692a145803649b649ccd4ece21a5..118ec4a97d76f17f6d363e47f17f1e400bd205c0 100644 --- a/src/main/java/ui/ActivityDiagram2TMLTranslator.java +++ b/src/main/java/ui/ActivityDiagram2TMLTranslator.java @@ -375,7 +375,7 @@ public class ActivityDiagram2TMLTranslator { } else { tmlreadchannel = new TMLReadChannel("read channel", tgc); tmlreadchannel.setNbOfSamples(modifyString(((TMLADReadChannel) tgc).getSamplesValue())); - tmlreadchannel.setEncForm(((TMLADReadChannel) tgc).getEncForm()); + // tmlreadchannel.setEncForm(((TMLADReadChannel) tgc).getEncForm()); tmlreadchannel.addChannel(channel); //security pattern if (securityPatterns.get(((TMLADReadChannel) tgc).getSecurityContext()) != null) { @@ -411,7 +411,6 @@ public class ActivityDiagram2TMLTranslator { if (tmltask.isAttacker()) { tmlreadchannel.setAttacker(true); } - activity.addElement(tmlreadchannel); addElement(activity, tmlreadchannel, tgc); ((BasicErrorHighlight) tgc).setStateAction(ErrorHighlight.OK); corrTgElement.addCor(tmlreadchannel, tgc); @@ -763,7 +762,7 @@ public class ActivityDiagram2TMLTranslator { tmlwritechannel = new TMLWriteChannel("write channel", tgc); tmlwritechannel.setNbOfSamples(modifyString(((TMLADWriteChannel) tgc).getSamplesValue())); - tmlwritechannel.setEncForm(((TMLADWriteChannel) tgc).getEncForm()); + // tmlwritechannel.setEncForm(((TMLADWriteChannel) tgc).getEncForm()); for (int i = 0; i < channels.length; i++) { diff --git a/src/main/java/ui/DrawerTMAPModeling.java b/src/main/java/ui/DrawerTMAPModeling.java index b2f85a693ee36c7d83994bca83839517ba012e44..b7f371d4417c1fcfaf17cafa3cf17dbb0b4fe5a9 100644 --- a/src/main/java/ui/DrawerTMAPModeling.java +++ b/src/main/java/ui/DrawerTMAPModeling.java @@ -46,6 +46,7 @@ import ui.tmlcompd.TMLCPortConnector; import ui.tmldd.*; import java.awt.*; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -100,6 +101,7 @@ public class DrawerTMAPModeling { return; } + tmap.NullifyAutomata(); TMLSyntaxChecking syntax = new TMLSyntaxChecking(tmap); syntax.checkSyntax(); if (syntax.hasErrors() > 0) { @@ -309,6 +311,10 @@ public class DrawerTMAPModeling { if (splitName.length >= 2) { artifact.setTaskName(splitName[1]); artifact.setReferenceTaskName(splitName[0]); + } else if (splitName.length == 1) { + String tabName = ((TGComponent)tmap.getTMLModeling().getReference()).getTDiagramPanel().tp.getNameOfTab(); + artifact.setTaskName(refAndName); + artifact.setReferenceTaskName(tabName); } else { artifact.setTaskName(refAndName); } @@ -328,30 +334,82 @@ public class DrawerTMAPModeling { List<TMLElement> elts = tmap.getMappedCommunicationElement(); check(oncommnodes.size() == elts.size(), "Tasks and execution nodes in mapping should be of the same dimension"); - - for(cpt=0; cpt < oncommnodes.size(); cpt ++) { - HwCommunicationNode node = oncommnodes.get(cpt); - TMLElement elt = elts.get(cpt); - - TGComponent tgc = nodeMap.get(node); - check(tgc != null, "No graphical component corresponding to communication node " + node.getName()); - check(tgc instanceof SwallowTGComponent && tgc instanceof TMLArchiElementInterface, - "Invalid graphical component for task " + node.getName()); - - Point p = getRandomCoordinate(tgc); - TMLArchiCommunicationArtifact artifact = new TMLArchiCommunicationArtifact(p.x, p.y, panel.getMinX(), panel.getMaxX(), - panel.getMinY(), panel.getMaxY(), false, tgc, panel); - - String refAndName = elt.getName(); - String[] splitName = refAndName.split("__"); - if (splitName.length >= 2) { - artifact.setCommunicationName(splitName[1]); - artifact.setReferenceCommunicationName(splitName[0]); - } else { - artifact.setCommunicationName(refAndName); + boolean isMultiMapping = false; + List<TMLElement> mappedElems = new ArrayList<TMLElement>(); + for (TMLElement elem : elts) { + if (!mappedElems.contains(elem)) { + if (elem instanceof TMLChannel) { + TMLChannel ch = (TMLChannel) elem; + ArrayList<HwCommunicationNode> commNodes = tmap.getAllCommunicationNodesOfChannel(ch); + for (HwCommunicationNode node : commNodes) { + if (node instanceof HwMemory) { + TGComponent tgc = nodeMap.get(node); + check(tgc != null, "No graphical component corresponding to communication node " + node.getName()); + check(tgc instanceof SwallowTGComponent && tgc instanceof TMLArchiElementInterface, + "Invalid graphical component for task " + node.getName()); + + Point p = getRandomCoordinate(tgc); + TMLArchiCommunicationArtifact artifact = new TMLArchiCommunicationArtifact(p.x, p.y, panel.getMinX(), panel.getMaxX(), + panel.getMinY(), panel.getMaxY(), false, tgc, panel); + + String refAndName = elem.getName(); + String[] splitName = refAndName.split("__"); + if (splitName.length >= 2) { + artifact.setCommunicationName(splitName[1]); + artifact.setReferenceCommunicationName(splitName[0]); + } else if (splitName.length == 1) { + String tabName = ((TGComponent)tmap.getTMLModeling().getReference()).getTDiagramPanel().tp.getNameOfTab(); + artifact.setCommunicationName(refAndName); + artifact.setReferenceCommunicationName(tabName); + } else { + artifact.setCommunicationName(refAndName); + } + ArrayList<String> otherCommNames = new ArrayList<String>(); + for (HwCommunicationNode otherNode : commNodes) { + if (otherNode != node) { + otherCommNames.add(otherNode.getName()); + } + } + artifact.addNewOtherCommunicationNames(otherCommNames); + panel.addComponent(artifact, p.x, p.y, true, true); + isMultiMapping = true; + mappedElems.add(elem); + break; + } + } + } + if (!isMultiMapping) { + for(cpt=0; cpt < oncommnodes.size(); cpt ++) { + TMLElement elt = elts.get(cpt); + if (elem.equals(elt)) { + HwCommunicationNode node = oncommnodes.get(cpt); + + TGComponent tgc = nodeMap.get(node); + check(tgc != null, "No graphical component corresponding to communication node " + node.getName()); + check(tgc instanceof SwallowTGComponent && tgc instanceof TMLArchiElementInterface, + "Invalid graphical component for task " + node.getName()); + + Point p = getRandomCoordinate(tgc); + TMLArchiCommunicationArtifact artifact = new TMLArchiCommunicationArtifact(p.x, p.y, panel.getMinX(), panel.getMaxX(), + panel.getMinY(), panel.getMaxY(), false, tgc, panel); + String refAndName = elt.getName(); + String[] splitName = refAndName.split("__"); + if (splitName.length >= 2) { + artifact.setCommunicationName(splitName[1]); + artifact.setReferenceCommunicationName(splitName[0]); + } else if (splitName.length == 1) { + String tabName = ((TGComponent)tmap.getTMLModeling().getReference()).getTDiagramPanel().tp.getNameOfTab(); + artifact.setCommunicationName(refAndName); + artifact.setReferenceCommunicationName(tabName); + } else { + artifact.setCommunicationName(refAndName); + } + panel.addComponent(artifact, p.x, p.y, true, true); + } + } + mappedElems.add(elem); + } } - - panel.addComponent(artifact, p.x, p.y, true, true); } } diff --git a/src/main/java/ui/DrawerTMLModeling.java b/src/main/java/ui/DrawerTMLModeling.java index 2178535d5a59a1500aca8e6f5c7dba26a8a7d138..11bc33f227d0d9804e25a538ea7a394c1054d871 100644 --- a/src/main/java/ui/DrawerTMLModeling.java +++ b/src/main/java/ui/DrawerTMLModeling.java @@ -209,6 +209,11 @@ public class DrawerTMLModeling { } } } + String longName = task.getName(); + int index = longName.indexOf("__"); + if (index <= 0) { + task.setName(panel.getNameOfTab() + "__" + longName); + } } @@ -281,6 +286,12 @@ public class DrawerTMLModeling { p2.checkWeakAuthStatus = TMLCPrimitivePort.TOCHECK; } + String longName = chan.getName(); + int index = longName.indexOf("__"); + if (index <= 0) { + chan.setName(panel.getNameOfTab() + "__" + longName); + } + } // Assumes 1 to 1 event @@ -316,6 +327,12 @@ public class DrawerTMLModeling { // Connecting the ports addPortConnector(p1, p2, panel); + String longName = evt.getName(); + int index = longName.indexOf("__"); + if (index <= 0) { + evt.setName(panel.getNameOfTab() + "__" + longName); + } + } // Assumes n to 1 requests @@ -357,6 +374,12 @@ public class DrawerTMLModeling { addPortConnector(p1, p2, panel); } + String longName = req.getName(); + int index = longName.indexOf("__"); + if (index <= 0) { + req.setName(panel.getNameOfTab() + "__" + longName); + } + } private TMLCChannelOutPort addPort(TGComponent tgc, String name, int portType, boolean isOrigin, boolean isLossy, @@ -678,6 +701,8 @@ public class DrawerTMLModeling { read.setSamples(readT.getNbOfSamples()); if (readT.securityPattern != null) { read.setSecurityContext(readT.securityPattern.name); + // read.setEncForm(readT.getEncForm()); + read.setIsAttacker(readT.isAttacker()); } return read; @@ -722,6 +747,8 @@ public class DrawerTMLModeling { if (writeT.securityPattern != null) { write.setSecurityContext(writeT.securityPattern.name); + // write.setEncForm(writeT.getEncForm()); + write.setIsAttacker(writeT.isAttacker()); } return write; diff --git a/src/main/java/ui/GTURTLEModeling.java b/src/main/java/ui/GTURTLEModeling.java index 4e017e9bee6fcad87aa2b793b9da8a100797656c..15dde278071e44f50324277988306753f32691a2 100644 --- a/src/main/java/ui/GTURTLEModeling.java +++ b/src/main/java/ui/GTURTLEModeling.java @@ -72,6 +72,13 @@ import sdtranslator.SDTranslator; import tmatrix.RequirementModeling; import tmltranslator.*; import tmltranslator.modelcompiler.TMLModelCompiler; +import tmltranslator.patternhandling.PatternConfig2Json; +import tmltranslator.patternhandling.PatternConfiguration; +import tmltranslator.patternhandling.PatternCreation; +import tmltranslator.patternhandling.PatternIntegration; +import tmltranslator.patternhandling.SecurityGenerationForTMAP; +import tmltranslator.patternhandling.TMRGeneration; +import tmltranslator.patternhandling.TaskPattern; import tmltranslator.toautomata.TML2AUT; import tmltranslator.toautomata.TML2AUTviaLOTOS; import tmltranslator.toavatar.FullTML2Avatar; @@ -131,6 +138,7 @@ import ui.tree.*; import ui.ucd.UseCaseDiagramPanel; import ui.util.DefaultText; import ui.util.IconManager; +import ui.window.JDialogProverifVerification; import ui.window.JFrameSimulationTrace; import uppaaldesc.UPPAALSpec; @@ -144,6 +152,7 @@ import java.io.*; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.List; +import java.util.Map.Entry; import java.util.*; // AVATAR @@ -1613,6 +1622,68 @@ public class GTURTLEModeling { hsm.startThread(); } + @SuppressWarnings("unchecked") + public void addPattern(MainGUI gui, Map<String, List<String>> selectedSensorsTasks, String selectedRecieverTask, String interpretersCompTime, String voterCompTime, String voterTimeOut) { + TMRGeneration tmr = new TMRGeneration(selectedSensorsTasks, selectedRecieverTask, interpretersCompTime, voterCompTime, voterTimeOut, tmap); + tmap = (TMLMapping<TGComponent>) tmr.startThread(); + try { + String archTabName = ((CorrespondanceTGElement)(tmap.getCorrespondanceList())).getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel().tp.getNameOfTab(); + String appTabName = ((TGComponent)tmap.getTMLModeling().getReference()).getTDiagramPanel().tp.getNameOfTab(); + gui.drawTMLAndTMAPSpecification(tmap, appTabName + "_tmr", archTabName + "_tmr"); + } catch (MalformedTMLDesignException e) { + TraceManager.addDev("Error when Drawing TML"); + } + } + + public void createPattern(List<String> selectedTasks, String patternName, String patternsPath) { + PatternCreation pattern = new PatternCreation(selectedTasks, patternName, patternsPath, tmap); + pattern.startThread(); + } + + public static void createPatternFromTmap(List<String> selectedTasks, String patternName, String patternsPath, TMLMapping<?> _tmap) { + PatternCreation pattern = new PatternCreation(selectedTasks, patternName, patternsPath, _tmap); + pattern.startThread(); + } + + public void integratePattern(MainGUI gui, String patternPath, String patternName) { + integratePattern(gui, patternPath, patternName, patternPath+"/"+patternName+"-config.json"); + } + + @SuppressWarnings("unchecked") + public void integratePattern(MainGUI gui, String patternPath, String patternName, String configPatternPath) { + String appTabName = ((TGComponent)tmap.getTMLModeling().getReference()).getTDiagramPanel().tp.getNameOfTab(); + tmap = (TMLMapping<TGComponent>) integratePatternTMAP(appTabName, patternPath, patternName, configPatternPath, tmap); + try { + String archTabName = ((CorrespondanceTGElement)(tmap.getCorrespondanceList())).getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel().tp.getNameOfTab(); + gui.drawTMLAndTMAPSpecification(tmap, appTabName + "_" + patternName, archTabName + "_" + patternName); + } catch (MalformedTMLDesignException e) { + TraceManager.addDev("Error when Drawing TML"); + } + } + + public static TMLMapping<?> integratePatternTMAP(String appTab, String patternPath, String patternName, String configPatternPath, TMLMapping<?> _tmap) { + PatternConfig2Json patternConfig2Json = new PatternConfig2Json(configPatternPath); + patternConfig2Json.json2patternConfiguration(); + PatternConfiguration patternConfiguration = patternConfig2Json.getPaternConfiguration(); + LinkedHashMap<String, TaskPattern> patternTasks = TaskPattern.parsePatternJsonFile(patternPath, patternName+".json"); + PatternIntegration patternInteg = new PatternIntegration(appTab, patternPath, patternName, patternConfiguration, patternTasks, _tmap); + TMLMapping<?> tmapPattern = patternInteg.startThread(); + return tmapPattern; + } + + public static void createJsonPatternConfigFile(String patternPath, String patternName, PatternConfiguration patternConfiguration) { + PatternConfig2Json patternConfig2Json = new PatternConfig2Json(patternPath+"/"+patternName+"-config.json", patternConfiguration); + patternConfig2Json.patternConfiguration2Json(); + } + + public static void createJsonPatternConfigFile(String pathConfigJsonFile, PatternConfiguration patternConfiguration) { + if (!pathConfigJsonFile.endsWith(".json")) { + pathConfigJsonFile += ".json"; + } + PatternConfig2Json patternConfig2Json = new PatternConfig2Json(pathConfigJsonFile, patternConfiguration); + patternConfig2Json.patternConfiguration2Json(); + } + @SuppressWarnings("unchecked") public boolean generateGraphicalMapping(TMLMapping map) { TURTLEPanel tmlap = ((CorrespondanceTGElement)(tmap.getCorrespondanceList())).getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel().tp; @@ -1705,6 +1776,99 @@ public class GTURTLEModeling { return autoSecure(gui, newTabSuffix, tmap, newarch, encComp, overhead, decComp, autoConf, autoWeakAuth, autoStrongAuth, selectedCpuTasks); } + @SuppressWarnings("unchecked") + public void autoSecure(MainGUI gui, String encComp, String overhead, String decComp, Vector<String> channelsToAddSec, Map<String, List<String>> selectedCpuTasks) { + if (tmap == null) { + return; + } + boolean checkAddSec = false; + for (String channelToAddSec : channelsToAddSec) { + String channelName = channelToAddSec.split(": ")[0]; + String secToAdd = channelToAddSec.split(": ")[1]; + TMLChannel ch = tmap.getTMLModeling().getChannelByShortName(channelName); + if (ch != null) { + String[] sec = secToAdd.split(" \\+ "); + for (String s : sec) { + if (s.equals(JDialogProverifVerification.ADD_CONFIDENTIALITY)) { + ch.setEnsureConf(true); + ch.checkConf = true; + checkAddSec = true; + } + if (s.equals(JDialogProverifVerification.ADD_WEAK_AUTHENTICITY)) { + ch.setEnsureWeakAuth(true); + ch.checkAuth = true; + checkAddSec = true; + } + if (s.equals(JDialogProverifVerification.ADD_STRONG_AUTHENTICITY)) { + ch.setEnsureWeakAuth(true); + ch.setEnsureStrongAuth(true); + ch.checkAuth = true; + checkAddSec = true; + } + } + } + } + if (checkAddSec) { + String appTabName = ((TGComponent) tmap.getTMLModeling().getReference()).getTDiagramPanel().tp.getNameOfTab(); + SecurityGenerationForTMAP secgen = new SecurityGenerationForTMAP(appTabName, tmap, encComp, overhead, decComp, selectedCpuTasks); + tmap = (TMLMapping<TGComponent>) secgen.startThread(); + if (tmap != null) + TraceManager.addDev("Map keys Auto");{ + tmap = (TMLMapping<TGComponent>) secgen.autoMapKeys(); + } + + for (TMLTask task : tmap.getTMLModeling().getTasks()) { + String[] taskNameSplit = task.getName().split("__"); + task.setName(taskNameSplit[taskNameSplit.length-1]); + } + for (TMLChannel ch : tmap.getTMLModeling().getChannels()) { + String[] channelNameSplit = ch.getName().split("__"); + ch.setName(channelNameSplit[channelNameSplit.length-1]); + } + for (TMLEvent evt : tmap.getTMLModeling().getEvents()) { + String[] eventNameSplit = evt.getName().split("__"); + evt.setName(eventNameSplit[eventNameSplit.length-1]); + } + for (TMLRequest req : tmap.getTMLModeling().getRequests()) { + String[] requestNameSplit = req.getName().split("__"); + req.setName(requestNameSplit[requestNameSplit.length-1]); + } + + try { + String archTabName = ((CorrespondanceTGElement)(tmap.getCorrespondanceList())).getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel().tp.getNameOfTab(); + gui.drawTMLAndTMAPSpecification(tmap, appTabName + "_enc", archTabName + "_enc"); + } catch (MalformedTMLDesignException e) { + TraceManager.addDev("Error when Drawing TML"); + } + for (TMLTask task : tmap.getTMLModeling().getTasks()) { + String[] taskNameSplit = task.getName().split("__"); + if (taskNameSplit.length == 1) { + task.setName(appTabName + "__" + task.getName()); + } + } + for (TMLChannel ch : tmap.getTMLModeling().getChannels()) { + String[] channelNameSplit = ch.getName().split("__"); + if (channelNameSplit.length == 1) { + ch.setName(appTabName + "__" + ch.getName()); + } + } + for (TMLEvent evt : tmap.getTMLModeling().getEvents()) { + String[] eventNameSplit = evt.getName().split("__"); + if (eventNameSplit.length == 1) { + evt.setName(appTabName + "__" + evt.getName()); + } + } + for (TMLRequest req : tmap.getTMLModeling().getRequests()) { + String[] requestNameSplit = req.getName().split("__"); + if (requestNameSplit.length == 1) { + req.setName(appTabName + "__" + req.getName()); + } + } + } + + + } + public TMLMapping<TGComponent> autoSecure(MainGUI gui, String name, TMLMapping<TGComponent> map, TMLArchiPanel newarch, String encComp, String overhead, String decComp) { return autoSecure(gui, name, tmap, newarch, encComp, overhead, decComp, true, false, false, diff --git a/src/main/java/ui/JMenuBarTurtle.java b/src/main/java/ui/JMenuBarTurtle.java index a72929bbc04ddff20d8294dc2eff2ceac13f90f2..463e3c21e01de15960718afc23e9f6ac25b03c5c 100644 --- a/src/main/java/ui/JMenuBarTurtle.java +++ b/src/main/java/ui/JMenuBarTurtle.java @@ -622,6 +622,7 @@ public class JMenuBarTurtle extends JMenuBar { menuItem = vAndV.add(mgui.actions[TGUIAction.ACT_AVATAR_FV_STATICANALYSIS]); menuItem.setName("V&V Avatar Static Analysis"); menuItem.addMouseListener(mgui.mouseHandler); + // Code generation @@ -646,6 +647,10 @@ public class JMenuBarTurtle extends JMenuBar { menuItem = codeG.add(mgui.actions[TGUIAction.ACT_AVATAR_EXECUTABLE_GENERATION]); menuItem.setName("CodeG Executable"); menuItem.addMouseListener(mgui.mouseHandler); + + menuItem = codeG.add(mgui.actions[TGUIAction.ACT_PATTERN_HANDLING]); + menuItem.setName("CodeG Pattern Handling"); + menuItem.addMouseListener(mgui.mouseHandler); // View menuItem = view.add(mgui.actions[TGUIAction.ACT_VIEW_BIRDEYES_EMB]); diff --git a/src/main/java/ui/JToolBarMainTurtle.java b/src/main/java/ui/JToolBarMainTurtle.java index 8ca91acc97caac232d6d303c748f607e1776010f..e97500599f541a384d0dbe59f26117e5f3890f0c 100644 --- a/src/main/java/ui/JToolBarMainTurtle.java +++ b/src/main/java/ui/JToolBarMainTurtle.java @@ -71,8 +71,8 @@ public class JToolBarMainTurtle extends JToolBar implements ActionListener -1, TGUIAction.ACT_ZOOM_LESS, TGUIAction.ACT_SHOW_ZOOM, TGUIAction.ACT_ZOOM_MORE, -1, -1, TGUIAction.ACT_MODEL_CHECKING}; // Avatar - private JButton avatarSimu, avatarFVUPPAAL, avatarFVProVerif, avatarFVStaticAnalysis, avatarCodeGeneration, avatarMC; - private JMenuItem avatarSimuMI, avatarFVUPPAALMI, avatarFVProVerifMI, avatarFVStaticAnalysisMI, avatarCodeGenerationMI, avatarMCMI; + private JButton avatarSimu, avatarFVUPPAAL, avatarFVProVerif, avatarFVStaticAnalysis, avatarCodeGeneration, avatarMC, patterHandling; + private JMenuItem avatarSimuMI, avatarFVUPPAALMI, avatarFVProVerifMI, avatarFVStaticAnalysisMI, avatarCodeGenerationMI, avatarMCMI, patterHandlingMI; // Other private JButton genrtlotos, genlotos, genuppaal, gendesign, genMapping, dse, dseZ3, noc; @@ -223,6 +223,10 @@ public class JToolBarMainTurtle extends JToolBar implements ActionListener avatarFVStaticAnalysis.addMouseListener(mgui.mouseHandler); avatarFVStaticAnalysisMI = addMenu(mgui.actions[TGUIAction.ACT_AVATAR_FV_STATICANALYSIS]); + patterHandling = add(mgui.actions[TGUIAction.ACT_PATTERN_HANDLING]); + patterHandling.addMouseListener(mgui.mouseHandler); + patterHandlingMI = addMenu(mgui.actions[TGUIAction.ACT_PATTERN_HANDLING]); + addSeparator(); menu.addSeparator(); @@ -436,6 +440,8 @@ public class JToolBarMainTurtle extends JToolBar implements ActionListener avatarCodeGeneration.setVisible(b); avatarFVStaticAnalysisMI.setVisible(b); avatarCodeGenerationMI.setVisible(b); + patterHandling.setVisible(b); + patterHandlingMI.setVisible(b); if (genrtlotosMI != null) { genrtlotosMI.setVisible(!b); @@ -589,6 +595,8 @@ public class JToolBarMainTurtle extends JToolBar implements ActionListener avatarFVStaticAnalysis.setVisible(!b); avatarFVUPPAALMI.setVisible(!b); avatarFVStaticAnalysisMI.setVisible(!b); + patterHandling.setVisible(!b); + patterHandlingMI.setVisible(!b); if (avatarFVProVerif != null) { avatarFVProVerif.setVisible(b); diff --git a/src/main/java/ui/MainGUI.java b/src/main/java/ui/MainGUI.java index 2c90314f311148110bda20c26e3d63cb49e0e4a0..5e52a0a94bf4cc62fcb907557cb3be10d57eb39d 100644 --- a/src/main/java/ui/MainGUI.java +++ b/src/main/java/ui/MainGUI.java @@ -1932,6 +1932,31 @@ public class MainGUI implements ActionListener, WindowListener, KeyListener, Per TraceManager.addDev("Draw TMAP Spec 4"); } + public void drawTMLAndTMAPSpecification(TMLMapping tmap, String titleApp, String titleArch) throws MalformedTMLDesignException { + DateFormat dateFormat = new SimpleDateFormat("HHmmss"); + Date date = new Date(); + String dateAndTime = dateFormat.format(date); + String tabNameArch = titleArch + "_" + dateAndTime; + String tabNameApp = titleApp + "_" + dateAndTime; + + TraceManager.addDev("Draw TML Spec 1"); + int indexApp = createTMLComponentDesign(tabNameApp); + TraceManager.addDev("Draw TML Spec 2"); + TMLComponentDesignPanel tmlcdp = (TMLComponentDesignPanel) (tabs.elementAt(indexApp)); + TraceManager.addDev("Draw TML Spec 3"); + DrawerTMLModeling drawerApp = new DrawerTMLModeling(this); + drawerApp.drawTMLModelingPanel(tmap.getTMLModeling(), tmlcdp); + + TraceManager.addDev("Draw TMAP Spec 1"); + int indexArch = createTMLArchitecture(tabNameArch + "_Mapping"); + TraceManager.addDev("Draw TMAP Spec 2"); + TMLArchiPanel tmlap = (TMLArchiPanel) (tabs.elementAt(indexArch)); + TraceManager.addDev("to Draw TMAP Spec 3"); + DrawerTMAPModeling drawerArch = new DrawerTMAPModeling(this); + drawerArch.drawTMAPModelingPanel(tmap, tmlap); + TraceManager.addDev("Draw TMAP Spec 4"); + } + // Creates the status bar. private JLabel createStatusBar() { status = new JLabel("Ready..."); @@ -5190,6 +5215,21 @@ public class MainGUI implements ActionListener, WindowListener, KeyListener, Per dtree.toBeUpdated(); } + public void patternHandling() { + boolean limit = true; + TraceManager.addDev("PATTERN HANDLING"); + TURTLEPanel tp = this.getCurrentTURTLEPanel(); + AvatarDesignPanel adp = null; + if (tp instanceof AvatarDesignPanel) { + adp = (AvatarDesignPanel) tp; + limit = false; + } + JDialogPatternHandling jgen = new JDialogPatternHandling(frame, this, "Pattern Handling", "../ttool/build/resources/main/patterns/"); + GraphicLib.centerOnParent(jgen, 600, 800); + jgen.setVisible(true); + dtree.toBeUpdated(); + } + public void dse() { // TraceManager.addDev("Design space exploration"); JDialogDSE jdse = new JDialogDSE(frame, this, "Design Space Exploration", SpecConfigTTool.SystemCCodeDirectory, diff --git a/src/main/java/ui/ModeManager.java b/src/main/java/ui/ModeManager.java index d7d6df2f5c11ac74b8eeae39079195812811acac..e99622e0515cc26b561843d06c82545062b61e36 100644 --- a/src/main/java/ui/ModeManager.java +++ b/src/main/java/ui/ModeManager.java @@ -152,6 +152,7 @@ public class ModeManager { actions[TGUIAction.ACT_GEN_LOTOS].setEnabled(true); if (mgui.getCurrentTURTLEPanel() instanceof TMLArchiPanel) { actions[TGUIAction.ACT_GEN_MAPPING].setEnabled(true); + actions[TGUIAction.ACT_PATTERN_HANDLING].setEnabled(true); } actions[TGUIAction.ACT_DSE].setEnabled(true); actions[TGUIAction.ACT_DSE_Z3].setEnabled(true); @@ -269,6 +270,7 @@ public class ModeManager { actions[TGUIAction.ACT_AVATAR_FV_PROVERIF].setEnabled(false); actions[TGUIAction.ACT_AVATAR_FV_STATICANALYSIS].setEnabled(false); actions[TGUIAction.ACT_AVATAR_EXECUTABLE_GENERATION].setEnabled(false); + actions[TGUIAction.ACT_PATTERN_HANDLING].setEnabled(false); break; case MainGUI.METHO_CHANGED: actions[TGUIAction.ACT_GEN_RTLOTOS].setEnabled(false); @@ -319,6 +321,7 @@ public class ModeManager { actions[TGUIAction.ACT_AVATAR_FV_PROVERIF].setEnabled(false); actions[TGUIAction.ACT_AVATAR_FV_STATICANALYSIS].setEnabled(false); actions[TGUIAction.ACT_AVATAR_EXECUTABLE_GENERATION].setEnabled(false); + actions[TGUIAction.ACT_PATTERN_HANDLING].setEnabled(false); break; case MainGUI.MODEL_SAVED: diff --git a/src/main/java/ui/SecurityGeneration.java b/src/main/java/ui/SecurityGeneration.java index 7a50f0ca1ee87f65f70fb99c9cadd9213da0e3cf..bab318ccf8e83512615d91eff9f1fc13dc2c83b0 100644 --- a/src/main/java/ui/SecurityGeneration.java +++ b/src/main/java/ui/SecurityGeneration.java @@ -961,7 +961,7 @@ public class SecurityGeneration implements Runnable { TMLADWriteChannel wChannel = (TMLADWriteChannel) tg; if (channel.equals(wChannel.getChannelName()) && wChannel.getSecurityContext().equals("")) { wChannel.setSecurityContext(channelSecMap.get(channel)); - wChannel.setEncForm(true); + // wChannel.setEncForm(true); } } @@ -1059,7 +1059,7 @@ public class SecurityGeneration implements Runnable { TMLADWriteChannel wChannel = (TMLADWriteChannel) tg; if (channel.equals(wChannel.getChannelName()) && wChannel.getSecurityContext().equals("")) { wChannel.setSecurityContext(channelSecMap.get(channel)); - wChannel.setEncForm(true); + // wChannel.setEncForm(true); tad.repaint(); } } @@ -1097,7 +1097,7 @@ public class SecurityGeneration implements Runnable { continue; } writeChannel.setSecurityContext(channelSecMap.get(chanName)); - writeChannel.setEncForm(true); + // writeChannel.setEncForm(true); xpos = chan.getX(); ypos = chan.getY(); fromStart = tad.findTGConnectorEndingAt(chan.getTGConnectingPointAtIndex(0)); @@ -1129,7 +1129,7 @@ public class SecurityGeneration implements Runnable { //Add write channel operator wr = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); wr.setChannelName("data_" + chanName + "_" + task.getName().split("__")[1]); - wr.setEncForm(false); + // wr.setEncForm(false); wr.setSecurityContext(channelSecMap.get(chanName)); tad.addComponent(wr, xpos, ypos + yShift, false, true); @@ -1248,7 +1248,7 @@ public class SecurityGeneration implements Runnable { continue; } readChannel.setSecurityContext(channelSecMap.get(chanName)); - readChannel.setEncForm(true); + // readChannel.setEncForm(true); xpos = chan.getX() + 1; ypos = chan.getY() + 1; fromStart = tad.findTGConnectorStartingAt(chan.getTGConnectingPointAtIndex(1)); @@ -1364,7 +1364,7 @@ public class SecurityGeneration implements Runnable { TMLADReadChannel rd = new TMLADReadChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); rd.setChannelName("retData_" + chanName + "_" + task.getName().split("__")[1]); rd.setSecurityContext(channelSecMap.get(chanName)); - rd.setEncForm(false); + // rd.setEncForm(false); tad.addComponent(rd, xpos, ypos + yShift, false, true); fromStart.setP2(rd.getTGConnectingPointAtIndex(0)); @@ -1495,7 +1495,7 @@ public class SecurityGeneration implements Runnable { if (channel.equals(readChannel.getChannelName()) && readChannel.getSecurityContext().equals("")) { readChannel.setSecurityContext(channelSecMap.get(readChannel.getChannelName())); - readChannel.setEncForm(true); + // readChannel.setEncForm(true); } } @@ -1595,7 +1595,7 @@ public class SecurityGeneration implements Runnable { //Now add the decrypt operator yShift += 40; readChannel.setSecurityContext(channelSecMap.get(readChannel.getChannelName())); - readChannel.setEncForm(true); + // readChannel.setEncForm(true); tad.repaint(); //Add decryption operator if it does not already exist xpos = readChannel.getX(); @@ -1616,7 +1616,7 @@ public class SecurityGeneration implements Runnable { readChannel = (TMLADReadChannel) tg; if (channel.equals(readChannel.getChannelName()) && readChannel.getSecurityContext().equals("")) { readChannel.setSecurityContext(channelSecMap.get(readChannel.getChannelName())); - readChannel.setEncForm(true); + // readChannel.setEncForm(true); } } @@ -1828,9 +1828,9 @@ public class SecurityGeneration implements Runnable { tad.addComponent(rd, xc, 300, false, true); //Recieve plaintext data if encrypting - if (ch.secType != HSMChannel.DEC) { + /* if (ch.secType != HSMChannel.DEC) { rd.setEncForm(false); - } + } */ //Connect choice and readchannel @@ -1868,9 +1868,9 @@ public class SecurityGeneration implements Runnable { wr.setChannelName("retData_" + ch.name + "_" + ch.task); //Return plaintext data if decrypting - if (ch.secType == HSMChannel.DEC) { + /* if (ch.secType == HSMChannel.DEC) { wr.setEncForm(false); - } + } */ tad.addComponent(wr, xc, 600, false, true); diff --git a/src/main/java/ui/TGUIAction.java b/src/main/java/ui/TGUIAction.java index c4f7026fc3de61a6c5d95880cce1730a63641a8b..07ca9f9d8485714b424f07edffa9d0aab32b0428 100644 --- a/src/main/java/ui/TGUIAction.java +++ b/src/main/java/ui/TGUIAction.java @@ -678,6 +678,7 @@ public class TGUIAction extends AbstractAction { public static final int ACT_AVATAR_FV_PROVERIF = 338; public static final int ACT_AVATAR_FV_STATICANALYSIS = 365; public static final int ACT_AVATAR_EXECUTABLE_GENERATION = 340; + public static final int ACT_PATTERN_HANDLING = 565; // DSE public static final int ACT_GEN_MAPPING = 528; @@ -731,7 +732,7 @@ public class TGUIAction extends AbstractAction { - public static final int NB_ACTION = 565; // Last + 1 + public static final int NB_ACTION = 566; // Last + 1 private static final TAction [] actions = new TAction[NB_ACTION]; @@ -964,6 +965,7 @@ public class TGUIAction extends AbstractAction { IconManager.imgic96, IconManager.imgic96, "Mutual exclusion analysis with invariants", "Mutual exclusion analysis with invariants", '5'); actions[ACT_AVATAR_EXECUTABLE_GENERATION] = new TAction("avatar-executable-generation", "Code generation" , IconManager.imgic94, IconManager.imgic94, "Code generation", "Generation of C-POSIX executable code from AVATAR design under edition", '6'); + actions[ACT_PATTERN_HANDLING] = new TAction("pattern-handling", "Pattern Handling", IconManager.imgic88, IconManager.imgic88, "Pattern Handling", "Pattern Handling", '7'); actions[ACT_VIEW_JAVA] = new TAction("view-java", "Display Java code", IconManager.imgic38, IconManager.imgic39, "Display Java code", "Display the java code of the pointed component", 0); diff --git a/src/main/java/ui/tmlad/TMLADReadCAMS.java b/src/main/java/ui/tmlad/TMLADReadCAMS.java index 7beb88b006c3f3c4c53b5581271126bf48e0f604..e1f8d4fe2cda47818c78f79e9973130576abbfae 100755 --- a/src/main/java/ui/tmlad/TMLADReadCAMS.java +++ b/src/main/java/ui/tmlad/TMLADReadCAMS.java @@ -109,7 +109,7 @@ public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69 public int reachabilityInformation; - public boolean isEncForm = true; + // public boolean isEncForm = true; public TMLADReadCAMS(int _x, int _y, int _minX, int _maxX, int _minY, int _maxY, boolean _pos, TGComponent _father, TDiagramPanel _tdp) { super(_x, _y, _minX, _maxX, _minY, _maxY, _pos, _father, _tdp); @@ -200,9 +200,9 @@ public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69 if (!securityContext.equals("")) { c = g.getColor(); - if (!isEncForm){ + /* if (!isEncForm){ g.setColor(Color.RED); - } + } */ g.drawString("sec:" + securityContext, x + 3 * width / 4, y + height + textY1 - decSec); g.setColor(c); } @@ -307,14 +307,14 @@ public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69 tab1.help = help; TabInfo tab2 = new TabInfo("Security"); - labels = new String[3]; - values = new String[3]; + labels = new String[2]; + values = new String[2]; labels[0] = "Security Pattern"; values[0] = securityContext; labels[1] = "Attacker?"; values[1] = isAttacker ? "Yes" : "No"; - labels[2] = "Encrypted Form?"; - values[2] = isEncForm ? "Yes" : "No"; + // labels[2] = "Encrypted Form?"; + // values[2] = isEncForm ? "Yes" : "No"; help = new ArrayList<String[]>(); String[] choice = new String[]{"Yes", "No"}; help.add(tdp.getMGUI().getCurrentCryptoConfig()); @@ -323,7 +323,7 @@ public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69 tab2.labels=labels; tab2.values = values; tab2.help = help; - tab2.helpButtom = new String[]{null, "cryptographicconfiguration.html", "cryptographicconfiguration.html"}; + tab2.helpButtom = new String[]{null, "cryptographicconfiguration.html"}; List<TabInfo> tabs = new ArrayList<>(); tabs.add(tab1); @@ -340,7 +340,7 @@ public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69 nbOfSamples = jdmsat.getString(0, 1); securityContext = jdmsat.getString(1, 0); isAttacker = jdmsat.getString(1, 1).equals("Yes"); - isEncForm = jdmsat.getString(1, 2).equals("Yes"); + // isEncForm = jdmsat.getString(1, 2).equals("Yes"); makeValue(); return true; } @@ -364,8 +364,8 @@ public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69 sb.append(securityContext); sb.append("\" isAttacker=\""); sb.append(isAttacker ? "Yes" : "No"); - sb.append("\" isEncForm=\""); - sb.append(isEncForm ? "Yes" : "No"); + // sb.append("\" isEncForm=\""); + // sb.append(isEncForm ? "Yes" : "No"); sb.append("\" />\n"); sb.append("</extraparam>\n"); return new String(sb); @@ -392,12 +392,12 @@ public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69 nbOfSamples = elt.getAttribute("nbOfSamples"); securityContext = elt.getAttribute("secPattern"); isAttacker = elt.getAttribute("isAttacker").equals("Yes"); - isEncForm = elt.getAttribute("isEncForm").equals("Yes"); + /* isEncForm = elt.getAttribute("isEncForm").equals("Yes"); if (elt.getAttribute("isEncForm").equals("") || !elt.hasAttribute("isEncForm")){ if (!securityContext.equals("")){ isEncForm=true; } - } + } */ } } } @@ -437,13 +437,13 @@ public class TMLADReadCAMS extends TADComponentWithoutSubcomponents/* Issue #69 stateOfError = _stateAction; } - public boolean getEncForm(){ + /* public boolean getEncForm(){ return isEncForm; } public void setEncForm(boolean encForm){ isEncForm=encForm; - } + } */ public void setChannelName(String s) { diff --git a/src/main/java/ui/tmlad/TMLADReadChannel.java b/src/main/java/ui/tmlad/TMLADReadChannel.java index 3b36ef69251431ba8ffd3c25c9620dbfa98f5479..01486295204cddf71639122e1113fdb4f2dba915 100755 --- a/src/main/java/ui/tmlad/TMLADReadChannel.java +++ b/src/main/java/ui/tmlad/TMLADReadChannel.java @@ -114,7 +114,7 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue # public int reachabilityInformation; - public boolean isEncForm = true; + // public boolean isEncForm = true; private int securityMaxX; @@ -218,9 +218,9 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue # } if (!securityContext.equals("")) { c = g.getColor(); - if (!isEncForm) { + /* if (!isEncForm) { g.setColor(Color.RED); - } + } */ drawSingleString(g,"sec:" + securityContext, x + 3 * width / 4, y + height + textY1 - decSec); if (!tdp.isScaled()) { //TraceManager.addDev("Size of \"" + ("sec:" + securityContext) +"\": " + g.getFontMetrics().stringWidth("sec:" + @@ -421,14 +421,14 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue # tab1.help = help; TabInfo tab2 = new TabInfo("Security"); - labels = new String[3]; - values = new String[3]; + labels = new String[2]; + values = new String[2]; labels[0] = "Security Pattern"; values[0] = securityContext; labels[1] = "Attacker?"; values[1] = isAttacker ? "Yes" : "No"; - labels[2] = "Encrypted Form?"; - values[2] = isEncForm ? "Yes" : "No"; + // labels[2] = "Encrypted Form?"; + // values[2] = isEncForm ? "Yes" : "No"; help = new ArrayList<String[]>(); String[] choice = new String[]{"Yes", "No"}; help.add(tdp.getMGUI().getCurrentCryptoConfig()); @@ -437,7 +437,7 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue # tab2.labels=labels; tab2.values = values; tab2.help = help; - tab2.helpButtom = new String[]{null, "cryptographicconfiguration.html", "cryptographicconfiguration.html"}; + tab2.helpButtom = new String[]{null, "cryptographicconfiguration.html"}; List<TabInfo> tabs = new ArrayList<>(); tabs.add(tab1); @@ -454,7 +454,7 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue # nbOfSamples = jdmsat.getString(0, 1); securityContext = jdmsat.getString(1, 0); isAttacker = jdmsat.getString(1, 1).equals("Yes"); - isEncForm = jdmsat.getString(1, 2).equals("Yes"); + // isEncForm = jdmsat.getString(1, 2).equals("Yes"); makeValue(); return true; } @@ -478,8 +478,8 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue # sb.append(securityContext); sb.append("\" isAttacker=\""); sb.append(isAttacker ? "Yes" : "No"); - sb.append("\" isEncForm=\""); - sb.append(isEncForm ? "Yes" : "No"); + // sb.append("\" isEncForm=\""); + // sb.append(isEncForm ? "Yes" : "No"); sb.append("\" />\n"); sb.append("</extraparam>\n"); return new String(sb); @@ -506,12 +506,12 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue # nbOfSamples = elt.getAttribute("nbOfSamples"); securityContext = elt.getAttribute("secPattern"); isAttacker = elt.getAttribute("isAttacker").equals("Yes"); - isEncForm = elt.getAttribute("isEncForm").equals("Yes"); + /* isEncForm = elt.getAttribute("isEncForm").equals("Yes"); if (elt.getAttribute("isEncForm").equals("") || !elt.hasAttribute("isEncForm")) { if (!securityContext.equals("")) { isEncForm=true; } - } + } */ } } } @@ -536,6 +536,10 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue # return isAttacker; } + public void setIsAttacker(boolean _isAttacker) { + isAttacker = _isAttacker; + } + @Override public int getType() { return TGComponentManager.TMLAD_READ_CHANNEL; @@ -551,13 +555,13 @@ public class TMLADReadChannel extends TADComponentWithoutSubcomponents/* Issue # stateOfError = _stateAction; } - public boolean getEncForm() { + /* public boolean getEncForm() { return isEncForm; } public void setEncForm(boolean encForm) { isEncForm=encForm; - } + } */ public void setChannelName(String s) { diff --git a/src/main/java/ui/tmlad/TMLADWriteCAMS.java b/src/main/java/ui/tmlad/TMLADWriteCAMS.java index 7cbec8ee5121fbd93dc6a2a264193ab14f1077d3..738ed87b594b1c8db358531d228362aefa8b2890 100755 --- a/src/main/java/ui/tmlad/TMLADWriteCAMS.java +++ b/src/main/java/ui/tmlad/TMLADWriteCAMS.java @@ -109,7 +109,7 @@ public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69 public int reachabilityInformation; - public boolean isEncForm = true; + // public boolean isEncForm = true; public TMLADWriteCAMS(int _x, int _y, int _minX, int _maxX, int _minY, int _maxY, boolean _pos, TGComponent _father, TDiagramPanel _tdp) { super(_x, _y, _minX, _maxX, _minY, _maxY, _pos, _father, _tdp); @@ -195,9 +195,9 @@ public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69 g.drawString(value, x + (width - w) / 2, y + textY); if (!securityContext.equals("")) { c = g.getColor(); - if (!isEncForm){ + /* if (!isEncForm){ g.setColor(Color.RED); - } + } */ g.drawString("sec:" + securityContext, x + 3 * width / 4, y + height + textY - decSec); g.setColor(c); } @@ -328,14 +328,14 @@ public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69 tab1.help = help; TabInfo tab2 = new TabInfo("Security"); - labels = new String[3]; - values = new String[3]; + labels = new String[2]; + values = new String[2]; labels[0] = "Security Pattern"; values[0] = securityContext; labels[1] = "Attacker?"; values[1] = isAttacker ? "Yes" : "No"; - labels[2] = "Encrypted Form?"; - values[2] = isEncForm ? "Yes" : "No"; + // labels[2] = "Encrypted Form?"; + // values[2] = isEncForm ? "Yes" : "No"; help = new ArrayList<String[]>(); help.add(tdp.getMGUI().getCurrentCryptoConfig()); @@ -344,7 +344,7 @@ public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69 tab2.labels=labels; tab2.values = values; tab2.help = help; - tab2.helpButtom = new String[]{null, "cryptographicconfiguration.html", "cryptographicconfiguration.html"}; + tab2.helpButtom = new String[]{null, "cryptographicconfiguration.html"}; List<TabInfo> tabs = new ArrayList<>(); tabs.add(tab1); @@ -362,7 +362,7 @@ public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69 nbOfSamples = jdmsat.getString(0, 1); securityContext = jdmsat.getString(1, 0); isAttacker = jdmsat.getString(1, 1).equals("Yes"); - isEncForm = jdmsat.getString(1, 2).equals("Yes"); + // isEncForm = jdmsat.getString(1, 2).equals("Yes"); makeValue(); return true; @@ -382,8 +382,8 @@ public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69 sb.append(securityContext); sb.append("\" isAttacker=\""); sb.append(isAttacker ? "Yes" : "No"); - sb.append("\" isEncForm=\""); - sb.append(isEncForm ? "Yes" : "No"); + // sb.append("\" isEncForm=\""); + // sb.append(isEncForm ? "Yes" : "No"); sb.append("\" />\n"); sb.append("</extraparam>\n"); return new String(sb); @@ -411,12 +411,12 @@ public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69 nbOfSamples = elt.getAttribute("nbOfSamples"); securityContext = elt.getAttribute("secPattern"); isAttacker = elt.getAttribute("isAttacker").equals("Yes"); - isEncForm = elt.getAttribute("isEncForm").equals("Yes"); + /* isEncForm = elt.getAttribute("isEncForm").equals("Yes"); if (elt.getAttribute("isEncForm").equals("") || !elt.hasAttribute("isEncForm")){ if (!securityContext.equals("")){ isEncForm=true; } - } + } */ } } } @@ -465,14 +465,14 @@ public class TMLADWriteCAMS extends TADComponentWithoutSubcomponents/* Issue #69 return isAttacker; } - public boolean getEncForm(){ + /* public boolean getEncForm(){ return isEncForm; } public void setEncForm(boolean encForm){ isEncForm=encForm; - } + } */ @Override public void setStateAction(int _stateAction) { diff --git a/src/main/java/ui/tmlad/TMLADWriteChannel.java b/src/main/java/ui/tmlad/TMLADWriteChannel.java index 57d39853cccfb933f392a574570e797bf551e459..6c75be7719b8c26392a0074e34c5d18dd1368014 100755 --- a/src/main/java/ui/tmlad/TMLADWriteChannel.java +++ b/src/main/java/ui/tmlad/TMLADWriteChannel.java @@ -112,7 +112,7 @@ public class TMLADWriteChannel extends TADComponentWithoutSubcomponents/* Issue public final static int NOT_REACHABLE = 2; - public boolean isEncForm = true; + // public boolean isEncForm = true; private int securityMaxX; @@ -205,9 +205,9 @@ public class TMLADWriteChannel extends TADComponentWithoutSubcomponents/* Issue } if (!securityContext.equals("")) { c = g.getColor(); - if (!isEncForm){ + /* if (!isEncForm){ g.setColor(Color.RED); - } + } */ drawSingleString(g,"sec:" + securityContext, x + 3 * width / 4, y + height + textY - scale( 4 ) ); if (!tdp.isScaled()) { @@ -349,14 +349,14 @@ public class TMLADWriteChannel extends TADComponentWithoutSubcomponents/* Issue tab1.help = help; TabInfo tab2 = new TabInfo("Security"); - labels = new String[3]; - values = new String[3]; + labels = new String[2]; + values = new String[2]; labels[0] = "Security Pattern"; values[0] = securityContext; labels[1] = "Attacker?"; values[1] = isAttacker ? "Yes" : "No"; - labels[2] = "Encrypted Form?"; - values[2] = isEncForm ? "Yes" : "No"; + // labels[2] = "Encrypted Form?"; + // values[2] = isEncForm ? "Yes" : "No"; help = new ArrayList<String[]>(); help.add(tdp.getMGUI().getCurrentCryptoConfig()); @@ -365,7 +365,7 @@ public class TMLADWriteChannel extends TADComponentWithoutSubcomponents/* Issue tab2.labels=labels; tab2.values = values; tab2.help = help; - tab2.helpButtom = new String[]{null, "cryptographicconfiguration.html", "cryptographicconfiguration.html"}; + tab2.helpButtom = new String[]{null, "cryptographicconfiguration.html"}; List<TabInfo> tabs = new ArrayList<>(); tabs.add(tab1); @@ -383,7 +383,7 @@ public class TMLADWriteChannel extends TADComponentWithoutSubcomponents/* Issue nbOfSamples = jdmsat.getString(0, 1); securityContext = jdmsat.getString(1, 0); isAttacker = jdmsat.getString(1, 1).equals("Yes"); - isEncForm = jdmsat.getString(1, 2).equals("Yes"); + // isEncForm = jdmsat.getString(1, 2).equals("Yes"); makeValue(); return true; @@ -403,8 +403,8 @@ public class TMLADWriteChannel extends TADComponentWithoutSubcomponents/* Issue sb.append(securityContext); sb.append("\" isAttacker=\""); sb.append(isAttacker ? "Yes" : "No"); - sb.append("\" isEncForm=\""); - sb.append(isEncForm ? "Yes" : "No"); + // sb.append("\" isEncForm=\""); + // sb.append(isEncForm ? "Yes" : "No"); sb.append("\" />\n"); sb.append("</extraparam>\n"); return new String(sb); @@ -432,12 +432,12 @@ public class TMLADWriteChannel extends TADComponentWithoutSubcomponents/* Issue nbOfSamples = elt.getAttribute("nbOfSamples"); securityContext = elt.getAttribute("secPattern"); isAttacker = elt.getAttribute("isAttacker").equals("Yes"); - isEncForm = elt.getAttribute("isEncForm").equals("Yes"); + /* isEncForm = elt.getAttribute("isEncForm").equals("Yes"); if (elt.getAttribute("isEncForm").equals("") || !elt.hasAttribute("isEncForm")){ if (!securityContext.equals("")){ isEncForm=true; } - } + } */ } } } @@ -486,14 +486,18 @@ public class TMLADWriteChannel extends TADComponentWithoutSubcomponents/* Issue return isAttacker; } - public boolean getEncForm(){ + public void setIsAttacker(boolean _isAttacker) { + isAttacker = _isAttacker; + } + + /* public boolean getEncForm(){ return isEncForm; } public void setEncForm(boolean encForm){ isEncForm=encForm; - } + } */ @Override public void setStateAction(int _stateAction) { diff --git a/src/main/java/ui/tmldd/TMLArchiKey.java b/src/main/java/ui/tmldd/TMLArchiKey.java index 11e164b97fe9db7d9669ed0694746cc2b4d142f8..df0b12822cbd74551d1eb9b997a6559ac6144244 100755 --- a/src/main/java/ui/tmldd/TMLArchiKey.java +++ b/src/main/java/ui/tmldd/TMLArchiKey.java @@ -67,10 +67,11 @@ public class TMLArchiKey extends TGCWithoutInternalComponent implements Swallowe // protected int fileX = 20; // protected int fileY = 25; // protected int cran = 5; + private static final int SPACE = 6; private static final int KEY_OFFSET_Y = 5; - private static final int KEY_OFFSET_X = 20; + private static final int KEY_OFFSET_X = 15; - //protected String oldValue = ""; + protected String oldValue = ""; protected String referenceKey = "TMLKey"; protected String typeName = "key"; protected int priority = 5; // Between 0 and 10 @@ -132,32 +133,35 @@ public class TMLArchiKey extends TGCWithoutInternalComponent implements Swallowe protected void internalDrawing(Graphics g) { // Issue #31 -// if (oldValue.compareTo(value) != 0) { -// setValue(value, g); -// } - checkWidth( g ); + if (oldValue.compareTo(value) != 0) { + setValue(value, g); + } + + // Issue #31 + final int space = scale( SPACE ); + final int keyOffsetX = scale( KEY_OFFSET_X + SPACE); + final int keyOffsetY = scale( KEY_OFFSET_Y); + final int shaftWidth = scale( 3 ); + checkWidth( g ); + g.drawRect(x, y, width, height); Color c = g.getColor(); g.setColor(ColorManager.MEMORY_BOX_2); g.fillRect(x+1, y+1, width-1, height-1); g.setColor(c); - - // Issue #31 - final int keyOffsetX = scale( KEY_OFFSET_X ); - final int keyOffsetY = scale( KEY_OFFSET_Y ); - final int shaftWidth = scale( 3 ); // Key head - g.fillOval(x+width-keyOffsetX, y+keyOffsetY, height/3, height/3); + final int keyHeadDiameter = scale(13); + g.fillOval(x+width-keyOffsetX, y+keyOffsetY, keyHeadDiameter, keyHeadDiameter); // Key shaft - g.fillRect(x+width-keyOffsetY-keyOffsetX/2,y+keyOffsetY, shaftWidth/*3*/, height*3/4-keyOffsetY); + g.fillRect(x+width-keyOffsetX+space,y+keyOffsetY, shaftWidth/*3*/, height*3/4-keyOffsetY); // key teeth final int teethLength = scale( 8 ); - g.fillRect(x+width-keyOffsetY-keyOffsetX/2, y+height*3/4, teethLength/*8*/, shaftWidth/*3*/); - g.fillRect(x+width-keyOffsetY-keyOffsetX/2, y+height*2/3, teethLength/*8*/, shaftWidth/*3*/); + g.fillRect(x+width-keyOffsetX+space, y+height*3/4, teethLength/*8*/, shaftWidth/*3*/); + g.fillRect(x+width-keyOffsetX+space, y+height*2/3, teethLength/*8*/, shaftWidth/*3*/); /* //g.drawRoundRect(x, y, width, height, arc, arc); g.drawLine(x+width-space-fileX, y + space, x+width-space-fileX, y+space+fileY); @@ -181,18 +185,22 @@ public class TMLArchiKey extends TGCWithoutInternalComponent implements Swallowe } // Issue #31 - //private void setValue(String val/*, Graphics g*/) { -// oldValue = value; -// int w = fileX + g.getFontMetrics().stringWidth(value) + textX; -// int w1 = Math.max(minWidth, w); -// -// //TraceManager.addDev(" Width=" + width + " w1=" + w1 + " value=" + value); -// if (w1 != width) { -// width = w1; -// resizeWithFather(); -// } - //TraceManager.addDev(" Width=" + width + " w1=" + w1 + " value=" + value); -// } + public void setValue(String val, Graphics g) { + oldValue = val; + int w = g.getFontMetrics().stringWidth(val); + + // Issue #31 + final int keyOffsetX = scale( KEY_OFFSET_X + SPACE); + + int w1 = Math.max(minWidth, w + 2 * textX + keyOffsetX /*fileX + space*/); + + // + if (w1 != width) { + width = w1; + resizeWithFather(); + } + // + } @Override public void resizeWithFather() { diff --git a/src/main/java/ui/window/JDialogPatternHandling.java b/src/main/java/ui/window/JDialogPatternHandling.java new file mode 100644 index 0000000000000000000000000000000000000000..fa39890726f2cb642be67e7f11be892fb99f8c7e --- /dev/null +++ b/src/main/java/ui/window/JDialogPatternHandling.java @@ -0,0 +1,2400 @@ +/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + */ + +package ui.window; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dialog; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Vector; + +import javax.swing.ButtonGroup; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.ListSelectionModel; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +import launcher.LauncherException; +import launcher.RshClient; +import myutil.GraphicLib; +import myutil.MasterProcessInterface; +import myutil.TraceManager; +import tmltranslator.HwNode; +import tmltranslator.TMLArchitecture; +import tmltranslator.TMLChannel; +import tmltranslator.TMLEvent; +import tmltranslator.TMLModeling; +import tmltranslator.TMLRequest; +import tmltranslator.TMLTask; +import tmltranslator.patternhandling.AttributeTaskJsonFile; +import tmltranslator.patternhandling.MappingPatternChannel; +import tmltranslator.patternhandling.MappingPatternTask; +import tmltranslator.patternhandling.PatternChannelWithSecurity; +import tmltranslator.patternhandling.PatternCloneTask; +import tmltranslator.patternhandling.PatternConfiguration; +import tmltranslator.patternhandling.PatternConnection; +import tmltranslator.patternhandling.PatternCreation; +import tmltranslator.patternhandling.PatternPortsConfig; +import tmltranslator.patternhandling.PortTaskJsonFile; +import tmltranslator.patternhandling.TaskPattern; +import tmltranslator.patternhandling.TaskPorts; +import ui.*; +import ui.util.IconManager; + +/** + * Class JDialogPatternHandling + * Dialog for managing the generation of Patterns + * + * Creation: 16/08/2023 + * + * @author Jawher JERRAY + * @version 1.0 16/08/2023 + */ + +public class JDialogPatternHandling extends JDialog implements ActionListener, ListSelectionListener, MouseListener, Runnable, + MasterProcessInterface { + + private static final Insets WEST_INSETS = new Insets(0, 0, 0, 0); + + protected MainGUI mgui; + + protected final static int NOT_STARTED = 1; + protected final static int STARTED = 2; + protected final static int STOPPED = 3; + + private String pathPatterns; + + private int mode; + + // Pattern Creation + private String newPatternName; + private JTextField jFieldNewPatternName; + private JButton buttonAddAllTasksAsPattern, buttonAddSelectedTasksAsPattern, buttonRemoveAllTasksAsPattern, buttonRemoveSelectedTasksAsPattern; + private JList<String> jListNoSelectedTasksAsPattern, jListSelectedTasksAsPattern; + private Vector<String> selectedTasksAsPattern = new Vector<String>(); + private Vector<String> noSelectedTasksAsPattern = new Vector<String>(); + private Map<String, String> tasksFullName = new LinkedHashMap<String, String>(); + private JPanel jPanelPatternSelection; + + // Pattern Configuration + private Vector<String> listPatterns = new Vector<String>(); + private Vector<String> tasksOfPatternWithExternalPort = new Vector<String>(); + private Vector<String> externalPortsOfTaskInPattern = new Vector<String>(); + private Vector<String> tasksOfModel = new Vector<String>(); + private Vector<String> portsOfTaskInModel = new Vector<String>(); + private JComboBox<String> jComboBoxPatterns; + private JComboBox<String> jComboBoxPatternsTaskWithExternalPort; + private DefaultComboBoxModel<String> modelPatternsTaskWithExternalPort = new DefaultComboBoxModel<>(tasksOfPatternWithExternalPort); + private JComboBox<String> jComboBoxPatternExternalPortOfATask; + private DefaultComboBoxModel<String> modelPatternExternalPortOfATask = new DefaultComboBoxModel<>(externalPortsOfTaskInPattern); + private JComboBox<String> jComboBoxModelsTask; + private DefaultComboBoxModel<String> modelTask = new DefaultComboBoxModel<>(tasksOfModel); + private JComboBox<String> jComboBoxModelsPortOfTask; + private DefaultComboBoxModel<String> modelPortOfATask = new DefaultComboBoxModel<>(portsOfTaskInModel); + private JCheckBox jCheckBoxConnectToNewPort; + private JCheckBox jCheckBoxAddConfidentiality; + private JLabel jLabelAddAuthenticity; + private Vector<String> authenticityModes = new Vector<String>(Arrays.asList(PatternCreation.WITHOUT_AUTHENTICITY, PatternCreation.WEAK_AUTHENTICITY, PatternCreation.STRONG_AUTHENTICITY)); + private JComboBox<String> jComboBoxAddAuthenticity; + private JList<String> jListConnectedPorts; + private Vector<String> connectedPorts = new Vector<String>(); + private List<PatternConnection> patternConnectionList = new ArrayList<PatternConnection>(); + private JButton addConnectionBetweenSelectedPorts, removeConnectionBetweenPorts; + private JButton buttonCloneTask; + private Vector<String> portsConfig = new Vector<String>(); + private JComboBox<String> jComboBoxPortsConfig; + private DefaultComboBoxModel<String> modelPortsConfig = new DefaultComboBoxModel<>(portsConfig); + private ButtonGroup portsConfigGroup; + private JRadioButton jRadioPortConfigRemove, jRadioPortConfigMerge; + private Vector<String> portsConfigMerge = new Vector<String>(); + private DefaultComboBoxModel<String> modelPortsConfigMerge = new DefaultComboBoxModel<>(portsConfigMerge); + private JComboBox<String> jComboBoxPortsConfigMerge; + private JList<String> jListConfigPorts; + private Vector<String> configuredPorts = new Vector<String>(); + private List<PatternPortsConfig> configuredPortsList = new ArrayList<PatternPortsConfig>(); + private JButton addConfigPorts, removeConfigPorts; + private JButton buttonTasksMapInArch; + private JButton buttonChannelsMapInArch; + private JButton buttonUpdatePatternsAttributes; + + private Vector<String> tasksCanBeCloned = new Vector<String>(); + private DefaultComboBoxModel<String> modelTaskToClone = new DefaultComboBoxModel<>(tasksCanBeCloned); + private JComboBox<String> jComboBoxTaskToClone; + private String newClonedTaskName; + private JTextField jFieldNewClonedTaskName; + private JButton addClonedTask, removeClonedTask; + private JList<String> jListClonedTasks; + private Vector<String> clonedTasks = new Vector<String>(); + private List<PatternCloneTask> clonedTasksList = new ArrayList<PatternCloneTask>(); + + private ButtonGroup mapTaskGroup; + private JRadioButton jRadioMapTaskInExistingHw, jRadioMapTaskInNewHw; + private Vector<String> tasksToMap = new Vector<String>(); + private List<MappingPatternTask> tasksToMapList = new ArrayList<MappingPatternTask>(); + private Vector<String> tasksToMapInSameHw = new Vector<String>(); + private List<MappingPatternTask> tasksToMapInSameHwList = new ArrayList<MappingPatternTask>(); + private Vector<String> busToLinkNewHw = new Vector<String>(); + private DefaultComboBoxModel<String> modelTaskToMap = new DefaultComboBoxModel<>(tasksToMap); + private DefaultComboBoxModel<String> modelMapTaskInSameHwAs = new DefaultComboBoxModel<>(tasksToMapInSameHw); + private JComboBox<String> jComboBoxTaskToMap, jComboBoxMapTaskInSameHwAs, jComboBoxMapTaskInNewHw; + private JButton addMappedTask, removeMappedTask; + private JList<String> jListMappedTasks; + private Vector<String> mappedTasks = new Vector<String>(); + private List<MappingPatternTask> mappedTasksList = new ArrayList<MappingPatternTask>(); + + private ButtonGroup mapChannelGroup; + private JRadioButton jRadioMapChannelInExistingMem, jRadioMapChannelInNewMem; + private Vector<String> channelsToMap = new Vector<String>(); + private List<MappingPatternChannel> channelsToMapList = new ArrayList<MappingPatternChannel>(); + private Vector<String> channelsToMapInSameMem = new Vector<String>(); + private List<MappingPatternChannel> channelsToMapInSameMemList = new ArrayList<MappingPatternChannel>(); + private Vector<String> busToLinkNewMem = new Vector<String>(); + private DefaultComboBoxModel<String> modelChannelToMap = new DefaultComboBoxModel<>(channelsToMap); + private DefaultComboBoxModel<String> modelMapChannelInSameMemAs = new DefaultComboBoxModel<>(channelsToMapInSameMem); + private JComboBox<String> jComboBoxChannelToMap, jComboBoxMapChannelInSameMemAs, jComboBoxMapChannelInNewMem; + private JButton addMappedChannel, removeMappedChannel; + private JList<String> jListMappedChannels; + private Vector<String> mappedChannels = new Vector<String>(); + private List<MappingPatternChannel> mappedChannelsList = new ArrayList<MappingPatternChannel>(); + + private Vector<String> tasksToUpdateAttributes = new Vector<String>(); + private DefaultComboBoxModel<String> modelTasksToUpdateAttributes = new DefaultComboBoxModel<>(tasksToUpdateAttributes); + private JComboBox<String> jComboBoxTasksToUpdateAttributes; + private Vector<String> attributesOfTaskToUpdate = new Vector<String>(); + private DefaultComboBoxModel<String> modelAttributesOfTaskToUpdate = new DefaultComboBoxModel<>(attributesOfTaskToUpdate); + private JComboBox<String> jComboBoxAttributesOfTaskToUpdate; + private String newTaskAttibuteValue; + private JTextField jFieldNewTaskAttibuteValue; + private JButton buttonUpdateTaskAttributeValue; + + + //LinkedHashMap<String, List<AttributeTaskJsonFile>> patternTasksAttributes = new LinkedHashMap<String, List<AttributeTaskJsonFile>>(); + //LinkedHashMap<String, List<PortTaskJsonFile>> patternTasksExternalPorts = new LinkedHashMap<String, List<PortTaskJsonFile>>(); + //LinkedHashMap<String, List<PortTaskJsonFile>> patternTasksInternalPorts = new LinkedHashMap<String, List<PortTaskJsonFile>>(); + private LinkedHashMap<String, TaskPattern> patternTasksAll = new LinkedHashMap<String, TaskPattern>(); + private LinkedHashMap<String, TaskPattern> patternTasksNotConnected = new LinkedHashMap<String, TaskPattern>(); + private LinkedHashMap<String, TaskPorts> portsTaskOfModelAll = new LinkedHashMap<String, TaskPorts>(); + private LinkedHashMap<String, TaskPorts> portsTaskOfModelLeft = new LinkedHashMap<String, TaskPorts>(); + private List<PatternPortsConfig> portsTaskConfig = new ArrayList<PatternPortsConfig>(); + private LinkedHashMap<String, List<AttributeTaskJsonFile>> updatedPatternAttributes = new LinkedHashMap<String, List<AttributeTaskJsonFile>>(); + private List<PatternChannelWithSecurity> channelsWithSecurity = new ArrayList<PatternChannelWithSecurity>(); + + private List<String> busesOfModel = new ArrayList<String>(); + + // Pattern Integration + private Vector<String> listPatternsJson = new Vector<String>(); + private JComboBox<String> jComboBoxPatternsJson; + private String patternJsonPathValue; + private JTextField jFieldPatternJsonPath; + + //components + private JScrollPane jsp; + private JPanel jta; + private JButton startButton; + private JButton stop; + private JButton close; + private boolean go = false; + + private RshClient rshc; + private JTabbedPane jp1; + + /* + * Creates new form + */ + public JDialogPatternHandling(Frame f, MainGUI _mgui, String title, String _pathPatterns) { + super(f, title, Dialog.ModalityType.DOCUMENT_MODAL); + + mgui = _mgui; + this.pathPatterns = _pathPatterns; + + TMLModeling<?> tmlmNew = mgui.gtm.getTMLMapping().getTMLModeling(); + for (TMLTask task : tmlmNew.getTasks()) { + String[] taskNameSplit = task.getName().split("__"); + task.setName(taskNameSplit[taskNameSplit.length-1]); + } + for (TMLChannel ch : tmlmNew.getChannels()) { + String[] channelNameSplit = ch.getName().split("__"); + ch.setName(channelNameSplit[channelNameSplit.length-1]); + } + for (TMLEvent evt : tmlmNew.getEvents()) { + String[] eventNameSplit = evt.getName().split("__"); + evt.setName(eventNameSplit[eventNameSplit.length-1]); + } + for (TMLRequest req : tmlmNew.getRequests()) { + String[] requestNameSplit = req.getName().split("__"); + req.setName(requestNameSplit[requestNameSplit.length-1]); + } + + for (int i=0; i < mgui.gtm.getTMLMapping().getMappedTasks().size(); i++) { + String taskFullName = mgui.gtm.getTMLMapping().getMappedTasks().get(i).getName(); + String taskShortName = taskFullName.split("__")[taskFullName.split("__").length - 1]; + tasksFullName.put(taskShortName, taskFullName); + noSelectedTasksAsPattern.add(taskShortName); + } + listPatterns = getFoldersName(_pathPatterns); + listPatternsJson = getFoldersName(_pathPatterns); + portsTaskOfModelAll = TaskPorts.getListPortsTask(mgui.gtm.getTMLMapping().getTMLModeling()); + portsTaskOfModelLeft = TaskPorts.getListPortsTask(mgui.gtm.getTMLMapping().getTMLModeling()); + busesOfModel = getListBus(mgui.gtm.getTMLMapping().getArch()); + initComponents(); + myInitComponents(); + pack(); + } + + protected void myInitComponents() { + mode = NOT_STARTED; + setButtons(); + } + + List<String> getListBus(TMLArchitecture tmlarch) { + List<String> listBusName = new ArrayList<String>(); + for (HwNode bus : tmlarch.getBUSs()) { + listBusName.add(bus.getName()); + } + return listBusName; + } + + Vector<String> getFoldersName(String path) { + Vector<String> folders = new Vector<String>(); + File directoryPath = new File(path); + String[] directories = directoryPath.list((dir, name) -> new File(dir, name).isDirectory()); + if (directories != null) { + folders = new Vector<String>(Arrays.asList(directories)); + } + return folders; + } + + private GridBagConstraints createGbc(int y) { + GridBagConstraints gbc = new GridBagConstraints(); + gbc.gridx = 0; + gbc.gridy = y; + gbc.gridwidth = 1; + gbc.gridheight = 1; + + gbc.anchor = GridBagConstraints.WEST; + gbc.fill = GridBagConstraints.BOTH; + + gbc.insets = WEST_INSETS; + gbc.weightx = 1.0; + gbc.weighty = 1.0; + return gbc; + } + + protected void panelPatternCreation() { + JPanel jp01 = new JPanel(); + GridBagLayout gridbag01 = new GridBagLayout(); + GridBagConstraints c01 = new GridBagConstraints(); + jp01.setLayout(gridbag01); + jp01.setBorder(new javax.swing.border.TitledBorder("Pattern Creation")); + + c01.weighty = 1.0; + c01.weightx = 1.0; + c01.fill = GridBagConstraints.HORIZONTAL; + c01.gridheight = 1; + c01.gridwidth = 2; + + JLabel labelPatternName = new JLabel("Name of the new pattern: "); + jp01.add(labelPatternName, c01); + //addComponent(jp01, labelPatternName, 0, curY, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH); + c01.gridwidth = GridBagConstraints.REMAINDER; + jFieldNewPatternName = new JTextField(newPatternName, 10); + jFieldNewPatternName.setPreferredSize(new Dimension(10, 25)); + jp01.add(jFieldNewPatternName, c01); + //addComponent(jp01, jFieldNewPatternName, 1, curY, 3, GridBagConstraints.EAST, GridBagConstraints.BOTH); + c01.gridwidth = GridBagConstraints.REMAINDER; + jp01.add(new JLabel(" "), c01); + c01.gridwidth = GridBagConstraints.REMAINDER; + JLabel labelSelectPattern = new JLabel("Select tasks of the new Pattern: "); + jp01.add(labelSelectPattern, c01); + //addComponent(jp01, labelSelectPattern, 0, curY, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH); + jListNoSelectedTasksAsPattern = new JList<String>(noSelectedTasksAsPattern); + jPanelPatternSelection = new JPanel(); + jPanelPatternSelection.setPreferredSize(new Dimension(250, 200)); + GridBagConstraints c02 = new GridBagConstraints(); + c02.gridwidth = 1; + c02.gridheight = 1; + c02.fill= GridBagConstraints.BOTH; + jListNoSelectedTasksAsPattern.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + + jListNoSelectedTasksAsPattern.addListSelectionListener(this); + JScrollPane scrollPane1 = new JScrollPane(jListNoSelectedTasksAsPattern); + scrollPane1.setPreferredSize(new Dimension(250, 200)); + jPanelPatternSelection.add(scrollPane1, BorderLayout.WEST); + + JPanel buttonPanel = new JPanel(); + GridBagConstraints c13 = new GridBagConstraints(); + c13.gridwidth = GridBagConstraints.REMAINDER; + c13.gridheight = 1; + + buttonAddAllTasksAsPattern = new JButton(IconManager.imgic50); + buttonAddAllTasksAsPattern.setPreferredSize(new Dimension(50, 25)); + buttonAddAllTasksAsPattern.addActionListener(this); + buttonAddAllTasksAsPattern.setActionCommand("allTasksSelectedAsPattern"); + buttonPanel.add(buttonAddAllTasksAsPattern, c13); + //buttonAddAllTasksAsPattern.setEnabled(false); + + buttonAddSelectedTasksAsPattern = new JButton(IconManager.imgic48); + buttonAddSelectedTasksAsPattern.setPreferredSize(new Dimension(50, 25)); + buttonAddSelectedTasksAsPattern.addActionListener(this); + buttonAddSelectedTasksAsPattern.setActionCommand("addTaskAsPattern"); + buttonPanel.add(buttonAddSelectedTasksAsPattern, c13); + //buttonAddSelectedTasksAsPattern.setEnabled(false); + + buttonPanel.add(new JLabel(" "), c13); + + buttonRemoveSelectedTasksAsPattern = new JButton(IconManager.imgic46); + buttonRemoveSelectedTasksAsPattern.addActionListener(this); + buttonRemoveSelectedTasksAsPattern.setPreferredSize(new Dimension(50, 25)); + buttonRemoveSelectedTasksAsPattern.setActionCommand("removeTaskAsPattern"); + buttonPanel.add(buttonRemoveSelectedTasksAsPattern, c13); + //buttonRemoveSelectedTasksAsPattern.setEnabled(false); + + buttonRemoveAllTasksAsPattern = new JButton(IconManager.imgic44); + buttonRemoveAllTasksAsPattern.addActionListener(this); + buttonRemoveAllTasksAsPattern.setPreferredSize(new Dimension(50, 25)); + buttonRemoveAllTasksAsPattern.setActionCommand("allTasksNoSelectedAsPattern"); + buttonPanel.add(buttonRemoveAllTasksAsPattern, c13); + jPanelPatternSelection.add(buttonPanel, c02); + buttonPanel.setPreferredSize(new Dimension(50, 200)); + //buttonRemoveAllTasksAsPattern.setEnabled(false); + + jListSelectedTasksAsPattern = new JList<String>(selectedTasksAsPattern); + + jListSelectedTasksAsPattern.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + jListSelectedTasksAsPattern.addListSelectionListener(this); + JScrollPane scrollPane2 = new JScrollPane(jListSelectedTasksAsPattern); + scrollPane2.setPreferredSize(new Dimension(250, 200)); + jPanelPatternSelection.add(scrollPane2, BorderLayout.CENTER); + jPanelPatternSelection.setPreferredSize(new Dimension(600, 250)); + jPanelPatternSelection.setMinimumSize(new Dimension(600, 250)); + //c01.gridheight = 10; + jp01.add(jPanelPatternSelection, c01); + //c02.gridheight = 1; + + jp1.add("Pattern Creation", jp01); + } + + protected void panelPatternConfiguration() { + JPanel jp02 = new JPanel(); + GridBagLayout gridbag02 = new GridBagLayout(); + GridBagConstraints c02 = new GridBagConstraints(); + jp02.setLayout(gridbag02); + jp02.setBorder(new javax.swing.border.TitledBorder("Pattern Selection and Configuration")); + + c02.weighty = 1.0; + c02.weightx = 1.0; + c02.fill = GridBagConstraints.HORIZONTAL; + c02.anchor = GridBagConstraints.LINE_START; + c02.gridheight = 1; + c02.gridwidth = 1; + + JPanel jpPatternSelection = new JPanel(); + jpPatternSelection.setLayout(new GridBagLayout()); + GridBagConstraints cPatternSelection = new GridBagConstraints(); + cPatternSelection.gridx = 0; + cPatternSelection.gridy = 0; + cPatternSelection.fill = GridBagConstraints.HORIZONTAL; + cPatternSelection.anchor = GridBagConstraints.LINE_START; + cPatternSelection.weightx = 0.5; + + JLabel labelPatternName = new JLabel("Select a pattern: "); + jpPatternSelection.add(labelPatternName, cPatternSelection); + jComboBoxPatterns = new JComboBox<String>(listPatterns); + jComboBoxPatterns.setSelectedIndex(-1); + jComboBoxPatterns.addActionListener(this); + cPatternSelection.gridx = 1; + jpPatternSelection.add(jComboBoxPatterns, cPatternSelection); + jp02.add(jpPatternSelection, c02); + + JPanel jpPatternConnetionMain = new JPanel(); + jpPatternConnetionMain.setLayout(new GridBagLayout()); + GridBagConstraints cPatternConnetionMain = new GridBagConstraints(); + cPatternConnetionMain.gridx = 0; + cPatternConnetionMain.gridy = 0; + cPatternConnetionMain.fill = GridBagConstraints.HORIZONTAL; + cPatternConnetionMain.anchor = GridBagConstraints.LINE_START; + cPatternConnetionMain.weightx = 1.0; + jpPatternConnetionMain.add(new JLabel("Connect pattern's external ports:"), cPatternConnetionMain); + + + JPanel jpPatternConnetion = new JPanel(); + jpPatternConnetion.setLayout(new GridBagLayout()); + GridBagConstraints cPatternConnetion = new GridBagConstraints(); + cPatternConnetion.gridx = 0; + cPatternConnetion.gridy = 0; + cPatternConnetion.fill = GridBagConstraints.HORIZONTAL; + cPatternConnetion.anchor = GridBagConstraints.LINE_START; + jpPatternConnetion.add(new JLabel("Select an external port of the pattern:"), cPatternConnetion); + + + jComboBoxPatternsTaskWithExternalPort = new JComboBox<String>(modelPatternsTaskWithExternalPort); + jComboBoxPatternsTaskWithExternalPort.setSelectedIndex(-1); + jComboBoxPatternsTaskWithExternalPort.setEnabled(false); + jComboBoxPatternsTaskWithExternalPort.addActionListener(this); + cPatternConnetion.weightx = 0.4; + cPatternConnetion.gridy = 1; + jpPatternConnetion.add(jComboBoxPatternsTaskWithExternalPort, cPatternConnetion); + jComboBoxPatternExternalPortOfATask = new JComboBox<String>(modelPatternExternalPortOfATask); + jComboBoxPatternExternalPortOfATask.setSelectedIndex(-1); + jComboBoxPatternExternalPortOfATask.setEnabled(false); + jComboBoxPatternExternalPortOfATask.addActionListener(this); + cPatternConnetion.gridx = 1; + cPatternConnetion.weightx = 0.8; + jpPatternConnetion.add(jComboBoxPatternExternalPortOfATask, cPatternConnetion); + buttonCloneTask = new JButton("Clone Task"); + //buttonCloneTask.setPreferredSize(new Dimension(50, 25)); + buttonCloneTask.setEnabled(false); + buttonCloneTask.addActionListener(this); + buttonCloneTask.setActionCommand("cloneTask"); + cPatternConnetion.gridx = 2; + cPatternConnetion.weightx = 0; + jpPatternConnetion.add(buttonCloneTask, cPatternConnetion); + + jComboBoxModelsTask = new JComboBox<String>(modelTask); + jComboBoxModelsTask.setSelectedIndex(-1); + jComboBoxModelsTask.setEnabled(false); + jComboBoxModelsTask.addActionListener(this); + cPatternConnetion.gridx = 0; + cPatternConnetion.gridy = 2; + + jpPatternConnetion.add(new JLabel("Select a model port to connect with:"), cPatternConnetion); + cPatternConnetion.gridy = 3; + cPatternConnetion.weightx = 0.8; + jpPatternConnetion.add(jComboBoxModelsTask, cPatternConnetion); + + jComboBoxModelsPortOfTask = new JComboBox<String>(modelPortOfATask); + jComboBoxModelsPortOfTask.setSelectedIndex(-1); + jComboBoxModelsPortOfTask.setEnabled(false); + jComboBoxModelsPortOfTask.addActionListener(this); + cPatternConnetion.gridx = 1; + cPatternConnetion.weightx = 0.8; + jpPatternConnetion.add(jComboBoxModelsPortOfTask, cPatternConnetion); + jCheckBoxConnectToNewPort = new JCheckBox("Connect to new Port"); + jCheckBoxConnectToNewPort.setEnabled(false); + jCheckBoxConnectToNewPort.addActionListener(this); + cPatternConnetion.gridx = 2; + cPatternConnetion.weightx = 0; + jpPatternConnetion.add(jCheckBoxConnectToNewPort, cPatternConnetion); + + cPatternConnetion.gridy = 4; + cPatternConnetion.gridx = 0; + jCheckBoxAddConfidentiality = new JCheckBox("Add Confidentiality"); + jCheckBoxAddConfidentiality.setEnabled(false); + jCheckBoxAddConfidentiality.setVisible(false); + jCheckBoxAddConfidentiality.addActionListener(this); + jpPatternConnetion.add(jCheckBoxAddConfidentiality, cPatternConnetion); + cPatternConnetion.gridx = 1; + jLabelAddAuthenticity = new JLabel("Add Authenticity:"); + jLabelAddAuthenticity.setVisible(false); + jpPatternConnetion.add(jLabelAddAuthenticity, cPatternConnetion); + cPatternConnetion.gridx = 2; + jComboBoxAddAuthenticity = new JComboBox<String>(authenticityModes); + jComboBoxAddAuthenticity.setSelectedIndex(authenticityModes.indexOf(PatternCreation.WITHOUT_AUTHENTICITY)); + jComboBoxAddAuthenticity.setEnabled(false); + jComboBoxAddAuthenticity.setVisible(false); + jComboBoxAddAuthenticity.addActionListener(this); + jpPatternConnetion.add(jComboBoxAddAuthenticity, cPatternConnetion); + + cPatternConnetionMain.gridy = 1; + jpPatternConnetionMain.add(jpPatternConnetion, cPatternConnetionMain); + + + jListConnectedPorts = new JList<String>(connectedPorts); + JPanel jPanelPatternIntegration = new JPanel(); + jPanelPatternIntegration.setLayout(new GridBagLayout()); + GridBagConstraints cPatternIntegration = new GridBagConstraints(); + cPatternIntegration.gridx = 0; + cPatternIntegration.gridy = 0; + cPatternIntegration.weightx = 0.9; + cPatternIntegration.fill = GridBagConstraints.HORIZONTAL; + cPatternIntegration.anchor = GridBagConstraints.LINE_START; + + //jPanelPatternIntegration.setPreferredSize(new Dimension(600, 130)); + jListConnectedPorts.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + + jListConnectedPorts.addListSelectionListener(this); + JScrollPane scrollPaneConnectedPorts = new JScrollPane(jListConnectedPorts); + scrollPaneConnectedPorts.setPreferredSize(new Dimension(450, 125)); + jPanelPatternIntegration.add(scrollPaneConnectedPorts, cPatternIntegration); + + JPanel pannelButtonConnectPorts = new JPanel(); + pannelButtonConnectPorts.setLayout(new GridBagLayout()); + GridBagConstraints cConnectedPorts = new GridBagConstraints(); + cConnectedPorts.gridx = 0; + cConnectedPorts.weightx = 1.0; + cConnectedPorts.gridy = 0; + cConnectedPorts.fill = GridBagConstraints.HORIZONTAL; + cConnectedPorts.anchor = GridBagConstraints.LINE_START; + addConnectionBetweenSelectedPorts = new JButton("+"); + addConnectionBetweenSelectedPorts.setEnabled(false); + addConnectionBetweenSelectedPorts.setPreferredSize(new Dimension(50, 25)); + addConnectionBetweenSelectedPorts.addActionListener(this); + addConnectionBetweenSelectedPorts.setActionCommand("addConnectionBetweenSelectedPorts"); + pannelButtonConnectPorts.add(addConnectionBetweenSelectedPorts, cConnectedPorts); + + removeConnectionBetweenPorts = new JButton("-"); + removeConnectionBetweenPorts.setEnabled(false); + removeConnectionBetweenPorts.setPreferredSize(new Dimension(50, 25)); + removeConnectionBetweenPorts.addActionListener(this); + removeConnectionBetweenPorts.setActionCommand("removeConnectionBetweenPorts"); + cConnectedPorts.gridy = 1; + pannelButtonConnectPorts.add(removeConnectionBetweenPorts, cConnectedPorts); + //pannelButtonConnectPorts.setPreferredSize(new Dimension(50, 125)); + //jPanelPatternIntegration.setMinimumSize(new Dimension(600, 130)); + cPatternIntegration.gridx = 1; + cPatternIntegration.weightx = 0.1; + jPanelPatternIntegration.add(pannelButtonConnectPorts, cPatternIntegration); + cPatternConnetionMain.gridy = 2; + jpPatternConnetionMain.add(jPanelPatternIntegration, cPatternConnetionMain); + //c02.gridwidth = GridBagConstraints.REMAINDER; + c02.gridy = 1; + c02.insets = new Insets(10,0,0,0); + jp02.add(jpPatternConnetionMain, c02); + + JPanel jpPortConfigurationMain = new JPanel(); + jpPortConfigurationMain.setLayout(new GridBagLayout()); + GridBagConstraints cPortConfigurationMain = new GridBagConstraints(); + cPortConfigurationMain.gridx = 0; + cPortConfigurationMain.gridy = 0; + cPortConfigurationMain.gridwidth = 2; + cPortConfigurationMain.anchor = GridBagConstraints.LINE_START; + //cPortConfigurationMain.fill= GridBagConstraints.BOTH; + + jpPortConfigurationMain.add(new JLabel("Ports to configure:"), cPortConfigurationMain); + //cPortConfigurationMain.gridwidth = GridBagConstraints.REMAINDER; + JPanel jpPortConfiguration = new JPanel(); + jpPortConfiguration.setLayout(new GridBagLayout()); + GridBagConstraints cPortConfiguration = new GridBagConstraints(); + cPortConfiguration.gridx = 0; + cPortConfiguration.gridy = 0; + cPortConfiguration.gridwidth = 2; + cPortConfiguration.fill = GridBagConstraints.HORIZONTAL; + cPortConfiguration.anchor = GridBagConstraints.LINE_START; + + jComboBoxPortsConfig = new JComboBox<String>(modelPortsConfig); + jComboBoxPortsConfig.setSelectedIndex(-1); + jComboBoxPortsConfig.setEnabled(false); + jComboBoxPortsConfig.addActionListener(this); + jpPortConfiguration.add(jComboBoxPortsConfig, cPortConfiguration); + //cPortConfiguration.gridwidth = GridBagConstraints.REMAINDER; + portsConfigGroup =new ButtonGroup(); + jRadioPortConfigRemove = new JRadioButton("Remove port"); + jRadioPortConfigRemove.setEnabled(false); + jRadioPortConfigRemove.addActionListener(this); + cPortConfiguration.gridy = 1; + jpPortConfiguration.add(jRadioPortConfigRemove, cPortConfiguration); + + jRadioPortConfigMerge = new JRadioButton("Merge with:"); + jRadioPortConfigMerge.setEnabled(false); + jRadioPortConfigMerge.addActionListener(this); + cPortConfiguration.gridy = 2; + cPortConfiguration.gridwidth = 1; + jpPortConfiguration.add(jRadioPortConfigMerge, cPortConfiguration); + //cPortConfiguration.gridwidth = GridBagConstraints.REMAINDER; + portsConfigGroup.add(jRadioPortConfigRemove); + portsConfigGroup.add(jRadioPortConfigMerge); + jComboBoxPortsConfigMerge = new JComboBox<String>(modelPortsConfigMerge); + jComboBoxPortsConfigMerge.setSelectedIndex(-1); + jComboBoxPortsConfigMerge.setEnabled(false); + jComboBoxPortsConfigMerge.addActionListener(this); + jComboBoxPortsConfigMerge.setPreferredSize(new Dimension(200, 25)); + cPortConfiguration.gridx = 1; + cPortConfiguration.weightx = 1.0; + jpPortConfiguration.add(jComboBoxPortsConfigMerge, cPortConfiguration); + + cPortConfigurationMain.gridx = 0; + cPortConfigurationMain.gridy = 1; + cPortConfigurationMain.weightx = 0.6; + cPortConfigurationMain.gridwidth = 1; + //cPortConfigurationMain.ipady = 100; + //cPortConfigurationMain.fill = GridBagConstraints.BOTH; + cPortConfigurationMain.anchor = GridBagConstraints.FIRST_LINE_START; + //jpPortConfiguration.setBackground(Color.gray); + cPortConfigurationMain.insets = new Insets(5,0,0,0); //top padding + jpPortConfigurationMain.add(jpPortConfiguration, cPortConfigurationMain); + //cPortConfigurationMain.gridwidth = GridBagConstraints.REMAINDER; + + jListConfigPorts = new JList<String>(configuredPorts); + JPanel jPanelConfigPorts = new JPanel(new GridBagLayout()); + jPanelConfigPorts.setLayout(new GridBagLayout()); + GridBagConstraints cConfigPorts = new GridBagConstraints(); + //jPanelConfigPorts.setPreferredSize(new Dimension(200, 100)); + jListConfigPorts.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + + jListConfigPorts.addListSelectionListener(this); + JScrollPane scrollPaneConfigPorts = new JScrollPane(jListConfigPorts); + //scrollPaneConfigPorts.setPreferredSize(new Dimension(200, 100)); + cConfigPorts.gridx = 0; + cConfigPorts.gridy = 0; + cConfigPorts.fill = GridBagConstraints.HORIZONTAL; + jPanelConfigPorts.add(scrollPaneConfigPorts, cConfigPorts); + + JPanel pannelButtonConfigPorts = new JPanel(); + pannelButtonConfigPorts.setLayout(new GridBagLayout()); + GridBagConstraints cButtonConfigPorts = new GridBagConstraints(); + cButtonConfigPorts.gridx = 0; + cButtonConfigPorts.gridy = 0; + addConfigPorts = new JButton("+"); + addConfigPorts.setEnabled(false); + addConfigPorts.setPreferredSize(new Dimension(50, 25)); + addConfigPorts.addActionListener(this); + addConfigPorts.setActionCommand("addConfigPorts"); + pannelButtonConfigPorts.add(addConfigPorts, cButtonConfigPorts); + + removeConfigPorts = new JButton("-"); + removeConfigPorts.setEnabled(false); + removeConfigPorts.setPreferredSize(new Dimension(50, 25)); + removeConfigPorts.addActionListener(this); + removeConfigPorts.setActionCommand("removeConfigPorts"); + cButtonConfigPorts.gridx = 1; + pannelButtonConfigPorts.add(removeConfigPorts, cButtonConfigPorts); + //pannelButtonConfigPorts.setPreferredSize(new Dimension(200, 30)); + //jPanelConfigPorts.setMinimumSize(new Dimension(220, 110)); + cConfigPorts.gridy = 1; + jPanelConfigPorts.add(pannelButtonConfigPorts, cConfigPorts); + + cPortConfigurationMain.gridx = 1; + cPortConfigurationMain.gridy = 1; + cPortConfigurationMain.weightx = 0.4; + cPortConfigurationMain.fill = GridBagConstraints.HORIZONTAL; + cPortConfigurationMain.anchor = GridBagConstraints.FIRST_LINE_START; + //jPanelConfigPorts.setBackground(Color.red); + jpPortConfigurationMain.add(jPanelConfigPorts, cPortConfigurationMain); + c02.gridy = 2; + jp02.add(jpPortConfigurationMain, c02); + //c02.gridwidth = GridBagConstraints.REMAINDER; + + JPanel jpOptions = new JPanel(); + jpOptions.setLayout(new GridBagLayout()); + GridBagConstraints cOptions = new GridBagConstraints(); + cOptions.gridx = 0; + cOptions.gridy = 0; + cOptions.fill = GridBagConstraints.HORIZONTAL; + cOptions.anchor = GridBagConstraints.FIRST_LINE_START; + cOptions.weightx = 1.0; + cOptions.gridwidth = 3; + jpOptions.add(new JLabel("Options:"), cOptions); + + + buttonTasksMapInArch = new JButton("Map pattern tasks"); + buttonTasksMapInArch.setEnabled(false); + buttonTasksMapInArch.addActionListener(this); + buttonTasksMapInArch.setActionCommand("mapTasksManuallyInArchitecture"); + cOptions.gridy = 1; + cOptions.gridwidth = 1; + //cOptions.weightx = 0.3; + cOptions.fill = GridBagConstraints.NONE; + jpOptions.add(buttonTasksMapInArch, cOptions); + + buttonChannelsMapInArch = new JButton("Map pattern channels"); + buttonChannelsMapInArch.setEnabled(false); + buttonChannelsMapInArch.addActionListener(this); + buttonChannelsMapInArch.setActionCommand("mapChannelsManuallyInArchitecture"); + cOptions.gridx = 1; + jpOptions.add(buttonChannelsMapInArch, cOptions); + + buttonUpdatePatternsAttributes = new JButton("Update Pattern's Attributes values"); + buttonUpdatePatternsAttributes.setEnabled(false); + buttonUpdatePatternsAttributes.addActionListener(this); + buttonUpdatePatternsAttributes.setActionCommand("updatePatternsAttributes"); + cOptions.gridx = 2; + jpOptions.add(buttonUpdatePatternsAttributes, cOptions); + + c02.gridy = 3; + jp02.add(jpOptions, c02); + + jp1.add("Pattern Selection and Configuration", jp02); + } + + protected void panelPatternIntegration() { + JPanel jp02 = new JPanel(); + GridBagLayout gridbag02 = new GridBagLayout(); + GridBagConstraints c02 = new GridBagConstraints(); + jp02.setLayout(gridbag02); + jp02.setBorder(new javax.swing.border.TitledBorder("Pattern Integration")); + + c02.weighty = 1.0; + c02.weightx = 1.0; + c02.fill = GridBagConstraints.HORIZONTAL; + c02.anchor = GridBagConstraints.LINE_START; + c02.gridheight = 1; + c02.gridwidth = 1; + + JPanel jpPatternSelection = new JPanel(); + jpPatternSelection.setLayout(new GridBagLayout()); + GridBagConstraints cPatternSelection = new GridBagConstraints(); + cPatternSelection.gridx = 0; + cPatternSelection.gridy = 0; + cPatternSelection.fill = GridBagConstraints.HORIZONTAL; + cPatternSelection.anchor = GridBagConstraints.LINE_START; + cPatternSelection.weightx = 0.5; + + JLabel labelPatternName = new JLabel("Select a pattern: "); + jpPatternSelection.add(labelPatternName, cPatternSelection); + + jComboBoxPatternsJson = new JComboBox<String>(listPatternsJson); + jComboBoxPatternsJson.setSelectedIndex(-1); + jComboBoxPatternsJson.addActionListener(this); + cPatternSelection.gridx = 1; + jpPatternSelection.add(jComboBoxPatternsJson, cPatternSelection); + + cPatternSelection.gridy = 1; + cPatternSelection.gridx = 0; + jpPatternSelection.add(new JLabel("Path To Json File :"), cPatternSelection); + + + jFieldPatternJsonPath = new JTextField(patternJsonPathValue, 10); + jFieldPatternJsonPath.setEnabled(false); + jFieldPatternJsonPath.setPreferredSize(new Dimension(10, 25)); + jFieldPatternJsonPath.addActionListener(this); + cPatternSelection.gridx = 1; + jpPatternSelection.add(jFieldPatternJsonPath, cPatternSelection); + jp02.add(jpPatternSelection, c02); + + jp1.add("Pattern Integration", jp02); + } + + protected void initComponents() { + + jp1 = GraphicLib.createTabbedPane(); + Container c = getContentPane(); + setFont(new Font("Helvetica", Font.PLAIN, 14)); + c.setLayout(new BorderLayout()); + + jta = new JPanel(); + jta.setLayout(new GridBagLayout()); + jta.setBorder(new javax.swing.border.TitledBorder("Results")); + Font f = new Font("Courrier", Font.BOLD, 12); + jta.setFont(f); + + jsp = new JScrollPane(jta, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jsp.setPreferredSize(new Dimension(300, 100)); + c.add(jsp, BorderLayout.CENTER); + + startButton = new JButton("Start", IconManager.imgic53); + stop = new JButton("Stop", IconManager.imgic55); + close = new JButton("Close", IconManager.imgic27); + + startButton.setPreferredSize(new Dimension(100, 30)); + stop.setPreferredSize(new Dimension(100, 30)); + close.setPreferredSize(new Dimension(120, 30)); + + startButton.addActionListener(this); + stop.addActionListener(this); + close.addActionListener(this); + + JPanel jp2 = new JPanel(); + jp2.add(startButton); + jp2.add(stop); + jp2.add(close); + + panelPatternCreation(); + panelPatternConfiguration(); + panelPatternIntegration(); + + c.add(jp1, BorderLayout.NORTH); + c.add(jp2, BorderLayout.SOUTH); + } + + private void removeTaskAsPattern() { + int[] list = jListSelectedTasksAsPattern.getSelectedIndices(); + Vector<String> v = new Vector<String>(); + String o; + for (int i = 0; i < list.length; i++) { + o = selectedTasksAsPattern.elementAt(list[i]); + noSelectedTasksAsPattern.addElement(o); + v.addElement(o); + } + + selectedTasksAsPattern.removeAll(v); + jListNoSelectedTasksAsPattern.setListData(noSelectedTasksAsPattern); + jListSelectedTasksAsPattern.setListData(selectedTasksAsPattern); + setButtons(); + } + + private void addTaskAsPattern() { + int[] list = jListNoSelectedTasksAsPattern.getSelectedIndices(); + Vector<String> v = new Vector<String>(); + String o; + + for (int i = 0; i < list.length; i++) { + o = noSelectedTasksAsPattern.elementAt(list[i]); + selectedTasksAsPattern.addElement(o); + v.addElement(o); + } + noSelectedTasksAsPattern.removeAll(v); + jListNoSelectedTasksAsPattern.setListData(noSelectedTasksAsPattern); + jListSelectedTasksAsPattern.setListData(selectedTasksAsPattern); + setButtons(); + } + + private void allTasksSelectedAsPattern() { + selectedTasksAsPattern.addAll(noSelectedTasksAsPattern); + noSelectedTasksAsPattern.removeAllElements(); + jListNoSelectedTasksAsPattern.setListData(noSelectedTasksAsPattern); + jListSelectedTasksAsPattern.setListData(selectedTasksAsPattern); + setButtons(); + } + + private void allTasksNoSelectedAsPattern() { + noSelectedTasksAsPattern.addAll(selectedTasksAsPattern); + selectedTasksAsPattern.removeAllElements(); + jListNoSelectedTasksAsPattern.setListData(noSelectedTasksAsPattern); + jListSelectedTasksAsPattern.setListData(selectedTasksAsPattern); + setButtons(); + } + + private void mapTasksManuallyInArchitecture() { + JDialog mapTasksInArchDialog = new JDialog(this.getOwner(), "Map manually tasks of the pattern in the architecture", Dialog.ModalityType.DOCUMENT_MODAL); + Container contMapTasksInArch = mapTasksInArchDialog.getContentPane(); + contMapTasksInArch.setLayout(new BorderLayout()); + JPanel jpMapTasksInArch = new JPanel(); + jpMapTasksInArch.setLayout(new GridBagLayout()); + GridBagConstraints cMapTasksInArch = new GridBagConstraints(); + cMapTasksInArch.gridx = 0; + cMapTasksInArch.gridy = 0; + cMapTasksInArch.fill = GridBagConstraints.HORIZONTAL; + cMapTasksInArch.anchor = GridBagConstraints.FIRST_LINE_START; + cMapTasksInArch.weightx = 0.0; + cMapTasksInArch.insets = new Insets(10,0,0,0); //top padding + jpMapTasksInArch.add(new JLabel("Select a Task to map:"), cMapTasksInArch); + + jComboBoxTaskToMap = new JComboBox<String>(modelTaskToMap); + jComboBoxTaskToMap.setSelectedIndex(-1); + //jComboBoxTaskToMap.setEnabled(false); + jComboBoxTaskToMap.addActionListener(this); + //jComboBoxPortsConfigMerge.setPreferredSize(new Dimension(150, 25)); + cMapTasksInArch.gridx = 1; + cMapTasksInArch.weightx = 1.0; + jpMapTasksInArch.add(jComboBoxTaskToMap, cMapTasksInArch); + cMapTasksInArch.gridx = 0; + cMapTasksInArch.gridy = 1; + cMapTasksInArch.weightx = 0.0; + + mapTaskGroup =new ButtonGroup(); + jRadioMapTaskInExistingHw = new JRadioButton("Map in the same HW as : "); + jRadioMapTaskInExistingHw.setEnabled(false); + jRadioMapTaskInExistingHw.addActionListener(this); + jpMapTasksInArch.add(jRadioMapTaskInExistingHw, cMapTasksInArch); + cMapTasksInArch.gridx = 1; + cMapTasksInArch.weightx = 1.0; + jComboBoxMapTaskInSameHwAs = new JComboBox<String>(modelMapTaskInSameHwAs); + jComboBoxMapTaskInSameHwAs.setSelectedIndex(-1); + jComboBoxMapTaskInSameHwAs.setEnabled(false); + jComboBoxMapTaskInSameHwAs.addActionListener(this); + jpMapTasksInArch.add(jComboBoxMapTaskInSameHwAs, cMapTasksInArch); + + cMapTasksInArch.gridy = 2; + cMapTasksInArch.gridx = 0; + cMapTasksInArch.weightx = 0.0; + jRadioMapTaskInNewHw = new JRadioButton("Map in a new HW that will be linked to bus :"); + jRadioMapTaskInNewHw.setEnabled(false); + jRadioMapTaskInNewHw.addActionListener(this); + jpMapTasksInArch.add(jRadioMapTaskInNewHw, cMapTasksInArch); + cMapTasksInArch.gridx = 1; + cMapTasksInArch.weightx = 1.0; + busToLinkNewHw = new Vector<String>(busesOfModel) ; + jComboBoxMapTaskInNewHw = new JComboBox<String>(busToLinkNewHw); + jComboBoxMapTaskInNewHw.setSelectedIndex(-1); + jComboBoxMapTaskInNewHw.setEnabled(false); + jComboBoxMapTaskInNewHw.addActionListener(this); + jpMapTasksInArch.add(jComboBoxMapTaskInNewHw, cMapTasksInArch); + mapTaskGroup.add(jRadioMapTaskInExistingHw); + mapTaskGroup.add(jRadioMapTaskInNewHw); + + + jListMappedTasks = new JList<String>(mappedTasks); + JPanel jPanelMappedTasks = new JPanel(); + jPanelMappedTasks.setLayout(new GridBagLayout()); + GridBagConstraints cMappedTasks = new GridBagConstraints(); + cMappedTasks.gridx = 0; + cMappedTasks.gridy = 0; + cMappedTasks.weightx = 0.95; + cMappedTasks.fill = GridBagConstraints.HORIZONTAL; + cMappedTasks.anchor = GridBagConstraints.LINE_START; + + jListMappedTasks.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + jListMappedTasks.addListSelectionListener(this); + JScrollPane scrollPaneMappedTasks = new JScrollPane(jListMappedTasks); + scrollPaneMappedTasks.setPreferredSize(new Dimension(250, 175)); + jPanelMappedTasks.add(scrollPaneMappedTasks, cMappedTasks); + + JPanel pannelButtonMappedTasks = new JPanel(); + pannelButtonMappedTasks.setLayout(new GridBagLayout()); + GridBagConstraints cButtonMappedTasks = new GridBagConstraints(); + cButtonMappedTasks.gridx = 0; + cButtonMappedTasks.weightx = 1.0; + cButtonMappedTasks.gridy = 0; + cButtonMappedTasks.fill = GridBagConstraints.HORIZONTAL; + cButtonMappedTasks.anchor = GridBagConstraints.LINE_START; + addMappedTask = new JButton("+"); + addMappedTask.setEnabled(false); + addMappedTask.setPreferredSize(new Dimension(40, 25)); + addMappedTask.addActionListener(this); + addMappedTask.setActionCommand("addMappedTask"); + pannelButtonMappedTasks.add(addMappedTask, cButtonMappedTasks); + + removeMappedTask = new JButton("-"); + //removeMappedTask.setEnabled(false); + removeMappedTask.setPreferredSize(new Dimension(40, 25)); + removeMappedTask.addActionListener(this); + removeMappedTask.setActionCommand("removeMappedTask"); + cButtonMappedTasks.gridy = 1; + pannelButtonMappedTasks.add(removeMappedTask, cButtonMappedTasks); + + cMappedTasks.gridx = 1; + cMappedTasks.weightx = 0.05; + jPanelMappedTasks.add(pannelButtonMappedTasks, cMappedTasks); + cMapTasksInArch.gridy = 3; + cMapTasksInArch.gridx = 0; + cMapTasksInArch.gridwidth = 2; + jpMapTasksInArch.add(jPanelMappedTasks, cMapTasksInArch); + contMapTasksInArch.add(jpMapTasksInArch, BorderLayout.NORTH); + GraphicLib.centerOnParent(mapTasksInArchDialog, 500, 400); + mapTasksInArchDialog.setVisible(true); + } + + private void mapChannelsManuallyInArchitecture() { + JDialog mapChannelsInArchDialog = new JDialog(this.getOwner(), "Map manually channels of the pattern in the architecture", Dialog.ModalityType.DOCUMENT_MODAL); + Container contMapChannelsInArch = mapChannelsInArchDialog.getContentPane(); + contMapChannelsInArch.setLayout(new BorderLayout()); + JPanel jpMapChannelsInArch = new JPanel(); + jpMapChannelsInArch.setLayout(new GridBagLayout()); + GridBagConstraints cMapChannelsInArch = new GridBagConstraints(); + cMapChannelsInArch.gridx = 0; + cMapChannelsInArch.gridy = 0; + cMapChannelsInArch.fill = GridBagConstraints.HORIZONTAL; + cMapChannelsInArch.anchor = GridBagConstraints.FIRST_LINE_START; + cMapChannelsInArch.weightx = 0.0; + cMapChannelsInArch.insets = new Insets(10,0,0,0); //top padding + jpMapChannelsInArch.add(new JLabel("Select a Channel to map:"), cMapChannelsInArch); + + jComboBoxChannelToMap = new JComboBox<String>(modelChannelToMap); + jComboBoxChannelToMap.setSelectedIndex(-1); + //jComboBoxChannelToMap.setEnabled(false); + jComboBoxChannelToMap.addActionListener(this); + //jComboBoxPortsConfigMerge.setPreferredSize(new Dimension(150, 25)); + cMapChannelsInArch.gridx = 1; + cMapChannelsInArch.weightx = 1.0; + jpMapChannelsInArch.add(jComboBoxChannelToMap, cMapChannelsInArch); + cMapChannelsInArch.gridx = 0; + cMapChannelsInArch.gridy = 1; + cMapChannelsInArch.weightx = 0.0; + + mapChannelGroup =new ButtonGroup(); + jRadioMapChannelInExistingMem = new JRadioButton("Map in the same Memory as : "); + jRadioMapChannelInExistingMem.setEnabled(false); + jRadioMapChannelInExistingMem.addActionListener(this); + jpMapChannelsInArch.add(jRadioMapChannelInExistingMem, cMapChannelsInArch); + cMapChannelsInArch.gridx = 1; + cMapChannelsInArch.weightx = 1.0; + jComboBoxMapChannelInSameMemAs = new JComboBox<String>(modelMapChannelInSameMemAs); + jComboBoxMapChannelInSameMemAs.setSelectedIndex(-1); + jComboBoxMapChannelInSameMemAs.setEnabled(false); + jComboBoxMapChannelInSameMemAs.addActionListener(this); + jpMapChannelsInArch.add(jComboBoxMapChannelInSameMemAs, cMapChannelsInArch); + + cMapChannelsInArch.gridy = 2; + cMapChannelsInArch.gridx = 0; + cMapChannelsInArch.weightx = 0.0; + jRadioMapChannelInNewMem = new JRadioButton("Map in a new Memory that will be linked to bus :"); + jRadioMapChannelInNewMem.setEnabled(false); + jRadioMapChannelInNewMem.addActionListener(this); + jpMapChannelsInArch.add(jRadioMapChannelInNewMem, cMapChannelsInArch); + cMapChannelsInArch.gridx = 1; + cMapChannelsInArch.weightx = 1.0; + busToLinkNewMem = new Vector<String>(busesOfModel) ; + jComboBoxMapChannelInNewMem = new JComboBox<String>(busToLinkNewMem); + jComboBoxMapChannelInNewMem.setSelectedIndex(-1); + jComboBoxMapChannelInNewMem.setEnabled(false); + jComboBoxMapChannelInNewMem.addActionListener(this); + jpMapChannelsInArch.add(jComboBoxMapChannelInNewMem, cMapChannelsInArch); + mapChannelGroup.add(jRadioMapChannelInExistingMem); + mapChannelGroup.add(jRadioMapChannelInNewMem); + + + jListMappedChannels = new JList<String>(mappedChannels); + JPanel jPanelMappedChannels = new JPanel(); + jPanelMappedChannels.setLayout(new GridBagLayout()); + GridBagConstraints cMappedChannels = new GridBagConstraints(); + cMappedChannels.gridx = 0; + cMappedChannels.gridy = 0; + cMappedChannels.weightx = 0.95; + cMappedChannels.fill = GridBagConstraints.HORIZONTAL; + cMappedChannels.anchor = GridBagConstraints.LINE_START; + + jListMappedChannels.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + jListMappedChannels.addListSelectionListener(this); + JScrollPane scrollPaneMappedChannels = new JScrollPane(jListMappedChannels); + scrollPaneMappedChannels.setPreferredSize(new Dimension(250, 175)); + jPanelMappedChannels.add(scrollPaneMappedChannels, cMappedChannels); + + JPanel pannelButtonMappedChannels = new JPanel(); + pannelButtonMappedChannels.setLayout(new GridBagLayout()); + GridBagConstraints cButtonMappedChannels = new GridBagConstraints(); + cButtonMappedChannels.gridx = 0; + cButtonMappedChannels.weightx = 1.0; + cButtonMappedChannels.gridy = 0; + cButtonMappedChannels.fill = GridBagConstraints.HORIZONTAL; + cButtonMappedChannels.anchor = GridBagConstraints.LINE_START; + addMappedChannel = new JButton("+"); + addMappedChannel.setEnabled(false); + addMappedChannel.setPreferredSize(new Dimension(40, 25)); + addMappedChannel.addActionListener(this); + addMappedChannel.setActionCommand("addMappedChannel"); + pannelButtonMappedChannels.add(addMappedChannel, cButtonMappedChannels); + + removeMappedChannel = new JButton("-"); + //removeMappedChannel.setEnabled(false); + removeMappedChannel.setPreferredSize(new Dimension(40, 25)); + removeMappedChannel.addActionListener(this); + removeMappedChannel.setActionCommand("removeMappedChannel"); + cButtonMappedChannels.gridy = 1; + pannelButtonMappedChannels.add(removeMappedChannel, cButtonMappedChannels); + + cMappedChannels.gridx = 1; + cMappedChannels.weightx = 0.05; + jPanelMappedChannels.add(pannelButtonMappedChannels, cMappedChannels); + cMapChannelsInArch.gridy = 3; + cMapChannelsInArch.gridx = 0; + cMapChannelsInArch.gridwidth = 2; + jpMapChannelsInArch.add(jPanelMappedChannels, cMapChannelsInArch); + contMapChannelsInArch.add(jpMapChannelsInArch, BorderLayout.NORTH); + GraphicLib.centerOnParent(mapChannelsInArchDialog, 500, 400); + mapChannelsInArchDialog.setVisible(true); + } + + private void cloneTask() { + JDialog cloneTaskDialog = new JDialog(this.getOwner(), "Clone a Task", Dialog.ModalityType.DOCUMENT_MODAL); + Container contCloneTask = cloneTaskDialog.getContentPane(); + contCloneTask.setLayout(new BorderLayout()); + JPanel jpCloneTask = new JPanel(); + jpCloneTask.setLayout(new GridBagLayout()); + GridBagConstraints cCloneTask = new GridBagConstraints(); + cCloneTask.gridx = 0; + cCloneTask.gridy = 0; + cCloneTask.fill = GridBagConstraints.HORIZONTAL; + cCloneTask.anchor = GridBagConstraints.FIRST_LINE_START; + cCloneTask.weightx = 1.0; + cCloneTask.insets = new Insets(10,0,0,0); //top padding + jpCloneTask.add(new JLabel("Select a Task to clone:"), cCloneTask); + + tasksCanBeCloned.removeAllElements(); + for (String s : portsTaskOfModelAll.keySet()) { + tasksCanBeCloned.add(s); + } + jComboBoxTaskToClone = new JComboBox<String>(modelTaskToClone); + jComboBoxTaskToClone.setSelectedIndex(-1); + //jComboBoxTaskToClone.setEnabled(false); + jComboBoxTaskToClone.addActionListener(this); + //jComboBoxPortsConfigMerge.setPreferredSize(new Dimension(150, 25)); + cCloneTask.gridx = 1; + jpCloneTask.add(jComboBoxTaskToClone, cCloneTask); + cCloneTask.gridx = 0; + cCloneTask.gridy = 1; + jpCloneTask.add(new JLabel("Cloned task name:"), cCloneTask); + jFieldNewClonedTaskName = new JTextField(newClonedTaskName, 10); + jFieldNewClonedTaskName.setEnabled(false); + jFieldNewClonedTaskName.setPreferredSize(new Dimension(10, 25)); + cCloneTask.gridx = 1; + jpCloneTask.add(jFieldNewClonedTaskName, cCloneTask); + + jListClonedTasks = new JList<String>(clonedTasks); + JPanel jPanelClonedTasks = new JPanel(); + jPanelClonedTasks.setLayout(new GridBagLayout()); + GridBagConstraints cClonedTasks = new GridBagConstraints(); + cClonedTasks.gridx = 0; + cClonedTasks.gridy = 0; + cClonedTasks.weightx = 0.95; + cClonedTasks.fill = GridBagConstraints.HORIZONTAL; + cClonedTasks.anchor = GridBagConstraints.LINE_START; + + jListClonedTasks.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + jListClonedTasks.addListSelectionListener(this); + JScrollPane scrollPaneClonedTasks = new JScrollPane(jListClonedTasks); + scrollPaneClonedTasks.setPreferredSize(new Dimension(250, 150)); + jPanelClonedTasks.add(scrollPaneClonedTasks, cClonedTasks); + + JPanel pannelButtonClonedTasks = new JPanel(); + pannelButtonClonedTasks.setLayout(new GridBagLayout()); + GridBagConstraints cButtonClonedTasks = new GridBagConstraints(); + cButtonClonedTasks.gridx = 0; + cButtonClonedTasks.weightx = 1.0; + cButtonClonedTasks.gridy = 0; + cButtonClonedTasks.fill = GridBagConstraints.HORIZONTAL; + cButtonClonedTasks.anchor = GridBagConstraints.LINE_START; + addClonedTask = new JButton("+"); + addClonedTask.setEnabled(false); + addClonedTask.setPreferredSize(new Dimension(40, 25)); + addClonedTask.addActionListener(this); + addClonedTask.setActionCommand("addClonedTask"); + pannelButtonClonedTasks.add(addClonedTask, cButtonClonedTasks); + + removeClonedTask = new JButton("-"); + //removeClonedTask.setEnabled(false); + removeClonedTask.setPreferredSize(new Dimension(40, 25)); + removeClonedTask.addActionListener(this); + removeClonedTask.setActionCommand("removeClonedTask"); + cButtonClonedTasks.gridy = 1; + pannelButtonClonedTasks.add(removeClonedTask, cButtonClonedTasks); + + cClonedTasks.gridx = 1; + cClonedTasks.weightx = 0.05; + jPanelClonedTasks.add(pannelButtonClonedTasks, cClonedTasks); + cCloneTask.gridy = 2; + cCloneTask.gridx = 0; + cCloneTask.gridwidth = 2; + jpCloneTask.add(jPanelClonedTasks, cCloneTask); + contCloneTask.add(jpCloneTask, BorderLayout.NORTH); + GraphicLib.centerOnParent(cloneTaskDialog, 470, 350); + cloneTaskDialog.setVisible(true); + } + + private void updatePatternsAttributes() { + JDialog updatePatternsAttributesDialog = new JDialog(this.getOwner(), "Update Pattern's Attributes Values", Dialog.ModalityType.DOCUMENT_MODAL); + Container contUpdatePatternsAttributes = updatePatternsAttributesDialog.getContentPane(); + contUpdatePatternsAttributes.setLayout(new BorderLayout()); + JPanel jpUpdatePatternsAttributes = new JPanel(); + jpUpdatePatternsAttributes.setLayout(new GridBagLayout()); + GridBagConstraints cUpdatePatternsAttributes = new GridBagConstraints(); + cUpdatePatternsAttributes.gridx = 0; + cUpdatePatternsAttributes.gridy = 0; + cUpdatePatternsAttributes.fill = GridBagConstraints.HORIZONTAL; + cUpdatePatternsAttributes.anchor = GridBagConstraints.FIRST_LINE_START; + cUpdatePatternsAttributes.weightx = 1.0; + cUpdatePatternsAttributes.insets = new Insets(10,0,0,0); //top padding + jpUpdatePatternsAttributes.add(new JLabel("Select a Task to update its attributes:"), cUpdatePatternsAttributes); + + tasksToUpdateAttributes.removeAllElements(); + for (String s : patternTasksAll.keySet()) { + tasksToUpdateAttributes.add(s); + } + jComboBoxTasksToUpdateAttributes = new JComboBox<String>(modelTasksToUpdateAttributes); + jComboBoxTasksToUpdateAttributes.setSelectedIndex(-1); + //jComboBoxTasksToUpdateAttributes.setEnabled(false); + jComboBoxTasksToUpdateAttributes.addActionListener(this); + cUpdatePatternsAttributes.gridx = 1; + jpUpdatePatternsAttributes.add(jComboBoxTasksToUpdateAttributes, cUpdatePatternsAttributes); + + cUpdatePatternsAttributes.gridx = 0; + cUpdatePatternsAttributes.gridy = 1; + jpUpdatePatternsAttributes.add(new JLabel("Select an attribute to update:"), cUpdatePatternsAttributes); + attributesOfTaskToUpdate.removeAllElements(); + jComboBoxAttributesOfTaskToUpdate = new JComboBox<String>(modelAttributesOfTaskToUpdate); + jComboBoxAttributesOfTaskToUpdate.setSelectedIndex(-1); + jComboBoxAttributesOfTaskToUpdate.setEnabled(false); + jComboBoxAttributesOfTaskToUpdate.addActionListener(this); + cUpdatePatternsAttributes.gridx = 1; + jpUpdatePatternsAttributes.add(jComboBoxAttributesOfTaskToUpdate, cUpdatePatternsAttributes); + + cUpdatePatternsAttributes.gridx = 0; + cUpdatePatternsAttributes.gridy = 2; + jpUpdatePatternsAttributes.add(new JLabel("New Value:"), cUpdatePatternsAttributes); + jFieldNewTaskAttibuteValue = new JTextField(newTaskAttibuteValue, 10); + jFieldNewTaskAttibuteValue.setEnabled(false); + jFieldNewTaskAttibuteValue.setPreferredSize(new Dimension(10, 25)); + jFieldNewTaskAttibuteValue.addActionListener(this); + cUpdatePatternsAttributes.gridx = 1; + jpUpdatePatternsAttributes.add(jFieldNewTaskAttibuteValue, cUpdatePatternsAttributes); + + JPanel pannelButtonUpdatePatternsAttributesValues = new JPanel(); + pannelButtonUpdatePatternsAttributesValues.setLayout(new GridBagLayout()); + GridBagConstraints cButtonUpdatePatternsAttributesValues = new GridBagConstraints(); + cButtonUpdatePatternsAttributesValues.gridx = 0; + cButtonUpdatePatternsAttributesValues.weightx = 1.0; + cButtonUpdatePatternsAttributesValues.gridy = 0; + cButtonUpdatePatternsAttributesValues.fill = GridBagConstraints.HORIZONTAL; + cButtonUpdatePatternsAttributesValues.anchor = GridBagConstraints.LINE_START; + buttonUpdateTaskAttributeValue = new JButton("Update"); + buttonUpdateTaskAttributeValue.setEnabled(false); + buttonUpdateTaskAttributeValue.setPreferredSize(new Dimension(100, 50)); + buttonUpdateTaskAttributeValue.addActionListener(this); + buttonUpdateTaskAttributeValue.setActionCommand("updateTaskAttributeValue"); + pannelButtonUpdatePatternsAttributesValues.add(buttonUpdateTaskAttributeValue, cButtonUpdatePatternsAttributesValues); + + cUpdatePatternsAttributes.gridy = 3; + cUpdatePatternsAttributes.gridx = 0; + cUpdatePatternsAttributes.gridwidth = 2; + cUpdatePatternsAttributes.fill = GridBagConstraints.NONE; + cUpdatePatternsAttributes.anchor = GridBagConstraints.CENTER; + jpUpdatePatternsAttributes.add(pannelButtonUpdatePatternsAttributesValues, cUpdatePatternsAttributes); + contUpdatePatternsAttributes.add(jpUpdatePatternsAttributes, BorderLayout.NORTH); + GraphicLib.centerOnParent(updatePatternsAttributesDialog, 470, 350); + updatePatternsAttributesDialog.setVisible(true); + } + + private void updateTaskAttributeValue() { + String selectedTaskToUpdateAttributes = jComboBoxTasksToUpdateAttributes.getSelectedItem().toString(); + String selectedAttributeToUpdate = jComboBoxAttributesOfTaskToUpdate.getSelectedItem().toString(); + String newValueAttribute = jFieldNewTaskAttibuteValue.getText(); + if (newValueAttribute.matches("-?\\d+") || newValueAttribute.matches("(?i)^(true|false)")) { + for (AttributeTaskJsonFile attributeTaskJsonFile : patternTasksAll.get(selectedTaskToUpdateAttributes).getAttributes()) { + if (attributeTaskJsonFile.getName().equals(selectedAttributeToUpdate)) { + attributeTaskJsonFile.setValue(newValueAttribute); + jFieldNewTaskAttibuteValue.setText(attributeTaskJsonFile.getValue()); + if (updatedPatternAttributes.containsKey(selectedTaskToUpdateAttributes)) { + boolean attributeExist = false; + for (AttributeTaskJsonFile attribUpdate : updatedPatternAttributes.get(selectedTaskToUpdateAttributes)) { + if (attribUpdate.getName().equals(selectedAttributeToUpdate)) { + attribUpdate.setValue(newValueAttribute); + attributeExist = true; + } + } + if (!attributeExist) { + AttributeTaskJsonFile attrib = new AttributeTaskJsonFile(selectedAttributeToUpdate, attributeTaskJsonFile.getType(), newValueAttribute); + updatedPatternAttributes.get(selectedTaskToUpdateAttributes).add(attrib); + } + } else { + List<AttributeTaskJsonFile> listAttrib = new ArrayList<AttributeTaskJsonFile>(); + AttributeTaskJsonFile attrib = new AttributeTaskJsonFile(selectedAttributeToUpdate, attributeTaskJsonFile.getType(), newValueAttribute); + listAttrib.add(attrib); + updatedPatternAttributes.put(selectedTaskToUpdateAttributes, listAttrib); + } + + } + } + } + } + + private void addConnectionBetweenSelectedPorts() { + String patternTaskName = jComboBoxPatternsTaskWithExternalPort.getSelectedItem().toString(); + String patternTaskPortName = jComboBoxPatternExternalPortOfATask.getSelectedItem().toString(); + String modelTaskName = jComboBoxModelsTask.getSelectedItem().toString(); + String modelTaskPortName = jComboBoxModelsPortOfTask.getSelectedItem().toString(); + Boolean isNewPort = jCheckBoxConnectToNewPort.isSelected(); + PatternConnection patternConnection = new PatternConnection(patternTaskName, patternTaskPortName, modelTaskName, modelTaskPortName, isNewPort); + + connectedPorts.add(patternConnection.getStringDisplay()); + if (!isNewPort) { + TaskPorts pt = portsTaskOfModelLeft.get(modelTaskName); + if (pt.getWriteChannels().contains(modelTaskPortName)) { + pt.getWriteChannels().remove(modelTaskPortName); + } else if (pt.getReadChannels().contains(modelTaskPortName)) { + pt.getReadChannels().remove(modelTaskPortName); + } else if (pt.getSendEvents().contains(modelTaskPortName)) { + pt.getSendEvents().remove(modelTaskPortName); + } else if (pt.getWaitEvents().contains(modelTaskPortName)) { + pt.getWaitEvents().remove(modelTaskPortName); + } + } + TaskPattern tp = patternTasksNotConnected.get(patternTaskName); + int indexElemToRemove = -1; + for (int i = 0; i < tp.getExternalPorts().size(); i++){ + if (tp.getExternalPorts().get(i).getName().equals(patternTaskPortName)) { + indexElemToRemove = i; + break; + } + } + if (indexElemToRemove >= 0) { + tp.getExternalPorts().remove(indexElemToRemove); + } + if (tp.getExternalPorts().size() == 0) { + patternTasksNotConnected.remove(patternTaskName); + tasksOfPatternWithExternalPort.removeAllElements(); + for (String pTaskName : patternTasksNotConnected.keySet()) { + if (patternTasksNotConnected.get(pTaskName).getExternalPorts().size() > 0) { + tasksOfPatternWithExternalPort.add(pTaskName); + } + } + } + + for (PortTaskJsonFile portTaskJsonFile : patternTasksAll.get(patternTaskName).getExternalPorts()) { + if (portTaskJsonFile.getName().equals(patternTaskPortName)) { + if (portTaskJsonFile.getType().equals(PatternCreation.CHANNEL)) { + if (jCheckBoxAddConfidentiality.isSelected()) { + portTaskJsonFile.setConfidentiality(PatternCreation.WITH_CONFIDENTIALITY); + } else { + portTaskJsonFile.setConfidentiality(PatternCreation.WITHOUT_CONFIDENTIALITY); + } + portTaskJsonFile.setAuthenticity(jComboBoxAddAuthenticity.getSelectedItem().toString()); + break; + } + } + } + + patternConnectionList.add(patternConnection); + + /*if (jCheckBoxAddConfidentiality.isSelected() || (jComboBoxAddAuthenticity.getSelectedIndex() >= 0 && !jComboBoxAddAuthenticity.getSelectedItem().toString().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase()))) { + if (channelsWithSecurity.containsKey(patternTaskName)) { + boolean channelWithSecToUpdate = false; + for (PortTaskJsonFile pt : channelsWithSecurity.get(patternTaskName)) { + if (pt.getName().equals(patternTaskPortName)) { + if (jCheckBoxAddConfidentiality.isSelected()) { + pt.setConfidentiality(PatternCreation.WITH_CONFIDENTIALITY); + } + if (jComboBoxAddAuthenticity.getSelectedIndex() >= 0 && !jComboBoxAddAuthenticity.getSelectedItem().toString().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase())) { + pt.setAuthenticity(jComboBoxAddAuthenticity.getSelectedItem().toString()); + } + channelWithSecToUpdate = true; + break; + } + } + if (!channelWithSecToUpdate) { + for (PortTaskJsonFile portTaskJsonFile : patternTasksAll.get(patternTaskName).getExternalPorts()) { + if (portTaskJsonFile.getName().equals(patternTaskPortName)) { + if (jCheckBoxAddConfidentiality.isSelected()) { + portTaskJsonFile.setConfidentiality(PatternCreation.WITH_CONFIDENTIALITY); + } + if (jComboBoxAddAuthenticity.getSelectedIndex() >= 0 && !jComboBoxAddAuthenticity.getSelectedItem().toString().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase())) { + portTaskJsonFile.setAuthenticity(jComboBoxAddAuthenticity.getSelectedItem().toString()); + } + channelsWithSecurity.get(patternTaskName).add(portTaskJsonFile); + break; + } + } + } + } else { + List<PortTaskJsonFile> channelWithSecInfo = new ArrayList<PortTaskJsonFile>(); + for (PortTaskJsonFile portTaskJsonFile : patternTasksAll.get(patternTaskName).getExternalPorts()) { + if (portTaskJsonFile.getName().equals(patternTaskPortName)) { + if (jCheckBoxAddConfidentiality.isSelected()) { + portTaskJsonFile.setConfidentiality(PatternCreation.WITH_CONFIDENTIALITY); + } + if (jComboBoxAddAuthenticity.getSelectedIndex() >= 0 && !jComboBoxAddAuthenticity.getSelectedItem().toString().toUpperCase().equals(PatternCreation.WITHOUT_AUTHENTICITY.toUpperCase())) { + portTaskJsonFile.setAuthenticity(jComboBoxAddAuthenticity.getSelectedItem().toString()); + } + channelWithSecInfo.add(portTaskJsonFile); + channelsWithSecurity.put(patternTaskName, channelWithSecInfo); + break; + } + } + } + }*/ + + jComboBoxPatternsTaskWithExternalPort.setSelectedIndex(-1); + jCheckBoxConnectToNewPort.setSelected(false); + jListConnectedPorts.setListData(connectedPorts); + setButtons(); + } + + private void removeConnectionBetweenPorts() { + int[] list = jListConnectedPorts.getSelectedIndices(); + List<PatternConnection> patternConnectionsToRemove = new ArrayList<PatternConnection>(); + for (int i = 0; i < list.length; i++) { + PatternConnection patternConnection = patternConnectionList.get(list[i]); + String patternTaskName = patternConnection.getPatternTaskName(); + String patternTaskPortName = patternConnection.getPatternChannel(); + String modelTaskName = patternConnection.getModelTaskName(); + String modelTaskPortName = patternConnection.getModelChannelName(); + for (String patternTask : patternTasksAll.keySet()) { + for (PortTaskJsonFile portTaskJsonFile : patternTasksAll.get(patternTask).getExternalPorts()) { + if (portTaskJsonFile.getName().equals(patternTaskPortName)) { + if (patternTasksNotConnected.containsKey(patternTaskName)) { + TaskPattern tp = patternTasksNotConnected.get(patternTaskName); + tp.getExternalPorts().add(portTaskJsonFile); + } else { + List<PortTaskJsonFile> portTaskJsonFilesList = new ArrayList<PortTaskJsonFile>(Arrays.asList(portTaskJsonFile)); + TaskPattern tp = new TaskPattern(patternTasksAll.get(patternTask).getAttributes(), patternTasksAll.get(patternTask).getInternalPorts(), portTaskJsonFilesList); + patternTasksNotConnected.put(patternTaskName, tp); + tasksOfPatternWithExternalPort.removeAllElements(); + for (String pTaskName : patternTasksNotConnected.keySet()) { + if (patternTasksNotConnected.get(pTaskName).getExternalPorts().size() > 0) { + tasksOfPatternWithExternalPort.add(pTaskName); + } + } + } + break; + } + } + } + if (!patternConnection.isNewPort()) { + TaskPorts pt = portsTaskOfModelLeft.get(modelTaskName); + TaskPorts ptAll = portsTaskOfModelAll.get(modelTaskName); + if (ptAll.getWriteChannels().contains(modelTaskPortName)) { + pt.getWriteChannels().add(modelTaskPortName); + } else if (ptAll.getReadChannels().contains(modelTaskPortName)) { + pt.getReadChannels().add(modelTaskPortName); + } else if (ptAll.getSendEvents().contains(modelTaskPortName)) { + pt.getSendEvents().add(modelTaskPortName); + } else if (ptAll.getWaitEvents().contains(modelTaskPortName)) { + pt.getWaitEvents().add(modelTaskPortName); + } + } + connectedPorts.remove(list[i]); + patternConnectionsToRemove.add(patternConnection); + jComboBoxPatternsTaskWithExternalPort.setSelectedIndex(-1); + jCheckBoxConnectToNewPort.setSelected(false); + } + patternConnectionList.removeAll(patternConnectionsToRemove); + jListConnectedPorts.setListData(connectedPorts); + setButtons(); + } + + private void addClonedTask() { + String selectedTaskToClone = jComboBoxTaskToClone.getSelectedItem().toString(); + String nameNewTaskToClone = jFieldNewClonedTaskName.getText(); + + if (!tasksCanBeCloned.contains(nameNewTaskToClone) && !tasksOfModel.contains(nameNewTaskToClone) && !nameNewTaskToClone.contains(" ")) { + PatternCloneTask patternCloneTask = new PatternCloneTask(nameNewTaskToClone, selectedTaskToClone); + clonedTasks.add(patternCloneTask.getStringDisplay()); + clonedTasksList.add(patternCloneTask); + List<String> wcs = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getWriteChannels()); + List<String> rcs = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getReadChannels()); + List<String> ses = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getSendEvents()); + List<String> wes = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getWaitEvents()); + + List<String> wcs1 = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getWriteChannels()); + List<String> rcs1 = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getReadChannels()); + List<String> ses1 = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getSendEvents()); + List<String> wes1 = new ArrayList<String>(portsTaskOfModelAll.get(selectedTaskToClone).getWaitEvents()); + + TaskPorts portTasksClone = new TaskPorts(wcs, rcs, ses, wes); + TaskPorts portTasksClone1 = new TaskPorts(wcs1, rcs1, ses1, wes1); + portsTaskOfModelLeft.put(nameNewTaskToClone, portTasksClone); + portsTaskOfModelAll.put(nameNewTaskToClone, portTasksClone1); + } + tasksOfModel.removeAllElements(); + for (String pTaskName : portsTaskOfModelLeft.keySet()) { + tasksOfModel.add(pTaskName); + } + jListClonedTasks.setListData(clonedTasks); + setButtons(); + } + + private void removeClonedTask() { + int[] list = jListClonedTasks.getSelectedIndices(); + List<PatternCloneTask> patternCloneTasksToRemove = new ArrayList<PatternCloneTask>(); + for (int i = 0; i < list.length; i++) { + PatternCloneTask patternCloneTask = clonedTasksList.get(list[i]); + patternCloneTasksToRemove.add(patternCloneTask); + portsTaskOfModelLeft.remove(patternCloneTask.getClonedTask()); + portsTaskOfModelAll.remove(patternCloneTask.getClonedTask()); + List<PatternConnection> patternConnectionsToRemove = new ArrayList<PatternConnection>(); + for (PatternConnection pConnection : patternConnectionList) { + String patternTaskName = pConnection.getPatternTaskName(); + String patternTaskPortName = pConnection.getPatternChannel(); + String modelTaskName = pConnection.getModelTaskName(); + + if (modelTaskName.equals(patternCloneTask.getClonedTask())) { + for (String patternTask : patternTasksAll.keySet()) { + for (PortTaskJsonFile portTaskJsonFile : patternTasksAll.get(patternTask).getExternalPorts()) { + if (portTaskJsonFile.getName().equals(patternTaskPortName)) { + if (patternTasksNotConnected.containsKey(patternTaskName)) { + TaskPattern tp = patternTasksNotConnected.get(patternTaskName); + tp.getExternalPorts().add(portTaskJsonFile); + } else { + List<PortTaskJsonFile> portTaskJsonFilesList = new ArrayList<PortTaskJsonFile>(Arrays.asList(portTaskJsonFile)); + TaskPattern tp = new TaskPattern(patternTasksAll.get(patternTask).getAttributes(), patternTasksAll.get(patternTask).getInternalPorts(), portTaskJsonFilesList); + patternTasksNotConnected.put(patternTaskName, tp); + tasksOfPatternWithExternalPort.removeAllElements(); + for (String pTaskName : patternTasksNotConnected.keySet()) { + if (patternTasksNotConnected.get(pTaskName).getExternalPorts().size() > 0) { + tasksOfPatternWithExternalPort.add(pTaskName); + } + } + } + break; + } + } + } + connectedPorts.remove(pConnection.getStringDisplay()); + patternConnectionsToRemove.add(pConnection); + } + } + clonedTasks.remove(list[i]); + patternConnectionList.removeAll(patternConnectionsToRemove); + jListConnectedPorts.setListData(connectedPorts); + } + clonedTasksList.removeAll(patternCloneTasksToRemove); + + tasksOfModel.removeAllElements(); + for (String pTaskName : portsTaskOfModelLeft.keySet()) { + tasksOfModel.add(pTaskName); + } + jListClonedTasks.setListData(clonedTasks); + setButtons(); + } + + private void addConfigPorts() { + String selectedTaskToConfig = jComboBoxPortsConfig.getSelectedItem().toString(); + String[] taskAndChannelSelected = PatternPortsConfig.seperateTaskAndChannel(selectedTaskToConfig); + PatternPortsConfig patternPortConfig = new PatternPortsConfig(taskAndChannelSelected[0], taskAndChannelSelected[1]); + if (jRadioPortConfigRemove.isSelected()) { + patternPortConfig.setIsChannelToRemove(true); + } else if (jRadioPortConfigMerge.isSelected()) { + patternPortConfig.setMergeWith(jComboBoxPortsConfigMerge.getSelectedItem().toString()); + } + configuredPorts.add(patternPortConfig.getStringDisplay()); + configuredPortsList.add(patternPortConfig); + portsConfig.remove(selectedTaskToConfig); + jComboBoxPortsConfig.setSelectedIndex(-1); + jListConfigPorts.setListData(configuredPorts); + setButtons(); + } + + private void removeConfigPorts() { + int[] list = jListConfigPorts.getSelectedIndices(); + List<PatternPortsConfig> patternPortsConfigToRemove = new ArrayList<PatternPortsConfig>(); + for (int i = 0; i < list.length; i++) { + PatternPortsConfig patternPortConfigToRemove = configuredPortsList.get(list[i]); + portsConfig.add(patternPortConfigToRemove.getTaskChannelToConfig()); + configuredPorts.remove(list[i]); + patternPortsConfigToRemove.add(patternPortConfigToRemove); + } + configuredPortsList.removeAll(patternPortsConfigToRemove); + jListConfigPorts.setListData(configuredPorts); + jComboBoxPortsConfig.setSelectedIndex(-1); + setButtons(); + } + + private void addMappedTask() { + //String selectedTaskToMap = jComboBoxTaskToMap.getSelectedItem().toString(); + int selectedTaskToMapIndice = jComboBoxTaskToMap.getSelectedIndex(); + MappingPatternTask mappingPatternTask = tasksToMapList.get(selectedTaskToMapIndice); + if (jRadioMapTaskInExistingHw.isSelected()) { + int selectedTaskInSameHwIndice = jComboBoxMapTaskInSameHwAs.getSelectedIndex(); + MappingPatternTask sameHwTask = tasksToMapInSameHwList.get(selectedTaskInSameHwIndice); + mappingPatternTask.setSameHwAs(sameHwTask.getTaskToMapName(), sameHwTask.getOrigin()); + } else if (jRadioMapTaskInNewHw.isSelected()) { + mappingPatternTask.setBusNameForNewHw(jComboBoxMapTaskInNewHw.getSelectedItem().toString()); + } + mappedTasks.add(mappingPatternTask.getStringDisplay()); + mappedTasksList.add(mappingPatternTask); + tasksToMapInSameHw.add(tasksToMap.remove(selectedTaskToMapIndice)); + tasksToMapInSameHwList.add(tasksToMapList.remove(selectedTaskToMapIndice)); + jComboBoxTaskToMap.setSelectedIndex(-1); + jListMappedTasks.setListData(mappedTasks); + setButtons(); + } + + private void removeMappedTask() { + int[] list = jListMappedTasks.getSelectedIndices(); + List<MappingPatternTask> mappingPatternTasksToRemove = new ArrayList<MappingPatternTask>(); + for (int i = 0; i < list.length; i++) { + MappingPatternTask mappingPatternTaskSelected = mappedTasksList.get(list[i]); + tasksToMap.add(mappingPatternTaskSelected.getTaskToMapName()); + tasksToMapList.add(mappingPatternTaskSelected); + tasksToMapInSameHw.remove(mappingPatternTaskSelected.getSameHwAs()); + tasksToMapInSameHwList.remove(mappingPatternTaskSelected); + mappingPatternTasksToRemove.add(mappingPatternTaskSelected); + mappedTasks.remove(list[i]); + } + mappedTasksList.removeAll(mappingPatternTasksToRemove); + jListMappedTasks.setListData(mappedTasks); + jComboBoxTaskToMap.setSelectedIndex(-1); + setButtons(); + } + + private void addMappedChannel() { + //String selectedChannelToMap = jComboBoxChannelToMap.getSelectedItem().toString(); + int selectedChannelToMapIndex = jComboBoxChannelToMap.getSelectedIndex(); + //String[] taskAndChannelSelected = MappingPatternChannel.seperateTaskAndChannel(selectedChannelToMap); + if (selectedChannelToMapIndex >= 0) { + MappingPatternChannel mappingPatternChannel = channelsToMapList.get(selectedChannelToMapIndex); + if (jRadioMapChannelInExistingMem.isSelected()) { + int selectedChannelSameMemIndex = jComboBoxMapChannelInSameMemAs.getSelectedIndex(); + if (selectedChannelSameMemIndex >= 0) { + MappingPatternChannel mappingPatternChannelSameMem = channelsToMapInSameMemList.get(selectedChannelSameMemIndex); + mappingPatternChannel.setTaskAndChannelInSameMem(mappingPatternChannelSameMem.getTaskOfChannelToMap(), mappingPatternChannelSameMem.getChannelToMapName(), mappingPatternChannelSameMem.getOrigin()); + } + } else if (jRadioMapChannelInNewMem.isSelected()) { + mappingPatternChannel.setBusNameForNewMem(jComboBoxMapChannelInNewMem.getSelectedItem().toString()); + } + mappedChannels.add(mappingPatternChannel.getStringDisplay()); + channelsToMap.remove(mappingPatternChannel.getTaskChannelToMap()); + channelsToMapList.remove(mappingPatternChannel); + mappedChannelsList.add(mappingPatternChannel); + channelsToMapInSameMem.add(mappingPatternChannel.getTaskChannelToMap()); + channelsToMapInSameMemList.add(mappingPatternChannel); + jComboBoxChannelToMap.setSelectedIndex(-1); + jListMappedChannels.setListData(mappedChannels); + setButtons(); + } + } + + private void removeMappedChannel() { + int[] list = jListMappedChannels.getSelectedIndices(); + List<MappingPatternChannel> mappingPatternChannelsToRemove = new ArrayList<MappingPatternChannel>(); + for (int i = 0; i < list.length; i++) { + MappingPatternChannel mappingPatternChannelSelected = mappedChannelsList.get(list[i]); + channelsToMap.add(mappingPatternChannelSelected.getTaskChannelToMap()); + channelsToMapList.add(mappingPatternChannelSelected); + channelsToMapInSameMem.remove(mappingPatternChannelSelected.getTaskChannelToMap()); + channelsToMapInSameMemList.remove(mappingPatternChannelSelected); + mappingPatternChannelsToRemove.add(mappingPatternChannelSelected); + mappedChannels.remove(list[i]); + } + mappedChannelsList.removeAll(mappingPatternChannelsToRemove); + jListMappedChannels.setListData(mappedChannels); + jComboBoxChannelToMap.setSelectedIndex(-1); + setButtons(); + } + + @Override + public void actionPerformed(ActionEvent evt) { + String command = evt.getActionCommand(); + + switch (command) { + case "Start": + startProcess(); + break; + case "Stop": + stopProcess(); + break; + case "Close": + closeDialog(); + break; + default: + if (command.equals("addTaskAsPattern")) { + addTaskAsPattern(); + } else if (command.equals("removeTaskAsPattern")) { + removeTaskAsPattern(); + } else if (command.equals("allTasksSelectedAsPattern")) { + allTasksSelectedAsPattern(); + } else if (command.equals("allTasksNoSelectedAsPattern")) { + allTasksNoSelectedAsPattern(); + } else if (command.equals("cloneTask")) { + cloneTask(); + } else if (command.equals("mapTasksManuallyInArchitecture")) { + mapTasksManuallyInArchitecture(); + } else if (command.equals("mapChannelsManuallyInArchitecture")) { + mapChannelsManuallyInArchitecture(); + } else if (command.equals("updatePatternsAttributes")) { + updatePatternsAttributes(); + } else if (command.equals("addClonedTask")) { + addClonedTask(); + } else if (command.equals("removeClonedTask")) { + removeClonedTask(); + } else if (command.equals("addConnectionBetweenSelectedPorts")) { + addConnectionBetweenSelectedPorts(); + } else if (command.equals("removeConnectionBetweenPorts")) { + removeConnectionBetweenPorts(); + } else if (command.equals("addConfigPorts")) { + addConfigPorts(); + } else if (command.equals("removeConfigPorts")) { + removeConfigPorts(); + } else if (command.equals("addMappedTask")) { + addMappedTask(); + } else if (command.equals("removeMappedTask")) { + removeMappedTask(); + } else if (command.equals("addMappedChannel")) { + addMappedChannel(); + } else if (command.equals("removeMappedChannel")) { + removeMappedChannel(); + } else if (command.equals("updateTaskAttributeValue")) { + updateTaskAttributeValue(); + } + if (evt.getSource() == jp1) { + listPatterns = getFoldersName(pathPatterns); + listPatternsJson = getFoldersName(pathPatterns); + } + if (evt.getSource() == jComboBoxPatterns) { + int selectedPatternIndex = jComboBoxPatterns.getSelectedIndex(); + patternTasksAll = TaskPattern.parsePatternJsonFile(pathPatterns + listPatterns.get(selectedPatternIndex), listPatterns.get(selectedPatternIndex)+".json"); + patternTasksNotConnected = TaskPattern.parsePatternJsonFile(pathPatterns + listPatterns.get(selectedPatternIndex), listPatterns.get(selectedPatternIndex)+".json"); + portsTaskOfModelLeft = TaskPorts.getListPortsTask(mgui.gtm.getTMLMapping().getTMLModeling()); + //Vector<String> patternTasksVector = new Vector<String>(); + tasksOfPatternWithExternalPort.removeAllElements(); + clonedTasks.removeAllElements(); + clonedTasksList.clear(); + for (String pTaskName : patternTasksNotConnected.keySet()) { + if (patternTasksNotConnected.get(pTaskName).getExternalPorts().size() > 0) { + tasksOfPatternWithExternalPort.add(pTaskName); + } + } + + //tasksOfPatternWithExternalPort = patternTasksVector; + //modelPatternsTaskWithExternalPort.removeAllElements(); + + //modelPatternsTaskWithExternalPort.addAll(tasksOfPatternWithExternalPort); + jComboBoxPatternsTaskWithExternalPort.setEnabled(true); + jComboBoxPatternsTaskWithExternalPort.setSelectedIndex(-1); + buttonCloneTask.setEnabled(true); + removeConnectionBetweenPorts.setEnabled(true); + connectedPorts.removeAllElements(); + patternConnectionList.clear(); + jListConnectedPorts.setListData(connectedPorts); + portsConfig.removeAllElements(); + configuredPorts.removeAllElements(); + mappedTasks.removeAllElements(); + mappedTasksList.clear(); + tasksToMap.removeAllElements(); + tasksToMapList.clear(); + channelsToMap.removeAllElements(); + channelsToMapList.clear(); + mappedChannels.removeAllElements(); + mappedChannelsList.clear(); + } + if (evt.getSource() == jComboBoxPatternsTaskWithExternalPort) { + externalPortsOfTaskInPattern.removeAllElements(); + if (jComboBoxPatternsTaskWithExternalPort.getSelectedIndex() >= 0) { + for (PortTaskJsonFile portTask : patternTasksNotConnected.get(jComboBoxPatternsTaskWithExternalPort.getSelectedItem().toString()).getExternalPorts()) { + externalPortsOfTaskInPattern.add(portTask.getName()); + } + jComboBoxPatternExternalPortOfATask.setEnabled(true); + } else { + jComboBoxPatternExternalPortOfATask.setEnabled(false); + } + //modelPatternExternalPortOfATask.removeAllElements(); + //modelPatternExternalPortOfATask.addAll(externalPortsOfTaskInPattern); + jComboBoxPatternExternalPortOfATask.setSelectedIndex(-1); + if (tasksOfPatternWithExternalPort.size() == 0) { + removeConfigPorts.setEnabled(true); + configuredPorts.removeAllElements(); + portsConfig.removeAllElements(); + List<String> clonedTasksAll = new ArrayList<String>(); + for (PatternCloneTask cloneT : clonedTasksList) { + clonedTasksAll.add(cloneT.getClonedTask()); + } + portsTaskConfig = PatternPortsConfig.getPortsToConfig(portsTaskOfModelAll, portsTaskOfModelLeft, clonedTasksAll, mgui.gtm.getTMLMapping().getTMLModeling()); + for (PatternPortsConfig portTaskConfig : portsTaskConfig) { + portTaskConfig.setIsChannelToRemove(true); + configuredPorts.add(portTaskConfig.getStringDisplay()); + configuredPortsList.add(portTaskConfig); + } + jListConfigPorts.setListData(configuredPorts); + jComboBoxPortsConfig.setSelectedIndex(-1); + jComboBoxPortsConfig.setEnabled(true); + } else { + configuredPorts.removeAllElements(); + jListConfigPorts.setListData(configuredPorts); + portsConfig.removeAllElements(); + jComboBoxPortsConfig.setEnabled(false); + removeConfigPorts.setEnabled(false); + mappedTasks.removeAllElements(); + mappedTasksList.clear(); + tasksToMap.removeAllElements(); + tasksToMapList.clear(); + channelsToMap.removeAllElements(); + channelsToMapList.clear(); + mappedChannels.removeAllElements(); + mappedChannelsList.clear(); + buttonTasksMapInArch.setEnabled(false); + buttonChannelsMapInArch.setEnabled(false); + buttonUpdatePatternsAttributes.setEnabled(false); + } + } + if (evt.getSource() == jComboBoxPatternExternalPortOfATask) { + if (jComboBoxPatternExternalPortOfATask.getSelectedIndex() >= 0) { + jComboBoxModelsTask.setEnabled(true); + tasksOfModel.removeAllElements(); + for (String pTaskName : portsTaskOfModelLeft.keySet()) { + tasksOfModel.add(pTaskName); + } + } else { + jComboBoxModelsTask.setEnabled(false); + } + jComboBoxModelsTask.setSelectedIndex(-1); + } + if (evt.getSource() == jComboBoxModelsTask || evt.getSource() == jCheckBoxConnectToNewPort) { + if (jComboBoxModelsTask.getSelectedIndex() >= 0) { + jComboBoxModelsPortOfTask.setEnabled(true); + jCheckBoxConnectToNewPort.setEnabled(true); + String selectedModelTask = jComboBoxModelsTask.getSelectedItem().toString(); + String selectedPatternTask = jComboBoxPatternsTaskWithExternalPort.getSelectedItem().toString(); + int selectedIndexPatternPort = jComboBoxPatternExternalPortOfATask.getSelectedIndex(); + + portsOfTaskInModel.removeAllElements(); + if (!jCheckBoxConnectToNewPort.isSelected()) { + String modeSelectedPatternPort = patternTasksNotConnected.get(selectedPatternTask).getExternalPorts().get(selectedIndexPatternPort).getMode(); + String typeSelectedPatternPort = patternTasksNotConnected.get(selectedPatternTask).getExternalPorts().get(selectedIndexPatternPort).getType(); + if (typeSelectedPatternPort.equals(PatternCreation.CHANNEL)) { + if (modeSelectedPatternPort.equals(PatternCreation.MODE_INPUT)) { + for (String st : portsTaskOfModelLeft.get(selectedModelTask).getWriteChannels()) { + portsOfTaskInModel.add(st); + } + } else if (modeSelectedPatternPort.equals(PatternCreation.MODE_OUTPUT)) { + for (String st : portsTaskOfModelLeft.get(selectedModelTask).getReadChannels()) { + portsOfTaskInModel.add(st); + } + } + } else if (typeSelectedPatternPort.equals(PatternCreation.EVENT)) { + if (modeSelectedPatternPort.equals(PatternCreation.MODE_INPUT)) { + for (String st : portsTaskOfModelLeft.get(selectedModelTask).getSendEvents()) { + portsOfTaskInModel.add(st); + } + } else if (modeSelectedPatternPort.equals(PatternCreation.MODE_OUTPUT)) { + for (String st : portsTaskOfModelLeft.get(selectedModelTask).getWaitEvents()) { + portsOfTaskInModel.add(st); + } + } + } + } else { + for (String st : portsTaskOfModelAll.get(selectedModelTask).getWriteChannels()) { + portsOfTaskInModel.add(st); + } + for (String st : portsTaskOfModelAll.get(selectedModelTask).getReadChannels()) { + portsOfTaskInModel.add(st); + } + for (String st : portsTaskOfModelAll.get(selectedModelTask).getSendEvents()) { + portsOfTaskInModel.add(st); + } + for (String st : portsTaskOfModelAll.get(selectedModelTask).getWaitEvents()) { + portsOfTaskInModel.add(st); + } + } + + } else { + jComboBoxModelsPortOfTask.setEnabled(false); + jCheckBoxConnectToNewPort.setEnabled(false); + } + jComboBoxModelsPortOfTask.setSelectedIndex(-1); + } + if (evt.getSource() == jComboBoxModelsPortOfTask) { + if (jComboBoxModelsPortOfTask.getSelectedIndex() >= 0) { + String selectedPatternTask = jComboBoxPatternsTaskWithExternalPort.getSelectedItem().toString(); + int selectedIndexPatternPort = jComboBoxPatternExternalPortOfATask.getSelectedIndex(); + String typeSelectedPatternPort = patternTasksNotConnected.get(selectedPatternTask).getExternalPorts().get(selectedIndexPatternPort).getType(); + if (typeSelectedPatternPort.equals(PatternCreation.CHANNEL)){ + String confSelectedPatternPort = patternTasksNotConnected.get(selectedPatternTask).getExternalPorts().get(selectedIndexPatternPort).getConfidentiality(); + String authSelectedPatternPort = patternTasksNotConnected.get(selectedPatternTask).getExternalPorts().get(selectedIndexPatternPort).getAuthenticity(); + jCheckBoxAddConfidentiality.setVisible(true); + jCheckBoxAddConfidentiality.setEnabled(true); + if (confSelectedPatternPort.toUpperCase().equals(PatternCreation.WITH_CONFIDENTIALITY.toUpperCase())) { + jCheckBoxAddConfidentiality.setSelected(true); + } + for (int indexModeAuth = 0; indexModeAuth < authenticityModes.size(); indexModeAuth++) { + if (authSelectedPatternPort.toUpperCase().equals(authenticityModes.get(indexModeAuth).toUpperCase())) { + jComboBoxAddAuthenticity.setSelectedIndex(indexModeAuth); + } + } + jComboBoxAddAuthenticity.setEnabled(true); + jComboBoxAddAuthenticity.setVisible(true); + jLabelAddAuthenticity.setVisible(true); + } + addConnectionBetweenSelectedPorts.setEnabled(true); + } else { + addConnectionBetweenSelectedPorts.setEnabled(false); + jCheckBoxAddConfidentiality.setVisible(false); + jCheckBoxAddConfidentiality.setEnabled(false); + jCheckBoxAddConfidentiality.setSelected(false); + jComboBoxAddAuthenticity.setEnabled(false); + jComboBoxAddAuthenticity.setVisible(false); + jComboBoxAddAuthenticity.setSelectedIndex(authenticityModes.indexOf(PatternCreation.WITHOUT_AUTHENTICITY)); + jLabelAddAuthenticity.setVisible(false); + } + } + if (evt.getSource() == jComboBoxTaskToClone) { + if (jComboBoxTaskToClone.getSelectedIndex() >= 0) { + jFieldNewClonedTaskName.setEnabled(true); + addClonedTask.setEnabled(true); + } else { + jFieldNewClonedTaskName.setEnabled(false); + addClonedTask.setEnabled(false); + } + } + + if (evt.getSource() == jComboBoxPortsConfig) { + if (jComboBoxPortsConfig.getSelectedIndex() >= 0) { + jRadioPortConfigRemove.setEnabled(true); + jRadioPortConfigMerge.setEnabled(true); + + } else { + jRadioPortConfigRemove.setEnabled(false); + jRadioPortConfigMerge.setEnabled(false); + } + if (portsConfig.size() == 0 && tasksOfPatternWithExternalPort.size() == 0) { + tasksToMap.removeAllElements(); + tasksToMapList.clear(); + tasksToMapInSameHw.removeAllElements(); + tasksToMapInSameHwList.clear(); + mappedTasks.removeAllElements(); + mappedTasksList.clear(); + channelsToMap.removeAllElements(); + channelsToMapList.clear(); + channelsToMapInSameMem.removeAllElements(); + channelsToMapInSameMemList.clear(); + mappedChannels.removeAllElements(); + mappedChannelsList.clear(); + List<String> clonedTasksName = new ArrayList<String>(); + for(PatternCloneTask cloneT: clonedTasksList) { + tasksToMap.add(cloneT.getClonedTask()); + MappingPatternTask mapTask = new MappingPatternTask(cloneT.getClonedTask(), MappingPatternTask.ORIGIN_CLONE); + tasksToMapList.add(mapTask); + clonedTasksName.add(cloneT.getClonedTask()); + } + for(String st : patternTasksAll.keySet()) { + tasksToMap.add(st); + MappingPatternTask mapTask = new MappingPatternTask(st, MappingPatternTask.ORIGIN_PATTERN); + tasksToMapList.add(mapTask); + } + for(String st : portsTaskOfModelAll.keySet()) { + if (!clonedTasksName.contains(st)) { + tasksToMapInSameHw.add(st); + MappingPatternTask mapTask = new MappingPatternTask(st, MappingPatternTask.ORIGIN_MODEL); + tasksToMapInSameHwList.add(mapTask); + } + } + List<MappingPatternChannel> channelsToMapListA = MappingPatternChannel.getChannelsToMap(patternConnectionList, patternTasksAll, clonedTasksList); + for(MappingPatternChannel channelToMap : channelsToMapListA) { + channelsToMap.add(channelToMap.getTaskChannelToMap()); + channelsToMapList.add(channelToMap); + } + + for(String st : portsTaskOfModelAll.keySet()) { + if (!clonedTasksName.contains(st)) { + for (String wc : portsTaskOfModelAll.get(st).getWriteChannels()) { + if (!channelsToMapInSameMem.contains(MappingPatternChannel.getTaskChannel(st, wc))) { + MappingPatternChannel mappingPatternChannel = new MappingPatternChannel(st, wc, MappingPatternChannel.ORIGIN_MODEL); + channelsToMapInSameMem.add(mappingPatternChannel.getTaskChannelToMap()); + channelsToMapInSameMemList.add(mappingPatternChannel); + } + } + } + } + + buttonTasksMapInArch.setEnabled(true); + buttonChannelsMapInArch.setEnabled(true); + buttonUpdatePatternsAttributes.setEnabled(true); + } else { + buttonTasksMapInArch.setEnabled(false); + buttonChannelsMapInArch.setEnabled(false); + buttonUpdatePatternsAttributes.setEnabled(false); + } + + jRadioPortConfigRemove.setSelected(false); + jRadioPortConfigMerge.setSelected(false); + portsConfigGroup.clearSelection(); + portsConfigMerge.removeAllElements(); + jComboBoxPortsConfigMerge.setSelectedIndex(-1); + } + if (evt.getSource() == jRadioPortConfigRemove) { + jComboBoxPortsConfigMerge.setSelectedIndex(-1); + jComboBoxPortsConfigMerge.setEnabled(false); + } + + if (evt.getSource() == jRadioPortConfigMerge) { + if (jRadioPortConfigMerge.isSelected()) { + jComboBoxPortsConfigMerge.setEnabled(true); + String jCo = jComboBoxPortsConfig.getSelectedItem().toString(); + String[] taskPortSelected = PatternPortsConfig.seperateTaskAndChannel(jCo); + String taskSelected = taskPortSelected[0]; + List<String> portsToConfOfTaskAll = new ArrayList<String>(); + for (PatternPortsConfig portTaskConfig : portsTaskConfig) { + if (taskSelected.equals(portTaskConfig.getTaskOfChannelToConfig())) { + portsToConfOfTaskAll.add(portTaskConfig.getChannelToConfig()); + } + } + for (String wc : portsTaskOfModelAll.get(taskSelected).getWriteChannels()) { + if (!portsToConfOfTaskAll.contains(wc)) { + portsConfigMerge.add(wc); + } + } + for (String rc : portsTaskOfModelAll.get(taskSelected).getReadChannels()) { + if (!portsToConfOfTaskAll.contains(rc)) { + portsConfigMerge.add(rc); + } + } + for (String se : portsTaskOfModelAll.get(taskSelected).getSendEvents()) { + if (!portsToConfOfTaskAll.contains(se)) { + portsConfigMerge.add(se); + } + } + for (String we : portsTaskOfModelAll.get(taskSelected).getWaitEvents()) { + if (!portsToConfOfTaskAll.contains(we)) { + portsConfigMerge.add(we); + } + } + + } else { + jComboBoxPortsConfigMerge.setEnabled(false); + } + jComboBoxPortsConfigMerge.setSelectedIndex(-1); + } + + if (evt.getSource() == jRadioPortConfigMerge || evt.getSource() == jRadioPortConfigRemove || evt.getSource() == jComboBoxPortsConfigMerge) { + if (portsConfig.size()>0 && (jRadioPortConfigRemove.isSelected() || (jRadioPortConfigMerge.isSelected() && jComboBoxPortsConfigMerge.getSelectedIndex() >= 0))) { + addConfigPorts.setEnabled(true); + } else { + addConfigPorts.setEnabled(false); + } + } + if (evt.getSource() == jComboBoxTaskToMap) { + if (jComboBoxTaskToMap.getSelectedIndex() >= 0) { + jRadioMapTaskInNewHw.setEnabled(true); + jRadioMapTaskInExistingHw.setEnabled(true); + } else { + jRadioMapTaskInNewHw.setEnabled(false); + jRadioMapTaskInExistingHw.setEnabled(false); + } + mapTaskGroup.clearSelection(); + jComboBoxMapTaskInSameHwAs.setEnabled(false); + jComboBoxMapTaskInNewHw.setEnabled(false); + jComboBoxMapTaskInSameHwAs.setSelectedIndex(-1); + jComboBoxMapTaskInNewHw.setSelectedIndex(-1); + } + if (evt.getSource() == jRadioMapTaskInNewHw) { + if (jRadioMapTaskInNewHw.isSelected()) { + jComboBoxMapTaskInNewHw.setEnabled(true); + jComboBoxMapTaskInSameHwAs.setEnabled(false); + jComboBoxMapTaskInSameHwAs.setSelectedIndex(-1); + } else { + jComboBoxMapTaskInNewHw.setEnabled(false); + } + } + if (evt.getSource() == jRadioMapTaskInExistingHw) { + if (jRadioMapTaskInExistingHw.isSelected()) { + jComboBoxMapTaskInSameHwAs.setEnabled(true); + jComboBoxMapTaskInNewHw.setEnabled(false); + jComboBoxMapTaskInNewHw.setSelectedIndex(-1); + } else { + jComboBoxMapTaskInSameHwAs.setEnabled(false); + } + } + if (evt.getSource() == jComboBoxMapTaskInSameHwAs || evt.getSource() == jComboBoxMapTaskInNewHw) { + if (tasksToMap.size() > 0 && ((jRadioMapTaskInExistingHw.isSelected() && jComboBoxMapTaskInSameHwAs.getSelectedIndex() >= 0) || (jRadioMapTaskInNewHw.isSelected() && jComboBoxMapTaskInNewHw.getSelectedIndex() >= 0))) { + addMappedTask.setEnabled(true); + } else { + addMappedTask.setEnabled(false); + } + } + if (evt.getSource() == jComboBoxChannelToMap) { + if (jComboBoxChannelToMap.getSelectedIndex() >= 0) { + jRadioMapChannelInNewMem.setEnabled(true); + jRadioMapChannelInExistingMem.setEnabled(true); + } else { + jRadioMapChannelInNewMem.setEnabled(false); + jRadioMapChannelInExistingMem.setEnabled(false); + } + mapChannelGroup.clearSelection(); + jComboBoxMapChannelInSameMemAs.setEnabled(false); + jComboBoxMapChannelInNewMem.setEnabled(false); + jComboBoxMapChannelInSameMemAs.setSelectedIndex(-1); + jComboBoxMapChannelInNewMem.setSelectedIndex(-1); + } + if (evt.getSource() == jRadioMapChannelInNewMem) { + if (jRadioMapChannelInNewMem.isSelected()) { + jComboBoxMapChannelInNewMem.setEnabled(true); + jComboBoxMapChannelInSameMemAs.setEnabled(false); + jComboBoxMapChannelInSameMemAs.setSelectedIndex(-1); + } else { + jComboBoxMapChannelInNewMem.setEnabled(false); + } + } + if (evt.getSource() == jRadioMapChannelInExistingMem) { + if (jRadioMapChannelInExistingMem.isSelected()) { + jComboBoxMapChannelInSameMemAs.setEnabled(true); + jComboBoxMapChannelInNewMem.setEnabled(false); + jComboBoxMapChannelInNewMem.setSelectedIndex(-1); + } else { + jComboBoxMapChannelInSameMemAs.setEnabled(false); + } + } + if (evt.getSource() == jComboBoxMapChannelInSameMemAs || evt.getSource() == jComboBoxMapChannelInNewMem) { + if (channelsToMap.size() > 0 && ((jRadioMapChannelInExistingMem.isSelected() && jComboBoxMapChannelInSameMemAs.getSelectedIndex() >= 0) || (jRadioMapChannelInNewMem.isSelected() && jComboBoxMapChannelInNewMem.getSelectedIndex() >= 0))) { + addMappedChannel.setEnabled(true); + } else { + addMappedChannel.setEnabled(false); + } + } + + if (evt.getSource() == jComboBoxTasksToUpdateAttributes) { + attributesOfTaskToUpdate.removeAllElements(); + if (jComboBoxTasksToUpdateAttributes.getSelectedIndex() >= 0) { + jComboBoxAttributesOfTaskToUpdate.setEnabled(true); + String selectedTaskToUpdateAttributes = jComboBoxTasksToUpdateAttributes.getSelectedItem().toString(); + for (AttributeTaskJsonFile attributeTaskJsonFile : patternTasksAll.get(selectedTaskToUpdateAttributes).getAttributes()) { + attributesOfTaskToUpdate.add(attributeTaskJsonFile.getName()); + } + } else { + jComboBoxAttributesOfTaskToUpdate.setEnabled(false); + } + jComboBoxAttributesOfTaskToUpdate.setSelectedIndex(-1); + jFieldNewTaskAttibuteValue.setText(""); + } + + if (evt.getSource() == jComboBoxAttributesOfTaskToUpdate) { + if (jComboBoxAttributesOfTaskToUpdate.getSelectedIndex() >= 0) { + jFieldNewTaskAttibuteValue.setEnabled(true); + buttonUpdateTaskAttributeValue.setEnabled(true); + String selectedTaskToUpdateAttributes = jComboBoxTasksToUpdateAttributes.getSelectedItem().toString(); + String selectedAttributeToUpdate = jComboBoxAttributesOfTaskToUpdate.getSelectedItem().toString(); + for (AttributeTaskJsonFile attributeTaskJsonFile : patternTasksAll.get(selectedTaskToUpdateAttributes).getAttributes()) { + if (attributeTaskJsonFile.getName().equals(selectedAttributeToUpdate)) { + jFieldNewTaskAttibuteValue.setText(attributeTaskJsonFile.getValue()); + } + } + } else { + jFieldNewTaskAttibuteValue.setEnabled(false); + jFieldNewTaskAttibuteValue.setText(""); + buttonUpdateTaskAttributeValue.setEnabled(false); + } + } + + if (evt.getSource() == jComboBoxPatternsJson) { + if (jComboBoxPatternsJson.getSelectedIndex() >= 0) { + jFieldPatternJsonPath.setEnabled(true); + jFieldPatternJsonPath.setText(pathPatterns + listPatternsJson.get(jComboBoxPatternsJson.getSelectedIndex()) + "/"+listPatternsJson.get(jComboBoxPatternsJson.getSelectedIndex())+"-config.json"); + } else { + jFieldPatternJsonPath.setEnabled(false); + jFieldPatternJsonPath.setText(""); + } + } + } + } + + private void closeDialog() { + if (mode == STARTED) { + stopProcess(); + } + dispose(); + } + + private void stopProcess() { + if (rshc != null) { + try { + rshc.stopCommand(); + } catch (LauncherException ignored) { + } + } + rshc = null; + mode = STOPPED; + setButtons(); + go = false; + } + + private void startProcess() { + Thread t = new Thread(this); + mode = STARTED; + setButtons(); + go = true; + t.start(); + } + + @Override + public void run() { + TraceManager.addDev("Thread started"); + int currentPosY = 0; + int stepY = 10; + if (jp1.getSelectedIndex() == 0) { + newPatternName = jFieldNewPatternName.getText(); + jta.removeAll(); + boolean findErr = false; + if (selectedTasksAsPattern.size() == 0) { + JLabel label = new JLabel("ERROR: No Task Selected As Pattern"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (newPatternName.length() <= 0) { + JLabel label = new JLabel("ERROR: Pattern name is missing"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + /*if (selectedTasksAsPattern.size() > 1) { + for (int i = 0; i < selectedTasksAsPattern.size(); i++) { + boolean isLinkedToPattern = false; + for (int j = 0; j < selectedTasksAsPattern.size(); j++) { + if (i != j) { + int nbChWr = getListChannelsBetweenTwoTasks(tasksFullName.get(selectedTasksAsPattern.get(i)), tasksFullName.get(selectedTasksAsPattern.get(j))).size(); + int nbChRd = getListChannelsBetweenTwoTasks(tasksFullName.get(selectedTasksAsPattern.get(j)), tasksFullName.get(selectedTasksAsPattern.get(i))).size(); + if (nbChWr != 0 || nbChRd != 0) { + isLinkedToPattern = true; + break; + } + } + } + if (!isLinkedToPattern) { + JLabel label = new JLabel("ERROR: The task " + selectedTasksAsPattern.get(i) +" is not linked to the others selected tasks"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + } + }*/ + + if (!findErr) { + mgui.gtm.createPattern(selectedTasksAsPattern, newPatternName, pathPatterns); + JLabel label = new JLabel("Pattern Creation Completed"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + } + mode = NOT_STARTED; + } else if (jp1.getSelectedIndex() == 1) { + newPatternName = jFieldNewPatternName.getText(); + jta.removeAll(); + boolean findErr = false; + if (tasksOfPatternWithExternalPort.size() > 0) { + JLabel label = new JLabel("ERROR: Some connections between the pattern and the model are missing"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (portsConfig.size() > 0) { + JLabel label = new JLabel("ERROR: There are some port's configurations left to do"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (!findErr) { + int selectedPatternIndex = jComboBoxPatterns.getSelectedIndex(); + String selectedPatternPath = pathPatterns+listPatterns.get(selectedPatternIndex)+"/"; + String selectedPatternName = listPatterns.get(selectedPatternIndex); + PatternConfiguration patternConfiguration = new PatternConfiguration(patternConnectionList, clonedTasksList, configuredPortsList, mappedTasksList, mappedChannelsList, updatedPatternAttributes, channelsWithSecurity); + patternConfiguration.loadChannelsWithSecurity(patternTasksAll); + GTURTLEModeling.createJsonPatternConfigFile(selectedPatternPath, selectedPatternName, patternConfiguration); + mgui.gtm.integratePattern(mgui, selectedPatternPath, selectedPatternName); + JLabel label = new JLabel("Pattern Configuration Completed"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + } + mode = NOT_STARTED; + } else if (jp1.getSelectedIndex() == 2) { + jta.removeAll(); + boolean findErr = false; + String textJFieldPathJson = jFieldPatternJsonPath.getText(); + File f = new File(textJFieldPathJson); + + if (jComboBoxPatternsJson.getSelectedIndex() == -1) { + JLabel label = new JLabel("ERROR: Select a pattern"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (!f.isFile() || !f.exists()) { + JLabel label = new JLabel("ERROR: Json file doesn't exist"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + + if (!findErr) { + int selectedPatternIndex = jComboBoxPatternsJson.getSelectedIndex(); + String selectedPatternPath = pathPatterns+listPatternsJson.get(selectedPatternIndex) + "/"; + String selectedPatternName = listPatternsJson.get(selectedPatternIndex); + mgui.gtm.integratePattern(mgui, selectedPatternPath, selectedPatternName, textJFieldPathJson); + JLabel label = new JLabel("Pattern Integration Completed"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + } + mode = NOT_STARTED; + } + setButtons(); + } + + protected void setButtons() { + switch (mode) { + case NOT_STARTED: + startButton.setEnabled(true); + stop.setEnabled(false); + close.setEnabled(true); + getGlassPane().setVisible(false); + break; + case STARTED: + startButton.setEnabled(false); + stop.setEnabled(true); + close.setEnabled(false); + getGlassPane().setVisible(true); + break; + case STOPPED: + default: + startButton.setEnabled(false); + stop.setEnabled(false); + close.setEnabled(true); + getGlassPane().setVisible(false); + break; + } + } + + @Override + public void setError() { + } + + @Override + public void appendOut(String s) { + } + + @Override + public boolean hasToContinue() { + return this.go; + } + + @Override + public void mouseClicked(MouseEvent e) { + } + + @Override + public void mouseEntered(MouseEvent e) { + } + + @Override + public void mouseExited(MouseEvent e) { + } + + @Override + public void mousePressed(MouseEvent e) { + + } + + @Override + public void mouseReleased(MouseEvent e) { + + } + + @Override + public void valueChanged(ListSelectionEvent e) { + + } + +} diff --git a/src/main/java/ui/window/JDialogProverifVerification.java b/src/main/java/ui/window/JDialogProverifVerification.java index d91af85707ee1afd8676f18192e978ecde9ddf6a..a38e02aadd96e2567db00a30661535ad9b1c8ab4 100644 --- a/src/main/java/ui/window/JDialogProverifVerification.java +++ b/src/main/java/ui/window/JDialogProverifVerification.java @@ -61,10 +61,12 @@ import java.io.OutputStreamWriter; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -138,6 +140,10 @@ public class JDialogProverifVerification extends JDialog implements ActionListen private static boolean PI_CALCULUS = true; public static int LOOP_ITERATION = 1; + public static String ADD_CONFIDENTIALITY = "Conf"; + public static String ADD_WEAK_AUTHENTICITY = "Integrity"; + public static String ADD_STRONG_AUTHENTICITY = "Strong Authenticity"; + private static boolean DRAW_AVATAR = false; private JLabel labelError; @@ -167,10 +173,48 @@ public class JDialogProverifVerification extends JDialog implements ActionListen JList<String> listSelected; JList<String> listIgnored; + Vector<String> selectedChannelsToAddSec = new Vector<String>(); + Vector<String> ignoredChannelsToAddSec = new Vector<String>(); + JList<String> listSelectedChannelsToAddSec; + JList<String> listIgnoredChannelsToAddSec; + + //Patterns + Vector<String> listPatterns = new Vector<String>(Arrays.asList("TMR")); + + JComboBox<String> jComboBoxPatterns; + JComboBox<String> listCompSelectReceiver; + JComboBox<String> listCompSelectMainSensor, listChannelsMainSensor; + JComboBox<String> listCompSelectSecondSensor, listChannelsSecondSensor; + JComboBox<String> listCompSelectThirdSensor, listChannelsThirdSensor; + Vector<String> allTasksFullName = new Vector<String>(); + Vector<String> allTasksAsReceiver = new Vector<String>(); + Vector<String> allTasksAsMainSensor = new Vector<String>(); + Vector<String> allTasksAsSecondSensor = new Vector<String>(); + Vector<String> allTasksAsThirdSensor = new Vector<String>(); + Vector<String> allChannelsMainSensor = new Vector<String>(); + Vector<String> allChannelsSecondSensor = new Vector<String>(); + Vector<String> allChannelsThirdSensor = new Vector<String>(); + JButton addChannelFromMainSensor, removeChannelFromMainSensor, moveUpChannelFromMainSensor, moveDownChannelFromMainSensor; + JButton addChannelFromSecondSensor, removeChannelFromSecondSensor, moveUpChannelFromSecondSensor, moveDownChannelFromSecondSensor; + JButton addChannelFromThirdSensor, removeChannelFromThirdSensor, moveUpChannelFromThirdSensor, moveDownChannelFromThirdSensor; + JList<String> listSelectedChannelsMainSensor; + JList<String> listSelectedChannelsSecondSensor; + JList<String> listSelectedChannelsThirdSensor; + Vector<String> selectedChannelsMainSensor = new Vector<String>(); + Vector<String> selectedChannelsSecondSensor = new Vector<String>(); + Vector<String> selectedChannelsThirdSensor = new Vector<String>(); + Map<String, List<String>> selectedSensors = new LinkedHashMap<String, List<String>>(); + + protected JCheckBox selectTwoSensors; + protected JTextField interpretersCompTime, voterCompTime, voterTimeOut; + protected static String interpretersCompTimeDefault = "10"; + protected static String voterCompTimeDefault = "10"; + protected static String voterTimeOutDefault = "1000"; protected static String encCC = "100"; protected static String decCC = "100"; protected static String secOv = "100"; + private ProVerifOutputAnalyzer pvoa; //components @@ -190,6 +234,7 @@ public class JDialogProverifVerification extends JDialog implements ActionListen protected JTextField encTime, decTime, secOverhead; protected JComboBox<String> addtoCPU; protected JButton allValidated, addOneValidated, allIgnored, addOneIgnored; + protected JButton addAllChannelsToAddSec, addOneChannelToAddSec, removeAllChannelsToAddSec, removeOneChannelToAddSec; protected JCheckBox removeForkAndJoin; @@ -274,7 +319,26 @@ public class JDialogProverifVerification extends JDialog implements ActionListen taskCpuMap.put(task, cpu); } } + currPanel = mgui.getCurrentTURTLEPanel(); + + if (currPanel instanceof TMLArchiPanel) { + for (int i=0; i < mgui.gtm.getTMLMapping().getTMLModeling().getChannels().size(); i++) { + String channelFullName = mgui.gtm.getTMLMapping().getTMLModeling().getChannels().get(i).getName(); + String channelShortName = channelFullName.split("__")[channelFullName.split("__").length - 1]; + ignoredChannelsToAddSec.add(channelShortName); + } + + for (int i=0; i<mgui.gtm.getTMLMapping().getMappedTasks().size(); i++) { + String taskFullName = mgui.gtm.getTMLMapping().getMappedTasks().get(i).getName(); + String taskShortName = taskFullName.split("__")[taskFullName.split("__").length - 1]; + allTasksFullName.add(taskFullName); + allTasksAsReceiver.add(taskShortName); + allTasksAsMainSensor.add(taskShortName); + allTasksAsSecondSensor.add(taskShortName); + allTasksAsThirdSensor.add(taskShortName); + } + } initComponents(); myInitComponents(); @@ -311,6 +375,376 @@ public class JDialogProverifVerification extends JDialog implements ActionListen return gbc; } + Vector<String> getListChannelsBetweenTwoTasks(String originTaskName, String destinationTaskName) { + Vector<String> channels = new Vector<String>(); + if (mgui.gtm.getTMLMapping().getTaskByName(originTaskName) != null && mgui.gtm.getTMLMapping().getTaskByName(destinationTaskName) != null) { + if (mgui.gtm.getTMLMapping().getTaskByName(originTaskName).getWriteChannels().size() > 0) { + for (int i=0; i < mgui.gtm.getTMLMapping().getTaskByName(destinationTaskName).getReadChannels().size(); i++) { + for (int j=0 ; j < mgui.gtm.getTMLMapping().getTaskByName(destinationTaskName).getReadChannels().get(i).getNbOfChannels(); j++) { + for (int k=0; k < mgui.gtm.getTMLMapping().getTaskByName(originTaskName).getWriteChannels().size(); k++) { + for (int l=0; l < mgui.gtm.getTMLMapping().getTaskByName(originTaskName).getWriteChannels().get(k).getNbOfChannels(); l++) { + if (mgui.gtm.getTMLMapping().getTaskByName(originTaskName).getWriteChannels().get(k).getChannel(l) == mgui.gtm.getTMLMapping().getTaskByName(destinationTaskName).getReadChannels().get(i).getChannel(j)) { + String channelLongName = mgui.gtm.getTMLMapping().getTaskByName(destinationTaskName).getReadChannels().get(i).getChannel(j).getName(); + String channelShortName = channelLongName.split("__")[channelLongName.split("__").length - 1]; + if (!channels.contains(channelShortName)) { + channels.add(channelShortName); + } + } + } + } + } + } + } + } + return channels; + } + + protected void panelAutoPattern() { + JPanel jp03 = new JPanel(); + GridBagLayout gridbag03 = new GridBagLayout(); + GridBagConstraints c03 = new GridBagConstraints(); + jp03.setLayout(gridbag03); + jp03.setBorder(new javax.swing.border.TitledBorder("Auto add Pattern")); + + c03.weighty = 1.0; + c03.weightx = 1.0; + c03.fill = GridBagConstraints.HORIZONTAL; + c03.gridheight = 1; + c03.gridwidth = 2; + jp03.add(new JLabel("Select Pattern:"), c03); + c03.gridwidth = GridBagConstraints.REMAINDER; + jComboBoxPatterns = new JComboBox<String>(listPatterns); + jp03.add(jComboBoxPatterns, c03); + + jp03.add(new JLabel("Select receiver Component:"), c03); + c03.gridwidth = GridBagConstraints.REMAINDER; + listCompSelectReceiver = new JComboBox<String>(allTasksAsReceiver); + listCompSelectReceiver.setSelectedIndex(-1); + listCompSelectReceiver.addActionListener(this); + + jp03.add(listCompSelectReceiver, c03); + c03.gridwidth = GridBagConstraints.REMAINDER; + + jp03.add(new JLabel("Select a sensor and its ports for which a TMR will be integrated:"), c03); + c03.gridwidth = 2; + listCompSelectMainSensor = new JComboBox<String>(allTasksAsMainSensor); + listCompSelectMainSensor.setSelectedIndex(-1); + listCompSelectMainSensor.addActionListener(this); + jp03.add(listCompSelectMainSensor, c03); + c03.gridwidth = GridBagConstraints.REMAINDER; + + listChannelsMainSensor = new JComboBox<String>(allChannelsMainSensor); + listChannelsMainSensor.setSelectedIndex(-1); + listChannelsMainSensor.addActionListener(this); + jp03.add(listChannelsMainSensor, c03); + c03.gridwidth = GridBagConstraints.REMAINDER; + + listSelectedChannelsMainSensor = new JList<String>(selectedChannelsMainSensor); + JPanel panelSelectChannelsMainSensor = new JPanel(); + panelSelectChannelsMainSensor.setPreferredSize(new Dimension(200, 100)); + listSelectedChannelsMainSensor.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); + + listSelectedChannelsMainSensor.addListSelectionListener(this); + JScrollPane scrollPaneSelectedChannelsMainSensor = new JScrollPane(listSelectedChannelsMainSensor); + scrollPaneSelectedChannelsMainSensor.setPreferredSize(new Dimension(200, 100)); + panelSelectChannelsMainSensor.add(scrollPaneSelectedChannelsMainSensor, BorderLayout.WEST); + + JPanel selectChannelsMainSensorPanel = new JPanel(); + GridBagConstraints c13MainSensor = new GridBagConstraints(); + c13MainSensor.gridwidth = GridBagConstraints.REMAINDER; + c13MainSensor.gridheight = 1; + addChannelFromMainSensor = new JButton("+"); + addChannelFromMainSensor.setPreferredSize(new Dimension(50, 25)); + addChannelFromMainSensor.addActionListener(this); + addChannelFromMainSensor.setActionCommand("addChannelMainSensor"); + selectChannelsMainSensorPanel.add(addChannelFromMainSensor, c13MainSensor); + + removeChannelFromMainSensor = new JButton("-"); + removeChannelFromMainSensor.setPreferredSize(new Dimension(50, 25)); + removeChannelFromMainSensor.addActionListener(this); + removeChannelFromMainSensor.setActionCommand("removeChannelMainSensor"); + selectChannelsMainSensorPanel.add(removeChannelFromMainSensor, c13MainSensor); + + moveUpChannelFromMainSensor = new JButton(IconManager.imgic78); + moveUpChannelFromMainSensor.setPreferredSize(new Dimension(50, 25)); + moveUpChannelFromMainSensor.addActionListener(this); + moveUpChannelFromMainSensor.setActionCommand("moveUpChannelMainSensor"); + selectChannelsMainSensorPanel.add(moveUpChannelFromMainSensor, c13MainSensor); + + moveDownChannelFromMainSensor = new JButton(IconManager.imgic79); + moveDownChannelFromMainSensor.setPreferredSize(new Dimension(50, 25)); + moveDownChannelFromMainSensor.addActionListener(this); + moveDownChannelFromMainSensor.setActionCommand("moveDownChannelMainSensor"); + selectChannelsMainSensorPanel.add(moveDownChannelFromMainSensor, c13MainSensor); + + panelSelectChannelsMainSensor.add(selectChannelsMainSensorPanel, c03); + jp03.add(panelSelectChannelsMainSensor, c03); + + + GridBagConstraints c04 = new GridBagConstraints(); + c04.weighty = 1.0; + c04.weightx = 1.0; + c04.gridwidth = GridBagConstraints.REMAINDER; + c04.gridheight = 1; + c04.fill= GridBagConstraints.HORIZONTAL; + jp03.add(new JLabel(""), c04); + + selectTwoSensors = new JCheckBox("Select two other sensors"); + jp03.add(selectTwoSensors, c03); + selectTwoSensors.addActionListener(this); + + c03.gridwidth = 2; + listCompSelectSecondSensor = new JComboBox<String>(allTasksAsSecondSensor); + listCompSelectSecondSensor.setSelectedIndex(-1); + listCompSelectSecondSensor.setEnabled(false); + listCompSelectSecondSensor.addActionListener(this); + jp03.add(listCompSelectSecondSensor, c03); + c03.gridwidth = GridBagConstraints.REMAINDER; + + listChannelsSecondSensor = new JComboBox<String>(allChannelsSecondSensor); + listChannelsSecondSensor.setSelectedIndex(-1); + listChannelsSecondSensor.setEnabled(false); + listChannelsSecondSensor.addActionListener(this); + jp03.add(listChannelsSecondSensor, c03); + c03.gridwidth = GridBagConstraints.REMAINDER; + + listSelectedChannelsSecondSensor = new JList<String>(selectedChannelsSecondSensor); + JPanel panelSelectChannelsSecondSensor = new JPanel(); + panelSelectChannelsSecondSensor.setPreferredSize(new Dimension(200, 100)); + listSelectedChannelsSecondSensor.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); + + listSelectedChannelsSecondSensor.addListSelectionListener(this); + JScrollPane scrollPaneSelectedChannelsSecondSensor = new JScrollPane(listSelectedChannelsSecondSensor); + scrollPaneSelectedChannelsSecondSensor.setPreferredSize(new Dimension(200, 100)); + panelSelectChannelsSecondSensor.add(scrollPaneSelectedChannelsSecondSensor, BorderLayout.WEST); + + JPanel selectChannelsSecondSensorPanel = new JPanel(); + GridBagConstraints c13SecondSensor = new GridBagConstraints(); + c13SecondSensor.gridwidth = GridBagConstraints.REMAINDER; + c13SecondSensor.gridheight = 1; + addChannelFromSecondSensor = new JButton("+"); + addChannelFromSecondSensor.setEnabled(false); + addChannelFromSecondSensor.setPreferredSize(new Dimension(50, 25)); + addChannelFromSecondSensor.addActionListener(this); + addChannelFromSecondSensor.setActionCommand("addChannelSecondSensor"); + selectChannelsSecondSensorPanel.add(addChannelFromSecondSensor, c13SecondSensor); + + removeChannelFromSecondSensor = new JButton("-"); + removeChannelFromSecondSensor.setEnabled(false); + removeChannelFromSecondSensor.setPreferredSize(new Dimension(50, 25)); + removeChannelFromSecondSensor.addActionListener(this); + removeChannelFromSecondSensor.setActionCommand("removeChannelSecondSensor"); + selectChannelsSecondSensorPanel.add(removeChannelFromSecondSensor, c13SecondSensor); + + moveUpChannelFromSecondSensor = new JButton(IconManager.imgic78); + moveUpChannelFromSecondSensor.setEnabled(false); + moveUpChannelFromSecondSensor.setPreferredSize(new Dimension(50, 25)); + moveUpChannelFromSecondSensor.addActionListener(this); + moveUpChannelFromSecondSensor.setActionCommand("moveUpChannelSecondSensor"); + selectChannelsSecondSensorPanel.add(moveUpChannelFromSecondSensor, c13SecondSensor); + + moveDownChannelFromSecondSensor = new JButton(IconManager.imgic79); + moveDownChannelFromSecondSensor.setEnabled(false); + moveDownChannelFromSecondSensor.setPreferredSize(new Dimension(50, 25)); + moveDownChannelFromSecondSensor.addActionListener(this); + moveDownChannelFromSecondSensor.setActionCommand("moveDownChannelSecondSensor"); + selectChannelsSecondSensorPanel.add(moveDownChannelFromSecondSensor, c13SecondSensor); + + panelSelectChannelsSecondSensor.add(selectChannelsSecondSensorPanel, c04); + jp03.add(panelSelectChannelsSecondSensor, c04); + + c03.gridwidth = 2; + listCompSelectThirdSensor = new JComboBox<String>(allTasksAsThirdSensor); + listCompSelectThirdSensor.setSelectedIndex(-1); + listCompSelectThirdSensor.setEnabled(false); + listCompSelectThirdSensor.addActionListener(this); + jp03.add(listCompSelectThirdSensor, c03); + c03.gridwidth = GridBagConstraints.REMAINDER; + + listChannelsThirdSensor = new JComboBox<String>(allChannelsThirdSensor); + listChannelsThirdSensor.setSelectedIndex(-1); + listChannelsThirdSensor.setEnabled(false); + listChannelsThirdSensor.addActionListener(this); + jp03.add(listChannelsThirdSensor, c03); + c03.gridwidth = GridBagConstraints.REMAINDER; + + listSelectedChannelsThirdSensor = new JList<String>(selectedChannelsThirdSensor); + JPanel panelSelectChannelsThirdSensor = new JPanel(); + panelSelectChannelsThirdSensor.setPreferredSize(new Dimension(200, 100)); + listSelectedChannelsThirdSensor.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); + + listSelectedChannelsThirdSensor.addListSelectionListener(this); + JScrollPane scrollPaneSelectedChannelsThirdSensor = new JScrollPane(listSelectedChannelsThirdSensor); + scrollPaneSelectedChannelsThirdSensor.setPreferredSize(new Dimension(200, 100)); + panelSelectChannelsThirdSensor.add(scrollPaneSelectedChannelsThirdSensor, BorderLayout.WEST); + + JPanel selectChannelsThirdSensorPanel = new JPanel(); + GridBagConstraints c13ThirdSensor = new GridBagConstraints(); + c13ThirdSensor.gridwidth = GridBagConstraints.REMAINDER; + c13ThirdSensor.gridheight = 1; + addChannelFromThirdSensor = new JButton("+"); + addChannelFromThirdSensor.setEnabled(false); + addChannelFromThirdSensor.setPreferredSize(new Dimension(50, 25)); + addChannelFromThirdSensor.addActionListener(this); + addChannelFromThirdSensor.setActionCommand("addChannelThirdSensor"); + selectChannelsThirdSensorPanel.add(addChannelFromThirdSensor, c13ThirdSensor); + + removeChannelFromThirdSensor = new JButton("-"); + removeChannelFromThirdSensor.setEnabled(false); + removeChannelFromThirdSensor.setPreferredSize(new Dimension(50, 25)); + removeChannelFromThirdSensor.addActionListener(this); + removeChannelFromThirdSensor.setActionCommand("removeChannelThirdSensor"); + selectChannelsThirdSensorPanel.add(removeChannelFromThirdSensor, c13ThirdSensor); + + moveUpChannelFromThirdSensor = new JButton(IconManager.imgic78); + moveUpChannelFromThirdSensor.setEnabled(false); + moveUpChannelFromThirdSensor.setPreferredSize(new Dimension(50, 25)); + moveUpChannelFromThirdSensor.addActionListener(this); + moveUpChannelFromThirdSensor.setActionCommand("moveUpChannelThirdSensor"); + selectChannelsThirdSensorPanel.add(moveUpChannelFromThirdSensor, c13ThirdSensor); + + moveDownChannelFromThirdSensor = new JButton(IconManager.imgic79); + moveDownChannelFromThirdSensor.setEnabled(false); + moveDownChannelFromThirdSensor.setPreferredSize(new Dimension(50, 25)); + moveDownChannelFromThirdSensor.addActionListener(this); + moveDownChannelFromThirdSensor.setActionCommand("moveDownChannelThirdSensor"); + selectChannelsThirdSensorPanel.add(moveDownChannelFromThirdSensor, c13ThirdSensor); + + panelSelectChannelsThirdSensor.add(selectChannelsThirdSensorPanel, c04); + jp03.add(panelSelectChannelsThirdSensor, c04); + + jp03.add(new JLabel("Interpreters computation time:"), c04); + c04.gridwidth = GridBagConstraints.REMAINDER; + interpretersCompTime = new JTextField(interpretersCompTimeDefault); + jp03.add(interpretersCompTime, c04); + jp03.add(new JLabel("Voter computation time:"), c04); + c04.gridwidth = GridBagConstraints.REMAINDER; + voterCompTime = new JTextField(voterCompTimeDefault); + jp03.add(voterCompTime, c04); + jp03.add(new JLabel("Timeout voter:"), c04); + c04.gridwidth = GridBagConstraints.REMAINDER; + voterTimeOut = new JTextField(voterTimeOutDefault); + jp03.add(voterTimeOut, c04); + if (currPanel instanceof TMLArchiPanel) { + //Can only secure a mapping + jp1.add("Auto add Pattern", jp03); + } + } + + private void addChannelMainSensor() { + if (listChannelsMainSensor.getSelectedIndex() >= 0) { + String selectedChannel = listChannelsMainSensor.getSelectedItem().toString(); + if (selectedChannel != "" && !selectedChannelsMainSensor.contains(selectedChannel)) { + selectedChannelsMainSensor.addElement(selectedChannel); + listSelectedChannelsMainSensor.setListData(selectedChannelsMainSensor); + } + } + } + + private void removeChannelMainSensor() { + int selectedChannelIndex = listSelectedChannelsMainSensor.getSelectedIndex(); + if (selectedChannelIndex >= 0) { + selectedChannelsMainSensor.remove(selectedChannelIndex); + listSelectedChannelsMainSensor.setListData(selectedChannelsMainSensor); + } + } + + private void moveUpChannelMainSensor() { + int selectedChannelIndex = listSelectedChannelsMainSensor.getSelectedIndex(); + String selectedChannel = listSelectedChannelsMainSensor.getSelectedValue(); + if (selectedChannelIndex > 0) { + selectedChannelsMainSensor.remove(selectedChannelIndex); + selectedChannelsMainSensor.add(selectedChannelIndex-1, selectedChannel); + listSelectedChannelsMainSensor.setListData(selectedChannelsMainSensor); + } + } + + private void moveDownChannelMainSensor() { + int selectedChannelIndex = listSelectedChannelsMainSensor.getSelectedIndex(); + String selectedChannel = listSelectedChannelsMainSensor.getSelectedValue(); + if (selectedChannelIndex < selectedChannelsMainSensor.size()-1 && selectedChannelIndex >= 0) { + selectedChannelsMainSensor.remove(selectedChannelIndex); + selectedChannelsMainSensor.add(selectedChannelIndex+1, selectedChannel); + listSelectedChannelsMainSensor.setListData(selectedChannelsMainSensor); + } + } + + private void addChannelSecondSensor() { + if (listChannelsSecondSensor.getSelectedIndex() >= 0) { + String selectedChannel = listChannelsSecondSensor.getSelectedItem().toString(); + if (selectedChannel != "" && !selectedChannelsSecondSensor.contains(selectedChannel)) { + selectedChannelsSecondSensor.addElement(selectedChannel); + listSelectedChannelsSecondSensor.setListData(selectedChannelsSecondSensor); + } + } + } + + private void removeChannelSecondSensor() { + int selectedChannelIndex = listSelectedChannelsSecondSensor.getSelectedIndex(); + if (selectedChannelIndex >= 0) { + selectedChannelsSecondSensor.remove(selectedChannelIndex); + listSelectedChannelsSecondSensor.setListData(selectedChannelsSecondSensor); + } + } + + private void moveUpChannelSecondSensor() { + int selectedChannelIndex = listSelectedChannelsSecondSensor.getSelectedIndex(); + String selectedChannel = listSelectedChannelsSecondSensor.getSelectedValue(); + if (selectedChannelIndex > 0) { + selectedChannelsSecondSensor.remove(selectedChannelIndex); + selectedChannelsSecondSensor.add(selectedChannelIndex-1, selectedChannel); + listSelectedChannelsSecondSensor.setListData(selectedChannelsSecondSensor); + } + } + + private void moveDownChannelSecondSensor() { + int selectedChannelIndex = listSelectedChannelsSecondSensor.getSelectedIndex(); + String selectedChannel = listSelectedChannelsSecondSensor.getSelectedValue(); + if (selectedChannelIndex < selectedChannelsSecondSensor.size()-1 && selectedChannelIndex >= 0) { + selectedChannelsSecondSensor.remove(selectedChannelIndex); + selectedChannelsSecondSensor.add(selectedChannelIndex+1, selectedChannel); + listSelectedChannelsSecondSensor.setListData(selectedChannelsSecondSensor); + } + } + + private void addChannelThirdSensor() { + if (listChannelsThirdSensor.getSelectedIndex() >= 0) { + String selectedChannel = listChannelsThirdSensor.getSelectedItem().toString(); + if (selectedChannel != "" && !selectedChannelsThirdSensor.contains(selectedChannel)) { + selectedChannelsThirdSensor.addElement(selectedChannel); + listSelectedChannelsThirdSensor.setListData(selectedChannelsThirdSensor); + } + } + } + + private void removeChannelThirdSensor() { + int selectedChannelIndex = listSelectedChannelsThirdSensor.getSelectedIndex(); + if (selectedChannelIndex >= 0) { + selectedChannelsThirdSensor.remove(selectedChannelIndex); + listSelectedChannelsThirdSensor.setListData(selectedChannelsThirdSensor); + } + } + + private void moveUpChannelThirdSensor() { + int selectedChannelIndex = listSelectedChannelsThirdSensor.getSelectedIndex(); + String selectedChannel = listSelectedChannelsThirdSensor.getSelectedValue(); + if (selectedChannelIndex > 0) { + selectedChannelsThirdSensor.remove(selectedChannelIndex); + selectedChannelsThirdSensor.add(selectedChannelIndex-1, selectedChannel); + listSelectedChannelsThirdSensor.setListData(selectedChannelsThirdSensor); + } + } + + private void moveDownChannelThirdSensor() { + int selectedChannelIndex = listSelectedChannelsThirdSensor.getSelectedIndex(); + String selectedChannel = listSelectedChannelsThirdSensor.getSelectedValue(); + if (selectedChannelIndex < selectedChannelsThirdSensor.size()-1 && selectedChannelIndex >= 0) { + selectedChannelsThirdSensor.remove(selectedChannelIndex); + selectedChannelsThirdSensor.add(selectedChannelIndex+1, selectedChannel); + listSelectedChannelsThirdSensor.setListData(selectedChannelsThirdSensor); + } + } + protected void initComponents() { jp1 = GraphicLib.createTabbedPane();//new JTabbedPane(); @@ -352,29 +786,89 @@ public class JDialogProverifVerification extends JDialog implements ActionListen autoStrongAuth = new JCheckBox("Add security (Strong Authenticity)"); autoStrongAuth.setEnabled(false); jp02.add(autoStrongAuth, c01); - autoStrongAuth.addActionListener(this); + listIgnoredChannelsToAddSec = new JList<String>(ignoredChannelsToAddSec); + JPanel panelListChannelsAddSec = new JPanel(); + panelListChannelsAddSec.setPreferredSize(new Dimension(250, 150)); + GridBagConstraints cListChannelsAddSec = new GridBagConstraints(); + cListChannelsAddSec.gridwidth = 1; + cListChannelsAddSec.gridheight = 1; + cListChannelsAddSec.fill= GridBagConstraints.BOTH; + listIgnoredChannelsToAddSec.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + listIgnoredChannelsToAddSec.addListSelectionListener(this); + + JScrollPane scrollPane1ChannelsToAddSec = new JScrollPane(listIgnoredChannelsToAddSec); + scrollPane1ChannelsToAddSec.setPreferredSize(new Dimension(250, 150)); + panelListChannelsAddSec.add(scrollPane1ChannelsToAddSec, BorderLayout.WEST); + + JPanel buttonPanelChannelsToAddSec = new JPanel(); + GridBagConstraints cButtonChannelsToAddSec = new GridBagConstraints(); + cButtonChannelsToAddSec.gridwidth = GridBagConstraints.REMAINDER; + cButtonChannelsToAddSec.gridheight = 1; + + addAllChannelsToAddSec = new JButton(IconManager.imgic50); + addAllChannelsToAddSec.setPreferredSize(new Dimension(50, 25)); + addAllChannelsToAddSec.setEnabled(false); + addAllChannelsToAddSec.addActionListener(this); + addAllChannelsToAddSec.setActionCommand("addAllChannelsToAddSec"); + buttonPanelChannelsToAddSec.add(addAllChannelsToAddSec, cButtonChannelsToAddSec); + + addOneChannelToAddSec = new JButton(IconManager.imgic48); + addOneChannelToAddSec.setPreferredSize(new Dimension(50, 25)); + addOneChannelToAddSec.setEnabled(false); + addOneChannelToAddSec.addActionListener(this); + addOneChannelToAddSec.setActionCommand("addOneChannelToAddSec"); + buttonPanelChannelsToAddSec.add(addOneChannelToAddSec, cButtonChannelsToAddSec); + + buttonPanelChannelsToAddSec.add(new JLabel(" "), cButtonChannelsToAddSec); + + removeOneChannelToAddSec = new JButton(IconManager.imgic46); + removeOneChannelToAddSec.setEnabled(false); + removeOneChannelToAddSec.addActionListener(this); + removeOneChannelToAddSec.setPreferredSize(new Dimension(50, 25)); + removeOneChannelToAddSec.setActionCommand("removeOneChannelToAddSec"); + buttonPanelChannelsToAddSec.add(removeOneChannelToAddSec, cButtonChannelsToAddSec); + + removeAllChannelsToAddSec = new JButton(IconManager.imgic44); + removeAllChannelsToAddSec.setEnabled(false); + removeAllChannelsToAddSec.addActionListener(this); + removeAllChannelsToAddSec.setPreferredSize(new Dimension(50, 25)); + removeAllChannelsToAddSec.setActionCommand("removeAllChannelsToAddSec"); + buttonPanelChannelsToAddSec.add(removeAllChannelsToAddSec, cButtonChannelsToAddSec); + buttonPanelChannelsToAddSec.setPreferredSize(new Dimension(50, 150)); + panelListChannelsAddSec.add(buttonPanelChannelsToAddSec, cListChannelsAddSec); + + listSelectedChannelsToAddSec = new JList<String>(selectedChannelsToAddSec); + listSelectedChannelsToAddSec.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + listSelectedChannelsToAddSec.addListSelectionListener(this); + JScrollPane scrollPane2ChannelsToAddSec = new JScrollPane(listSelectedChannelsToAddSec); + scrollPane2ChannelsToAddSec.setPreferredSize(new Dimension(250, 150)); + panelListChannelsAddSec.add(scrollPane2ChannelsToAddSec, BorderLayout.CENTER); + panelListChannelsAddSec.setPreferredSize(new Dimension(600, 175)); + panelListChannelsAddSec.setMinimumSize(new Dimension(600, 175)); + c01.gridheight = 10; + jp02.add(panelListChannelsAddSec, c01); + addHSM = new JCheckBox("Add HSM to component:"); addHSM.addActionListener(this); addHSM.setEnabled(false); jp02.add(addHSM, c01); - listIgnored = new JList<String>(ignoredTasks); listPanel = new JPanel(); - listPanel.setPreferredSize(new Dimension(250, 200)); + listPanel.setPreferredSize(new Dimension(250, 150)); GridBagConstraints c02 = new GridBagConstraints(); c02.gridwidth=1; c02.gridheight=1; c02.fill= GridBagConstraints.BOTH; - listIgnored.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION ); + listIgnored.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); listIgnored.addListSelectionListener(this); JScrollPane scrollPane1 = new JScrollPane(listIgnored); - scrollPane1.setPreferredSize(new Dimension(250, 200)); + scrollPane1.setPreferredSize(new Dimension(250, 150)); listPanel.add(scrollPane1, BorderLayout.WEST); JPanel buttonPanel = new JPanel(); @@ -416,7 +910,7 @@ public class JDialogProverifVerification extends JDialog implements ActionListen allIgnored.setActionCommand("allIgnored"); buttonPanel.add(allIgnored, c13); listPanel.add(buttonPanel, c02); - buttonPanel.setPreferredSize(new Dimension(50, 200)); + buttonPanel.setPreferredSize(new Dimension(50, 150)); allIgnored.setEnabled(false); @@ -426,10 +920,10 @@ public class JDialogProverifVerification extends JDialog implements ActionListen listSelected.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); listSelected.addListSelectionListener(this); JScrollPane scrollPane2 = new JScrollPane(listSelected); - scrollPane2.setPreferredSize(new Dimension(250, 200)); + scrollPane2.setPreferredSize(new Dimension(250, 150)); listPanel.add(scrollPane2, BorderLayout.CENTER); - listPanel.setPreferredSize(new Dimension(600, 250)); - listPanel.setMinimumSize(new Dimension(600, 250)); + listPanel.setPreferredSize(new Dimension(600, 175)); + listPanel.setMinimumSize(new Dimension(600, 175)); c01.gridheight = 10; jp02.add(listPanel, c01); c02.gridheight = 1; @@ -609,6 +1103,7 @@ public class JDialogProverifVerification extends JDialog implements ActionListen //Can only secure a mapping jp1.add("Automated Security", jp02); } + panelAutoPattern(); c.add(jp1, BorderLayout.NORTH); c.add(jp2, BorderLayout.SOUTH); @@ -672,6 +1167,84 @@ public class JDialogProverifVerification extends JDialog implements ActionListen setButtons(); } + private void addAllChannelsToAddSec() { + for(String ch : ignoredChannelsToAddSec) { + String toAdd = ch; + if (autoConf.isSelected() || autoStrongAuth.isSelected() || autoWeakAuth.isSelected()) { + toAdd += ":"; + if (autoConf.isSelected()) { + toAdd += " " + ADD_CONFIDENTIALITY + " +"; + } + if (autoStrongAuth.isSelected()) { + toAdd += " " + ADD_STRONG_AUTHENTICITY + " +"; + } else if (autoWeakAuth.isSelected()) { + toAdd += " " + ADD_WEAK_AUTHENTICITY + " +"; + } + toAdd = toAdd.substring(0, toAdd.length() - 2); + } + selectedChannelsToAddSec.add(toAdd); + } + ignoredChannelsToAddSec.removeAllElements(); + listIgnoredChannelsToAddSec.setListData(ignoredChannelsToAddSec); + listSelectedChannelsToAddSec.setListData(selectedChannelsToAddSec); + setButtons(); + } + + private void removeAllChannelsToAddSec() { + for(String ch : selectedChannelsToAddSec) { + ignoredChannelsToAddSec.add(ch.split(": ")[0]); + } + selectedChannelsToAddSec.removeAllElements(); + listIgnoredChannelsToAddSec.setListData(ignoredChannelsToAddSec); + listSelectedChannelsToAddSec.setListData(selectedChannelsToAddSec); + setButtons(); + } + + private void addOneChannelToAddSec() { + int[] list = listIgnoredChannelsToAddSec.getSelectedIndices(); + Vector<String> v = new Vector<String>(); + String o; + + for (int i = 0; i < list.length; i++) { + o = ignoredChannelsToAddSec.elementAt(list[i]); + String toAdd = o; + if (autoConf.isSelected() || autoStrongAuth.isSelected() || autoWeakAuth.isSelected()) { + toAdd += ":"; + if (autoConf.isSelected()) { + toAdd += " " + ADD_CONFIDENTIALITY + " +"; + } + if (autoStrongAuth.isSelected()) { + toAdd += " " + ADD_STRONG_AUTHENTICITY + " +"; + } else if (autoWeakAuth.isSelected()) { + toAdd += " " + ADD_WEAK_AUTHENTICITY + " +"; + } + toAdd = toAdd.substring(0, toAdd.length() - 2); + } + selectedChannelsToAddSec.addElement(toAdd); + v.addElement(o); + } + ignoredChannelsToAddSec.removeAll(v); + listIgnoredChannelsToAddSec.setListData(ignoredChannelsToAddSec); + listSelectedChannelsToAddSec.setListData(selectedChannelsToAddSec); + setButtons(); + } + + private void removeOneChannelToAddSec() { + int[] list = listSelectedChannelsToAddSec.getSelectedIndices(); + Vector<String> v = new Vector<String>(); + String o; + + for (int i = 0; i < list.length; i++) { + o = selectedChannelsToAddSec.elementAt(list[i]); + ignoredChannelsToAddSec.addElement(o.split(": ")[0]); + v.addElement(o); + } + selectedChannelsToAddSec.removeAll(v); + listIgnoredChannelsToAddSec.setListData(ignoredChannelsToAddSec); + listSelectedChannelsToAddSec.setListData(selectedChannelsToAddSec); + setButtons(); + } + @Override public void actionPerformed(ActionEvent evt) { String command = evt.getActionCommand(); @@ -762,6 +1335,38 @@ public class JDialogProverifVerification extends JDialog implements ActionListen allValidated(); } else if (command.equals("allIgnored")) { allIgnored(); + } else if (command.equals("addAllChannelsToAddSec")) { + addAllChannelsToAddSec(); + } else if (command.equals("removeAllChannelsToAddSec")) { + removeAllChannelsToAddSec(); + } else if (command.equals("addOneChannelToAddSec")) { + addOneChannelToAddSec(); + } else if (command.equals("removeOneChannelToAddSec")) { + removeOneChannelToAddSec(); + } else if (command.equals("addChannelMainSensor")) { + addChannelMainSensor(); + } else if (command.equals("removeChannelMainSensor")) { + removeChannelMainSensor(); + } else if (command.equals("moveUpChannelMainSensor")) { + moveUpChannelMainSensor(); + } else if (command.equals("moveDownChannelMainSensor")) { + moveDownChannelMainSensor(); + } else if (command.equals("addChannelSecondSensor")) { + addChannelSecondSensor(); + } else if (command.equals("removeChannelSecondSensor")) { + removeChannelSecondSensor(); + } else if (command.equals("moveUpChannelSecondSensor")) { + moveUpChannelSecondSensor(); + } else if (command.equals("moveDownChannelSecondSensor")) { + moveDownChannelSecondSensor(); + } else if (command.equals("addChannelThirdSensor")) { + addChannelThirdSensor(); + } else if (command.equals("removeChannelThirdSensor")) { + removeChannelThirdSensor(); + } else if (command.equals("moveUpChannelThirdSensor")) { + moveUpChannelThirdSensor(); + } else if (command.equals("moveDownChannelThirdSensor")) { + moveDownChannelThirdSensor(); } if (evt.getSource() == autoConf || evt.getSource() == autoSec || evt.getSource() == autoMapKeys || evt.getSource() == autoWeakAuth || evt.getSource()==addHSM) { //autoWeakAuth.setEnabled(autoConf.isSelected()); @@ -778,13 +1383,102 @@ public class JDialogProverifVerification extends JDialog implements ActionListen autoConf.setSelected(false); autoWeakAuth.setSelected(false); autoStrongAuth.setSelected(false); + addHSM.setSelected(false); + + autoConf.setEnabled(false); + autoWeakAuth.setEnabled(false); + autoStrongAuth.setEnabled(false); + allIgnored(); + removeAllChannelsToAddSec(); + } + + if (!autoWeakAuth.isSelected()) { + autoStrongAuth.setSelected(false); + } + } + if (evt.getSource() == autoSec || evt.getSource() == autoConf || evt.getSource() == autoWeakAuth) { + if (autoSec.isSelected() && (autoWeakAuth.isSelected() || autoConf.isSelected())) { + addAllChannelsToAddSec.setEnabled(true); + addOneChannelToAddSec.setEnabled(true); + removeAllChannelsToAddSec.setEnabled(true); + removeOneChannelToAddSec.setEnabled(true); + } else { + addAllChannelsToAddSec.setEnabled(false); + addOneChannelToAddSec.setEnabled(false); + removeAllChannelsToAddSec.setEnabled(false); + removeOneChannelToAddSec.setEnabled(false); } } + if (evt.getSource() == custom) { encTime.setEnabled(custom.isSelected()); decTime.setEnabled(custom.isSelected()); secOverhead.setEnabled(custom.isSelected()); } + if (evt.getSource() == selectTwoSensors) { + addChannelFromSecondSensor.setEnabled(selectTwoSensors.isSelected()); + removeChannelFromSecondSensor.setEnabled(selectTwoSensors.isSelected()); + moveUpChannelFromSecondSensor.setEnabled(selectTwoSensors.isSelected()); + moveDownChannelFromSecondSensor.setEnabled(selectTwoSensors.isSelected()); + listCompSelectSecondSensor.setEnabled(selectTwoSensors.isSelected()); + listChannelsSecondSensor.setEnabled(selectTwoSensors.isSelected()); + + addChannelFromThirdSensor.setEnabled(selectTwoSensors.isSelected()); + removeChannelFromThirdSensor.setEnabled(selectTwoSensors.isSelected()); + moveUpChannelFromThirdSensor.setEnabled(selectTwoSensors.isSelected()); + moveDownChannelFromThirdSensor.setEnabled(selectTwoSensors.isSelected()); + listCompSelectThirdSensor.setEnabled(selectTwoSensors.isSelected()); + listChannelsThirdSensor.setEnabled(selectTwoSensors.isSelected()); + } + if (evt.getSource() == listCompSelectReceiver || evt.getSource() == listCompSelectMainSensor) { + int selectedReceiverIndex = listCompSelectReceiver.getSelectedIndex(); + int selectedMainSensorIndex = listCompSelectMainSensor.getSelectedIndex(); + listChannelsMainSensor.removeAllItems(); + if (selectedMainSensorIndex >= 0 && selectedReceiverIndex >= 0 && selectedMainSensorIndex != selectedReceiverIndex) { + allChannelsMainSensor = getListChannelsBetweenTwoTasks(allTasksFullName.get(selectedMainSensorIndex), allTasksFullName.get(selectedReceiverIndex)); + + for(String chName : allChannelsMainSensor) { + listChannelsMainSensor.addItem(chName); + } + } + listChannelsMainSensor.setSelectedItem(-1); + listChannelsMainSensor.addActionListener(this); + selectedChannelsMainSensor.removeAllElements(); + listSelectedChannelsMainSensor.setListData(selectedChannelsMainSensor); + } + + if (evt.getSource() == listCompSelectReceiver || evt.getSource() == listCompSelectSecondSensor) { + int selectedReceiverIndex = listCompSelectReceiver.getSelectedIndex(); + int selectedSecondSensorIndex = listCompSelectSecondSensor.getSelectedIndex(); + listChannelsSecondSensor.removeAllItems(); + if (selectedReceiverIndex >= 0 && selectedSecondSensorIndex >= 0 && selectedSecondSensorIndex!=selectedReceiverIndex) { + allChannelsSecondSensor = getListChannelsBetweenTwoTasks(allTasksFullName.get(selectedSecondSensorIndex), allTasksFullName.get(selectedReceiverIndex)); + + for(String chName : allChannelsSecondSensor) { + listChannelsSecondSensor.addItem(chName); + } + } + listChannelsSecondSensor.setSelectedItem(-1); + listChannelsSecondSensor.addActionListener(this); + selectedChannelsSecondSensor.removeAllElements(); + listSelectedChannelsSecondSensor.setListData(selectedChannelsSecondSensor); + } + if (evt.getSource() == listCompSelectReceiver || evt.getSource() == listCompSelectThirdSensor) { + int selectedReceiverIndex = listCompSelectReceiver.getSelectedIndex(); + int selectedThirdSensorIndex = listCompSelectThirdSensor.getSelectedIndex(); + listChannelsThirdSensor.removeAllItems(); + if (selectedReceiverIndex >= 0 && selectedThirdSensorIndex >= 0 && selectedThirdSensorIndex!=selectedReceiverIndex) { + allChannelsThirdSensor = getListChannelsBetweenTwoTasks(allTasksFullName.get(selectedThirdSensorIndex), allTasksFullName.get(selectedReceiverIndex)); + + for(String chName : allChannelsThirdSensor) { + listChannelsThirdSensor.addItem(chName); + } + } + listChannelsThirdSensor.setSelectedItem(-1); + listChannelsThirdSensor.addActionListener(this); + selectedChannelsThirdSensor.removeAllElements(); + listSelectedChannelsThirdSensor.setListData(selectedChannelsThirdSensor); + } } } @@ -857,176 +1551,260 @@ public class JDialogProverifVerification extends JDialog implements ActionListen TraceManager.addDev("Thread started"); File testFile; Map<String, List<String>> selectedCpuTasks = new HashMap<String, java.util.List<String>>(); - try { - if (jp1.getSelectedIndex() == 1) { - if (autoSec.isSelected()){ - encCC = encTime.getText(); - decCC = decTime.getText(); - secOv = secOverhead.getText(); - TMLMapping map; - if (addHSM.isSelected() && selectedTasks.size()>0) { - - - for (String task : selectedTasks) { - String cpu = taskCpuMap.get(task); - if (selectedCpuTasks.containsKey(cpu)) { - selectedCpuTasks.get(cpu).add(task); - } else { - ArrayList<String> tasks = new ArrayList<String>(); - tasks.add(task); - selectedCpuTasks.put(cpu, tasks); - } - } - //mgui.gtm.addHSM(mgui, selectedCpuTasks); - } - if (autoConf.isSelected() || autoWeakAuth.isSelected() || autoStrongAuth.isSelected()) { - if (custom.isSelected()) { - map = mgui.gtm.autoSecure(mgui, encCC, secOv, decCC, autoConf.isSelected(), autoWeakAuth.isSelected(), - autoStrongAuth.isSelected(), selectedCpuTasks); - } else { - map = mgui.gtm.autoSecure(mgui, "100", "0", "100", autoConf.isSelected(), - autoWeakAuth.isSelected(), autoStrongAuth.isSelected(), selectedCpuTasks); - } - } - } - else if (autoMapKeys.isSelected()) { - mgui.gtm.autoMapKeys(); + int currentPosY = 0; + int stepY = 10; + if (jp1.getSelectedIndex() == 2) { + interpretersCompTimeDefault = interpretersCompTime.getText(); + voterCompTimeDefault = voterCompTime.getText(); + voterTimeOutDefault = voterTimeOut.getText(); + jta.removeAll(); + boolean findErr = false; + if (listCompSelectReceiver.getSelectedIndex() < 0) { + JLabel label = new JLabel("ERROR: Receiver not selected"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (listCompSelectMainSensor.getSelectedIndex() < 0) { + JLabel label = new JLabel("ERROR: Main Sensor not selected"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (listCompSelectMainSensor.getSelectedItem() == listCompSelectReceiver.getSelectedItem()) { + JLabel label = new JLabel("ERROR: Receiver and Main Sensor must be different"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (selectedChannelsMainSensor.size() == 0) { + JLabel label = new JLabel("ERROR: No Channel of main sensor is selected"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (selectTwoSensors.isSelected() && listCompSelectSecondSensor.getSelectedIndex() < 0) { + JLabel label = new JLabel("ERROR: Second Sensor not selected"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (selectTwoSensors.isSelected() && selectedChannelsSecondSensor.size() == 0) { + JLabel label = new JLabel("ERROR: No Channel of second sensor is selected"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (selectTwoSensors.isSelected() && listCompSelectThirdSensor.getSelectedIndex() < 0) { + JLabel label = new JLabel("ERROR: Third Sensor not selected"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (selectTwoSensors.isSelected() && selectedChannelsThirdSensor.size() == 0) { + JLabel label = new JLabel("ERROR: No Channel of third sensor is selected"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (selectTwoSensors.isSelected() && (selectedChannelsThirdSensor.size() != selectedChannelsSecondSensor.size() || selectedChannelsThirdSensor.size() != selectedChannelsMainSensor.size() || selectedChannelsMainSensor.size() != selectedChannelsSecondSensor.size())) { + JLabel label = new JLabel("ERROR: The number of selected channels is not the same for the 3 sensors"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (selectTwoSensors.isSelected() && listCompSelectMainSensor.getSelectedItem() == listCompSelectSecondSensor.getSelectedItem()) { + JLabel label = new JLabel("ERROR: Main and second Sensors must be different"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (selectTwoSensors.isSelected() && listCompSelectSecondSensor.getSelectedItem() == listCompSelectThirdSensor.getSelectedItem()) { + JLabel label = new JLabel("ERROR: Second and third Sensors must be different"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (selectTwoSensors.isSelected() && listCompSelectMainSensor.getSelectedItem() == listCompSelectThirdSensor.getSelectedItem()) { + JLabel label = new JLabel("ERROR: Main and third Sensors must be different"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (selectTwoSensors.isSelected() && listCompSelectReceiver.getSelectedItem() == listCompSelectSecondSensor.getSelectedItem()) { + JLabel label = new JLabel("ERROR: Receiver and second Sensor must be different"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (selectTwoSensors.isSelected() && listCompSelectReceiver.getSelectedItem() == listCompSelectThirdSensor.getSelectedItem()) { + JLabel label = new JLabel("ERROR: Receiver and third Sensor must be different"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); + currentPosY += stepY; + findErr = true; + } + if (!findErr) { + selectedSensors.put(listCompSelectMainSensor.getSelectedItem().toString(), selectedChannelsMainSensor); + if (selectTwoSensors.isSelected()) { + selectedSensors.put(listCompSelectSecondSensor.getSelectedItem().toString(), selectedChannelsSecondSensor); + selectedSensors.put(listCompSelectThirdSensor.getSelectedItem().toString(), selectedChannelsThirdSensor); } - - jta.removeAll(); - JLabel label = new JLabel("Security Generation Complete"); - label.setAlignmentX(Component.LEFT_ALIGNMENT); - this.jta.add(label, this.createGbc(0)); - mode = NOT_STARTED; + mgui.gtm.addPattern(mgui, selectedSensors, listCompSelectReceiver.getSelectedItem().toString(), interpretersCompTimeDefault, voterCompTimeDefault, voterTimeOutDefault); + JLabel label = new JLabel("Pattern Generation Complete"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(currentPosY)); } - else { - - + mode = NOT_STARTED; + } else { + try { + if (jp1.getSelectedIndex() == 1) { + if (autoSec.isSelected()){ + encCC = encTime.getText(); + decCC = decTime.getText(); + secOv = secOverhead.getText(); + TMLMapping map; + if (addHSM.isSelected() && selectedTasks.size()>0) { + + + for (String task : selectedTasks) { + String cpu = taskCpuMap.get(task); + if (selectedCpuTasks.containsKey(cpu)) { + selectedCpuTasks.get(cpu).add(task); + } else { + ArrayList<String> tasks = new ArrayList<String>(); + tasks.add(task); + selectedCpuTasks.put(cpu, tasks); + } + } + //mgui.gtm.addHSM(mgui, selectedCpuTasks); + } + if (autoConf.isSelected() || autoWeakAuth.isSelected() || autoStrongAuth.isSelected()) { + /*if (custom.isSelected()) { + map = mgui.gtm.autoSecure(mgui, encCC, secOv, decCC, autoConf.isSelected(), autoWeakAuth.isSelected(), + autoStrongAuth.isSelected(), selectedCpuTasks); + } else { + map = mgui.gtm.autoSecure(mgui, "100", "0", "100", autoConf.isSelected(), + autoWeakAuth.isSelected(), autoStrongAuth.isSelected(), selectedCpuTasks); + }*/ + mgui.gtm.autoSecure(mgui, encCC, secOv, decCC, selectedChannelsToAddSec, selectedCpuTasks); + } + } + else if (autoMapKeys.isSelected()) { + mgui.gtm.autoMapKeys(); + } + + jta.removeAll(); + JLabel label = new JLabel("Security Generation Complete"); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(0)); + mode = NOT_STARTED; + } + else { + testGo(); + pathCode = code1.getText().trim(); + SpecConfigTTool.checkAndCreateProverifDir(pathCode); - testGo(); - pathCode = code1.getText().trim(); + pathCode += "pvspec"; + testFile = new File(pathCode); - SpecConfigTTool.checkAndCreateProverifDir(pathCode); - pathCode += "pvspec"; - testFile = new File(pathCode); + File dir = testFile.getParentFile(); + if (dir == null || !dir.exists()) { + mode = STOPPED; + setButtons(); + throw new ProVerifVerificationException("Error: invalid file: " + pathCode); + } - File dir = testFile.getParentFile(); - if (dir == null || !dir.exists()) { - mode = STOPPED; - setButtons(); - throw new ProVerifVerificationException("Error: invalid file: " + pathCode); - } + if (testFile.exists()) { + // FIXME Raise error if modified since last + TraceManager.addDev("FILE EXISTS!!!"); + } - if (testFile.exists()) { - // FIXME Raise error if modified since last - TraceManager.addDev("FILE EXISTS!!!"); - } - + if (!mgui.gtm.generateProVerifFromAVATAR( + pathCode, + stateReachabilityAll.isSelected() ? REACHABILITY_ALL : + stateReachabilitySelected.isSelected() ? REACHABILITY_SELECTED : REACHABILITY_NONE, + typedLanguage.isSelected(), + privateChannelDup.isSelected(), + loopLimit.getText()) + ) { + throw new ProVerifVerificationException("Could not generate proverif code"); + } - if (!mgui.gtm.generateProVerifFromAVATAR( - pathCode, - stateReachabilityAll.isSelected() ? REACHABILITY_ALL : - stateReachabilitySelected.isSelected() ? REACHABILITY_SELECTED : REACHABILITY_NONE, - typedLanguage.isSelected(), - privateChannelDup.isSelected(), - loopLimit.getText()) - ) { - mode = NOT_STARTED; setButtons(); - throw new ProVerifVerificationException("Could not generate proverif code"); - } + String cmd = exe2.getText().trim(); - String cmd = exe2.getText().trim(); - /*File proverifVerifier= new File(cmd); - if (!proverifVerifier.exists()) { - mode = NOT_STARTED; setButtons(); - throw new ProVerifVerificationException(cmd + ": Proverif prover not found"); - }*/ - - // Must test if this command corresponds to ProVerif - this.rshc = new RshClient(hostProVerif); - this.rshc.setCmd(cmd + " -help"); - this.rshc.sendExecuteCommandRequest(); - RshClientReader readerHelp = this.rshc.getDataReaderFromProcess(); - BufferedReader bReader = new BufferedReader(readerHelp); - String str; - boolean foundProverif = false; - while ((str = bReader.readLine()) != null) { - if (str.contains("Proverif")) { - foundProverif = true; + if (this.typedLanguage.isSelected()) { + cmd += " -in pitype "; + } else { + cmd += " -in pi "; } - } - - if (!foundProverif) { - mode = NOT_STARTED; setButtons(); - throw new ProVerifVerificationException("\"" + cmd + "\" refers to an invalid Proverif prover"); - } - - if (this.typedLanguage.isSelected()) { - cmd += " -in pitype "; - } else { - cmd += " -in pi "; - } + cmd += pathCode; + TraceManager.addDev("Executing command:" + cmd); - cmd += pathCode; - TraceManager.addDev("Executing command:" + cmd); + testGo(); - testGo(); + this.rshc = new RshClient(hostProVerif); + this.rshc.setCmd(cmd); + this.rshc.sendExecuteCommandRequest(); + RshClientReader reader = this.rshc.getDataReaderFromProcess(); - this.rshc = new RshClient(hostProVerif); - this.rshc.setCmd(cmd); - this.rshc.sendExecuteCommandRequest(); - RshClientReader reader = this.rshc.getDataReaderFromProcess(); + if (this.pvoa == null) { + this.pvoa = mgui.gtm.getProVerifOutputAnalyzer(); + this.pvoa.addListener(this); + } + //try { + this.pvoa.analyzeOutput(reader, typedLanguage.isSelected()); + /*} catch (Exception e) { + TraceManager.addDev("Traces could not be analyzed: " + e.getMessage()); + }*/ + mgui.modelBacktracingProVerif(pvoa); - if (this.pvoa == null) { - this.pvoa = mgui.gtm.getProVerifOutputAnalyzer(); - this.pvoa.addListener(this); - } - //try { - this.pvoa.analyzeOutput(reader, typedLanguage.isSelected()); - /*} catch (Exception e) { - TraceManager.addDev("Traces could not be analyzed: " + e.getMessage()); - }*/ + if (drawAvatarDesign != null) { + if (drawAvatarDesign.isSelected()) { + mgui.drawAvatarSpecification(mgui.gtm.getAvatarSpecification()); + } + } - mgui.modelBacktracingProVerif(pvoa); + mode = NOT_STARTED; - if (drawAvatarDesign != null) { - if (drawAvatarDesign.isSelected()) { - mgui.drawAvatarSpecification(mgui.gtm.getAvatarSpecification()); - } } - + } catch (LauncherException | ProVerifVerificationException le) { + JLabel label = new JLabel("Error: " + le.getMessage()); + label.setAlignmentX(Component.LEFT_ALIGNMENT); + this.jta.add(label, this.createGbc(0)); + mode = STOPPED; + } catch (InterruptedException ie) { mode = NOT_STARTED; - + } catch (FileException e) { + System.err.println(e.getMessage() + " : Can't generate proverif file."); + } catch (Exception e) { + mode = STOPPED; + TraceManager.addDev("General exception in ProVerif proof or trace generation: " + e.getMessage()); + //throw e; } - } catch (LauncherException | ProVerifVerificationException le) { - this.jta.removeAll(); - labelError = new JLabel("Error: " + le.getMessage()); - labelError.setAlignmentX(Component.LEFT_ALIGNMENT); - this.jta.add(labelError, this.createGbc(0)); - mode = NOT_STARTED; - } catch (InterruptedException ie) { - TraceManager.addDev("Proverif thread interrupted: " + ie.getMessage()); - mode = NOT_STARTED; - } catch (FileException e) { - TraceManager.addDev("Proverif file couldnot be generated: " + e.getMessage()); - System.err.println(e.getMessage() + " : Can't generate proverif file."); - } catch (Exception e) { - mode = STOPPED; - TraceManager.addDev("General exception in ProVerif proof or trace generation: " + e.getMessage()); - //throw e; } - - setButtons(); - } protected void setButtons() { diff --git a/ttool/src/test/java/cli/CLIPatternHandlingTest.java b/ttool/src/test/java/cli/CLIPatternHandlingTest.java new file mode 100644 index 0000000000000000000000000000000000000000..5ee0b0ad13cb3b62dab5ea7939ff6267e43221e1 --- /dev/null +++ b/ttool/src/test/java/cli/CLIPatternHandlingTest.java @@ -0,0 +1,249 @@ +/**Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + * /** + * Class CLIPatternHandlingTest + * Creation: 13/11/2023 + * @version 1.0 13/11/2023 + * @author Jawher JERRAY + * @see + */ + +package cli; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import common.ConfigurationTTool; +import common.SpecConfigTTool; +import graph.AUTGraph; +import graph.AUTTransition; +import myutil.Conversion; +import myutil.TraceManager; +import org.junit.Test; +import test.AbstractTest; +import tmltranslator.compareTMLTest.CompareTML; +import tmltranslator.compareTMLTest.CompareTMAP; +import tmltranslator.TMLMapping; +import tmltranslator.TMLMappingTextSpecification; +import tmltranslator.TMLSyntaxChecking; +import tmltranslator.TMLError; +import cli.PatternHandling; + + +public class CLIPatternHandlingTest extends AbstractTest implements InterpreterOutputInterface { + + private final static String PATH_TO_TEST_FILE = "cli/testPatternHandling/"; + private static final String PATH_PATTERNS [] = {PATH_TO_TEST_FILE + "tmr/"}; + private static final String PATH_CLI_TO_CREATE_PATTERNS [] = {"cli/create-tmr"}; + + private static final String PATH_CLI_TO_CONFIGURATE_TMR_IN_MODELS [] = {"cli/configurate-tmr-for-modelWithOneSensor", "cli/configurate-tmr-for-modelWithThreeSensors"}; + private static final String PATH_CLI_TO_APPLY_TMR_IN_MODELS [] = {"cli/apply-tmr-in-modelWithOneSensor", "cli/apply-tmr-in-modelWithThreeSensors"}; + private static final String EXPECTED_MODELS_AFTER_INTEGRATING_TMR_TMAP [] = {"expected/modelWithOneSensorIntegTMR.tmap", "expected/modelWithThreeSensorsIntegTMR.tmap"}; + private static final String EXPECTED_MODELS_AFTER_INTEGRATING_TMR_TARCHI [] = {"expected/modelWithOneSensorIntegTMR.tarchi", "expected/modelWithThreeSensorsIntegTMR.tarchi"}; + private static final String EXPECTED_MODELS_AFTER_INTEGRATING_TMR_TML [] = {"expected/modelWithOneSensorIntegTMR.tml", "expected/modelWithThreeSensorsIntegTMR.tml"}; + + private static final String OBTAINED_MODELS_PATH = "resources/test/cli/testPatternHandling/tmr/"; + private static final String OBTAINED_MODELS_AFTER_INTEGRATING_TMR_TMAP [] = {"modelsAfterIntegratingTMR/modelWithOneSensorIntegTMR.tmap", "modelsAfterIntegratingTMR/modelWithThreeSensorsIntegTMR.tmap"}; + private static final String OBTAINED_MODELS_AFTER_INTEGRATING_TMR_TARCHI [] = {"modelsAfterIntegratingTMR/modelWithOneSensorIntegTMR.tarchi", "modelsAfterIntegratingTMR/modelWithThreeSensorsIntegTMR.tarchi"}; + private static final String OBTAINED_MODELS_AFTER_INTEGRATING_TMR_TML [] = {"modelsAfterIntegratingTMR/modelWithOneSensorIntegTMR.tml", "modelsAfterIntegratingTMR/modelWithThreeSensorsIntegTMR.tml"}; + + private static final String PATH_CLI_CONFIGURATION_WITH_ERRORS_TMR_IN_MODELS [] = {"cli/incomplete-configuration-tmr-for-modelWithOneSensor"}; + + private StringBuilder outputResult; + private List<String> errorOutputs = new ArrayList<String>(); + + + public CLIPatternHandlingTest() { + // + } + + public void exit(int reason) { + TraceManager.addDev("Exit reason=" + reason); + assertTrue(reason == 0); + } + + public void printError(String error) { + TraceManager.addDev("Error=" + error); + errorOutputs.add(error); + } + + public void print(String s) { + TraceManager.addDev("info from interpreter:" + s); + outputResult.append(s); + } + + @Test + public void testIntegratingTMR() throws Exception { + String filePathCreateTMR = getBaseResourcesDir() + PATH_PATTERNS[0] + PATH_CLI_TO_CREATE_PATTERNS[0]; + String script; + outputResult = new StringBuilder(); + + File f = new File(filePathCreateTMR); + assertTrue(myutil.FileUtils.checkFileForOpen(f)); + + script = myutil.FileUtils.loadFileData(f); + + assertTrue(script.length() > 0); + + boolean show = false; + Interpreter interpret = new Interpreter(script, (InterpreterOutputInterface)this, show); + interpret.interpret(); + + for (int i = 0; i < PATH_CLI_TO_CONFIGURATE_TMR_IN_MODELS.length; i++) { + String filePathConfigModel = getBaseResourcesDir() + PATH_PATTERNS[0] + PATH_CLI_TO_CONFIGURATE_TMR_IN_MODELS[i]; + String scriptConfig; + outputResult = new StringBuilder(); + File fConfig = new File(filePathConfigModel); + assertTrue(myutil.FileUtils.checkFileForOpen(fConfig)); + scriptConfig = myutil.FileUtils.loadFileData(fConfig); + assertTrue(scriptConfig.length() > 0); + Interpreter interpretConfigModel = new Interpreter(scriptConfig, (InterpreterOutputInterface)this, false); + interpretConfigModel.interpret(); + + String filePathApplyToModel = getBaseResourcesDir() + PATH_PATTERNS[0] + PATH_CLI_TO_APPLY_TMR_IN_MODELS[i]; + String scriptApplyToModel; + outputResult = new StringBuilder(); + File fApplyToModel = new File(filePathApplyToModel); + assertTrue(myutil.FileUtils.checkFileForOpen(fApplyToModel)); + scriptApplyToModel = myutil.FileUtils.loadFileData(fApplyToModel); + assertTrue(scriptApplyToModel.length() > 0); + Interpreter interpretApplyToModel = new Interpreter(scriptApplyToModel, (InterpreterOutputInterface)this, false); + interpretApplyToModel.interpret(); + + String filePathObtainedTmap = OBTAINED_MODELS_PATH + OBTAINED_MODELS_AFTER_INTEGRATING_TMR_TMAP[i]; + String folderPathObtainedTmap = filePathObtainedTmap.substring(0, filePathObtainedTmap.lastIndexOf("/")+1); + String fileName = filePathObtainedTmap.split("/")[filePathObtainedTmap.split("/").length -1]; + String modelName = fileName.split("\\.")[0]; + File fObtainedTmap = new File(filePathObtainedTmap); + assertTrue(myutil.FileUtils.checkFileForOpen(fObtainedTmap)); + + TMLMappingTextSpecification tmts = new TMLMappingTextSpecification(modelName); + TraceManager.addDev("Loading file: " + fObtainedTmap.getAbsolutePath()); + String obtainedOutputTmap = null; + try { + obtainedOutputTmap = myutil.FileUtils.loadFileData(fObtainedTmap); + } catch (Exception e) { + TraceManager.addDev("Exception executing: loading " + modelName); + assertTrue(false); + } + TraceManager.addDev("Testing spec " + modelName); + assertTrue(obtainedOutputTmap != null); + TraceManager.addDev("Going to parse " + modelName); + boolean parsed = tmts.makeTMLMapping(obtainedOutputTmap, folderPathObtainedTmap); + assertTrue(parsed); + + TraceManager.addDev("Checking syntax " + modelName); + // Checking syntax + TMLMapping tmap = tmts.getTMLMapping(); + + TMLSyntaxChecking syntax = new TMLSyntaxChecking(tmap); + syntax.checkSyntax(); + + if (syntax.hasErrors() > 0) { + for (TMLError error: syntax.getErrors()) { + TraceManager.addDev("Error: " + error.toString()); + } + + } + assertTrue(syntax.hasErrors() == 0); + + + String filePathExpectedTmap = getBaseResourcesDir() + PATH_PATTERNS[0] + EXPECTED_MODELS_AFTER_INTEGRATING_TMR_TMAP[i]; + File fExpectedTmap = new File(filePathExpectedTmap); + assertTrue(myutil.FileUtils.checkFileForOpen(fExpectedTmap)); + String expectedOutputTmap = myutil.FileUtils.loadFileData(fExpectedTmap); + //TraceManager.addDev("\nExpected:>" + expectedOutputTmap + "<"); + //TraceManager.addDev("\nObtained:>" + obtainedOutputTmap + "<"); + CompareTMAP ctmap = new CompareTMAP(); + assertTrue("comparing between 2 TMAP files", ctmap.CompareTMAPFiles(fObtainedTmap, fExpectedTmap)); + + + String filePathObtainedTarchi = OBTAINED_MODELS_PATH + OBTAINED_MODELS_AFTER_INTEGRATING_TMR_TARCHI[i]; + File fObtainedTarchi = new File(filePathObtainedTarchi); + assertTrue(myutil.FileUtils.checkFileForOpen(fObtainedTarchi)); + String obtainedOutputTarchi = myutil.FileUtils.loadFileData(fObtainedTarchi); + String filePathExpectedTarchi = getBaseResourcesDir() + PATH_PATTERNS[0] + EXPECTED_MODELS_AFTER_INTEGRATING_TMR_TARCHI[i]; + File fExpectedTarchi = new File(filePathExpectedTarchi); + assertTrue(myutil.FileUtils.checkFileForOpen(fExpectedTarchi)); + String expectedOutputTarchi = myutil.FileUtils.loadFileData(fExpectedTarchi); + CompareTMAP ctarchi = new CompareTMAP(); + assertTrue("comparing between 2 Tarchi files", ctarchi.CompareTMAPFiles(fObtainedTarchi, fExpectedTarchi)); + //TraceManager.addDev("\nExpected Tarchi:>" + expectedOutputTarchi + "<"); + //TraceManager.addDev("\nObtained Tarchi:>" + obtainedOutputTarchi + "<"); + + String filePathObtainedTML = OBTAINED_MODELS_PATH + OBTAINED_MODELS_AFTER_INTEGRATING_TMR_TML[i]; + File fObtainedTML = new File(filePathObtainedTML); + assertTrue(myutil.FileUtils.checkFileForOpen(fObtainedTML)); + String obtainedOutputTML = myutil.FileUtils.loadFileData(fObtainedTML); + String filePathExpectedTML = getBaseResourcesDir() + PATH_PATTERNS[0] + EXPECTED_MODELS_AFTER_INTEGRATING_TMR_TML[i]; + File fExpectedTML = new File(filePathExpectedTML); + assertTrue(myutil.FileUtils.checkFileForOpen(fExpectedTML)); + String expectedOutputTML = myutil.FileUtils.loadFileData(fExpectedTML); + CompareTML ctml = new CompareTML(); + assertTrue("comparing between 2 TML files", ctml.compareTML(fObtainedTML, fExpectedTML)); + //TraceManager.addDev("\nExpected TML:>" + expectedOutputTML + "<"); + //TraceManager.addDev("\nObtained TML:>" + obtainedOutputTML + "<"); + } + + for (int i = 0; i < PATH_CLI_CONFIGURATION_WITH_ERRORS_TMR_IN_MODELS.length; i++) { + String filePathConfigModel = getBaseResourcesDir() + PATH_PATTERNS[0] + PATH_CLI_CONFIGURATION_WITH_ERRORS_TMR_IN_MODELS[i]; + String scriptConfig; + outputResult = new StringBuilder(); + File fConfig = new File(filePathConfigModel); + assertTrue(myutil.FileUtils.checkFileForOpen(fConfig)); + scriptConfig = myutil.FileUtils.loadFileData(fConfig); + assertTrue(scriptConfig.length() > 0); + Interpreter interpretConfigModel = new Interpreter(scriptConfig, (InterpreterOutputInterface)this, false); + String interp = interpretConfigModel.interpretUntilError(); + assertTrue("expected error: ", interp.equals(PatternHandling.PATTERN_NOT_CONNECTED)); + + //TraceManager.addDev("\noutputResult:>" + outputResult); + //assertTrue("comparing between 2 TML files", outputResult.equals(PatternHandling.PATTERN_NOT_CONNECTED)); + + + } + + } +} diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/apply-tmr-in-modelWithOneSensor b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/apply-tmr-in-modelWithOneSensor new file mode 100644 index 0000000000000000000000000000000000000000..0cb6a393e473d08fb2c2435d3db4529e29b58c69 --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/apply-tmr-in-modelWithOneSensor @@ -0,0 +1,4 @@ +pa dltmap ../src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tmap +pa a -p resources/test/cli/testPatternHandling/tmr/ +pa a -pc resources/test/cli/testPatternHandling/tmr/modelWithOneSensor-config.json +pa a -g resources/test/cli/testPatternHandling/tmr/modelsAfterIntegratingTMR/ modelWithOneSensorIntegTMR diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/apply-tmr-in-modelWithThreeSensors b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/apply-tmr-in-modelWithThreeSensors new file mode 100644 index 0000000000000000000000000000000000000000..5af221b880609dd97adb2bf5a1728a0785ed4dc8 --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/apply-tmr-in-modelWithThreeSensors @@ -0,0 +1,4 @@ +pa dltmap ../src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tmap +pa a -p resources/test/cli/testPatternHandling/tmr/ +pa a -pc resources/test/cli/testPatternHandling/tmr/modelWithThreeSensors-config.json +pa a -g resources/test/cli/testPatternHandling/tmr/modelsAfterIntegratingTMR/ modelWithThreeSensorsIntegTMR diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/configurate-tmr-for-modelWithOneSensor b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/configurate-tmr-for-modelWithOneSensor new file mode 100644 index 0000000000000000000000000000000000000000..3f0a43c53589feb2918972880e2c76ca3707b439 --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/configurate-tmr-for-modelWithOneSensor @@ -0,0 +1,29 @@ +pa dltmap ../src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tmap +pa sc -p resources/test/cli/testPatternHandling/tmr/ +pa sc -sp +pa sc -ct SensorClone Sensor +pa sc -ct SensorClone2 Sensor +pa sc -ctl +pa sc -ctr SensorClone +pa sc -ct SensorClone1 Sensor +pa sc -plnc +pa sc -pl InterpreterC.dataC +pa sc -co InterpreterA.dataA Sensor.sensorData +pa sc -co InterpreterB.dataB SensorClone1.sensorData +pa sc -co InterpreterC.dataC SensorClone2.sensorData +pa sc -co Voter.resultData Receiver.sensorData +pa sc -cor InterpreterA.dataA +pa sc -co InterpreterA.dataA Sensor.sensorData +pa sc -co Voter.moveto_FAIL_SAFE Receiver.sensorData NEW +pa sc -col +pa sc -cptl +pa sc -cpd ALL +pa sc -tctl +pa sc -tcn SensorClone1 BusEnvironment +pa sc -tcm SensorClone2 SensorClone1 +pa sc -tcn Voter MainBus +pa sc -mcn SensorClone1.sensorData BusReceiver +pa sc -mcm InterpreterA.resA SensorClone1.sensorData +pa sc -mctl +pa sc -ua Timer dataReceivingTimeout 1000 +pa sc -m resources/test/cli/testPatternHandling/tmr/modelWithOneSensor-config.json diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/configurate-tmr-for-modelWithThreeSensors b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/configurate-tmr-for-modelWithThreeSensors new file mode 100644 index 0000000000000000000000000000000000000000..dec9cdaa649379bd400d177816113939f24ee78e --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/configurate-tmr-for-modelWithThreeSensors @@ -0,0 +1,16 @@ +pa dltmap ../src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tmap +pa sc -p resources/test/cli/testPatternHandling/tmr/ +pa sc -sp +pa sc -ctl +pa sc -plnc +pa sc -pl InterpreterC.dataC +pa sc -co InterpreterA.dataA Sensor1.sensorData1 +pa sc -co InterpreterB.dataB Sensor2.sensorData2 +pa sc -co InterpreterC.dataC Sensor3.sensorData3 +pa sc -co Voter.resultData Receiver.sensorData1 +pa sc -co Voter.moveto_FAIL_SAFE Receiver.sensorData1 NEW +pa sc -cpd ALL +pa sc -tcn InterpreterB MainBus +pa sc -tcm InterpreterA InterpreterB +pa sc -ua Timer dataReceivingTimeout 500 +pa sc -m resources/test/cli/testPatternHandling/tmr/modelWithThreeSensors-config.json diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/create-tmr b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/create-tmr new file mode 100644 index 0000000000000000000000000000000000000000..2e16045700f0046a4f188984ee51df856d99cad3 --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/cli/create-tmr @@ -0,0 +1,9 @@ +pa dltmap ../src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tmap +pa c -n tmr +pa c -p resources/test/cli/testPatternHandling/ +pa c -t +pa c -a Voter Timer InterpreterA InterpreterB +pa c -r Timer +pa c -a InterpreterC Timer +pa c -l +pa c -m \ No newline at end of file diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tarchi b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tarchi new file mode 100644 index 0000000000000000000000000000000000000000..17c6c9238731581ff169df68dbb33cc8e7028154 --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tarchi @@ -0,0 +1,220 @@ +// Master clock frequency - in MHz +MASTERCLOCKFREQUENCY 200 + +NODE BRIDGE BridgeEnvironmentPrivate +SET BridgeEnvironmentPrivate bufferByteSize 4 +SET BridgeEnvironmentPrivate clockDivider 1 + +NODE BRIDGE BridgeReceiverPrivate +SET BridgeReceiverPrivate bufferByteSize 4 +SET BridgeReceiverPrivate clockDivider 1 + +NODE BUS BusEnvironmentPrivate +SET BusEnvironmentPrivate byteDataSize 4 +SET BusEnvironmentPrivate pipelineSize 1 +SET BusEnvironmentPrivate arbitration 0 +SET BusEnvironmentPrivate sliceTime 10000 +SET BusEnvironmentPrivate burstSize 100 +SET BusEnvironmentPrivate privacy private +SET BusEnvironmentPrivate clockDivider 1 + +NODE BUS BusReceiverPrivate +SET BusReceiverPrivate byteDataSize 4 +SET BusReceiverPrivate pipelineSize 1 +SET BusReceiverPrivate arbitration 0 +SET BusReceiverPrivate sliceTime 10000 +SET BusReceiverPrivate burstSize 100 +SET BusReceiverPrivate privacy private +SET BusReceiverPrivate clockDivider 1 + +NODE MEMORY MemoryEnvironmentPrivate +SET MemoryEnvironmentPrivate byteDataSize 4 +SET MemoryEnvironmentPrivate clockDivider 1 + +NODE MEMORY MemoryReceiverPrivate +SET MemoryReceiverPrivate byteDataSize 4 +SET MemoryReceiverPrivate clockDivider 1 + +NODE MEMORY MemoryReceiver +SET MemoryReceiver byteDataSize 4 +SET MemoryReceiver clockDivider 1 + +NODE MEMORY MemoryEnvironment +SET MemoryEnvironment byteDataSize 4 +SET MemoryEnvironment clockDivider 1 + +NODE CPU CPUReceiver +SET CPUReceiver nbOfCores 1 +SET CPUReceiver byteDataSize 4 +SET CPUReceiver pipelineSize 5 +SET CPUReceiver goIdleTime 10 +SET CPUReceiver maxConsecutiveIdleCycles 10 +SET CPUReceiver taskSwitchingTime 20 +SET CPUReceiver branchingPredictionPenalty 2 +SET CPUReceiver cacheMiss 5 +SET CPUReceiver schedulingPolicy 0 +SET CPUReceiver sliceTime 10000 +SET CPUReceiver execiTime 1 +SET CPUReceiver execcTime 1 +SET CPUReceiver clockDivider 1 + +NODE CPU CPUEnvironment +SET CPUEnvironment nbOfCores 1 +SET CPUEnvironment byteDataSize 4 +SET CPUEnvironment pipelineSize 5 +SET CPUEnvironment goIdleTime 10 +SET CPUEnvironment maxConsecutiveIdleCycles 10 +SET CPUEnvironment taskSwitchingTime 20 +SET CPUEnvironment branchingPredictionPenalty 2 +SET CPUEnvironment cacheMiss 5 +SET CPUEnvironment schedulingPolicy 0 +SET CPUEnvironment sliceTime 10000 +SET CPUEnvironment execiTime 1 +SET CPUEnvironment execcTime 1 +SET CPUEnvironment clockDivider 1 + +NODE BUS BusReceiver +SET BusReceiver byteDataSize 4 +SET BusReceiver pipelineSize 1 +SET BusReceiver arbitration 0 +SET BusReceiver sliceTime 10000 +SET BusReceiver burstSize 100 +SET BusReceiver privacy public +SET BusReceiver clockDivider 1 + +NODE BUS BusEnvironment +SET BusEnvironment byteDataSize 4 +SET BusEnvironment pipelineSize 1 +SET BusEnvironment arbitration 0 +SET BusEnvironment sliceTime 10000 +SET BusEnvironment burstSize 100 +SET BusEnvironment privacy public +SET BusEnvironment clockDivider 1 + +NODE BRIDGE BridgeReceiver +SET BridgeReceiver bufferByteSize 4 +SET BridgeReceiver clockDivider 1 + +NODE BRIDGE BridgeEnvironment +SET BridgeEnvironment bufferByteSize 4 +SET BridgeEnvironment clockDivider 1 + +NODE BUS MainBus +SET MainBus byteDataSize 4 +SET MainBus pipelineSize 1 +SET MainBus arbitration 0 +SET MainBus sliceTime 10000 +SET MainBus burstSize 100 +SET MainBus privacy public +SET MainBus clockDivider 1 + +NODE CPU CPU_SensorClone1 +SET CPU_SensorClone1 nbOfCores 1 +SET CPU_SensorClone1 byteDataSize 4 +SET CPU_SensorClone1 pipelineSize 5 +SET CPU_SensorClone1 goIdleTime 10 +SET CPU_SensorClone1 maxConsecutiveIdleCycles 10 +SET CPU_SensorClone1 taskSwitchingTime 20 +SET CPU_SensorClone1 branchingPredictionPenalty 2 +SET CPU_SensorClone1 cacheMiss 5 +SET CPU_SensorClone1 schedulingPolicy 0 +SET CPU_SensorClone1 sliceTime 10000 +SET CPU_SensorClone1 execiTime 1 +SET CPU_SensorClone1 execcTime 1 +SET CPU_SensorClone1 clockDivider 1 + +NODE CPU CPU_Voter +SET CPU_Voter nbOfCores 1 +SET CPU_Voter byteDataSize 4 +SET CPU_Voter pipelineSize 5 +SET CPU_Voter goIdleTime 10 +SET CPU_Voter maxConsecutiveIdleCycles 10 +SET CPU_Voter taskSwitchingTime 20 +SET CPU_Voter branchingPredictionPenalty 2 +SET CPU_Voter cacheMiss 5 +SET CPU_Voter schedulingPolicy 0 +SET CPU_Voter sliceTime 10000 +SET CPU_Voter execiTime 1 +SET CPU_Voter execcTime 1 +SET CPU_Voter clockDivider 1 + +NODE MEMORY Memory_sensorData +SET Memory_sensorData byteDataSize 4 +SET Memory_sensorData clockDivider 1 + +NODE MEMORY MemoryC +SET MemoryC byteDataSize 4 +SET MemoryC clockDivider 1 + +NODE LINK link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate +SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate node MemoryEnvironmentPrivate +SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate bus BusEnvironmentPrivate +SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate priority 0 +NODE LINK link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate +SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate node BridgeEnvironmentPrivate +SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate bus BusEnvironmentPrivate +SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate priority 0 +NODE LINK link_BridgeEnvironmentPrivate_to_BusEnvironment +SET link_BridgeEnvironmentPrivate_to_BusEnvironment node BridgeEnvironmentPrivate +SET link_BridgeEnvironmentPrivate_to_BusEnvironment bus BusEnvironment +SET link_BridgeEnvironmentPrivate_to_BusEnvironment priority 0 +NODE LINK link_MemoryReceiverPrivate_to_BusReceiverPrivate +SET link_MemoryReceiverPrivate_to_BusReceiverPrivate node MemoryReceiverPrivate +SET link_MemoryReceiverPrivate_to_BusReceiverPrivate bus BusReceiverPrivate +SET link_MemoryReceiverPrivate_to_BusReceiverPrivate priority 0 +NODE LINK link_BridgeReceiverPrivate_to_BusReceiverPrivate +SET link_BridgeReceiverPrivate_to_BusReceiverPrivate node BridgeReceiverPrivate +SET link_BridgeReceiverPrivate_to_BusReceiverPrivate bus BusReceiverPrivate +SET link_BridgeReceiverPrivate_to_BusReceiverPrivate priority 0 +NODE LINK link_BridgeReceiverPrivate_to_BusReceiver +SET link_BridgeReceiverPrivate_to_BusReceiver node BridgeReceiverPrivate +SET link_BridgeReceiverPrivate_to_BusReceiver bus BusReceiver +SET link_BridgeReceiverPrivate_to_BusReceiver priority 0 +NODE LINK link_CPUEnvironment_to_BusEnvironmentPrivate +SET link_CPUEnvironment_to_BusEnvironmentPrivate node CPUEnvironment +SET link_CPUEnvironment_to_BusEnvironmentPrivate bus BusEnvironmentPrivate +SET link_CPUEnvironment_to_BusEnvironmentPrivate priority 0 +NODE LINK link_MemoryEnvironment_to_BusEnvironment +SET link_MemoryEnvironment_to_BusEnvironment node MemoryEnvironment +SET link_MemoryEnvironment_to_BusEnvironment bus BusEnvironment +SET link_MemoryEnvironment_to_BusEnvironment priority 0 +NODE LINK link_BridgeEnvironment_to_BusEnvironment +SET link_BridgeEnvironment_to_BusEnvironment node BridgeEnvironment +SET link_BridgeEnvironment_to_BusEnvironment bus BusEnvironment +SET link_BridgeEnvironment_to_BusEnvironment priority 0 +NODE LINK link_BridgeEnvironment_to_MainBus +SET link_BridgeEnvironment_to_MainBus node BridgeEnvironment +SET link_BridgeEnvironment_to_MainBus bus MainBus +SET link_BridgeEnvironment_to_MainBus priority 0 +NODE LINK link_BridgeReceiver_to_BusReceiver +SET link_BridgeReceiver_to_BusReceiver node BridgeReceiver +SET link_BridgeReceiver_to_BusReceiver bus BusReceiver +SET link_BridgeReceiver_to_BusReceiver priority 0 +NODE LINK link_BridgeReceiver_to_MainBus +SET link_BridgeReceiver_to_MainBus node BridgeReceiver +SET link_BridgeReceiver_to_MainBus bus MainBus +SET link_BridgeReceiver_to_MainBus priority 0 +NODE LINK link_CPUReceiver_to_BusReceiverPrivate +SET link_CPUReceiver_to_BusReceiverPrivate node CPUReceiver +SET link_CPUReceiver_to_BusReceiverPrivate bus BusReceiverPrivate +SET link_CPUReceiver_to_BusReceiverPrivate priority 0 +NODE LINK link_MemoryReceiver_to_BusReceiver +SET link_MemoryReceiver_to_BusReceiver node MemoryReceiver +SET link_MemoryReceiver_to_BusReceiver bus BusReceiver +SET link_MemoryReceiver_to_BusReceiver priority 0 +NODE LINK link_CPU_SensorClone1_to_BusEnvironment +SET link_CPU_SensorClone1_to_BusEnvironment node CPU_SensorClone1 +SET link_CPU_SensorClone1_to_BusEnvironment bus BusEnvironment +SET link_CPU_SensorClone1_to_BusEnvironment priority 0 +NODE LINK link_CPU_Voter_to_MainBus +SET link_CPU_Voter_to_MainBus node CPU_Voter +SET link_CPU_Voter_to_MainBus bus MainBus +SET link_CPU_Voter_to_MainBus priority 0 +NODE LINK link_Memory_sensorData_to_BusReceiver +SET link_Memory_sensorData_to_BusReceiver node Memory_sensorData +SET link_Memory_sensorData_to_BusReceiver bus BusReceiver +SET link_Memory_sensorData_to_BusReceiver priority 0 +NODE LINK link_MemoryC_to_MainBus +SET link_MemoryC_to_MainBus node MemoryC +SET link_MemoryC_to_MainBus bus MainBus +SET link_MemoryC_to_MainBus priority 0 diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tmap b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tmap new file mode 100644 index 0000000000000000000000000000000000000000..51003f7426edc8f3291915e4a17a8e6bd796295b --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tmap @@ -0,0 +1,98 @@ +TMLSPEC + #include "modelWithOneSensorIntegTMR.tml" +ENDTMLSPEC + +TMLARCHI + #include "modelWithOneSensorIntegTMR.tarchi" +ENDTMLARCHI + +TMLMAPPING + MAP CPUReceiver ModelOneSensor__Receiver + SET ModelOneSensor__Receiver priority 0 + MAP CPUEnvironment ModelOneSensor__Sensor + SET ModelOneSensor__Sensor priority 0 + MAP CPU_SensorClone1 ModelOneSensor__SensorClone1 + SET ModelOneSensor__SensorClone1 priority 0 + MAP CPU_SensorClone1 ModelOneSensor__SensorClone2 + SET ModelOneSensor__SensorClone2 priority 0 + MAP CPU_Voter ModelOneSensor__Voter + SET ModelOneSensor__Voter priority 0 + MAP CPU_Voter ModelOneSensor__InterpreterA + SET ModelOneSensor__InterpreterA priority 0 + MAP CPU_Voter ModelOneSensor__InterpreterC + SET ModelOneSensor__InterpreterC priority 0 + MAP CPU_Voter ModelOneSensor__InterpreterB + SET ModelOneSensor__InterpreterB priority 0 + MAP CPU_Voter ModelOneSensor__Timer + SET ModelOneSensor__Timer priority 0 + MAP MemoryEnvironment ModelOneSensor__sensorData + SET ModelOneSensor__sensorData priority 0 + MAP BusEnvironment ModelOneSensor__sensorData + SET ModelOneSensor__sensorData priority 0 + MAP MainBus ModelOneSensor__sensorData + SET ModelOneSensor__sensorData priority 0 + MAP BusReceiver ModelOneSensor__sensorData + SET ModelOneSensor__sensorData priority 0 + MAP BusReceiverPrivate ModelOneSensor__sensorData + SET ModelOneSensor__sensorData priority 0 + MAP BusEnvironmentPrivate ModelOneSensor__sensorData + SET ModelOneSensor__sensorData priority 0 + MAP Memory_sensorData ModelOneSensor__sensorData1 + SET ModelOneSensor__sensorData1 priority 0 + MAP BusReceiver ModelOneSensor__sensorData1 + SET ModelOneSensor__sensorData1 priority 0 + MAP Memory_sensorData ModelOneSensor__resA + SET ModelOneSensor__resA priority 0 + MAP BusReceiver ModelOneSensor__resA + SET ModelOneSensor__resA priority 0 + MAP BusEnvironment ModelOneSensor__sensorData0 + SET ModelOneSensor__sensorData0 priority 0 + MAP MainBus ModelOneSensor__sensorData0 + SET ModelOneSensor__sensorData0 priority 0 + MAP BusReceiver ModelOneSensor__sensorData0 + SET ModelOneSensor__sensorData0 priority 0 + MAP BusReceiverPrivate ModelOneSensor__sensorData0 + SET ModelOneSensor__sensorData0 priority 0 + MAP BusEnvironmentPrivate ModelOneSensor__sensorData0 + SET ModelOneSensor__sensorData0 priority 0 + MAP MemoryC ModelOneSensor__sensorData0 + SET ModelOneSensor__sensorData0 priority 0 + MAP MainBus ModelOneSensor__sensorData0 + SET ModelOneSensor__sensorData0 priority 0 + MAP Memory_sensorData ModelOneSensor__resultData + SET ModelOneSensor__resultData priority 0 + MAP BusReceiver ModelOneSensor__resultData + SET ModelOneSensor__resultData priority 0 + MAP BusEnvironment ModelOneSensor__resultData + SET ModelOneSensor__resultData priority 0 + MAP MainBus ModelOneSensor__resultData + SET ModelOneSensor__resultData priority 0 + MAP BusReceiverPrivate ModelOneSensor__resultData + SET ModelOneSensor__resultData priority 0 + MAP BusEnvironmentPrivate ModelOneSensor__resultData + SET ModelOneSensor__resultData priority 0 + MAP Memory_sensorData ModelOneSensor__resC + SET ModelOneSensor__resC priority 0 + MAP BusReceiver ModelOneSensor__resC + SET ModelOneSensor__resC priority 0 + MAP BusEnvironment ModelOneSensor__resC + SET ModelOneSensor__resC priority 0 + MAP MainBus ModelOneSensor__resC + SET ModelOneSensor__resC priority 0 + MAP BusReceiverPrivate ModelOneSensor__resC + SET ModelOneSensor__resC priority 0 + MAP BusEnvironmentPrivate ModelOneSensor__resC + SET ModelOneSensor__resC priority 0 + MAP Memory_sensorData ModelOneSensor__resB + SET ModelOneSensor__resB priority 0 + MAP BusReceiver ModelOneSensor__resB + SET ModelOneSensor__resB priority 0 + MAP BusEnvironment ModelOneSensor__resB + SET ModelOneSensor__resB priority 0 + MAP MainBus ModelOneSensor__resB + SET ModelOneSensor__resB priority 0 + MAP BusReceiverPrivate ModelOneSensor__resB + SET ModelOneSensor__resB priority 0 + MAP BusEnvironmentPrivate ModelOneSensor__resB + SET ModelOneSensor__resB priority 0 +ENDTMLMAPPING diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tml b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tml new file mode 100644 index 0000000000000000000000000000000000000000..c77ae19649a57ce69ab6f12d7ad76967f0710ef6 --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithOneSensorIntegTMR.tml @@ -0,0 +1,194 @@ +// TML Application - FORMAT 0.2 +// Application: tmr +// Generated: Mon Nov 13 12:49:10 CET 2023 + +// PRAGMAS + +// Channels +CHANNEL ModelOneSensor__resA BRBW 8 8 OUT ModelOneSensor__InterpreterA IN ModelOneSensor__Voter +VCCHANNEL ModelOneSensor__resA 0 +CONFCHANNEL ModelOneSensor__resA +AUTHCHANNEL ModelOneSensor__resA +CHANNEL ModelOneSensor__resB BRBW 8 8 OUT ModelOneSensor__InterpreterB IN ModelOneSensor__Voter +VCCHANNEL ModelOneSensor__resB 0 +CONFCHANNEL ModelOneSensor__resB +AUTHCHANNEL ModelOneSensor__resB +CHANNEL ModelOneSensor__resC BRBW 8 8 OUT ModelOneSensor__InterpreterC IN ModelOneSensor__Voter +VCCHANNEL ModelOneSensor__resC 0 +CONFCHANNEL ModelOneSensor__resC +AUTHCHANNEL ModelOneSensor__resC +CHANNEL ModelOneSensor__resultData BRBW 8 8 OUT ModelOneSensor__Voter IN ModelOneSensor__Receiver +VCCHANNEL ModelOneSensor__resultData 0 +CONFCHANNEL ModelOneSensor__resultData +AUTHCHANNEL ModelOneSensor__resultData +CHANNEL ModelOneSensor__sensorData BRNBW 4 OUT ModelOneSensor__Sensor IN ModelOneSensor__InterpreterA +VCCHANNEL ModelOneSensor__sensorData 0 +CHANNEL ModelOneSensor__sensorData0 BRNBW 4 OUT ModelOneSensor__SensorClone2 IN ModelOneSensor__InterpreterC +VCCHANNEL ModelOneSensor__sensorData0 0 +CHANNEL ModelOneSensor__sensorData1 BRNBW 4 OUT ModelOneSensor__SensorClone1 IN ModelOneSensor__InterpreterB +VCCHANNEL ModelOneSensor__sensorData1 0 + +// Events +EVENT ModelOneSensor__evtA() NIB 8 ModelOneSensor__InterpreterA ModelOneSensor__Voter +EVENT ModelOneSensor__evtB() NIB 8 ModelOneSensor__InterpreterB ModelOneSensor__Voter +EVENT ModelOneSensor__evtC() NIB 8 ModelOneSensor__InterpreterC ModelOneSensor__Voter +EVENT ModelOneSensor__evtTimeout() NIB 8 ModelOneSensor__Timer ModelOneSensor__Voter +EVENT ModelOneSensor__moveto_FAIL_SAFE(bool) NIB 8 ModelOneSensor__Voter ModelOneSensor__Receiver + +// Requests + +TASK ModelOneSensor__InterpreterA + TASKOP + //Local variables + int size = 50 + int sizeA = 10 + + //Behavior + READ ModelOneSensor__sensorData size + EXECC size + NOTIFY ModelOneSensor__evtA + WRITE ModelOneSensor__resA sizeA +ENDTASK + +TASK ModelOneSensor__InterpreterB + TASKOP + //Local variables + int size = 50 + int sizeB = 10 + + //Behavior + READ ModelOneSensor__sensorData1 size + EXECC size + NOTIFY ModelOneSensor__evtB + WRITE ModelOneSensor__resB sizeB +ENDTASK + +TASK ModelOneSensor__InterpreterC + TASKOP + //Local variables + int size = 50 + int sizeC = 10 + + //Behavior + READ ModelOneSensor__sensorData0 size + EXECC size + NOTIFY ModelOneSensor__evtC + WRITE ModelOneSensor__resC sizeC +ENDTASK + +TASK ModelOneSensor__Receiver + TASKOP + //Local variables + int executeSensor = 10 + bool x = false + + //Behavior + FOR(; ; ) + WAIT ModelOneSensor__moveto_FAIL_SAFE x + READ ModelOneSensor__resultData 1 + EXECI executeSensor + ENDFOR +ENDTASK + +TASK ModelOneSensor__Sensor + TASKOP + //Local variables + + //Behavior + FOR(; ; ) + WRITE ModelOneSensor__sensorData 1 + DELAY 10 ms isActiveDelay false + ENDFOR +ENDTASK + +TASK ModelOneSensor__SensorClone1 + TASKOP + //Local variables + + //Behavior + FOR(; ; ) + WRITE ModelOneSensor__sensorData1 1 + DELAY 10 ms isActiveDelay false + ENDFOR +ENDTASK + +TASK ModelOneSensor__SensorClone2 + TASKOP + //Local variables + + //Behavior + FOR(; ; ) + WRITE ModelOneSensor__sensorData0 1 + DELAY 10 ms isActiveDelay false + ENDFOR +ENDTASK + +TASK ModelOneSensor__Timer + TASKOP + //Local variables + int dataReceivingTimeout = 1000 + + //Behavior + DELAY dataReceivingTimeout ns isActiveDelay false + NOTIFY ModelOneSensor__evtTimeout +ENDTASK + +TASK ModelOneSensor__Voter + TASKOP + //Local variables + bool x = false + int interpreteTime = 5 + bool dataProcessed = false + int indexA = 0 + int indexB = 0 + int indexC = 0 + int sizeA = 10 + int sizeB = 10 + int sizeC = 10 + int i = 0 + + //Behavior + FOR(i=0; i<3; ) + SELECTEVT + CASE ModelOneSensor__evtTimeout + i=3 + ENDCASE + CASE ModelOneSensor__evtC + READ ModelOneSensor__resC sizeC + indexC=indexC+1 + IF (indexC==1) + i=i+1 + ELSE + ENDIF + ENDCASE + CASE ModelOneSensor__evtB + READ ModelOneSensor__resB sizeB + indexB=indexB+1 + IF (indexB==1) + i=i+1 + ELSE + ENDIF + ENDCASE + CASE ModelOneSensor__evtA + READ ModelOneSensor__resA sizeA + indexA=indexA+1 + IF (indexA==1) + i=i+1 + ELSE + ENDIF + ENDCASE + ENDSELECTEVT + ENDFOR + EXECC interpreteTime + RAND + CASERAND 50 + x=true + ENDCASERAND + CASERAND 50 + x=false + ENDCASERAND + ENDRAND + NOTIFY ModelOneSensor__moveto_FAIL_SAFE x + WRITE ModelOneSensor__resultData 1 +ENDTASK + diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tarchi b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tarchi new file mode 100644 index 0000000000000000000000000000000000000000..50a23411eef7f93e1b25f46a2b985b355d405617 --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tarchi @@ -0,0 +1,193 @@ +// Master clock frequency - in MHz +MASTERCLOCKFREQUENCY 200 + +NODE BRIDGE BridgeEnvironmentPrivate +SET BridgeEnvironmentPrivate bufferByteSize 4 +SET BridgeEnvironmentPrivate clockDivider 1 + +NODE BRIDGE BridgeReceiverPrivate +SET BridgeReceiverPrivate bufferByteSize 4 +SET BridgeReceiverPrivate clockDivider 1 + +NODE BUS BusEnvironmentPrivate +SET BusEnvironmentPrivate byteDataSize 4 +SET BusEnvironmentPrivate pipelineSize 1 +SET BusEnvironmentPrivate arbitration 0 +SET BusEnvironmentPrivate sliceTime 10000 +SET BusEnvironmentPrivate burstSize 100 +SET BusEnvironmentPrivate privacy private +SET BusEnvironmentPrivate clockDivider 1 + +NODE BUS BusReceiverPrivate +SET BusReceiverPrivate byteDataSize 4 +SET BusReceiverPrivate pipelineSize 1 +SET BusReceiverPrivate arbitration 0 +SET BusReceiverPrivate sliceTime 10000 +SET BusReceiverPrivate burstSize 100 +SET BusReceiverPrivate privacy private +SET BusReceiverPrivate clockDivider 1 + +NODE MEMORY MemoryEnvironmentPrivate +SET MemoryEnvironmentPrivate byteDataSize 4 +SET MemoryEnvironmentPrivate clockDivider 1 + +NODE MEMORY MemoryReceiverPrivate +SET MemoryReceiverPrivate byteDataSize 4 +SET MemoryReceiverPrivate clockDivider 1 + +NODE MEMORY MemoryReceiver +SET MemoryReceiver byteDataSize 4 +SET MemoryReceiver clockDivider 1 + +NODE MEMORY MemoryEnvironment +SET MemoryEnvironment byteDataSize 4 +SET MemoryEnvironment clockDivider 1 + +NODE CPU CPUReceiver +SET CPUReceiver nbOfCores 1 +SET CPUReceiver byteDataSize 4 +SET CPUReceiver pipelineSize 5 +SET CPUReceiver goIdleTime 10 +SET CPUReceiver maxConsecutiveIdleCycles 10 +SET CPUReceiver taskSwitchingTime 20 +SET CPUReceiver branchingPredictionPenalty 2 +SET CPUReceiver cacheMiss 5 +SET CPUReceiver schedulingPolicy 0 +SET CPUReceiver sliceTime 10000 +SET CPUReceiver execiTime 1 +SET CPUReceiver execcTime 1 +SET CPUReceiver clockDivider 1 + +NODE CPU CPUEnvironment +SET CPUEnvironment nbOfCores 1 +SET CPUEnvironment byteDataSize 4 +SET CPUEnvironment pipelineSize 5 +SET CPUEnvironment goIdleTime 10 +SET CPUEnvironment maxConsecutiveIdleCycles 10 +SET CPUEnvironment taskSwitchingTime 20 +SET CPUEnvironment branchingPredictionPenalty 2 +SET CPUEnvironment cacheMiss 5 +SET CPUEnvironment schedulingPolicy 0 +SET CPUEnvironment sliceTime 10000 +SET CPUEnvironment execiTime 1 +SET CPUEnvironment execcTime 1 +SET CPUEnvironment clockDivider 1 + +NODE BUS BusReceiver +SET BusReceiver byteDataSize 4 +SET BusReceiver pipelineSize 1 +SET BusReceiver arbitration 0 +SET BusReceiver sliceTime 10000 +SET BusReceiver burstSize 100 +SET BusReceiver privacy public +SET BusReceiver clockDivider 1 + +NODE BUS BusEnvironment +SET BusEnvironment byteDataSize 4 +SET BusEnvironment pipelineSize 1 +SET BusEnvironment arbitration 0 +SET BusEnvironment sliceTime 10000 +SET BusEnvironment burstSize 100 +SET BusEnvironment privacy public +SET BusEnvironment clockDivider 1 + +NODE BRIDGE BridgeReceiver +SET BridgeReceiver bufferByteSize 4 +SET BridgeReceiver clockDivider 1 + +NODE BRIDGE BridgeEnvironment +SET BridgeEnvironment bufferByteSize 4 +SET BridgeEnvironment clockDivider 1 + +NODE BUS MainBus +SET MainBus byteDataSize 4 +SET MainBus pipelineSize 1 +SET MainBus arbitration 0 +SET MainBus sliceTime 10000 +SET MainBus burstSize 100 +SET MainBus privacy public +SET MainBus clockDivider 1 + +NODE CPU CPU_InterpreterB +SET CPU_InterpreterB nbOfCores 1 +SET CPU_InterpreterB byteDataSize 4 +SET CPU_InterpreterB pipelineSize 5 +SET CPU_InterpreterB goIdleTime 10 +SET CPU_InterpreterB maxConsecutiveIdleCycles 10 +SET CPU_InterpreterB taskSwitchingTime 20 +SET CPU_InterpreterB branchingPredictionPenalty 2 +SET CPU_InterpreterB cacheMiss 5 +SET CPU_InterpreterB schedulingPolicy 0 +SET CPU_InterpreterB sliceTime 10000 +SET CPU_InterpreterB execiTime 1 +SET CPU_InterpreterB execcTime 1 +SET CPU_InterpreterB clockDivider 1 + +NODE MEMORY MemoryVoter +SET MemoryVoter byteDataSize 4 +SET MemoryVoter clockDivider 1 + +NODE LINK link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate +SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate node MemoryEnvironmentPrivate +SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate bus BusEnvironmentPrivate +SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate priority 0 +NODE LINK link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate +SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate node BridgeEnvironmentPrivate +SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate bus BusEnvironmentPrivate +SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate priority 0 +NODE LINK link_BridgeEnvironmentPrivate_to_BusEnvironment +SET link_BridgeEnvironmentPrivate_to_BusEnvironment node BridgeEnvironmentPrivate +SET link_BridgeEnvironmentPrivate_to_BusEnvironment bus BusEnvironment +SET link_BridgeEnvironmentPrivate_to_BusEnvironment priority 0 +NODE LINK link_MemoryReceiverPrivate_to_BusReceiverPrivate +SET link_MemoryReceiverPrivate_to_BusReceiverPrivate node MemoryReceiverPrivate +SET link_MemoryReceiverPrivate_to_BusReceiverPrivate bus BusReceiverPrivate +SET link_MemoryReceiverPrivate_to_BusReceiverPrivate priority 0 +NODE LINK link_BridgeReceiverPrivate_to_BusReceiverPrivate +SET link_BridgeReceiverPrivate_to_BusReceiverPrivate node BridgeReceiverPrivate +SET link_BridgeReceiverPrivate_to_BusReceiverPrivate bus BusReceiverPrivate +SET link_BridgeReceiverPrivate_to_BusReceiverPrivate priority 0 +NODE LINK link_BridgeReceiverPrivate_to_BusReceiver +SET link_BridgeReceiverPrivate_to_BusReceiver node BridgeReceiverPrivate +SET link_BridgeReceiverPrivate_to_BusReceiver bus BusReceiver +SET link_BridgeReceiverPrivate_to_BusReceiver priority 0 +NODE LINK link_CPUEnvironment_to_BusEnvironmentPrivate +SET link_CPUEnvironment_to_BusEnvironmentPrivate node CPUEnvironment +SET link_CPUEnvironment_to_BusEnvironmentPrivate bus BusEnvironmentPrivate +SET link_CPUEnvironment_to_BusEnvironmentPrivate priority 0 +NODE LINK link_MemoryEnvironment_to_BusEnvironment +SET link_MemoryEnvironment_to_BusEnvironment node MemoryEnvironment +SET link_MemoryEnvironment_to_BusEnvironment bus BusEnvironment +SET link_MemoryEnvironment_to_BusEnvironment priority 0 +NODE LINK link_BridgeEnvironment_to_BusEnvironment +SET link_BridgeEnvironment_to_BusEnvironment node BridgeEnvironment +SET link_BridgeEnvironment_to_BusEnvironment bus BusEnvironment +SET link_BridgeEnvironment_to_BusEnvironment priority 0 +NODE LINK link_BridgeEnvironment_to_MainBus +SET link_BridgeEnvironment_to_MainBus node BridgeEnvironment +SET link_BridgeEnvironment_to_MainBus bus MainBus +SET link_BridgeEnvironment_to_MainBus priority 0 +NODE LINK link_BridgeReceiver_to_BusReceiver +SET link_BridgeReceiver_to_BusReceiver node BridgeReceiver +SET link_BridgeReceiver_to_BusReceiver bus BusReceiver +SET link_BridgeReceiver_to_BusReceiver priority 0 +NODE LINK link_BridgeReceiver_to_MainBus +SET link_BridgeReceiver_to_MainBus node BridgeReceiver +SET link_BridgeReceiver_to_MainBus bus MainBus +SET link_BridgeReceiver_to_MainBus priority 0 +NODE LINK link_CPUReceiver_to_BusReceiverPrivate +SET link_CPUReceiver_to_BusReceiverPrivate node CPUReceiver +SET link_CPUReceiver_to_BusReceiverPrivate bus BusReceiverPrivate +SET link_CPUReceiver_to_BusReceiverPrivate priority 0 +NODE LINK link_MemoryReceiver_to_BusReceiver +SET link_MemoryReceiver_to_BusReceiver node MemoryReceiver +SET link_MemoryReceiver_to_BusReceiver bus BusReceiver +SET link_MemoryReceiver_to_BusReceiver priority 0 +NODE LINK link_CPU_InterpreterB_to_MainBus +SET link_CPU_InterpreterB_to_MainBus node CPU_InterpreterB +SET link_CPU_InterpreterB_to_MainBus bus MainBus +SET link_CPU_InterpreterB_to_MainBus priority 0 +NODE LINK link_MemoryVoter_to_BusReceiverPrivate +SET link_MemoryVoter_to_BusReceiverPrivate node MemoryVoter +SET link_MemoryVoter_to_BusReceiverPrivate bus BusReceiverPrivate +SET link_MemoryVoter_to_BusReceiverPrivate priority 0 diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tmap b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tmap new file mode 100644 index 0000000000000000000000000000000000000000..ccd2d7e4ce92ccbe06509a43a25583d2ba9be5dd --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tmap @@ -0,0 +1,114 @@ +TMLSPEC + #include "modelWithThreeSensorsIntegTMR.tml" +ENDTMLSPEC + +TMLARCHI + #include "modelWithThreeSensorsIntegTMR.tarchi" +ENDTMLARCHI + +TMLMAPPING + MAP CPUReceiver ModelThreeSensors__Receiver + SET ModelThreeSensors__Receiver priority 0 + MAP CPUEnvironment ModelThreeSensors__Sensor3 + SET ModelThreeSensors__Sensor3 priority 0 + MAP CPUEnvironment ModelThreeSensors__Sensor2 + SET ModelThreeSensors__Sensor2 priority 0 + MAP CPUEnvironment ModelThreeSensors__Sensor1 + SET ModelThreeSensors__Sensor1 priority 0 + MAP CPU_InterpreterB ModelThreeSensors__InterpreterB + SET ModelThreeSensors__InterpreterB priority 0 + MAP CPU_InterpreterB ModelThreeSensors__InterpreterA + SET ModelThreeSensors__InterpreterA priority 0 + MAP CPU_InterpreterB ModelThreeSensors__Voter + SET ModelThreeSensors__Voter priority 0 + MAP CPU_InterpreterB ModelThreeSensors__InterpreterC + SET ModelThreeSensors__InterpreterC priority 0 + MAP CPU_InterpreterB ModelThreeSensors__Timer + SET ModelThreeSensors__Timer priority 0 + MAP MemoryEnvironment ModelThreeSensors__sensorData3 + SET ModelThreeSensors__sensorData3 priority 0 + MAP BusEnvironment ModelThreeSensors__sensorData3 + SET ModelThreeSensors__sensorData3 priority 0 + MAP MainBus ModelThreeSensors__sensorData3 + SET ModelThreeSensors__sensorData3 priority 0 + MAP BusReceiverPrivate ModelThreeSensors__sensorData3 + SET ModelThreeSensors__sensorData3 priority 0 + MAP BusEnvironmentPrivate ModelThreeSensors__sensorData3 + SET ModelThreeSensors__sensorData3 priority 0 + MAP BusReceiver ModelThreeSensors__sensorData3 + SET ModelThreeSensors__sensorData3 priority 0 + MAP MemoryEnvironment ModelThreeSensors__sensorData1 + SET ModelThreeSensors__sensorData1 priority 0 + MAP BusEnvironment ModelThreeSensors__sensorData1 + SET ModelThreeSensors__sensorData1 priority 0 + MAP MainBus ModelThreeSensors__sensorData1 + SET ModelThreeSensors__sensorData1 priority 0 + MAP BusReceiver ModelThreeSensors__sensorData1 + SET ModelThreeSensors__sensorData1 priority 0 + MAP BusReceiverPrivate ModelThreeSensors__sensorData1 + SET ModelThreeSensors__sensorData1 priority 0 + MAP BusEnvironmentPrivate ModelThreeSensors__sensorData1 + SET ModelThreeSensors__sensorData1 priority 0 + MAP MemoryEnvironment ModelThreeSensors__sensorData2 + SET ModelThreeSensors__sensorData2 priority 0 + MAP BusEnvironment ModelThreeSensors__sensorData2 + SET ModelThreeSensors__sensorData2 priority 0 + MAP MainBus ModelThreeSensors__sensorData2 + SET ModelThreeSensors__sensorData2 priority 0 + MAP BusEnvironmentPrivate ModelThreeSensors__sensorData2 + SET ModelThreeSensors__sensorData2 priority 0 + MAP BusReceiverPrivate ModelThreeSensors__sensorData2 + SET ModelThreeSensors__sensorData2 priority 0 + MAP BusReceiver ModelThreeSensors__sensorData2 + SET ModelThreeSensors__sensorData2 priority 0 + MAP BusEnvironment ModelThreeSensors__resultData + SET ModelThreeSensors__resultData priority 0 + MAP MainBus ModelThreeSensors__resultData + SET ModelThreeSensors__resultData priority 0 + MAP BusEnvironmentPrivate ModelThreeSensors__resultData + SET ModelThreeSensors__resultData priority 0 + MAP BusReceiverPrivate ModelThreeSensors__resultData + SET ModelThreeSensors__resultData priority 0 + MAP BusReceiver ModelThreeSensors__resultData + SET ModelThreeSensors__resultData priority 0 + MAP MemoryVoter ModelThreeSensors__resultData + SET ModelThreeSensors__resultData priority 0 + MAP BusReceiverPrivate ModelThreeSensors__resultData + SET ModelThreeSensors__resultData priority 0 + MAP MemoryVoter ModelThreeSensors__resA + SET ModelThreeSensors__resA priority 0 + MAP BusEnvironment ModelThreeSensors__resA + SET ModelThreeSensors__resA priority 0 + MAP MainBus ModelThreeSensors__resA + SET ModelThreeSensors__resA priority 0 + MAP BusEnvironmentPrivate ModelThreeSensors__resA + SET ModelThreeSensors__resA priority 0 + MAP BusReceiverPrivate ModelThreeSensors__resA + SET ModelThreeSensors__resA priority 0 + MAP BusReceiver ModelThreeSensors__resA + SET ModelThreeSensors__resA priority 0 + MAP MemoryVoter ModelThreeSensors__resC + SET ModelThreeSensors__resC priority 0 + MAP BusEnvironment ModelThreeSensors__resC + SET ModelThreeSensors__resC priority 0 + MAP MainBus ModelThreeSensors__resC + SET ModelThreeSensors__resC priority 0 + MAP BusEnvironmentPrivate ModelThreeSensors__resC + SET ModelThreeSensors__resC priority 0 + MAP BusReceiverPrivate ModelThreeSensors__resC + SET ModelThreeSensors__resC priority 0 + MAP BusReceiver ModelThreeSensors__resC + SET ModelThreeSensors__resC priority 0 + MAP MemoryVoter ModelThreeSensors__resB + SET ModelThreeSensors__resB priority 0 + MAP BusEnvironment ModelThreeSensors__resB + SET ModelThreeSensors__resB priority 0 + MAP MainBus ModelThreeSensors__resB + SET ModelThreeSensors__resB priority 0 + MAP BusEnvironmentPrivate ModelThreeSensors__resB + SET ModelThreeSensors__resB priority 0 + MAP BusReceiverPrivate ModelThreeSensors__resB + SET ModelThreeSensors__resB priority 0 + MAP BusReceiver ModelThreeSensors__resB + SET ModelThreeSensors__resB priority 0 +ENDTMLMAPPING diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tml b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tml new file mode 100644 index 0000000000000000000000000000000000000000..9a3a122ffc32b9ec5e7d8f2e69ce66a467474d7f --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/expected/modelWithThreeSensorsIntegTMR.tml @@ -0,0 +1,194 @@ +// TML Application - FORMAT 0.2 +// Application: tmr +// Generated: Mon Nov 13 12:40:36 CET 2023 + +// PRAGMAS + +// Channels +CHANNEL ModelThreeSensors__resA BRBW 8 8 OUT ModelThreeSensors__InterpreterA IN ModelThreeSensors__Voter +VCCHANNEL ModelThreeSensors__resA 0 +CONFCHANNEL ModelThreeSensors__resA +AUTHCHANNEL ModelThreeSensors__resA +CHANNEL ModelThreeSensors__resB BRBW 8 8 OUT ModelThreeSensors__InterpreterB IN ModelThreeSensors__Voter +VCCHANNEL ModelThreeSensors__resB 0 +CONFCHANNEL ModelThreeSensors__resB +AUTHCHANNEL ModelThreeSensors__resB +CHANNEL ModelThreeSensors__resC BRBW 8 8 OUT ModelThreeSensors__InterpreterC IN ModelThreeSensors__Voter +VCCHANNEL ModelThreeSensors__resC 0 +CONFCHANNEL ModelThreeSensors__resC +AUTHCHANNEL ModelThreeSensors__resC +CHANNEL ModelThreeSensors__resultData BRBW 8 8 OUT ModelThreeSensors__Voter IN ModelThreeSensors__Receiver +VCCHANNEL ModelThreeSensors__resultData 0 +CONFCHANNEL ModelThreeSensors__resultData +AUTHCHANNEL ModelThreeSensors__resultData +CHANNEL ModelThreeSensors__sensorData1 BRNBW 4 OUT ModelThreeSensors__Sensor1 IN ModelThreeSensors__InterpreterA +VCCHANNEL ModelThreeSensors__sensorData1 0 +CHANNEL ModelThreeSensors__sensorData2 BRNBW 4 OUT ModelThreeSensors__Sensor2 IN ModelThreeSensors__InterpreterB +VCCHANNEL ModelThreeSensors__sensorData2 0 +CHANNEL ModelThreeSensors__sensorData3 BRNBW 4 OUT ModelThreeSensors__Sensor3 IN ModelThreeSensors__InterpreterC +VCCHANNEL ModelThreeSensors__sensorData3 0 + +// Events +EVENT ModelThreeSensors__evtA() NIB 8 ModelThreeSensors__InterpreterA ModelThreeSensors__Voter +EVENT ModelThreeSensors__evtB() NIB 8 ModelThreeSensors__InterpreterB ModelThreeSensors__Voter +EVENT ModelThreeSensors__evtC() NIB 8 ModelThreeSensors__InterpreterC ModelThreeSensors__Voter +EVENT ModelThreeSensors__evtTimeout() NIB 8 ModelThreeSensors__Timer ModelThreeSensors__Voter +EVENT ModelThreeSensors__moveto_FAIL_SAFE(bool) NIB 8 ModelThreeSensors__Voter ModelThreeSensors__Receiver + +// Requests + +TASK ModelThreeSensors__InterpreterA + TASKOP + //Local variables + int size = 50 + int sizeA = 10 + + //Behavior + READ ModelThreeSensors__sensorData1 size + EXECC size + NOTIFY ModelThreeSensors__evtA + WRITE ModelThreeSensors__resA sizeA +ENDTASK + +TASK ModelThreeSensors__InterpreterB + TASKOP + //Local variables + int size = 50 + int sizeB = 10 + + //Behavior + READ ModelThreeSensors__sensorData2 size + EXECC size + NOTIFY ModelThreeSensors__evtB + WRITE ModelThreeSensors__resB sizeB +ENDTASK + +TASK ModelThreeSensors__InterpreterC + TASKOP + //Local variables + int size = 50 + int sizeC = 10 + + //Behavior + READ ModelThreeSensors__sensorData3 size + EXECC size + NOTIFY ModelThreeSensors__evtC + WRITE ModelThreeSensors__resC sizeC +ENDTASK + +TASK ModelThreeSensors__Receiver + TASKOP + //Local variables + int executeSensor = 10 + bool x = false + + //Behavior + FOR(; ; ) + WAIT ModelThreeSensors__moveto_FAIL_SAFE x + READ ModelThreeSensors__resultData 1 + EXECI executeSensor + ENDFOR +ENDTASK + +TASK ModelThreeSensors__Sensor1 + TASKOP + //Local variables + + //Behavior + FOR(; ; ) + WRITE ModelThreeSensors__sensorData1 1 + DELAY 10 ms isActiveDelay false + ENDFOR +ENDTASK + +TASK ModelThreeSensors__Sensor2 + TASKOP + //Local variables + + //Behavior + FOR(; ; ) + WRITE ModelThreeSensors__sensorData2 1 + DELAY 10 ms isActiveDelay false + ENDFOR +ENDTASK + +TASK ModelThreeSensors__Sensor3 + TASKOP + //Local variables + + //Behavior + FOR(; ; ) + WRITE ModelThreeSensors__sensorData3 1 + DELAY 10 ms isActiveDelay false + ENDFOR +ENDTASK + +TASK ModelThreeSensors__Timer + TASKOP + //Local variables + int dataReceivingTimeout = 500 + + //Behavior + DELAY dataReceivingTimeout ns isActiveDelay false + NOTIFY ModelThreeSensors__evtTimeout +ENDTASK + +TASK ModelThreeSensors__Voter + TASKOP + //Local variables + bool x = false + int interpreteTime = 5 + bool dataProcessed = false + int indexA = 0 + int indexB = 0 + int indexC = 0 + int sizeA = 10 + int sizeB = 10 + int sizeC = 10 + int i = 0 + + //Behavior + FOR(i=0; i<3; ) + SELECTEVT + CASE ModelThreeSensors__evtTimeout + i=3 + ENDCASE + CASE ModelThreeSensors__evtC + READ ModelThreeSensors__resC sizeC + indexC=indexC+1 + IF (indexC==1) + i=i+1 + ELSE + ENDIF + ENDCASE + CASE ModelThreeSensors__evtB + READ ModelThreeSensors__resB sizeB + indexB=indexB+1 + IF (indexB==1) + i=i+1 + ELSE + ENDIF + ENDCASE + CASE ModelThreeSensors__evtA + READ ModelThreeSensors__resA sizeA + indexA=indexA+1 + IF (indexA==1) + i=i+1 + ELSE + ENDIF + ENDCASE + ENDSELECTEVT + ENDFOR + EXECC interpreteTime + RAND + CASERAND 50 + x=true + ENDCASERAND + CASERAND 50 + x=false + ENDCASERAND + ENDRAND + NOTIFY ModelThreeSensors__moveto_FAIL_SAFE x + WRITE ModelThreeSensors__resultData 1 +ENDTASK + diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tarchi b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tarchi new file mode 100644 index 0000000000000000000000000000000000000000..b6c92cd2d1c8b973d97ca917dd1838c369ecdcb7 --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tarchi @@ -0,0 +1,166 @@ +// Master clock frequency - in MHz +MASTERCLOCKFREQUENCY 200 + +NODE BRIDGE BridgeEnvironmentPrivate +SET BridgeEnvironmentPrivate bufferByteSize 4 +SET BridgeEnvironmentPrivate clockDivider 1 + +NODE BRIDGE BridgeReceiverPrivate +SET BridgeReceiverPrivate bufferByteSize 4 +SET BridgeReceiverPrivate clockDivider 1 + +NODE BUS BusEnvironmentPrivate +SET BusEnvironmentPrivate byteDataSize 4 +SET BusEnvironmentPrivate pipelineSize 1 +SET BusEnvironmentPrivate arbitration 0 +SET BusEnvironmentPrivate sliceTime 10000 +SET BusEnvironmentPrivate burstSize 100 +SET BusEnvironmentPrivate privacy private +SET BusEnvironmentPrivate clockDivider 1 + +NODE BUS BusReceiverPrivate +SET BusReceiverPrivate byteDataSize 4 +SET BusReceiverPrivate pipelineSize 1 +SET BusReceiverPrivate arbitration 0 +SET BusReceiverPrivate sliceTime 10000 +SET BusReceiverPrivate burstSize 100 +SET BusReceiverPrivate privacy private +SET BusReceiverPrivate clockDivider 1 + +NODE MEMORY MemoryEnvironmentPrivate +SET MemoryEnvironmentPrivate byteDataSize 4 +SET MemoryEnvironmentPrivate clockDivider 1 + +NODE MEMORY MemoryReceiverPrivate +SET MemoryReceiverPrivate byteDataSize 4 +SET MemoryReceiverPrivate clockDivider 1 + +NODE MEMORY MemoryReceiver +SET MemoryReceiver byteDataSize 4 +SET MemoryReceiver clockDivider 1 + +NODE MEMORY MemoryEnvironment +SET MemoryEnvironment byteDataSize 4 +SET MemoryEnvironment clockDivider 1 + +NODE CPU CPUReceiver +SET CPUReceiver nbOfCores 1 +SET CPUReceiver byteDataSize 4 +SET CPUReceiver pipelineSize 5 +SET CPUReceiver goIdleTime 10 +SET CPUReceiver maxConsecutiveIdleCycles 10 +SET CPUReceiver taskSwitchingTime 20 +SET CPUReceiver branchingPredictionPenalty 2 +SET CPUReceiver cacheMiss 5 +SET CPUReceiver schedulingPolicy 0 +SET CPUReceiver sliceTime 10000 +SET CPUReceiver execiTime 1 +SET CPUReceiver execcTime 1 +SET CPUReceiver clockDivider 1 + +NODE CPU CPUEnvironment +SET CPUEnvironment nbOfCores 1 +SET CPUEnvironment byteDataSize 4 +SET CPUEnvironment pipelineSize 5 +SET CPUEnvironment goIdleTime 10 +SET CPUEnvironment maxConsecutiveIdleCycles 10 +SET CPUEnvironment taskSwitchingTime 20 +SET CPUEnvironment branchingPredictionPenalty 2 +SET CPUEnvironment cacheMiss 5 +SET CPUEnvironment schedulingPolicy 0 +SET CPUEnvironment sliceTime 10000 +SET CPUEnvironment execiTime 1 +SET CPUEnvironment execcTime 1 +SET CPUEnvironment clockDivider 1 + +NODE BUS BusReceiver +SET BusReceiver byteDataSize 4 +SET BusReceiver pipelineSize 1 +SET BusReceiver arbitration 0 +SET BusReceiver sliceTime 10000 +SET BusReceiver burstSize 100 +SET BusReceiver privacy public +SET BusReceiver clockDivider 1 + +NODE BUS BusEnvironment +SET BusEnvironment byteDataSize 4 +SET BusEnvironment pipelineSize 1 +SET BusEnvironment arbitration 0 +SET BusEnvironment sliceTime 10000 +SET BusEnvironment burstSize 100 +SET BusEnvironment privacy public +SET BusEnvironment clockDivider 1 + +NODE BRIDGE BridgeReceiver +SET BridgeReceiver bufferByteSize 4 +SET BridgeReceiver clockDivider 1 + +NODE BRIDGE BridgeEnvironment +SET BridgeEnvironment bufferByteSize 4 +SET BridgeEnvironment clockDivider 1 + +NODE BUS MainBus +SET MainBus byteDataSize 4 +SET MainBus pipelineSize 1 +SET MainBus arbitration 0 +SET MainBus sliceTime 10000 +SET MainBus burstSize 100 +SET MainBus privacy public +SET MainBus clockDivider 1 + +NODE LINK link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate +SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate node MemoryEnvironmentPrivate +SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate bus BusEnvironmentPrivate +SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate priority 0 +NODE LINK link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate +SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate node BridgeEnvironmentPrivate +SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate bus BusEnvironmentPrivate +SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate priority 0 +NODE LINK link_BridgeEnvironmentPrivate_to_BusEnvironment +SET link_BridgeEnvironmentPrivate_to_BusEnvironment node BridgeEnvironmentPrivate +SET link_BridgeEnvironmentPrivate_to_BusEnvironment bus BusEnvironment +SET link_BridgeEnvironmentPrivate_to_BusEnvironment priority 0 +NODE LINK link_MemoryReceiverPrivate_to_BusReceiverPrivate +SET link_MemoryReceiverPrivate_to_BusReceiverPrivate node MemoryReceiverPrivate +SET link_MemoryReceiverPrivate_to_BusReceiverPrivate bus BusReceiverPrivate +SET link_MemoryReceiverPrivate_to_BusReceiverPrivate priority 0 +NODE LINK link_BridgeReceiverPrivate_to_BusReceiverPrivate +SET link_BridgeReceiverPrivate_to_BusReceiverPrivate node BridgeReceiverPrivate +SET link_BridgeReceiverPrivate_to_BusReceiverPrivate bus BusReceiverPrivate +SET link_BridgeReceiverPrivate_to_BusReceiverPrivate priority 0 +NODE LINK link_BridgeReceiverPrivate_to_BusReceiver +SET link_BridgeReceiverPrivate_to_BusReceiver node BridgeReceiverPrivate +SET link_BridgeReceiverPrivate_to_BusReceiver bus BusReceiver +SET link_BridgeReceiverPrivate_to_BusReceiver priority 0 +NODE LINK link_CPUEnvironment_to_BusEnvironmentPrivate +SET link_CPUEnvironment_to_BusEnvironmentPrivate node CPUEnvironment +SET link_CPUEnvironment_to_BusEnvironmentPrivate bus BusEnvironmentPrivate +SET link_CPUEnvironment_to_BusEnvironmentPrivate priority 0 +NODE LINK link_MemoryEnvironment_to_BusEnvironment +SET link_MemoryEnvironment_to_BusEnvironment node MemoryEnvironment +SET link_MemoryEnvironment_to_BusEnvironment bus BusEnvironment +SET link_MemoryEnvironment_to_BusEnvironment priority 0 +NODE LINK link_BridgeEnvironment_to_BusEnvironment +SET link_BridgeEnvironment_to_BusEnvironment node BridgeEnvironment +SET link_BridgeEnvironment_to_BusEnvironment bus BusEnvironment +SET link_BridgeEnvironment_to_BusEnvironment priority 0 +NODE LINK link_BridgeEnvironment_to_MainBus +SET link_BridgeEnvironment_to_MainBus node BridgeEnvironment +SET link_BridgeEnvironment_to_MainBus bus MainBus +SET link_BridgeEnvironment_to_MainBus priority 0 +NODE LINK link_BridgeReceiver_to_BusReceiver +SET link_BridgeReceiver_to_BusReceiver node BridgeReceiver +SET link_BridgeReceiver_to_BusReceiver bus BusReceiver +SET link_BridgeReceiver_to_BusReceiver priority 0 +NODE LINK link_BridgeReceiver_to_MainBus +SET link_BridgeReceiver_to_MainBus node BridgeReceiver +SET link_BridgeReceiver_to_MainBus bus MainBus +SET link_BridgeReceiver_to_MainBus priority 0 +NODE LINK link_CPUReceiver_to_BusReceiverPrivate +SET link_CPUReceiver_to_BusReceiverPrivate node CPUReceiver +SET link_CPUReceiver_to_BusReceiverPrivate bus BusReceiverPrivate +SET link_CPUReceiver_to_BusReceiverPrivate priority 0 +NODE LINK link_MemoryReceiver_to_BusReceiver +SET link_MemoryReceiver_to_BusReceiver node MemoryReceiver +SET link_MemoryReceiver_to_BusReceiver bus BusReceiver +SET link_MemoryReceiver_to_BusReceiver priority 0 diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tmap b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tmap new file mode 100644 index 0000000000000000000000000000000000000000..cd705fcb3e9900a64d8062dd4029d58a6db203d6 --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tmap @@ -0,0 +1,26 @@ +TMLSPEC + #include "modelWithOneSensor.tml" +ENDTMLSPEC + +TMLARCHI + #include "modelWithOneSensor.tarchi" +ENDTMLARCHI + +TMLMAPPING + MAP CPUReceiver ModelOneSensor__Receiver + SET ModelOneSensor__Receiver priority 0 + MAP CPUEnvironment ModelOneSensor__Sensor + SET ModelOneSensor__Sensor priority 0 + MAP MemoryEnvironment ModelOneSensor__sensorData + SET ModelOneSensor__sensorData priority 0 + MAP BusEnvironment ModelOneSensor__sensorData + SET ModelOneSensor__sensorData priority 0 + MAP MainBus ModelOneSensor__sensorData + SET ModelOneSensor__sensorData priority 0 + MAP BusReceiver ModelOneSensor__sensorData + SET ModelOneSensor__sensorData priority 0 + MAP BusReceiverPrivate ModelOneSensor__sensorData + SET ModelOneSensor__sensorData priority 0 + MAP BusEnvironmentPrivate ModelOneSensor__sensorData + SET ModelOneSensor__sensorData priority 0 +ENDTMLMAPPING diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tml b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tml new file mode 100644 index 0000000000000000000000000000000000000000..bd0e0f6006f221776f4fb75a59bc11d483f5c4cd --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithOneSensor.tml @@ -0,0 +1,37 @@ +// TML Application - FORMAT 0.2 +// Application: modelWithOneSensor.xml +// Generated: Sat Nov 11 15:57:04 CET 2023 + +// PRAGMAS + +// Channels +CHANNEL ModelOneSensor__sensorData BRNBW 4 OUT ModelOneSensor__Sensor IN ModelOneSensor__Receiver +VCCHANNEL ModelOneSensor__sensorData 0 + +// Events + +// Requests + +TASK ModelOneSensor__Receiver + TASKOP + //Local variables + int executeSensor = 10 + + //Behavior + FOR( ; ; ) + READ ModelOneSensor__sensorData 1 + EXECI executeSensor + ENDFOR +ENDTASK + +TASK ModelOneSensor__Sensor + TASKOP + //Local variables + + //Behavior + FOR( ; ; ) + WRITE ModelOneSensor__sensorData 1 + DELAY 10 ms isActiveDelay false + ENDFOR +ENDTASK + diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tarchi b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tarchi new file mode 100644 index 0000000000000000000000000000000000000000..b6c92cd2d1c8b973d97ca917dd1838c369ecdcb7 --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tarchi @@ -0,0 +1,166 @@ +// Master clock frequency - in MHz +MASTERCLOCKFREQUENCY 200 + +NODE BRIDGE BridgeEnvironmentPrivate +SET BridgeEnvironmentPrivate bufferByteSize 4 +SET BridgeEnvironmentPrivate clockDivider 1 + +NODE BRIDGE BridgeReceiverPrivate +SET BridgeReceiverPrivate bufferByteSize 4 +SET BridgeReceiverPrivate clockDivider 1 + +NODE BUS BusEnvironmentPrivate +SET BusEnvironmentPrivate byteDataSize 4 +SET BusEnvironmentPrivate pipelineSize 1 +SET BusEnvironmentPrivate arbitration 0 +SET BusEnvironmentPrivate sliceTime 10000 +SET BusEnvironmentPrivate burstSize 100 +SET BusEnvironmentPrivate privacy private +SET BusEnvironmentPrivate clockDivider 1 + +NODE BUS BusReceiverPrivate +SET BusReceiverPrivate byteDataSize 4 +SET BusReceiverPrivate pipelineSize 1 +SET BusReceiverPrivate arbitration 0 +SET BusReceiverPrivate sliceTime 10000 +SET BusReceiverPrivate burstSize 100 +SET BusReceiverPrivate privacy private +SET BusReceiverPrivate clockDivider 1 + +NODE MEMORY MemoryEnvironmentPrivate +SET MemoryEnvironmentPrivate byteDataSize 4 +SET MemoryEnvironmentPrivate clockDivider 1 + +NODE MEMORY MemoryReceiverPrivate +SET MemoryReceiverPrivate byteDataSize 4 +SET MemoryReceiverPrivate clockDivider 1 + +NODE MEMORY MemoryReceiver +SET MemoryReceiver byteDataSize 4 +SET MemoryReceiver clockDivider 1 + +NODE MEMORY MemoryEnvironment +SET MemoryEnvironment byteDataSize 4 +SET MemoryEnvironment clockDivider 1 + +NODE CPU CPUReceiver +SET CPUReceiver nbOfCores 1 +SET CPUReceiver byteDataSize 4 +SET CPUReceiver pipelineSize 5 +SET CPUReceiver goIdleTime 10 +SET CPUReceiver maxConsecutiveIdleCycles 10 +SET CPUReceiver taskSwitchingTime 20 +SET CPUReceiver branchingPredictionPenalty 2 +SET CPUReceiver cacheMiss 5 +SET CPUReceiver schedulingPolicy 0 +SET CPUReceiver sliceTime 10000 +SET CPUReceiver execiTime 1 +SET CPUReceiver execcTime 1 +SET CPUReceiver clockDivider 1 + +NODE CPU CPUEnvironment +SET CPUEnvironment nbOfCores 1 +SET CPUEnvironment byteDataSize 4 +SET CPUEnvironment pipelineSize 5 +SET CPUEnvironment goIdleTime 10 +SET CPUEnvironment maxConsecutiveIdleCycles 10 +SET CPUEnvironment taskSwitchingTime 20 +SET CPUEnvironment branchingPredictionPenalty 2 +SET CPUEnvironment cacheMiss 5 +SET CPUEnvironment schedulingPolicy 0 +SET CPUEnvironment sliceTime 10000 +SET CPUEnvironment execiTime 1 +SET CPUEnvironment execcTime 1 +SET CPUEnvironment clockDivider 1 + +NODE BUS BusReceiver +SET BusReceiver byteDataSize 4 +SET BusReceiver pipelineSize 1 +SET BusReceiver arbitration 0 +SET BusReceiver sliceTime 10000 +SET BusReceiver burstSize 100 +SET BusReceiver privacy public +SET BusReceiver clockDivider 1 + +NODE BUS BusEnvironment +SET BusEnvironment byteDataSize 4 +SET BusEnvironment pipelineSize 1 +SET BusEnvironment arbitration 0 +SET BusEnvironment sliceTime 10000 +SET BusEnvironment burstSize 100 +SET BusEnvironment privacy public +SET BusEnvironment clockDivider 1 + +NODE BRIDGE BridgeReceiver +SET BridgeReceiver bufferByteSize 4 +SET BridgeReceiver clockDivider 1 + +NODE BRIDGE BridgeEnvironment +SET BridgeEnvironment bufferByteSize 4 +SET BridgeEnvironment clockDivider 1 + +NODE BUS MainBus +SET MainBus byteDataSize 4 +SET MainBus pipelineSize 1 +SET MainBus arbitration 0 +SET MainBus sliceTime 10000 +SET MainBus burstSize 100 +SET MainBus privacy public +SET MainBus clockDivider 1 + +NODE LINK link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate +SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate node MemoryEnvironmentPrivate +SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate bus BusEnvironmentPrivate +SET link_MemoryEnvironmentPrivate_to_BusEnvironmentPrivate priority 0 +NODE LINK link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate +SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate node BridgeEnvironmentPrivate +SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate bus BusEnvironmentPrivate +SET link_BridgeEnvironmentPrivate_to_BusEnvironmentPrivate priority 0 +NODE LINK link_BridgeEnvironmentPrivate_to_BusEnvironment +SET link_BridgeEnvironmentPrivate_to_BusEnvironment node BridgeEnvironmentPrivate +SET link_BridgeEnvironmentPrivate_to_BusEnvironment bus BusEnvironment +SET link_BridgeEnvironmentPrivate_to_BusEnvironment priority 0 +NODE LINK link_MemoryReceiverPrivate_to_BusReceiverPrivate +SET link_MemoryReceiverPrivate_to_BusReceiverPrivate node MemoryReceiverPrivate +SET link_MemoryReceiverPrivate_to_BusReceiverPrivate bus BusReceiverPrivate +SET link_MemoryReceiverPrivate_to_BusReceiverPrivate priority 0 +NODE LINK link_BridgeReceiverPrivate_to_BusReceiverPrivate +SET link_BridgeReceiverPrivate_to_BusReceiverPrivate node BridgeReceiverPrivate +SET link_BridgeReceiverPrivate_to_BusReceiverPrivate bus BusReceiverPrivate +SET link_BridgeReceiverPrivate_to_BusReceiverPrivate priority 0 +NODE LINK link_BridgeReceiverPrivate_to_BusReceiver +SET link_BridgeReceiverPrivate_to_BusReceiver node BridgeReceiverPrivate +SET link_BridgeReceiverPrivate_to_BusReceiver bus BusReceiver +SET link_BridgeReceiverPrivate_to_BusReceiver priority 0 +NODE LINK link_CPUEnvironment_to_BusEnvironmentPrivate +SET link_CPUEnvironment_to_BusEnvironmentPrivate node CPUEnvironment +SET link_CPUEnvironment_to_BusEnvironmentPrivate bus BusEnvironmentPrivate +SET link_CPUEnvironment_to_BusEnvironmentPrivate priority 0 +NODE LINK link_MemoryEnvironment_to_BusEnvironment +SET link_MemoryEnvironment_to_BusEnvironment node MemoryEnvironment +SET link_MemoryEnvironment_to_BusEnvironment bus BusEnvironment +SET link_MemoryEnvironment_to_BusEnvironment priority 0 +NODE LINK link_BridgeEnvironment_to_BusEnvironment +SET link_BridgeEnvironment_to_BusEnvironment node BridgeEnvironment +SET link_BridgeEnvironment_to_BusEnvironment bus BusEnvironment +SET link_BridgeEnvironment_to_BusEnvironment priority 0 +NODE LINK link_BridgeEnvironment_to_MainBus +SET link_BridgeEnvironment_to_MainBus node BridgeEnvironment +SET link_BridgeEnvironment_to_MainBus bus MainBus +SET link_BridgeEnvironment_to_MainBus priority 0 +NODE LINK link_BridgeReceiver_to_BusReceiver +SET link_BridgeReceiver_to_BusReceiver node BridgeReceiver +SET link_BridgeReceiver_to_BusReceiver bus BusReceiver +SET link_BridgeReceiver_to_BusReceiver priority 0 +NODE LINK link_BridgeReceiver_to_MainBus +SET link_BridgeReceiver_to_MainBus node BridgeReceiver +SET link_BridgeReceiver_to_MainBus bus MainBus +SET link_BridgeReceiver_to_MainBus priority 0 +NODE LINK link_CPUReceiver_to_BusReceiverPrivate +SET link_CPUReceiver_to_BusReceiverPrivate node CPUReceiver +SET link_CPUReceiver_to_BusReceiverPrivate bus BusReceiverPrivate +SET link_CPUReceiver_to_BusReceiverPrivate priority 0 +NODE LINK link_MemoryReceiver_to_BusReceiver +SET link_MemoryReceiver_to_BusReceiver node MemoryReceiver +SET link_MemoryReceiver_to_BusReceiver bus BusReceiver +SET link_MemoryReceiver_to_BusReceiver priority 0 diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tmap b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tmap new file mode 100644 index 0000000000000000000000000000000000000000..7b951259eeabbea59f3c517638ca731da1eecccf --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tmap @@ -0,0 +1,54 @@ +TMLSPEC + #include "modelWithThreeSensors.tml" +ENDTMLSPEC + +TMLARCHI + #include "modelWithThreeSensors.tarchi" +ENDTMLARCHI + +TMLMAPPING + MAP CPUReceiver ModelThreeSensors__Receiver + SET ModelThreeSensors__Receiver priority 0 + MAP CPUEnvironment ModelThreeSensors__Sensor3 + SET ModelThreeSensors__Sensor3 priority 0 + MAP CPUEnvironment ModelThreeSensors__Sensor2 + SET ModelThreeSensors__Sensor2 priority 0 + MAP CPUEnvironment ModelThreeSensors__Sensor1 + SET ModelThreeSensors__Sensor1 priority 0 + MAP MemoryEnvironment ModelThreeSensors__sensorData3 + SET ModelThreeSensors__sensorData3 priority 0 + MAP BusEnvironment ModelThreeSensors__sensorData3 + SET ModelThreeSensors__sensorData3 priority 0 + MAP MainBus ModelThreeSensors__sensorData3 + SET ModelThreeSensors__sensorData3 priority 0 + MAP BusReceiverPrivate ModelThreeSensors__sensorData3 + SET ModelThreeSensors__sensorData3 priority 0 + MAP BusEnvironmentPrivate ModelThreeSensors__sensorData3 + SET ModelThreeSensors__sensorData3 priority 0 + MAP BusReceiver ModelThreeSensors__sensorData3 + SET ModelThreeSensors__sensorData3 priority 0 + MAP MemoryEnvironment ModelThreeSensors__sensorData1 + SET ModelThreeSensors__sensorData1 priority 0 + MAP BusEnvironment ModelThreeSensors__sensorData1 + SET ModelThreeSensors__sensorData1 priority 0 + MAP MainBus ModelThreeSensors__sensorData1 + SET ModelThreeSensors__sensorData1 priority 0 + MAP BusReceiver ModelThreeSensors__sensorData1 + SET ModelThreeSensors__sensorData1 priority 0 + MAP BusReceiverPrivate ModelThreeSensors__sensorData1 + SET ModelThreeSensors__sensorData1 priority 0 + MAP BusEnvironmentPrivate ModelThreeSensors__sensorData1 + SET ModelThreeSensors__sensorData1 priority 0 + MAP MemoryEnvironment ModelThreeSensors__sensorData2 + SET ModelThreeSensors__sensorData2 priority 0 + MAP BusEnvironment ModelThreeSensors__sensorData2 + SET ModelThreeSensors__sensorData2 priority 0 + MAP MainBus ModelThreeSensors__sensorData2 + SET ModelThreeSensors__sensorData2 priority 0 + MAP BusEnvironmentPrivate ModelThreeSensors__sensorData2 + SET ModelThreeSensors__sensorData2 priority 0 + MAP BusReceiverPrivate ModelThreeSensors__sensorData2 + SET ModelThreeSensors__sensorData2 priority 0 + MAP BusReceiver ModelThreeSensors__sensorData2 + SET ModelThreeSensors__sensorData2 priority 0 +ENDTMLMAPPING diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tml b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tml new file mode 100644 index 0000000000000000000000000000000000000000..ea7cbae4f75bd73c4e2d02ecb82884ce48d7ecc7 --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/modelsToIntegrateTMR/modelWithThreeSensors.tml @@ -0,0 +1,65 @@ +// TML Application - FORMAT 0.2 +// Application: modelWithThreeSensors.xml +// Generated: Sat Nov 11 16:00:27 CET 2023 + +// PRAGMAS + +// Channels +CHANNEL ModelThreeSensors__sensorData1 BRNBW 4 OUT ModelThreeSensors__Sensor1 IN ModelThreeSensors__Receiver +VCCHANNEL ModelThreeSensors__sensorData1 0 +CHANNEL ModelThreeSensors__sensorData2 BRNBW 4 OUT ModelThreeSensors__Sensor2 IN ModelThreeSensors__Receiver +VCCHANNEL ModelThreeSensors__sensorData2 0 +CHANNEL ModelThreeSensors__sensorData3 BRNBW 4 OUT ModelThreeSensors__Sensor3 IN ModelThreeSensors__Receiver +VCCHANNEL ModelThreeSensors__sensorData3 0 + +// Events + +// Requests + +TASK ModelThreeSensors__Receiver + TASKOP + //Local variables + int executeSensor = 10 + + //Behavior + FOR( ; ; ) + READ ModelThreeSensors__sensorData1 1 + READ ModelThreeSensors__sensorData2 1 + READ ModelThreeSensors__sensorData3 1 + EXECI executeSensor + ENDFOR +ENDTASK + +TASK ModelThreeSensors__Sensor1 + TASKOP + //Local variables + + //Behavior + FOR( ; ; ) + WRITE ModelThreeSensors__sensorData1 1 + DELAY 10 ms isActiveDelay false + ENDFOR +ENDTASK + +TASK ModelThreeSensors__Sensor2 + TASKOP + //Local variables + + //Behavior + FOR( ; ; ) + WRITE ModelThreeSensors__sensorData2 1 + DELAY 10 ms isActiveDelay false + ENDFOR +ENDTASK + +TASK ModelThreeSensors__Sensor3 + TASKOP + //Local variables + + //Behavior + FOR( ; ; ) + WRITE ModelThreeSensors__sensorData3 1 + DELAY 10 ms isActiveDelay false + ENDFOR +ENDTASK + diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tarchi b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tarchi new file mode 100644 index 0000000000000000000000000000000000000000..edc6b1fdd3385da6b13e58be43bfce5a421c1872 --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tarchi @@ -0,0 +1,223 @@ +// Master clock frequency - in MHz +MASTERCLOCKFREQUENCY 200 + +NODE BRIDGE BridgeV_Voter +SET BridgeV_Voter bufferByteSize 4 +SET BridgeV_Voter clockDivider 1 + +NODE BRIDGE BridgeC_Voter +SET BridgeC_Voter bufferByteSize 4 +SET BridgeC_Voter clockDivider 1 + +NODE BRIDGE BridgeB_Voter +SET BridgeB_Voter bufferByteSize 4 +SET BridgeB_Voter clockDivider 1 + +NODE BRIDGE BridgeA_Voter +SET BridgeA_Voter bufferByteSize 4 +SET BridgeA_Voter clockDivider 1 + +NODE BUS BusVoter +SET BusVoter byteDataSize 4 +SET BusVoter pipelineSize 1 +SET BusVoter arbitration 0 +SET BusVoter sliceTime 10000 +SET BusVoter burstSize 100 +SET BusVoter privacy public +SET BusVoter clockDivider 1 + +NODE BUS BusC +SET BusC byteDataSize 4 +SET BusC pipelineSize 1 +SET BusC arbitration 0 +SET BusC sliceTime 10000 +SET BusC burstSize 100 +SET BusC privacy public +SET BusC clockDivider 1 + +NODE BUS BusB +SET BusB byteDataSize 4 +SET BusB pipelineSize 1 +SET BusB arbitration 0 +SET BusB sliceTime 10000 +SET BusB burstSize 100 +SET BusB privacy public +SET BusB clockDivider 1 + +NODE BUS BusA +SET BusA byteDataSize 4 +SET BusA pipelineSize 1 +SET BusA arbitration 0 +SET BusA sliceTime 10000 +SET BusA burstSize 100 +SET BusA privacy public +SET BusA clockDivider 1 + +NODE CPU user +SET user nbOfCores 1 +SET user byteDataSize 4 +SET user pipelineSize 5 +SET user goIdleTime 10 +SET user maxConsecutiveIdleCycles 10 +SET user taskSwitchingTime 20 +SET user branchingPredictionPenalty 2 +SET user cacheMiss 5 +SET user schedulingPolicy 0 +SET user sliceTime 10000 +SET user execiTime 1 +SET user execcTime 1 +SET user clockDivider 1 + +NODE BUS BusV +SET BusV byteDataSize 4 +SET BusV pipelineSize 1 +SET BusV arbitration 0 +SET BusV sliceTime 10000 +SET BusV burstSize 100 +SET BusV privacy public +SET BusV clockDivider 1 + +NODE MEMORY MemoryVoter +SET MemoryVoter byteDataSize 4 +SET MemoryVoter clockDivider 1 + +NODE CPU voter +SET voter nbOfCores 8 +SET voter byteDataSize 4 +SET voter pipelineSize 5 +SET voter goIdleTime 10 +SET voter maxConsecutiveIdleCycles 10 +SET voter taskSwitchingTime 20 +SET voter branchingPredictionPenalty 2 +SET voter cacheMiss 5 +SET voter schedulingPolicy 0 +SET voter sliceTime 10000 +SET voter execiTime 1 +SET voter execcTime 1 +SET voter clockDivider 1 + +NODE CPU sensorC +SET sensorC nbOfCores 4 +SET sensorC byteDataSize 4 +SET sensorC pipelineSize 5 +SET sensorC goIdleTime 10 +SET sensorC maxConsecutiveIdleCycles 10 +SET sensorC taskSwitchingTime 20 +SET sensorC branchingPredictionPenalty 2 +SET sensorC cacheMiss 5 +SET sensorC schedulingPolicy 0 +SET sensorC sliceTime 10000 +SET sensorC execiTime 1 +SET sensorC execcTime 1 +SET sensorC clockDivider 1 + +NODE MEMORY MemoryB +SET MemoryB byteDataSize 4 +SET MemoryB clockDivider 1 + +NODE CPU sensorA +SET sensorA nbOfCores 4 +SET sensorA byteDataSize 4 +SET sensorA pipelineSize 5 +SET sensorA goIdleTime 10 +SET sensorA maxConsecutiveIdleCycles 10 +SET sensorA taskSwitchingTime 20 +SET sensorA branchingPredictionPenalty 2 +SET sensorA cacheMiss 5 +SET sensorA schedulingPolicy 0 +SET sensorA sliceTime 10000 +SET sensorA execiTime 1 +SET sensorA execcTime 1 +SET sensorA clockDivider 1 + +NODE CPU sensorB +SET sensorB nbOfCores 4 +SET sensorB byteDataSize 4 +SET sensorB pipelineSize 5 +SET sensorB goIdleTime 10 +SET sensorB maxConsecutiveIdleCycles 10 +SET sensorB taskSwitchingTime 20 +SET sensorB branchingPredictionPenalty 2 +SET sensorB cacheMiss 5 +SET sensorB schedulingPolicy 0 +SET sensorB sliceTime 10000 +SET sensorB execiTime 1 +SET sensorB execcTime 1 +SET sensorB clockDivider 1 + +NODE MEMORY MemoryC +SET MemoryC byteDataSize 4 +SET MemoryC clockDivider 1 + +NODE MEMORY MemoryA +SET MemoryA byteDataSize 4 +SET MemoryA clockDivider 1 + +NODE LINK link_BridgeV_Voter_to_BusV +SET link_BridgeV_Voter_to_BusV node BridgeV_Voter +SET link_BridgeV_Voter_to_BusV bus BusV +SET link_BridgeV_Voter_to_BusV priority 0 +NODE LINK link_BridgeV_Voter_to_BusVoter +SET link_BridgeV_Voter_to_BusVoter node BridgeV_Voter +SET link_BridgeV_Voter_to_BusVoter bus BusVoter +SET link_BridgeV_Voter_to_BusVoter priority 0 +NODE LINK link_voter_to_BusVoter +SET link_voter_to_BusVoter node voter +SET link_voter_to_BusVoter bus BusVoter +SET link_voter_to_BusVoter priority 0 +NODE LINK link_BridgeA_Voter_to_BusVoter +SET link_BridgeA_Voter_to_BusVoter node BridgeA_Voter +SET link_BridgeA_Voter_to_BusVoter bus BusVoter +SET link_BridgeA_Voter_to_BusVoter priority 0 +NODE LINK link_BridgeB_Voter_to_BusVoter +SET link_BridgeB_Voter_to_BusVoter node BridgeB_Voter +SET link_BridgeB_Voter_to_BusVoter bus BusVoter +SET link_BridgeB_Voter_to_BusVoter priority 0 +NODE LINK link_BridgeC_Voter_to_BusVoter +SET link_BridgeC_Voter_to_BusVoter node BridgeC_Voter +SET link_BridgeC_Voter_to_BusVoter bus BusVoter +SET link_BridgeC_Voter_to_BusVoter priority 0 +NODE LINK link_BridgeC_Voter_to_BusC +SET link_BridgeC_Voter_to_BusC node BridgeC_Voter +SET link_BridgeC_Voter_to_BusC bus BusC +SET link_BridgeC_Voter_to_BusC priority 0 +NODE LINK link_BridgeB_Voter_to_BusB +SET link_BridgeB_Voter_to_BusB node BridgeB_Voter +SET link_BridgeB_Voter_to_BusB bus BusB +SET link_BridgeB_Voter_to_BusB priority 0 +NODE LINK link_BridgeA_Voter_to_BusA +SET link_BridgeA_Voter_to_BusA node BridgeA_Voter +SET link_BridgeA_Voter_to_BusA bus BusA +SET link_BridgeA_Voter_to_BusA priority 0 +NODE LINK link_user_to_BusV +SET link_user_to_BusV node user +SET link_user_to_BusV bus BusV +SET link_user_to_BusV priority 0 +NODE LINK link_MemoryC_to_BusC +SET link_MemoryC_to_BusC node MemoryC +SET link_MemoryC_to_BusC bus BusC +SET link_MemoryC_to_BusC priority 0 +NODE LINK link_MemoryB_to_BusB +SET link_MemoryB_to_BusB node MemoryB +SET link_MemoryB_to_BusB bus BusB +SET link_MemoryB_to_BusB priority 0 +NODE LINK link_sensorC_to_BusC +SET link_sensorC_to_BusC node sensorC +SET link_sensorC_to_BusC bus BusC +SET link_sensorC_to_BusC priority 0 +NODE LINK link_sensorB_to_BusB +SET link_sensorB_to_BusB node sensorB +SET link_sensorB_to_BusB bus BusB +SET link_sensorB_to_BusB priority 0 +NODE LINK link_MemoryA_to_BusA +SET link_MemoryA_to_BusA node MemoryA +SET link_MemoryA_to_BusA bus BusA +SET link_MemoryA_to_BusA priority 0 +NODE LINK link_sensorA_to_BusA +SET link_sensorA_to_BusA node sensorA +SET link_sensorA_to_BusA bus BusA +SET link_sensorA_to_BusA priority 0 +NODE LINK link_MemoryVoter_to_BusV +SET link_MemoryVoter_to_BusV node MemoryVoter +SET link_MemoryVoter_to_BusV bus BusV +SET link_MemoryVoter_to_BusV priority 0 diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tmap b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tmap new file mode 100644 index 0000000000000000000000000000000000000000..6db66f5cded5b3fac1e99da09800b2a2a401be13 --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tmap @@ -0,0 +1,70 @@ +TMLSPEC + #include "tmrPattern.tml" +ENDTMLSPEC + +TMLARCHI + #include "tmrPattern.tarchi" +ENDTMLARCHI + +TMLMAPPING + MAP user TMR__User + SET TMR__User priority 0 + MAP voter TMR__Timer + SET TMR__Timer priority 0 + MAP voter TMR__Voter + SET TMR__Voter priority 0 + MAP voter TMR__InterpreterA + SET TMR__InterpreterA priority 0 + MAP voter TMR__InterpreterB + SET TMR__InterpreterB priority 0 + MAP voter TMR__InterpreterC + SET TMR__InterpreterC priority 0 + MAP sensorC TMR__SensorC + SET TMR__SensorC priority 0 + MAP sensorA TMR__SensorA + SET TMR__SensorA priority 0 + MAP sensorB TMR__SensorB + SET TMR__SensorB priority 0 + MAP MemoryVoter TMR__resultData + SET TMR__resultData priority 0 + MAP BusV TMR__resultData + SET TMR__resultData priority 0 + MAP BusVoter TMR__resultData + SET TMR__resultData priority 0 + MAP MemoryVoter TMR__resA + SET TMR__resA priority 0 + MAP BusV TMR__resA + SET TMR__resA priority 0 + MAP BusVoter TMR__resA + SET TMR__resA priority 0 + MAP MemoryVoter TMR__resC + SET TMR__resC priority 0 + MAP BusV TMR__resC + SET TMR__resC priority 0 + MAP BusVoter TMR__resC + SET TMR__resC priority 0 + MAP MemoryVoter TMR__resB + SET TMR__resB priority 0 + MAP BusV TMR__resB + SET TMR__resB priority 0 + MAP BusVoter TMR__resB + SET TMR__resB priority 0 + MAP MemoryB TMR__dataB + SET TMR__dataB priority 0 + MAP BusB TMR__dataB + SET TMR__dataB priority 0 + MAP BusVoter TMR__dataB + SET TMR__dataB priority 0 + MAP MemoryC TMR__dataC + SET TMR__dataC priority 0 + MAP BusC TMR__dataC + SET TMR__dataC priority 0 + MAP BusVoter TMR__dataC + SET TMR__dataC priority 0 + MAP MemoryA TMR__dataA + SET TMR__dataA priority 0 + MAP BusA TMR__dataA + SET TMR__dataA priority 0 + MAP BusVoter TMR__dataA + SET TMR__dataA priority 0 +ENDTMLMAPPING diff --git a/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tml b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tml new file mode 100644 index 0000000000000000000000000000000000000000..07c6f5831a0d9f8ddd7a2641fe73e9cecf5233ee --- /dev/null +++ b/ttool/src/test/resources/cli/testPatternHandling/tmr/input/tmrPattern.tml @@ -0,0 +1,190 @@ +// TML Application - FORMAT 0.2 +// Application: tmrPattern.xml +// Generated: Sat Nov 11 15:19:32 CET 2023 + +// PRAGMAS + +// Channels +CHANNEL TMR__dataA BRBW 8 8 OUT TMR__SensorA IN TMR__InterpreterA +VCCHANNEL TMR__dataA 0 +CONFCHANNEL TMR__dataA +AUTHCHANNEL TMR__dataA +CHANNEL TMR__dataB BRBW 8 8 OUT TMR__SensorB IN TMR__InterpreterB +VCCHANNEL TMR__dataB 0 +CONFCHANNEL TMR__dataB +AUTHCHANNEL TMR__dataB +CHANNEL TMR__dataC BRBW 8 8 OUT TMR__SensorC IN TMR__InterpreterC +VCCHANNEL TMR__dataC 0 +CONFCHANNEL TMR__dataC +AUTHCHANNEL TMR__dataC +CHANNEL TMR__resA BRBW 8 8 OUT TMR__InterpreterA IN TMR__Voter +VCCHANNEL TMR__resA 0 +CONFCHANNEL TMR__resA +AUTHCHANNEL TMR__resA +CHANNEL TMR__resB BRBW 8 8 OUT TMR__InterpreterB IN TMR__Voter +VCCHANNEL TMR__resB 0 +CONFCHANNEL TMR__resB +AUTHCHANNEL TMR__resB +CHANNEL TMR__resC BRBW 8 8 OUT TMR__InterpreterC IN TMR__Voter +VCCHANNEL TMR__resC 0 +CONFCHANNEL TMR__resC +AUTHCHANNEL TMR__resC +CHANNEL TMR__resultData BRBW 8 8 OUT TMR__Voter IN TMR__User +VCCHANNEL TMR__resultData 0 +CONFCHANNEL TMR__resultData +AUTHCHANNEL TMR__resultData + +// Events +EVENT TMR__evtA__TMR__evtA() NIB 8 TMR__InterpreterA TMR__Voter +EVENT TMR__evtB__TMR__evtB() NIB 8 TMR__InterpreterB TMR__Voter +EVENT TMR__evtC__TMR__evtC() NIB 8 TMR__InterpreterC TMR__Voter +EVENT TMR__evtTimeout__TMR__evtTimeout() NIB 8 TMR__Timer TMR__Voter +EVENT TMR__moveto_FAIL_SAFE__TMR__moveto_FAIL_SAFE(bool) NIB 8 TMR__Voter TMR__User + +// Requests + +TASK TMR__InterpreterA + TASKOP + //Local variables + int size = 50 + int sizeA = 10 + + //Behavior + READ TMR__dataA size + EXECC size + NOTIFY TMR__evtA__TMR__evtA + WRITE TMR__resA sizeA +ENDTASK + +TASK TMR__InterpreterB + TASKOP + //Local variables + int size = 50 + int sizeB = 10 + + //Behavior + READ TMR__dataB size + EXECC size + NOTIFY TMR__evtB__TMR__evtB + WRITE TMR__resB sizeB +ENDTASK + +TASK TMR__InterpreterC + TASKOP + //Local variables + int size = 50 + int sizeC = 10 + + //Behavior + READ TMR__dataC size + EXECC size + NOTIFY TMR__evtC__TMR__evtC + WRITE TMR__resC sizeC +ENDTASK + +TASK TMR__SensorA + TASKOP + //Local variables + int size = 50 + + //Behavior + WRITE TMR__dataA size +ENDTASK + +TASK TMR__SensorB + TASKOP + //Local variables + int size = 50 + + //Behavior + WRITE TMR__dataB size +ENDTASK + +TASK TMR__SensorC + TASKOP + //Local variables + int size = 50 + + //Behavior + WRITE TMR__dataC size +ENDTASK + +TASK TMR__Timer + TASKOP + //Local variables + int dataReceivingTimeout = 2500 + + //Behavior + DELAY dataReceivingTimeout ns isActiveDelay false + NOTIFY TMR__evtTimeout__TMR__evtTimeout +ENDTASK + +TASK TMR__User + TASKOP + //Local variables + bool x + + //Behavior + WAIT TMR__moveto_FAIL_SAFE__TMR__moveto_FAIL_SAFE x + READ TMR__resultData 1 +ENDTASK + +TASK TMR__Voter + TASKOP + //Local variables + bool x + int interpreteTime = 5 + bool dataProcessed = false + int indexA = 0 + int indexB = 0 + int indexC = 0 + int sizeA = 10 + int sizeB = 10 + int sizeC = 10 + int i = 0 + + //Behavior + FOR(i=0; i<3; ) + SELECTEVT + CASE TMR__evtTimeout__TMR__evtTimeout + i=3 + ENDCASE + CASE TMR__evtC__TMR__evtC + READ TMR__resC sizeC + indexC=indexC+1 + IF (indexC==1) + i=i+1 + ELSE + ENDIF + ENDCASE + CASE TMR__evtB__TMR__evtB + READ TMR__resB sizeB + indexB=indexB+1 + IF (indexB==1) + i=i+1 + ELSE + ENDIF + ENDCASE + CASE TMR__evtA__TMR__evtA + READ TMR__resA sizeA + indexA=indexA+1 + IF (indexA==1) + i=i+1 + ELSE + ENDIF + ENDCASE + ENDSELECTEVT + ENDFOR + EXECC interpreteTime + RAND + CASERAND 50 + x=true + ENDCASERAND + CASERAND 50 + x=false + ENDCASERAND + ENDRAND + NOTIFY TMR__moveto_FAIL_SAFE__TMR__moveto_FAIL_SAFE x + WRITE TMR__resultData 1 +ENDTASK +