1
1
import { GVTypes , PNLClasses } from '../constants' ;
2
+ import { PortTypes } from '@metacell/meta-diagram' ;
2
3
import ProjectionLink from './links/ProjectionLink' ;
3
4
import QueryService from '../services/queryService' ;
4
5
import MechanismNode from './nodes/mechanism/MechanismNode' ;
5
6
import CompositionNode from './nodes/composition/CompositionNode' ;
6
- import { PortTypes } from '@metacell/meta-diagram' ;
7
7
8
8
const html2json = require ( 'html2json' ) . html2json
9
9
const typesArray = Object . values ( GVTypes ) ;
@@ -13,10 +13,15 @@ const parse = require('dotparser');
13
13
export default class ModelInterpreter {
14
14
nativeModel : any ;
15
15
jsonModel : Object ;
16
+ modelMap : { [ key : string ] : Map < String , CompositionNode | MechanismNode | ProjectionLink | any > } ;
16
17
17
18
constructor ( model : any ) {
18
19
this . nativeModel = model ;
19
20
this . jsonModel = this . _convertModel ( model ) ;
21
+ this . modelMap = {
22
+ 'nodes' : new Map ( ) ,
23
+ 'links' : new Map ( )
24
+ } ;
20
25
}
21
26
22
27
_convertModel ( model : any ) : Object {
@@ -26,13 +31,13 @@ export default class ModelInterpreter {
26
31
} ;
27
32
28
33
parsedModel [ PNLClasses . COMPOSITION ] = model [ PNLClasses . COMPOSITION ] . map ( ( singleModel : any ) => {
29
- const newModel = parse ( singleModel ) . map ( ( elem : any ) => ModelInterpreter . castObject ( elem ) ) ;
34
+ const newModel = parse ( singleModel ) . map ( ( elem : any ) => ModelInterpreter . castObject ( elem , undefined , this . modelMap ) ) ;
30
35
return newModel ;
31
36
} ) ;
32
37
33
38
parsedModel [ PNLClasses . MECHANISM ] = model [ PNLClasses . MECHANISM ] . map ( ( singleNode : any ) => {
34
39
let tempNode = parse ( singleNode ) [ 0 ] . children . filter ( ( elem : { node_id : { id : string ; } ; } ) => elem . node_id . id !== 'graph' ) ;
35
- let newNode = tempNode . map ( ( elem : any ) => ModelInterpreter . castObject ( elem ) ) ;
40
+ let newNode = tempNode . map ( ( elem : any ) => ModelInterpreter . castObject ( elem , undefined , this . modelMap ) ) ;
36
41
return newNode ;
37
42
} ) ;
38
43
@@ -51,6 +56,10 @@ export default class ModelInterpreter {
51
56
return this . nativeModel ;
52
57
}
53
58
59
+ getModelElementsMap ( ) {
60
+ return this . modelMap ;
61
+ }
62
+
54
63
static parseNodePorts ( name : string , type : string ) : { [ key : string ] : any } {
55
64
let ports : { [ key : string ] : any [ ] } = {
56
65
[ PortTypes . INPUT_PORT ] : [ ] ,
@@ -80,7 +89,11 @@ export default class ModelInterpreter {
80
89
return ports ;
81
90
}
82
91
83
- static castObject ( item : MechanismNode | CompositionNode | ProjectionLink | any ) : MechanismNode | CompositionNode | ProjectionLink {
92
+ static castObject (
93
+ item : MechanismNode | CompositionNode | ProjectionLink | any ,
94
+ parent : any | undefined ,
95
+ modelMap : { [ key : string ] : Map < String , CompositionNode | MechanismNode | ProjectionLink | any > } )
96
+ : MechanismNode | CompositionNode | ProjectionLink {
84
97
let newNode = item ;
85
98
if ( item ?. type === undefined ) {
86
99
throw new TypeError ( 'type is missing, object cannot be casted to the right class type.' ) ;
@@ -94,6 +107,8 @@ export default class ModelInterpreter {
94
107
[ PNLClasses . PROJECTION ] : [ ] ,
95
108
[ PNLClasses . COMPOSITION ] : [ ] ,
96
109
}
110
+ newNode = new CompositionNode ( item . id , parent , '' , false , ports , extra , children ) ;
111
+ modelMap [ 'nodes' ] . set ( newNode . getName ( ) , newNode ) ;
97
112
item . children . forEach ( ( element : any ) => {
98
113
if ( element . type === 'attr_stmt' ) {
99
114
extra [ element . target ] = { }
@@ -107,15 +122,15 @@ export default class ModelInterpreter {
107
122
if ( typesArray . includes ( element . type ) ) {
108
123
switch ( element . type ) {
109
124
case GVTypes . COMPOSITION : {
110
- children [ PNLClasses . COMPOSITION ] . push ( ModelInterpreter . castObject ( element ) ) ;
125
+ children [ PNLClasses . COMPOSITION ] . push ( ModelInterpreter . castObject ( element , newNode , modelMap ) ) ;
111
126
break ;
112
127
}
113
128
case GVTypes . MECHANISM : {
114
- children [ PNLClasses . MECHANISM ] . push ( ModelInterpreter . castObject ( element ) ) ;
129
+ children [ PNLClasses . MECHANISM ] . push ( ModelInterpreter . castObject ( element , newNode , modelMap ) ) ;
115
130
break ;
116
131
}
117
132
case GVTypes . PROJECTION : {
118
- children [ PNLClasses . PROJECTION ] . push ( ModelInterpreter . castObject ( element ) ) ;
133
+ children [ PNLClasses . PROJECTION ] . push ( ModelInterpreter . castObject ( element , newNode , modelMap ) ) ;
119
134
break ;
120
135
}
121
136
default :
@@ -125,7 +140,6 @@ export default class ModelInterpreter {
125
140
}
126
141
}
127
142
} ) ;
128
- newNode = new CompositionNode ( item . id , '' , false , ports , extra , children ) ;
129
143
break ;
130
144
}
131
145
case GVTypes . MECHANISM : {
@@ -142,7 +156,8 @@ export default class ModelInterpreter {
142
156
extra [ singleAttr ?. id ] = singleAttr ?. eq ;
143
157
}
144
158
} ) ;
145
- newNode = new MechanismNode ( item ?. node_id ?. id , '' , false , ports , extra ) ;
159
+ newNode = new MechanismNode ( item ?. node_id ?. id , parent , '' , false , ports , extra ) ;
160
+ modelMap [ 'nodes' ] . set ( newNode . getName ( ) , newNode ) ;
146
161
break ;
147
162
}
148
163
case GVTypes . PROJECTION : {
@@ -165,6 +180,7 @@ export default class ModelInterpreter {
165
180
receiverPort = item . edge_list [ 1 ] [ 'port' ] [ 'id' ] ;
166
181
}
167
182
newNode = new ProjectionLink ( name , sender , senderPort , receiver , receiverPort , false , extra ) ;
183
+ modelMap [ 'links' ] . set ( newNode . getName ( ) , newNode ) ;
168
184
break ;
169
185
}
170
186
default :
0 commit comments