@lbdudc/gp-gis-dsl 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/GISVisitor.js CHANGED
@@ -1,318 +1,368 @@
1
- import GISGrammarVisitor from "./lib/GISGrammarVisitor.js";
2
- import GIS from "./spl/GIS.js";
3
- import {
4
- TileLayer,
5
- GeoJSONLayer,
6
- WMSStyle,
7
- WMSLayer,
8
- Map,
9
- GeoJSONLayerStyle,
10
- } from "./spl/Map.js";
11
- import { transformation, getPropertyParams } from "./GISVisitorHelper.js";
12
- // import { generateProduct } from "./project-generator.js";
13
-
14
- class Visitor extends GISGrammarVisitor {
15
- constructor(store, debug) {
16
- super();
17
- this.store = store;
18
- this.debug = debug || false;
19
- }
20
-
21
- log(msg) {
22
- if (this.debug) {
23
- console.log(msg);
24
- }
25
- }
26
-
27
- start(ctx) {
28
- return this.visitParse(ctx);
29
- }
30
-
31
- visitParse(ctx) {
32
- this.log(`visitParse: ${ctx.getText()}`);
33
- return super.visitParse(ctx);
34
- }
35
-
36
- visitCreateGIS(ctx) {
37
- const gisName = ctx.getChild(1).getText();
38
- const srid = ctx.getChild(3).getText();
39
- this.log(`visitCreateGIS: ${gisName}`);
40
- if (this.store.getProduct(gisName)) {
41
- throw `GIS ${gisName} already exists!`;
42
- }
43
-
44
- this.store.addProduct(gisName, new GIS(gisName, srid));
45
- }
46
-
47
- visitUseGIS(ctx) {
48
- const gisName = ctx.getChild(2).getText();
49
- this.log(`visitUseGIS: ${gisName}`);
50
- this.store.setCurrentProduct(gisName);
51
- }
52
-
53
- visitGenerateGIS(ctx) {
54
- const gisName = ctx.getChild(2).getText();
55
- this.log(`visitGenerateGIS: ${gisName}`);
56
- this.store.setCurrentProduct(gisName);
57
- this.store.getCurrentProduct().validate();
58
- this.store.setLastGeneratedProduct(
59
- transformation(this.store.getCurrentProduct()),
60
- );
61
- }
62
-
63
- visitCreateEntity(ctx) {
64
- const entityName = ctx.getChild(1).getText();
65
- this.log(`visitCreateEntity: ${entityName}`);
66
-
67
- this.store.getCurrentProduct().addEntity(entityName);
68
- this.store.setCurrentEntity(entityName);
69
-
70
- super.visitCreateEntity(ctx);
71
-
72
- this.store.getCurrentEntity().validate();
73
- this.store.setCurrentEntity(null);
74
- }
75
-
76
- visitPropertyDefinition(ctx) {
77
- const pName = ctx.getChild(0).getText();
78
- this.log(`visitPropertyDefinition: ${pName}`);
79
- const pType = ctx.getChild(1).getText();
80
-
81
- this.store.getCurrentEntity().addProperty(
82
- pName,
83
- pType,
84
- getPropertyParams(
85
- ctx.children
86
- .slice(2)
87
- .filter((s) => s.getSymbol)
88
- .map((s) => s.getSymbol().text.toLowerCase()),
89
- ),
90
- );
91
- }
92
-
93
- visitOwnedRelationshipDefinition(ctx) {
94
- const sourceOpts = {
95
- label: ctx.getChild(0).getText(),
96
- multiplicity: ctx.getChild(6).getText(),
97
- };
98
- const targetOpts = {
99
- label: null,
100
- multiplicity: ctx.getChild(4).getText(),
101
- };
102
- const rSource = this.store.getCurrentEntity().name;
103
- const rTarget = ctx.getChild(1).getText();
104
-
105
- this.store
106
- .getCurrentProduct()
107
- .addRelationship(rSource, rTarget, sourceOpts, targetOpts);
108
- }
109
-
110
- visitMappedRelationshipDefinition(ctx) {
111
- const sourceOpts = {
112
- label: ctx.getChild(4).getText(),
113
- multiplicity: null,
114
- };
115
- const targetOpts = {
116
- label: ctx.getChild(0).getText(),
117
- multiplicity: null,
118
- };
119
- const rTarget = this.store.getCurrentEntity().name;
120
- const rSource = ctx.getChild(1).getText();
121
-
122
- this.store
123
- .getCurrentProduct()
124
- .addRelationship(rSource, rTarget, sourceOpts, targetOpts);
125
- }
126
-
127
- /* ****************** Map & layers stuff ************************ */
128
-
129
- visitCreateTileLayer(ctx) {
130
- const id = ctx.getChild(2).getText();
131
- let label, url;
132
- if (ctx.getChildCount() != 10) {
133
- label = id;
134
- url = ctx.getChild(5).getText().slice(1, -1);
135
- } else {
136
- // tiene AS label
137
- label = ctx.getChild(4).getText().slice(1, -1);
138
- url = ctx.getChild(7).getText().slice(1, -1);
139
- }
140
- this.log(`visitCreateTileLayer ${id} - ${label} (url: ${url})`);
141
- this.store.getCurrentProduct().addLayer(new TileLayer(id, label, url));
142
- }
143
-
144
- visitCreateGeoJSONLayer(ctx) {
145
- const id = ctx.getChild(2).getText();
146
- let label,
147
- entityId,
148
- editable,
149
- offset = 0,
150
- style = {
151
- fillColor: null,
152
- strokeColor: null,
153
- fillOpacity: null,
154
- strokeOpacity: null,
155
- };
156
- const childCound = ctx.getChildCount();
157
- if (childCound == 21 || childCound == 19) {
158
- // no editable
159
- editable = false;
160
- offset += 1;
161
- } else {
162
- editable = true;
163
- }
164
- if (childCound == 20 || childCound == 19) {
165
- // no label
166
- label = id;
167
- entityId = ctx.getChild(4).getText();
168
- offset += 2;
169
- } else {
170
- label = ctx.getChild(4).getText().slice(1, -1);
171
- entityId = ctx.getChild(6).getText();
172
- }
173
-
174
- // to check if the entity exists
175
- this.store.getCurrentProduct().getEntity(entityId);
176
-
177
- style.fillColor = ctx.getChild(10 - offset).getText();
178
- style.strokeColor = ctx.getChild(13 - offset).getText();
179
- style.fillOpacity = ctx.getChild(16 - offset).getText();
180
- style.strokeOpacity = ctx.getChild(19 - offset).getText();
181
- this.log(
182
- `visitCreateGeoJSONLayer ${id} - ${label} (entityId: ${entityId} - ${style.fillColor}, ${style.strokeColor}, ${style.fillOpacity}, ${style.strokeOpacity})`,
183
- );
184
- this.store
185
- .getCurrentProduct()
186
- .addStyle(
187
- new GeoJSONLayerStyle(
188
- id + "Style",
189
- style.fillColor,
190
- style.strokeColor,
191
- style.fillOpacity,
192
- style.strokeOpacity,
193
- ),
194
- );
195
- this.store
196
- .getCurrentProduct()
197
- .addLayer(new GeoJSONLayer(id, label, entityId, editable, id + "Style"));
198
- }
199
-
200
- visitCreateWmsStyle(ctx) {
201
- const id = ctx.getChild(2).getText();
202
- const sld = ctx.getChild(5).getText().slice(1, -1);
203
- this.log(`visitCreateWmsStyle ${id} with ${sld}`);
204
- this.store.getCurrentProduct().addStyle(new WMSStyle(id, sld));
205
- }
206
-
207
- visitCreateWmsLayer(ctx) {
208
- const id = ctx.getChild(2).getText();
209
- let label = id,
210
- from = 4,
211
- i,
212
- aux,
213
- entity,
214
- auxEntityName,
215
- style,
216
- styleName;
217
- if (ctx.getChild(3).getText() != ")") {
218
- // tiene label
219
- label = ctx.getChild(4).getText().slice(1, -1);
220
- from = 6;
221
- }
222
-
223
- const layer = new WMSLayer(id, label);
224
-
225
- for (i = from; i < ctx.getChildCount() - 2; i = i + 2) {
226
- aux = ctx.getChild(i);
227
- auxEntityName = aux.getChild(0).getText();
228
- entity = this.store.getCurrentProduct().getEntity(auxEntityName);
229
-
230
- if (!entity) {
231
- throw `ERROR: entity ${auxEntityName} required by layer ${id} does not exists!!`;
232
- }
233
-
234
- styleName = aux.getChild(1).getText();
235
- style = this.store.getCurrentProduct().getStyle(styleName);
236
- if (!style) {
237
- throw `Style ${aux.getChild(1).getText()} does not exist!!!`;
238
- }
239
- layer.addSubLayer(entity.name, styleName);
240
- }
241
- this.log(`visitCreateWmsLayer ${id} - ${label}`);
242
-
243
- this.store.getCurrentProduct().addLayer(layer);
244
- }
245
-
246
- visitCreateMap(ctx, sortable) {
247
- const id = ctx.getChild(1).getText();
248
- let label,
249
- from,
250
- i,
251
- auxLayer,
252
- layers = [];
253
- if (ctx.getChild(4).getText() == "(") {
254
- // tiene label
255
- label = ctx.getChild(3).getText().slice(1, -1);
256
- from = 5;
257
- } else {
258
- // no tiene label
259
- label = id;
260
- from = 3;
261
- }
262
- for (i = from; i < ctx.getChildCount() - 2; i = i + 2) {
263
- layers.push(this.visitMapLayer(ctx.getChild(i)));
264
- }
265
- this.log(
266
- `visitCreateMap ${id} - ${label} with ${layers.length} layers: ${layers
267
- .map((e) => e.id)
268
- .join(", ")}`,
269
- );
270
- const map = new Map(id, label, sortable);
271
- layers.forEach((l) => {
272
- auxLayer = this.store.getCurrentProduct().getLayer(l.id);
273
- if (!auxLayer) {
274
- throw `Layer ${l.id} does not exists!!!`;
275
- }
276
- map.addLayer(l.id, l.baseLayer, l.hidden);
277
- });
278
- this.store.getCurrentProduct().addMap(id, map);
279
- }
280
-
281
- visitMapLayer(ctx) {
282
- const ret = {
283
- id: ctx.getChild(0).getText(),
284
- };
285
- if (ctx.getChildCount() == 3) {
286
- // las dos opciones
287
- ret.hidden = ret.baseLayer = true;
288
- } else if (ctx.getChildCount() == 2) {
289
- if (ctx.getChild(1).getSymbol().text.toLowerCase() == "is_base_layer") {
290
- // base layer
291
- ret.baseLayer = true;
292
- } else {
293
- // capa oculta
294
- ret.hidden = true;
295
- }
296
- }
297
- return ret;
298
- }
299
-
300
- visitCreateSortableMap(ctx) {
301
- this.log(`visitCreateSortableMap`);
302
- this.visitCreateMap(ctx.getChild(1), true);
303
- }
304
-
305
- /* ****************** Deployment ************************ */
306
-
307
- visitDeploymentProperty(ctx) {
308
- this.log(`visitDeploymentProperty`);
309
- this.store
310
- .getCurrentProduct()
311
- .addDeploymentProperty(
312
- ctx.getChild(0).getText().slice(1, -1),
313
- ctx.getChild(1).getText().slice(1, -1),
314
- );
315
- }
316
- }
317
-
318
- export default Visitor;
1
+ import GISGrammarVisitor from "./lib/GISGrammarVisitor.js";
2
+ import GIS from "./spl/GIS.js";
3
+ import {
4
+ TileLayer,
5
+ GeoJSONLayer,
6
+ WMSStyle,
7
+ WMSLayer,
8
+ Map,
9
+ GeoJSONLayerStyle,
10
+ WMSStyleCustom,
11
+ } from "./spl/Map.js";
12
+ import { transformation, getPropertyParams } from "./GISVisitorHelper.js";
13
+ // import { generateProduct } from "./project-generator.js";
14
+
15
+ class Visitor extends GISGrammarVisitor {
16
+ constructor(store, debug) {
17
+ super();
18
+ this.store = store;
19
+ this.debug = debug || false;
20
+ }
21
+
22
+ log(msg) {
23
+ if (this.debug) {
24
+ console.log(msg);
25
+ }
26
+ }
27
+
28
+ start(ctx) {
29
+ return this.visitParse(ctx);
30
+ }
31
+
32
+ visitParse(ctx) {
33
+ this.log(`visitParse: ${ctx.getText()}`);
34
+ return super.visitParse(ctx);
35
+ }
36
+
37
+ visitCreateGIS(ctx) {
38
+ const gisName = ctx.getChild(1).getText();
39
+ const srid = ctx.getChild(3).getText();
40
+ this.log(`visitCreateGIS: ${gisName}`);
41
+ if (this.store.getProduct(gisName)) {
42
+ throw `GIS ${gisName} already exists!`;
43
+ }
44
+
45
+ this.store.addProduct(gisName, new GIS(gisName, srid));
46
+ }
47
+
48
+ visitUseGIS(ctx) {
49
+ const gisName = ctx.getChild(2).getText();
50
+ this.log(`visitUseGIS: ${gisName}`);
51
+ this.store.setCurrentProduct(gisName);
52
+ }
53
+
54
+ visitGenerateGIS(ctx) {
55
+ const gisName = ctx.getChild(2).getText();
56
+ this.log(`visitGenerateGIS: ${gisName}`);
57
+ this.store.setCurrentProduct(gisName);
58
+ this.store.getCurrentProduct().validate();
59
+ this.store.setLastGeneratedProduct(
60
+ transformation(this.store.getCurrentProduct()),
61
+ );
62
+ }
63
+
64
+ visitCreateEntity(ctx) {
65
+ const entityName = ctx.getChild(1).getText();
66
+ this.log(`visitCreateEntity: ${entityName}`);
67
+
68
+ this.store.getCurrentProduct().addEntity(entityName);
69
+ this.store.setCurrentEntity(entityName);
70
+
71
+ super.visitCreateEntity(ctx);
72
+
73
+ this.store.getCurrentEntity().validate();
74
+ this.store.setCurrentEntity(null);
75
+ }
76
+
77
+ visitPropertyDefinition(ctx) {
78
+ const pName = ctx.getChild(0).getText();
79
+ this.log(`visitPropertyDefinition: ${pName}`);
80
+ const pType = ctx.getChild(1).getText();
81
+
82
+ this.store.getCurrentEntity().addProperty(
83
+ pName,
84
+ pType,
85
+ getPropertyParams(
86
+ ctx.children
87
+ .slice(2)
88
+ .filter((s) => s.getSymbol)
89
+ .map((s) => s.getSymbol().text.toLowerCase()),
90
+ ),
91
+ );
92
+ }
93
+
94
+ visitOwnedRelationshipDefinition(ctx) {
95
+ const sourceOpts = {
96
+ label: ctx.getChild(0).getText(),
97
+ multiplicity: ctx.getChild(6).getText(),
98
+ };
99
+ const targetOpts = {
100
+ label: null,
101
+ multiplicity: ctx.getChild(4).getText(),
102
+ };
103
+ const rSource = this.store.getCurrentEntity().name;
104
+ const rTarget = ctx.getChild(1).getText();
105
+
106
+ this.store
107
+ .getCurrentProduct()
108
+ .addRelationship(rSource, rTarget, sourceOpts, targetOpts);
109
+ }
110
+
111
+ visitMappedRelationshipDefinition(ctx) {
112
+ const sourceOpts = {
113
+ label: ctx.getChild(4).getText(),
114
+ multiplicity: null,
115
+ };
116
+ const targetOpts = {
117
+ label: ctx.getChild(0).getText(),
118
+ multiplicity: null,
119
+ };
120
+ const rTarget = this.store.getCurrentEntity().name;
121
+ const rSource = ctx.getChild(1).getText();
122
+
123
+ this.store
124
+ .getCurrentProduct()
125
+ .addRelationship(rSource, rTarget, sourceOpts, targetOpts);
126
+ }
127
+
128
+ /* ****************** Map & layers stuff ************************ */
129
+
130
+ visitCreateTileLayer(ctx) {
131
+ const id = ctx.getChild(2).getText();
132
+ let label, url;
133
+ if (ctx.getChildCount() != 10) {
134
+ label = id;
135
+ url = ctx.getChild(5).getText().slice(1, -1);
136
+ } else {
137
+ // tiene AS label
138
+ label = ctx.getChild(4).getText().slice(1, -1);
139
+ url = ctx.getChild(7).getText().slice(1, -1);
140
+ }
141
+ this.log(`visitCreateTileLayer ${id} - ${label} (url: ${url})`);
142
+ this.store.getCurrentProduct().addLayer(new TileLayer(id, label, url));
143
+ }
144
+
145
+ visitCreateGeoJSONLayer(ctx) {
146
+ const id = ctx.getChild(2).getText();
147
+ let label,
148
+ entityId,
149
+ editable,
150
+ offset = 0,
151
+ style = {
152
+ fillColor: null,
153
+ strokeColor: null,
154
+ fillOpacity: null,
155
+ strokeOpacity: null,
156
+ };
157
+ const childCound = ctx.getChildCount();
158
+ if (childCound == 21 || childCound == 19) {
159
+ // no editable
160
+ editable = false;
161
+ offset += 1;
162
+ } else {
163
+ editable = true;
164
+ }
165
+ if (childCound == 20 || childCound == 19) {
166
+ // no label
167
+ label = id;
168
+ entityId = ctx.getChild(4).getText();
169
+ offset += 2;
170
+ } else {
171
+ label = ctx.getChild(4).getText().slice(1, -1);
172
+ entityId = ctx.getChild(6).getText();
173
+ }
174
+
175
+ // to check if the entity exists
176
+ this.store.getCurrentProduct().getEntity(entityId);
177
+
178
+ style.fillColor = ctx.getChild(10 - offset).getText();
179
+ style.strokeColor = ctx.getChild(13 - offset).getText();
180
+ style.fillOpacity = ctx.getChild(16 - offset).getText();
181
+ style.strokeOpacity = ctx.getChild(19 - offset).getText();
182
+ this.log(
183
+ `visitCreateGeoJSONLayer ${id} - ${label} (entityId: ${entityId} - ${style.fillColor}, ${style.strokeColor}, ${style.fillOpacity}, ${style.strokeOpacity})`,
184
+ );
185
+ this.store
186
+ .getCurrentProduct()
187
+ .addStyle(
188
+ new GeoJSONLayerStyle(
189
+ id + "Style",
190
+ style.fillColor,
191
+ style.strokeColor,
192
+ style.fillOpacity,
193
+ style.strokeOpacity,
194
+ ),
195
+ );
196
+ this.store
197
+ .getCurrentProduct()
198
+ .addLayer(new GeoJSONLayer(id, label, entityId, editable, id + "Style"));
199
+ }
200
+
201
+ visitCreateWmsStyle(ctx) {
202
+ const descriptor = ctx
203
+ .getChild(4)
204
+ .getText()
205
+ .startsWith("styleLayerDescriptor");
206
+ if (descriptor) {
207
+ const id = ctx.getChild(2).getText();
208
+ const sld = ctx.getChild(5).getText().slice(1, -1);
209
+ this.log(`visitCreateWmsStyle ${id} with ${sld}`);
210
+ this.store.getCurrentProduct().addStyle(new WMSStyle(id, sld));
211
+ } else {
212
+ let style = {
213
+ geometryType: null,
214
+ fillColor: null,
215
+ strokeColor: null,
216
+ fillOpacity: null,
217
+ strokeOpacity: null,
218
+ };
219
+ const id = ctx.getChild(2).getText();
220
+ const props = ctx.getChild(4).getText();
221
+
222
+ props.split(",").forEach((field) => {
223
+ if (field.startsWith("geometryType")) {
224
+ style.geometryType = field.split("geometryType")[1];
225
+ } else if (field.startsWith("fillColor")) {
226
+ if (field.split("fillColor")[1] == "null") style.fillColor = null;
227
+ else style.fillColor = field.split("fillColor")[1]; // Remove the '#' symbol
228
+ } else if (field.startsWith("strokeColor")) {
229
+ if (field.split("strokeColor")[1] == "null") style.strokeColor = null;
230
+ else style.strokeColor = field.split("strokeColor")[1]; // Remove the '#' symbol
231
+ } else if (field.startsWith("fillOpacity")) {
232
+ style.fillOpacity = parseFloat(field.split("fillOpacity")[1]);
233
+ } else if (field.startsWith("strokeOpacity")) {
234
+ style.strokeOpacity = parseFloat(field.split("strokeOpacity")[1]);
235
+ }
236
+ });
237
+
238
+ this.log(
239
+ `visitCreateWmsStyle ${id} - ${style.geometryType}, ${style.fillColor}, ${style.strokeColor}, ${style.fillOpacity}, ${style.strokeOpacity}`,
240
+ );
241
+
242
+ this.store
243
+ .getCurrentProduct()
244
+ .addStyle(
245
+ new WMSStyleCustom(
246
+ id,
247
+ style.geometryType,
248
+ style.fillColor,
249
+ style.strokeColor,
250
+ style.fillOpacity,
251
+ style.strokeOpacity,
252
+ ),
253
+ );
254
+ }
255
+ }
256
+
257
+ visitCreateWmsLayer(ctx) {
258
+ const id = ctx.getChild(2).getText();
259
+ let label = id,
260
+ from = 4,
261
+ i,
262
+ aux,
263
+ entity,
264
+ auxEntityName,
265
+ style,
266
+ styleName;
267
+ if (ctx.getChild(3).getText() != ")") {
268
+ // tiene label
269
+ label = ctx.getChild(4).getText().slice(1, -1);
270
+ from = 6;
271
+ }
272
+
273
+ const layer = new WMSLayer(id, label);
274
+
275
+ for (i = from; i < ctx.getChildCount() - 2; i = i + 2) {
276
+ aux = ctx.getChild(i);
277
+ auxEntityName = aux.getChild(0).getText();
278
+ entity = this.store.getCurrentProduct().getEntity(auxEntityName);
279
+
280
+ if (!entity) {
281
+ throw `ERROR: entity ${auxEntityName} required by layer ${id} does not exists!!`;
282
+ }
283
+
284
+ styleName = aux.getChild(1).getText();
285
+ style = this.store.getCurrentProduct().getStyle(styleName);
286
+ if (!style) {
287
+ throw `Style ${aux.getChild(1).getText()} does not exist!!!`;
288
+ }
289
+ layer.addSubLayer(entity.name, styleName);
290
+ }
291
+ this.log(`visitCreateWmsLayer ${id} - ${label}`);
292
+
293
+ this.store.getCurrentProduct().addLayer(layer);
294
+ }
295
+
296
+ visitCreateMap(ctx, sortable) {
297
+ const id = ctx.getChild(1).getText();
298
+ let label,
299
+ from,
300
+ i,
301
+ auxLayer,
302
+ layers = [];
303
+ if (ctx.getChild(4).getText() == "(") {
304
+ // tiene label
305
+ label = ctx.getChild(3).getText().slice(1, -1);
306
+ from = 5;
307
+ } else {
308
+ // no tiene label
309
+ label = id;
310
+ from = 3;
311
+ }
312
+ for (i = from; i < ctx.getChildCount() - 2; i = i + 2) {
313
+ layers.push(this.visitMapLayer(ctx.getChild(i)));
314
+ }
315
+ this.log(
316
+ `visitCreateMap ${id} - ${label} with ${layers.length} layers: ${layers
317
+ .map((e) => e.id)
318
+ .join(", ")}`,
319
+ );
320
+ const map = new Map(id, label, sortable);
321
+ layers.forEach((l) => {
322
+ auxLayer = this.store.getCurrentProduct().getLayer(l.id);
323
+ if (!auxLayer) {
324
+ throw `Layer ${l.id} does not exists!!!`;
325
+ }
326
+ map.addLayer(l.id, l.baseLayer, l.hidden);
327
+ });
328
+ this.store.getCurrentProduct().addMap(id, map);
329
+ }
330
+
331
+ visitMapLayer(ctx) {
332
+ const ret = {
333
+ id: ctx.getChild(0).getText(),
334
+ };
335
+ if (ctx.getChildCount() == 3) {
336
+ // las dos opciones
337
+ ret.hidden = ret.baseLayer = true;
338
+ } else if (ctx.getChildCount() == 2) {
339
+ if (ctx.getChild(1).getSymbol().text.toLowerCase() == "is_base_layer") {
340
+ // base layer
341
+ ret.baseLayer = true;
342
+ } else {
343
+ // capa oculta
344
+ ret.hidden = true;
345
+ }
346
+ }
347
+ return ret;
348
+ }
349
+
350
+ visitCreateSortableMap(ctx) {
351
+ this.log(`visitCreateSortableMap`);
352
+ this.visitCreateMap(ctx.getChild(1), true);
353
+ }
354
+
355
+ /* ****************** Deployment ************************ */
356
+
357
+ visitDeploymentProperty(ctx) {
358
+ this.log(`visitDeploymentProperty`);
359
+ this.store
360
+ .getCurrentProduct()
361
+ .addDeploymentProperty(
362
+ ctx.getChild(0).getText().slice(1, -1),
363
+ ctx.getChild(1).getText().slice(1, -1),
364
+ );
365
+ }
366
+ }
367
+
368
+ export default Visitor;