60318659be90151833c2263d5bc1199e18f238ff
[ccsdk/cds.git] /
1 /*\r
2  * Copyright © 2017-2018 AT&T Intellectual Property.\r
3  * Modifications Copyright © 2018 IBM.\r
4  *\r
5  * Licensed under the Apache License, Version 2.0 (the "License");\r
6  * you may not use this file except in compliance with the License.\r
7  * You may obtain a copy of the License at\r
8  *\r
9  *     http://www.apache.org/licenses/LICENSE-2.0\r
10  *\r
11  * Unless required by applicable law or agreed to in writing, software\r
12  * distributed under the License is distributed on an "AS IS" BASIS,\r
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
14  * See the License for the specific language governing permissions and\r
15  * limitations under the License.\r
16  */\r
17 \r
18 package org.onap.ccsdk.apps.controllerblueprints.core.service\r
19 \r
20 \r
21 import com.att.eelf.configuration.EELFLogger\r
22 import com.att.eelf.configuration.EELFManager\r
23 import com.fasterxml.jackson.databind.JsonNode\r
24 import com.fasterxml.jackson.databind.node.NullNode\r
25 import com.fasterxml.jackson.databind.node.ObjectNode\r
26 import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper\r
27 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintConstants\r
28 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintError\r
29 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintProcessorException\r
30 import org.onap.ccsdk.apps.controllerblueprints.core.data.ArtifactDefinition\r
31 import org.onap.ccsdk.apps.controllerblueprints.core.data.NodeTemplate\r
32 import org.onap.ccsdk.apps.controllerblueprints.core.data.PropertyDefinition\r
33 import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils\r
34 \r
35 interface BluePrintRuntimeService<T> {\r
36 \r
37     fun id(): String\r
38 \r
39     fun bluePrintContext(): BluePrintContext\r
40 \r
41     fun getExecutionContext(): T\r
42 \r
43     fun setExecutionContext(executionContext: T)\r
44 \r
45     fun put(key: String, value: JsonNode)\r
46 \r
47     fun get(key: String): JsonNode?\r
48 \r
49     fun check(key: String): Boolean\r
50 \r
51     fun cleanRuntime()\r
52 \r
53     fun getAsString(key: String): String?\r
54 \r
55     fun getAsBoolean(key: String): Boolean?\r
56 \r
57     fun getAsInt(key: String): Int?\r
58 \r
59     fun getAsDouble(key: String): Double?\r
60 \r
61     fun getBluePrintError(): BluePrintError\r
62 \r
63     fun setBluePrintError(bluePrintError: BluePrintError)\r
64 \r
65     fun resolveNodeTemplatePropertyAssignments(nodeTemplateName: String,\r
66                                                propertyDefinitions: MutableMap<String, PropertyDefinition>,\r
67                                                propertyAssignments: MutableMap<String, JsonNode>): MutableMap<String, JsonNode>\r
68 \r
69     fun resolveNodeTemplateProperties(nodeTemplateName: String): MutableMap<String, JsonNode>\r
70 \r
71     fun resolveNodeTemplateCapabilityProperties(nodeTemplateName: String, capabilityName: String): MutableMap<String,\r
72             JsonNode>\r
73 \r
74     fun resolveNodeTemplateInterfaceOperationInputs(nodeTemplateName: String, interfaceName: String,\r
75                                                     operationName: String): MutableMap<String, JsonNode>\r
76 \r
77     fun resolveNodeTemplateInterfaceOperationOutputs(nodeTemplateName: String, interfaceName: String,\r
78                                                      operationName: String): MutableMap<String, JsonNode>\r
79 \r
80     fun resolveNodeTemplateArtifact(nodeTemplateName: String, artifactName: String): String\r
81 \r
82     fun resolveNodeTemplateArtifactDefinition(nodeTemplateName: String, artifactName: String): ArtifactDefinition\r
83 \r
84     fun setInputValue(propertyName: String, propertyDefinition: PropertyDefinition, value: JsonNode)\r
85 \r
86     fun setWorkflowInputValue(workflowName: String, propertyName: String, propertyDefinition: PropertyDefinition, value: JsonNode)\r
87 \r
88     fun setNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String, value: JsonNode)\r
89 \r
90     fun setNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String, value: JsonNode)\r
91 \r
92     fun setNodeTemplateOperationPropertyValue(nodeTemplateName: String, interfaceName: String,\r
93                                               operationName: String, propertyName: String, value: JsonNode)\r
94 \r
95     fun setNodeTemplateOperationInputValue(nodeTemplateName: String, interfaceName: String,\r
96                                            operationName: String, propertyName: String, value: JsonNode)\r
97 \r
98     fun setNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String,\r
99                                             operationName: String, propertyName: String, value: JsonNode)\r
100 \r
101     fun getInputValue(propertyName: String): JsonNode\r
102 \r
103     fun getNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String,\r
104                                             operationName: String, propertyName: String): JsonNode\r
105 \r
106     fun getNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String): JsonNode?\r
107 \r
108     fun getNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String): JsonNode?\r
109 \r
110     fun assignInputs(jsonNode: JsonNode)\r
111 \r
112     fun assignWorkflowInputs(workflowName: String, jsonNode: JsonNode)\r
113 \r
114     fun getJsonForNodeTemplateAttributeProperties(nodeTemplateName: String, keys: List<String>): JsonNode\r
115 }\r
116 \r
117 /**\r
118  *\r
119  *\r
120  * @author Brinda Santh\r
121  */\r
122 open class DefaultBluePrintRuntimeService(private var id: String, private var bluePrintContext: BluePrintContext)\r
123     : BluePrintRuntimeService<MutableMap<String, JsonNode>> {\r
124 \r
125     @Transient\r
126     private val log: EELFLogger = EELFManager.getInstance().getLogger(BluePrintRuntimeService::class.toString())\r
127 \r
128     private var store: MutableMap<String, JsonNode> = hashMapOf()\r
129 \r
130     private var bluePrintError = BluePrintError()\r
131 \r
132     override fun id(): String {\r
133         return id\r
134     }\r
135 \r
136     override fun bluePrintContext(): BluePrintContext {\r
137         return bluePrintContext\r
138     }\r
139 \r
140     override fun getExecutionContext(): MutableMap<String, JsonNode> {\r
141         return store\r
142     }\r
143 \r
144     @Suppress("UNCHECKED_CAST")\r
145     override fun setExecutionContext(executionContext: MutableMap<String, JsonNode>) {\r
146         this.store = executionContext\r
147     }\r
148 \r
149     override fun put(key: String, value: JsonNode) {\r
150         store[key] = value\r
151     }\r
152 \r
153     override fun get(key: String): JsonNode {\r
154         return store[key] ?: throw BluePrintProcessorException("failed to get execution property($key)")\r
155     }\r
156 \r
157     override fun check(key: String): Boolean {\r
158         return store.containsKey(key)\r
159     }\r
160 \r
161     override fun cleanRuntime() {\r
162         store.clear()\r
163     }\r
164 \r
165     private fun getJsonNode(key: String): JsonNode {\r
166         return get(key)\r
167     }\r
168 \r
169     override fun getAsString(key: String): String? {\r
170         return get(key).asText()\r
171     }\r
172 \r
173     override fun getAsBoolean(key: String): Boolean? {\r
174         return get(key).asBoolean()\r
175     }\r
176 \r
177     override fun getAsInt(key: String): Int? {\r
178         return get(key).asInt()\r
179     }\r
180 \r
181     override fun getAsDouble(key: String): Double? {\r
182         return get(key).asDouble()\r
183     }\r
184 \r
185     override fun getBluePrintError(): BluePrintError {\r
186         return this.bluePrintError\r
187     }\r
188 \r
189     override fun setBluePrintError(bluePrintError: BluePrintError) {\r
190         this.bluePrintError = bluePrintError\r
191     }\r
192 \r
193     /**\r
194      * Resolve any property assignments for the node\r
195      */\r
196     override fun resolveNodeTemplatePropertyAssignments(nodeTemplateName: String,\r
197                                                         propertyDefinitions: MutableMap<String, PropertyDefinition>,\r
198                                                         propertyAssignments: MutableMap<String, JsonNode>)\r
199             : MutableMap<String, JsonNode> {\r
200 \r
201         val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()\r
202 \r
203         propertyDefinitions.forEach { nodeTypePropertyName, nodeTypeProperty ->\r
204             // Get the Express or Value for the Node Template\r
205             val propertyAssignment: JsonNode? = propertyAssignments[nodeTypePropertyName]\r
206 \r
207             var resolvedValue: JsonNode = NullNode.getInstance()\r
208             if (propertyAssignment != null) {\r
209                 // Resolve the Expressing\r
210                 val propertyAssignmentExpression = PropertyAssignmentService(this)\r
211                 resolvedValue = propertyAssignmentExpression.resolveAssignmentExpression(nodeTemplateName,\r
212                         nodeTypePropertyName, propertyAssignment)\r
213             } else {\r
214                 // Assign default value to the Operation\r
215                 nodeTypeProperty.defaultValue?.let {\r
216                     resolvedValue = JacksonUtils.jsonNodeFromObject(nodeTypeProperty.defaultValue!!)\r
217                 }\r
218             }\r
219             // Set for Return of method\r
220             propertyAssignmentValue[nodeTypePropertyName] = resolvedValue\r
221         }\r
222         return propertyAssignmentValue\r
223     }\r
224 \r
225     override fun resolveNodeTemplateProperties(nodeTemplateName: String): MutableMap<String, JsonNode> {\r
226         log.info("resolveNodeTemplatePropertyValues for node template ({})", nodeTemplateName)\r
227 \r
228         val nodeTemplate: NodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)\r
229 \r
230         val propertyAssignments: MutableMap<String, JsonNode> = nodeTemplate.properties!!\r
231 \r
232         // Get the Node Type Definitions\r
233         val nodeTypePropertieDefinitions: MutableMap<String, PropertyDefinition> = bluePrintContext\r
234                 .nodeTypeChainedProperties(nodeTemplate.type)!!\r
235 \r
236         /**\r
237          * Resolve the NodeTemplate Property Assignment Values.\r
238          */\r
239         return resolveNodeTemplatePropertyAssignments(nodeTemplateName, nodeTypePropertieDefinitions,\r
240                 propertyAssignments)\r
241     }\r
242 \r
243     override fun resolveNodeTemplateCapabilityProperties(nodeTemplateName: String, capabilityName: String):\r
244             MutableMap<String, JsonNode> {\r
245         log.info("resolveNodeTemplateCapabilityProperties for node template($nodeTemplateName) capability " +\r
246                 "($capabilityName)")\r
247         val nodeTemplate: NodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)\r
248 \r
249         val propertyAssignments = nodeTemplate.capabilities?.get(capabilityName)?.properties ?: hashMapOf()\r
250 \r
251         val propertyDefinitions = bluePrintContext.nodeTemplateNodeType(nodeTemplateName)\r
252                 .capabilities?.get(capabilityName)?.properties ?: hashMapOf()\r
253 \r
254         /**\r
255          * Resolve the Capability Property Assignment Values.\r
256          */\r
257         return resolveNodeTemplatePropertyAssignments(nodeTemplateName, propertyDefinitions,\r
258                 propertyAssignments)\r
259     }\r
260 \r
261     override fun resolveNodeTemplateInterfaceOperationInputs(nodeTemplateName: String,\r
262                                                              interfaceName: String,\r
263                                                              operationName: String): MutableMap<String, JsonNode> {\r
264         log.info("resolveNodeTemplateInterfaceOperationInputs for node template ($nodeTemplateName),interface name " +\r
265                 "($interfaceName), operationName($operationName)")\r
266 \r
267         val propertyAssignments: MutableMap<String, JsonNode> =\r
268                 bluePrintContext.nodeTemplateInterfaceOperationInputs(nodeTemplateName, interfaceName, operationName)\r
269                         ?: hashMapOf()\r
270 \r
271         val nodeTypeName = bluePrintContext.nodeTemplateByName(nodeTemplateName).type\r
272 \r
273         val nodeTypeInterfaceOperationInputs: MutableMap<String, PropertyDefinition> =\r
274                 bluePrintContext.nodeTypeInterfaceOperationInputs(nodeTypeName, interfaceName, operationName)\r
275                         ?: hashMapOf()\r
276 \r
277         log.info("input definition for node template ($nodeTemplateName), values ($propertyAssignments)")\r
278 \r
279         /**\r
280          * Resolve the Property Input Assignment Values.\r
281          */\r
282         return resolveNodeTemplatePropertyAssignments(nodeTemplateName, nodeTypeInterfaceOperationInputs,\r
283                 propertyAssignments)\r
284 \r
285     }\r
286 \r
287 \r
288     override fun resolveNodeTemplateInterfaceOperationOutputs(nodeTemplateName: String,\r
289                                                               interfaceName: String,\r
290                                                               operationName: String): MutableMap<String, JsonNode> {\r
291         log.info("resolveNodeTemplateInterfaceOperationOutputs for node template ($nodeTemplateName),interface name " +\r
292                 "($interfaceName), operationName($operationName)")\r
293 \r
294         val propertyAssignments: MutableMap<String, JsonNode> =\r
295                 bluePrintContext.nodeTemplateInterfaceOperationOutputs(nodeTemplateName, interfaceName, operationName)\r
296                         ?: hashMapOf()\r
297 \r
298         val nodeTypeName = bluePrintContext.nodeTemplateByName(nodeTemplateName).type\r
299 \r
300         val nodeTypeInterfaceOperationOutputs: MutableMap<String, PropertyDefinition> =\r
301                 bluePrintContext.nodeTypeInterfaceOperationOutputs(nodeTypeName, interfaceName, operationName)\r
302                         ?: hashMapOf()\r
303         /**\r
304          * Resolve the Property Output Assignment Values.\r
305          */\r
306         val propertyAssignmentValue = resolveNodeTemplatePropertyAssignments(nodeTemplateName,\r
307                 nodeTypeInterfaceOperationOutputs, propertyAssignments)\r
308 \r
309         // Store  operation output values into context\r
310         propertyAssignmentValue.forEach { key, value ->\r
311             setNodeTemplateOperationOutputValue(nodeTemplateName, interfaceName, operationName, key, value)\r
312         }\r
313         return propertyAssignmentValue\r
314     }\r
315 \r
316     override fun resolveNodeTemplateArtifact(nodeTemplateName: String, artifactName: String): String {\r
317         val artifactDefinition: ArtifactDefinition = resolveNodeTemplateArtifactDefinition(nodeTemplateName, artifactName)\r
318         val propertyAssignmentExpression = PropertyAssignmentService(this)\r
319         return propertyAssignmentExpression.artifactContent(artifactDefinition)\r
320     }\r
321 \r
322     override fun resolveNodeTemplateArtifactDefinition(nodeTemplateName: String, artifactName: String): ArtifactDefinition {\r
323         val nodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)\r
324 \r
325         return nodeTemplate.artifacts?.get(artifactName)\r
326                 ?: throw BluePrintProcessorException("failed to get artifat definition($artifactName) from the node " +\r
327                         "template")\r
328 \r
329     }\r
330 \r
331     override fun setInputValue(propertyName: String, propertyDefinition: PropertyDefinition, value: JsonNode) {\r
332         val path = StringBuilder(BluePrintConstants.PATH_INPUTS)\r
333                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
334         log.trace("setting input path ({}), values ({})", path, value)\r
335         put(path, value)\r
336     }\r
337 \r
338     override fun setWorkflowInputValue(workflowName: String, propertyName: String,\r
339                                        propertyDefinition: PropertyDefinition, value: JsonNode) {\r
340         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_WORKFLOWS)\r
341                 .append(BluePrintConstants.PATH_DIVIDER).append(workflowName)\r
342                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INPUTS)\r
343                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
344                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
345         put(path, value)\r
346     }\r
347 \r
348     override fun setNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String, value: JsonNode) {\r
349 \r
350         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)\r
351                 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
352                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
353                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
354         put(path, value)\r
355     }\r
356 \r
357     override fun setNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String, value: JsonNode) {\r
358 \r
359         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)\r
360                 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
361                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_ATTRIBUTES)\r
362                 .append(BluePrintConstants.PATH_DIVIDER).append(attributeName).toString()\r
363         put(path, value)\r
364     }\r
365 \r
366     override fun setNodeTemplateOperationPropertyValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String,\r
367                                                        value: JsonNode) {\r
368         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)\r
369                 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
370                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES)\r
371                 .append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)\r
372                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS)\r
373                 .append(BluePrintConstants.PATH_DIVIDER).append(operationName)\r
374                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
375                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
376         log.trace("setting operation property path ({}), values ({})", path, value)\r
377         put(path, value)\r
378     }\r
379 \r
380     override fun setNodeTemplateOperationInputValue(nodeTemplateName: String, interfaceName: String,\r
381                                                     operationName: String, propertyName: String,\r
382                                                     value: JsonNode) {\r
383         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)\r
384                 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
385                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES)\r
386                 .append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)\r
387                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS)\r
388                 .append(BluePrintConstants.PATH_DIVIDER).append(operationName)\r
389                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INPUTS)\r
390                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
391                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
392         put(path, value)\r
393     }\r
394 \r
395     override fun setNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String,\r
396                                                      operationName: String, propertyName: String,\r
397                                                      value: JsonNode) {\r
398         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)\r
399                 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
400                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES)\r
401                 .append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)\r
402                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS)\r
403                 .append(BluePrintConstants.PATH_DIVIDER).append(operationName)\r
404                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OUTPUTS)\r
405                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
406                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
407         put(path, value)\r
408     }\r
409 \r
410 \r
411     override fun getInputValue(propertyName: String): JsonNode {\r
412         val path = StringBuilder(BluePrintConstants.PATH_INPUTS)\r
413                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
414         return getJsonNode(path)\r
415     }\r
416 \r
417     override fun getNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String,\r
418                                                      operationName: String, propertyName: String): JsonNode {\r
419         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)\r
420                 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
421                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES)\r
422                 .append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)\r
423                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS)\r
424                 .append(BluePrintConstants.PATH_DIVIDER).append(operationName)\r
425                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OUTPUTS)\r
426                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
427                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
428         return getJsonNode(path)\r
429     }\r
430 \r
431     override fun getNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String): JsonNode {\r
432         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)\r
433                 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
434                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
435                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
436         return getJsonNode(path)\r
437     }\r
438 \r
439     override fun getNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String): JsonNode {\r
440         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)\r
441                 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
442                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_ATTRIBUTES)\r
443                 .append(BluePrintConstants.PATH_DIVIDER).append(attributeName).toString()\r
444         return getJsonNode(path)\r
445     }\r
446 \r
447     override fun assignInputs(jsonNode: JsonNode) {\r
448         log.info("assignInputs from input JSON ({})", jsonNode.toString())\r
449         bluePrintContext.inputs?.forEach { propertyName, property ->\r
450             val valueNode: JsonNode = jsonNode.at(BluePrintConstants.PATH_DIVIDER + propertyName)\r
451                     ?: NullNode.getInstance()\r
452             setInputValue(propertyName, property, valueNode)\r
453         }\r
454     }\r
455 \r
456     override fun assignWorkflowInputs(workflowName: String, jsonNode: JsonNode) {\r
457         log.info("assign workflow {} input value ({})", workflowName, jsonNode.toString())\r
458 \r
459         val dynamicInputPropertiesName = "$workflowName-properties"\r
460 \r
461         bluePrintContext.workflowByName(workflowName).inputs?.forEach { propertyName, property ->\r
462             if (propertyName != dynamicInputPropertiesName) {\r
463                 val valueNode: JsonNode = jsonNode.at(BluePrintConstants.PATH_DIVIDER + propertyName)\r
464                         ?: NullNode.getInstance()\r
465                 setInputValue(propertyName, property, valueNode)\r
466             }\r
467         }\r
468         // Load Dynamic data Types\r
469         val workflowDynamicInputs: JsonNode? = jsonNode.get(dynamicInputPropertiesName)\r
470 \r
471         workflowDynamicInputs?.let {\r
472             bluePrintContext.dataTypeByName("dt-$dynamicInputPropertiesName")?.properties?.forEach { propertyName, property ->\r
473                 val valueNode: JsonNode = workflowDynamicInputs.at(BluePrintConstants.PATH_DIVIDER + propertyName)\r
474                         ?: NullNode.getInstance()\r
475                 setInputValue(propertyName, property, valueNode)\r
476 \r
477             }\r
478         }\r
479     }\r
480 \r
481     override fun getJsonForNodeTemplateAttributeProperties(nodeTemplateName: String, keys: List<String>): JsonNode {\r
482 \r
483         val jsonNode: ObjectNode = jacksonObjectMapper().createObjectNode()\r
484         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)\r
485                 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
486                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_ATTRIBUTES)\r
487                 .append(BluePrintConstants.PATH_DIVIDER).toString()\r
488         store.keys.filter {\r
489             it.startsWith(path)\r
490         }.map {\r
491             val key = it.replace(path, "")\r
492             if (keys.contains(key)) {\r
493                 val value = store[it] as JsonNode\r
494                 jsonNode.set(key, value)\r
495             }\r
496         }\r
497         return jsonNode\r
498     }\r
499 \r
500 \r
501 }