Преглед на файлове

Add more robust detection of edges.

Bentley James Oakes преди 6 години
родител
ревизия
431858ec4e
променени са 1 файла, в които са добавени 101 реда и са изтрити 32 реда
  1. 101 32
      client/modelverse_connector.js

+ 101 - 32
client/modelverse_connector.js

@@ -15,7 +15,7 @@ class ModelVerseConnector {
         ModelVerseConnector.element_map = {};
 
         ModelVerseConnector.PM2MV_metamodel_map = {
-            "/Formalisms/__LanguageSyntax__/SimpleClassDiagram/SimpleClassDiagram" : "formalisms/SimpleClassDiagrams"
+            "/Formalisms/__LanguageSyntax__/SimpleClassDiagram/SimpleClassDiagram" : "formalisms/SimpleClassDiagrams",
         };
 
         ModelVerseConnector.MV2PM_metamodel_map = ModelVerseConnector.reverse_dict(ModelVerseConnector.PM2MV_metamodel_map);
@@ -73,7 +73,7 @@ class ModelVerseConnector {
         // console.log("MV MM: " + primary_mm_MV);
 
         if (primary_mm_MV == undefined){
-            WindowManagement.openDialog(_ERROR,'Meta-model may not exist in ModelVerse: "' + primary_mm_PM + '"');
+            //WindowManagement.openDialog(_ERROR,'Meta-model may not exist in ModelVerse: "' + primary_mm_PM + '"');
             //return;
 
             if (primary_mm_PM.startsWith("/")){
@@ -109,17 +109,65 @@ class ModelVerseConnector {
             .then(ModelVerseConnector.get_output)
             .then(function(data){
 
-                let node_creation_promises = [];
+                //find edges
+                //these have srcs and dests in the edge list
+                let edge_map = {};
                 for (const [key, node] of Object.entries(m.nodes)) {
-                    if (node.name == undefined){
+
+                    let src = null;
+                    let dest = null;
+
+                    for (const [edge_key, edge] of Object.entries(m.edges)) {
+
+                        //iterate through each pair of edges
+                        if (edge_key == m.edges.length - 1){
+                            continue;
+                        }
+
+                        //only look at pairs
+                        if (parseInt(edge_key) % 2 == 1){
+                            continue;
+                        }
+
+                        let next_edge = m.edges[parseInt(edge_key) + 1];
+
+                        //see if the links overlap -> this node is an edge
+
+                        if (edge["dest"] == next_edge["src"] && next_edge["src"] == key){
+                            src = edge['src'];
+                            dest = next_edge['dest']
+                        }
+                    }
+
+                    if (src == null || dest == null){
                         continue;
                     }
 
+                    edge_map[key] = [src, dest];
+                }
+
+                let node_creation_promises = [];
+                for (const [key, node] of Object.entries(m.nodes)) {
+                    // if (node.name == undefined){
+                    //     continue;
+                    // }
+
+                    // console.log("Node creation:");
+                    // console.log(node);
+
                     if (!(node.linktype == undefined)){
                         continue;
                     }
 
-                    let node_name = node.name.value;
+                    if (Object.keys(edge_map).includes(key)){
+                        continue;
+                    }
+
+                    let node_name = key;
+                    if (node.name != undefined){
+                        node_name = node.name.value;
+                    }
+
                     let node_type = node.$type.split("/").slice(-1)[0];
 
                     node_creation_promises.push(ModelVerseConnector.send_command(
@@ -127,13 +175,18 @@ class ModelVerseConnector {
                     ));
 
                     let set_id = function (id){
-                        ModelVerseConnector.element_map[key] = id.split(" ")[1].replace("\"", "");
+
+                        if (id.includes("Success")){
+                            ModelVerseConnector.element_map[key] = id.split(" ")[1].replace("\"", "");
+                        }
+
                     };
 
 
                     node_creation_promises.push(ModelVerseConnector.get_output(set_id));
                 }
 
+                //TODO: Only for SimpleClassDiagrams?
                 let simple_type = ["String", "Int", "Float", "Boolean", "Code", "File", "Map", "List", "ENUM"];
                 for (let st of simple_type){
 
@@ -167,47 +220,46 @@ class ModelVerseConnector {
 
                     let edge_creation_promises = [];
                     for (const [key, node] of Object.entries(m.nodes)) {
-                        if (node.name == undefined || node.linktype != undefined) {
 
-                            let node_type = node.$type.split("/").slice(-1)[0];
+                        if (!(Object.keys(edge_map).includes(key))){
+                            continue;
+                        }
 
-                            let node_name = null;
-                            if (node.name != undefined) {
-                                node_name = node.name.value;
-                            }else{
-                                node_name = node_type + key;
-                            }
+                        // console.log("Creating edge:");
+                        // console.log(node);
 
+                        let node_type = node.$type.split("/").slice(-1)[0];
 
+                        let node_name = null;
+                        if (node.name != undefined) {
+                            node_name = node.name.value;
+                        }else{
+                            node_name = node_type + key;
+                        }
 
-                            let src = null;
-                            let dest = null;
+                        let es = edge_map[key][0];
+                        let ed = edge_map[key][1];
 
-                            for (const [edge_key, edge] of Object.entries(m.edges)) {
-                                if (edge['src'] == key) {
-                                    let ed = edge['dest'];
-                                    dest = ModelVerseConnector.element_map[ed];
+                        let src = ModelVerseConnector.element_map[es];
+                        let dest = ModelVerseConnector.element_map[ed];
 
-                                } else if (edge['dest'] == key) {
-                                    let es = edge['src'];
-                                    src = ModelVerseConnector.element_map[es];
-                                }
-                            }
+                        let set_id = function (id){
+                            if (id.includes("Success")){
+                               ModelVerseConnector.element_map[key] = id.split(" ")[1].replace("\"", "");
 
-                            let set_id = function (id){
-                                ModelVerseConnector.element_map[key] = id.split(" ")[1].replace("\"", "");
-                            };
+                            }
+                        };
 
 
+                        if (src != null && dest != null) {
                             edge_creation_promises.push(ModelVerseConnector.send_command(
                                 {"data": utils.jsons(["instantiate_edge", node_type, node_name, src, dest])}
                             ));
                             edge_creation_promises.push(ModelVerseConnector.get_output(set_id));
                         }
-
-
                     }
 
+
                     Promise.all(edge_creation_promises).then(function() {
 
 
@@ -323,6 +375,11 @@ class ModelVerseConnector {
                 let primary_MV_metamodel = metamodels.split(" ")[1].split(",")[0];
                 let primary_PM_metamodel = ModelVerseConnector.MV2PM_metamodel_map[primary_MV_metamodel];
 
+                if (primary_PM_metamodel == undefined){
+                    console.log("Warning: No metamodel known for " + primary_MV_metamodel);
+                    primary_PM_metamodel = primary_MV_metamodel;
+                }
+
                 console.log("MV MM: " + primary_MV_metamodel);
                 console.log("PM MM: " + primary_PM_metamodel);
 
@@ -398,6 +455,7 @@ class ModelVerseConnector {
                     if (add_properties) {
                         for (let [prop_name, prop_value] of Object.entries(obj)) {
 
+                            console.log(name + " :: " + prop_name + ' = ' + prop_value);
                             if (prop_name.startsWith("__")) {
                                 continue;
                             }
@@ -412,6 +470,10 @@ class ModelVerseConnector {
 
                             if (prop_name.endsWith("_cardinality")){
 
+                                if (!(Object.keys(model_links_dict).includes(name))){
+                                    continue;
+                                }
+
                                 let dest = undefined;
                                 let lower_upper = prop_name.split("_")[1];
                                 lower_upper = (lower_upper == "lower")? "min":"max";
@@ -428,7 +490,7 @@ class ModelVerseConnector {
                                     model_properties[dest] = [];
                                 }
                                 model_properties[dest].push([prop_name, prop_value]);
-                                //console.log(src + " :: " + prop_name + ' = ' + prop_value);
+
                                 continue;
 
                             }
@@ -496,6 +558,9 @@ class ModelVerseConnector {
 
                     for (const [obj_type, src, trgt, obj_id] of model_links){
 
+                        console.log("Link:");
+                        console.log(obj_type + " " + src + " " + trgt + " " + obj_id);
+
                         link_promises.push(new Promise(function(resolve, reject) {
                             let source_element = ele_ids[src];
                             let target_element = ele_ids[trgt];
@@ -844,7 +909,7 @@ class ModelVerseConnector {
         //if editing a model, exit it
         if (ModelVerseConnector.curr_model){
             let command = {"data": utils.jsons(["exit"])};
-            this.send_command(command).then(this.get_output)
+            ModelVerseConnector.send_command(command).then(this.get_output)
             .then(function(data){
                 ModelVerseConnector.curr_model = null;
             });
@@ -923,7 +988,11 @@ class ModelVerseConnector {
 
     static load_model(model_name) {
 
+        //TODO: Allow user to choose metamodel
         let metamodel = "formalisms/SimpleClassDiagrams";
+        if (model_name.includes("autotest") && model_name != "autotest/autotest"){
+            metamodel = "autotest/autotest";
+        }
 
         console.log("Loading model: " + model_name);
         ModelVerseConnector.set_status(ModelVerseConnector.WORKING);