448a06a8678749c3812d949fca6a0df14ab5c4c1
[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.BluePrintProcessorException\r
29 import org.onap.ccsdk.apps.controllerblueprints.core.data.ArtifactDefinition\r
30 import org.onap.ccsdk.apps.controllerblueprints.core.data.NodeTemplate\r
31 import org.onap.ccsdk.apps.controllerblueprints.core.data.PropertyDefinition\r
32 import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils\r
33 \r
34 interface BluePrintRuntimeService<T> {\r
35 \r
36     fun id(): String\r
37 \r
38     fun bluePrintContext(): BluePrintContext\r
39 \r
40     fun getExecutionContext(): T\r
41 \r
42     fun setExecutionContext(executionContext: T)\r
43 \r
44     fun put(key: String, value: JsonNode)\r
45 \r
46     fun get(key: String): JsonNode?\r
47 \r
48     fun cleanRuntime()\r
49 \r
50     fun getAsString(key: String): String?\r
51 \r
52     fun getAsBoolean(key: String): Boolean?\r
53 \r
54     fun getAsInt(key: String): Int?\r
55 \r
56     fun getAsDouble(key: String): Double?\r
57 \r
58     /*\r
59       Get the Node Type Definition for the Node Template, Then iterate Node Type Properties and resolve the expressing\r
60    */\r
61     fun resolveNodeTemplateProperties(nodeTemplateName: String): MutableMap<String, JsonNode>\r
62 \r
63     fun resolveNodeTemplateInterfaceOperationInputs(nodeTemplateName: String, interfaceName: String, operationName: String): MutableMap<String, JsonNode>\r
64 \r
65     fun resolveNodeTemplateInterfaceOperationOutputs(nodeTemplateName: String, interfaceName: String, operationName: String): MutableMap<String, JsonNode>\r
66 \r
67     fun resolveNodeTemplateArtifact(nodeTemplateName: String, artifactName: String): String\r
68 \r
69     fun resolveNodeTemplateArtifactDefinition(nodeTemplateName: String, artifactName: String): ArtifactDefinition\r
70 \r
71     fun setInputValue(propertyName: String, propertyDefinition: PropertyDefinition, value: JsonNode)\r
72 \r
73     fun setWorkflowInputValue(workflowName: String, propertyName: String, propertyDefinition: PropertyDefinition, value: JsonNode)\r
74 \r
75     fun setNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String, value: JsonNode)\r
76 \r
77     fun setNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String, value: JsonNode)\r
78 \r
79     fun setNodeTemplateOperationPropertyValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String, value: JsonNode)\r
80 \r
81     fun setNodeTemplateOperationInputValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String, value: JsonNode)\r
82 \r
83     fun setNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String, value: JsonNode)\r
84 \r
85     fun getInputValue(propertyName: String): JsonNode\r
86 \r
87     fun getNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String): JsonNode\r
88 \r
89     fun getNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String): JsonNode?\r
90 \r
91     fun getNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String): JsonNode?\r
92 \r
93     fun getNodeTemplateRequirementPropertyValue(nodeTemplateName: String, requirementName: String, propertyName: String): JsonNode?\r
94 \r
95     fun getNodeTemplateCapabilityPropertyValue(nodeTemplateName: String, capabilityName: String, propertyName: String): JsonNode?\r
96 \r
97     fun assignInputs(jsonNode: JsonNode)\r
98 \r
99     fun assignWorkflowInputs(workflowName: String, jsonNode: JsonNode)\r
100 \r
101     fun getJsonForNodeTemplateAttributeProperties(nodeTemplateName: String, keys: List<String>): JsonNode\r
102 }\r
103 \r
104 /**\r
105  *\r
106  *\r
107  * @author Brinda Santh\r
108  */\r
109 open class DefaultBluePrintRuntimeService(private var id: String, private var bluePrintContext: BluePrintContext)\r
110     : BluePrintRuntimeService<MutableMap<String, JsonNode>> {\r
111 \r
112     private val log: EELFLogger = EELFManager.getInstance().getLogger(BluePrintRuntimeService::class.toString())\r
113 \r
114     private var store: MutableMap<String, JsonNode> = hashMapOf()\r
115 \r
116     override fun id(): String {\r
117         return id\r
118     }\r
119 \r
120     override fun bluePrintContext(): BluePrintContext {\r
121         return bluePrintContext\r
122     }\r
123 \r
124     override fun getExecutionContext(): MutableMap<String, JsonNode> {\r
125         return store\r
126     }\r
127 \r
128     @Suppress("UNCHECKED_CAST")\r
129     override fun setExecutionContext(executionContext: MutableMap<String, JsonNode>) {\r
130         this.store = executionContext\r
131     }\r
132 \r
133     override fun put(key: String, value: JsonNode) {\r
134         store[key] = value\r
135     }\r
136 \r
137     override fun get(key: String): JsonNode {\r
138         return store[key] ?: throw BluePrintProcessorException("failed to get execution property($key)")\r
139     }\r
140 \r
141     override fun cleanRuntime() {\r
142         store.clear()\r
143     }\r
144 \r
145     private fun getJsonNode(key: String): JsonNode {\r
146         return get(key)\r
147     }\r
148 \r
149     override fun getAsString(key: String): String? {\r
150         return get(key).asText()\r
151     }\r
152 \r
153     override fun getAsBoolean(key: String): Boolean? {\r
154         return get(key).asBoolean()\r
155     }\r
156 \r
157     override fun getAsInt(key: String): Int? {\r
158         return get(key).asInt()\r
159     }\r
160 \r
161     override fun getAsDouble(key: String): Double? {\r
162         return get(key).asDouble()\r
163     }\r
164 \r
165     /*\r
166             Get the Node Type Definition for the Node Template, Then iterate Node Type Properties and resolve the expressing\r
167          */\r
168     override fun resolveNodeTemplateProperties(nodeTemplateName: String): MutableMap<String, JsonNode> {\r
169         log.info("resolveNodeTemplatePropertyValues for node template ({})", nodeTemplateName)\r
170         val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()\r
171 \r
172         val nodeTemplate: NodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)\r
173 \r
174         val propertyAssignments: MutableMap<String, JsonNode> =\r
175                 nodeTemplate.properties as MutableMap<String, JsonNode>\r
176 \r
177         // Get the Node Type Definitions\r
178         val nodeTypeProperties: MutableMap<String, PropertyDefinition> =\r
179                 bluePrintContext.nodeTypeChainedProperties(nodeTemplate.type)!!\r
180 \r
181         // Iterate Node Type Properties\r
182         nodeTypeProperties.forEach { nodeTypePropertyName, nodeTypeProperty ->\r
183             // Get the Express or Value for the Node Template\r
184             val propertyAssignment: Any? = propertyAssignments[nodeTypePropertyName]\r
185 \r
186             var resolvedValue: JsonNode = NullNode.getInstance()\r
187             if (propertyAssignment != null) {\r
188                 // Resolve the Expressing\r
189                 val propertyAssignmentExpression = PropertyAssignmentService(this)\r
190                 resolvedValue = propertyAssignmentExpression.resolveAssignmentExpression(nodeTemplateName, nodeTypePropertyName, propertyAssignment)\r
191             } else {\r
192                 // Assign default value to the Operation\r
193                 nodeTypeProperty.defaultValue?.let { defaultValue ->\r
194                     resolvedValue = defaultValue\r
195                 }\r
196             }\r
197             // Set for Return of method\r
198             propertyAssignmentValue[nodeTypePropertyName] = resolvedValue\r
199         }\r
200         log.info("resolved property definition for node template ({}), values ({})", nodeTemplateName, propertyAssignmentValue)\r
201         return propertyAssignmentValue\r
202     }\r
203 \r
204     override fun resolveNodeTemplateInterfaceOperationInputs(nodeTemplateName: String,\r
205                                                              interfaceName: String, operationName: String): MutableMap<String, JsonNode> {\r
206         log.info("resolveNodeTemplateInterfaceOperationInputs for node template ({}),interface name ({}), " +\r
207                 "operationName({})", nodeTemplateName, interfaceName, operationName)\r
208 \r
209         val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()\r
210 \r
211         val propertyAssignments: MutableMap<String, Any> =\r
212                 bluePrintContext.nodeTemplateInterfaceOperationInputs(nodeTemplateName, interfaceName, operationName) as? MutableMap<String, Any>\r
213                         ?: hashMapOf()\r
214 \r
215         val nodeTypeName = bluePrintContext.nodeTemplateByName(nodeTemplateName).type\r
216 \r
217         val nodeTypeInterfaceOperationInputs: MutableMap<String, PropertyDefinition> =\r
218                 bluePrintContext.nodeTypeInterfaceOperationInputs(nodeTypeName, interfaceName, operationName)\r
219                         ?: hashMapOf()\r
220 \r
221         log.info("input definition for node template ({}), values ({})", nodeTemplateName, propertyAssignments)\r
222 \r
223         // Iterate Node Type Properties\r
224         nodeTypeInterfaceOperationInputs.forEach { nodeTypePropertyName, nodeTypeProperty ->\r
225             // Get the Express or Value for the Node Template\r
226             val propertyAssignment: Any? = propertyAssignments[nodeTypePropertyName]\r
227 \r
228             var resolvedValue: JsonNode = NullNode.getInstance()\r
229             if (propertyAssignment != null) {\r
230                 // Resolve the Expressing\r
231                 val propertyAssignmentExpression = PropertyAssignmentService(this)\r
232                 resolvedValue = propertyAssignmentExpression.resolveAssignmentExpression(nodeTemplateName, nodeTypePropertyName, propertyAssignment)\r
233             } else {\r
234                 // Assign default value to the Operation\r
235                 nodeTypeProperty.defaultValue?.let {\r
236                     resolvedValue = JacksonUtils.jsonNodeFromObject(nodeTypeProperty.defaultValue!!)\r
237                 }\r
238             }\r
239             // Set for Return of method\r
240             propertyAssignmentValue[nodeTypePropertyName] = resolvedValue\r
241         }\r
242         log.trace("resolved input assignments for node template ({}), values ({})", nodeTemplateName,\r
243                 propertyAssignmentValue)\r
244 \r
245         return propertyAssignmentValue\r
246     }\r
247 \r
248 \r
249     override fun resolveNodeTemplateInterfaceOperationOutputs(nodeTemplateName: String,\r
250                                                               interfaceName: String, operationName: String): MutableMap<String, JsonNode> {\r
251         log.info("resolveNodeTemplateInterfaceOperationOutputs for node template ({}),interface name ({}), " +\r
252                 "operationName({})", nodeTemplateName, interfaceName, operationName)\r
253 \r
254         val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()\r
255 \r
256         val propertyAssignments: MutableMap<String, Any> =\r
257                 bluePrintContext.nodeTemplateInterfaceOperationOutputs(nodeTemplateName, interfaceName, operationName) as? MutableMap<String, Any>\r
258                         ?: hashMapOf()\r
259 \r
260         val nodeTypeName = bluePrintContext.nodeTemplateByName(nodeTemplateName).type\r
261 \r
262         val nodeTypeInterfaceOperationOutputs: MutableMap<String, PropertyDefinition> =\r
263                 bluePrintContext.nodeTypeInterfaceOperationOutputs(nodeTypeName, interfaceName, operationName)\r
264                         ?: hashMapOf()\r
265 \r
266         // Iterate Node Type Properties\r
267         nodeTypeInterfaceOperationOutputs.forEach { nodeTypePropertyName, nodeTypeProperty ->\r
268 \r
269             // Get the Express or Value for the Node Template\r
270             val propertyAssignment: Any? = propertyAssignments[nodeTypePropertyName]\r
271 \r
272             var resolvedValue: JsonNode = NullNode.getInstance()\r
273             if (propertyAssignment != null) {\r
274                 // Resolve the Expressing\r
275                 val propertyAssignmentExpression = PropertyAssignmentService(this)\r
276                 resolvedValue = propertyAssignmentExpression.resolveAssignmentExpression(nodeTemplateName, nodeTypePropertyName, propertyAssignment)\r
277             } else {\r
278                 // Assign default value to the Operation\r
279                 nodeTypeProperty.defaultValue?.let {\r
280                     resolvedValue = JacksonUtils.jsonNodeFromObject(nodeTypeProperty.defaultValue!!)\r
281                 }\r
282             }\r
283             // Set for Return of method\r
284             propertyAssignmentValue[nodeTypePropertyName] = resolvedValue\r
285 \r
286             // Store  operation output values into context\r
287             setNodeTemplateOperationOutputValue(nodeTemplateName, interfaceName, operationName, nodeTypePropertyName, resolvedValue)\r
288             log.trace("resolved output assignments for node template ({}), property name ({}), value ({})", nodeTemplateName, nodeTypePropertyName, resolvedValue)\r
289         }\r
290         return propertyAssignmentValue\r
291     }\r
292 \r
293     override fun resolveNodeTemplateArtifact(nodeTemplateName: String, artifactName: String): String {\r
294         val artifactDefinition: ArtifactDefinition = resolveNodeTemplateArtifactDefinition(nodeTemplateName, artifactName)\r
295         val propertyAssignmentExpression = PropertyAssignmentService(this)\r
296         return propertyAssignmentExpression.artifactContent(artifactDefinition)\r
297     }\r
298 \r
299     override fun resolveNodeTemplateArtifactDefinition(nodeTemplateName: String, artifactName: String): ArtifactDefinition {\r
300         val nodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)\r
301 \r
302         return nodeTemplate.artifacts?.get(artifactName)\r
303                 ?: throw BluePrintProcessorException(String.format("failed to get artifat definition {} from the node template"\r
304                         , artifactName))\r
305 \r
306     }\r
307 \r
308 \r
309     override fun setInputValue(propertyName: String, propertyDefinition: PropertyDefinition, value: JsonNode) {\r
310         val path = StringBuilder(BluePrintConstants.PATH_INPUTS)\r
311                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
312         log.trace("setting input path ({}), values ({})", path, value)\r
313         put(path, value)\r
314     }\r
315 \r
316     override fun setWorkflowInputValue(workflowName: String, propertyName: String, propertyDefinition: PropertyDefinition, value: JsonNode) {\r
317         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_WORKFLOWS).append(BluePrintConstants.PATH_DIVIDER).append(workflowName)\r
318                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INPUTS)\r
319                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
320                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
321         put(path, value)\r
322     }\r
323 \r
324     override fun setNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String, value: JsonNode) {\r
325 \r
326         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
327                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
328                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
329         put(path, value)\r
330     }\r
331 \r
332     override fun setNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String, value: JsonNode) {\r
333 \r
334         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
335                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_ATTRIBUTES)\r
336                 .append(BluePrintConstants.PATH_DIVIDER).append(attributeName).toString()\r
337         put(path, value)\r
338     }\r
339 \r
340     override fun setNodeTemplateOperationPropertyValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String,\r
341                                                        value: JsonNode) {\r
342         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
343                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES).append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)\r
344                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS).append(BluePrintConstants.PATH_DIVIDER).append(operationName)\r
345                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
346                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
347         log.trace("setting operation property path ({}), values ({})", path, value)\r
348         put(path, value)\r
349     }\r
350 \r
351     override fun setNodeTemplateOperationInputValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String,\r
352                                                     value: JsonNode) {\r
353         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
354                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES).append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)\r
355                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS).append(BluePrintConstants.PATH_DIVIDER).append(operationName)\r
356                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INPUTS)\r
357                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
358                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
359         put(path, value)\r
360     }\r
361 \r
362     override fun setNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String,\r
363                                                      value: JsonNode) {\r
364         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
365                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES).append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)\r
366                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS).append(BluePrintConstants.PATH_DIVIDER).append(operationName)\r
367                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OUTPUTS)\r
368                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
369                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
370         put(path, value)\r
371     }\r
372 \r
373 \r
374     override fun getInputValue(propertyName: String): JsonNode {\r
375         val path = StringBuilder(BluePrintConstants.PATH_INPUTS)\r
376                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
377         return getJsonNode(path)\r
378     }\r
379 \r
380     override fun getNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String): JsonNode {\r
381         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
382                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES).append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)\r
383                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS).append(BluePrintConstants.PATH_DIVIDER).append(operationName)\r
384                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OUTPUTS).append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
385                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
386         return getJsonNode(path)\r
387     }\r
388 \r
389     override fun getNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String): JsonNode {\r
390         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
391                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
392                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
393         return getJsonNode(path)\r
394     }\r
395 \r
396     override fun getNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String): JsonNode {\r
397         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
398                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_ATTRIBUTES)\r
399                 .append(BluePrintConstants.PATH_DIVIDER).append(attributeName).toString()\r
400         return getJsonNode(path)\r
401     }\r
402 \r
403     override fun getNodeTemplateRequirementPropertyValue(nodeTemplateName: String, requirementName: String, propertyName:\r
404     String): JsonNode {\r
405         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
406                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_REQUIREMENTS).append(requirementName)\r
407                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
408                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
409         return getJsonNode(path)\r
410     }\r
411 \r
412     override fun getNodeTemplateCapabilityPropertyValue(nodeTemplateName: String, capabilityName: String, propertyName:\r
413     String): JsonNode {\r
414         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
415                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_CAPABILITIES).append(capabilityName)\r
416                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)\r
417                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()\r
418         return getJsonNode(path)\r
419     }\r
420 \r
421     override fun assignInputs(jsonNode: JsonNode) {\r
422         log.info("assignInputs from input JSON ({})", jsonNode.toString())\r
423         bluePrintContext.inputs?.forEach { propertyName, property ->\r
424             val valueNode: JsonNode = jsonNode.at(BluePrintConstants.PATH_DIVIDER + propertyName)\r
425                     ?: NullNode.getInstance()\r
426             setInputValue(propertyName, property, valueNode)\r
427         }\r
428     }\r
429 \r
430     override fun assignWorkflowInputs(workflowName: String, jsonNode: JsonNode) {\r
431         log.info("assign workflow {} input value ({})", workflowName, jsonNode.toString())\r
432 \r
433         val dynamicInputPropertiesName = "$workflowName-properties"\r
434 \r
435         bluePrintContext.workflowByName(workflowName).inputs?.forEach { propertyName, property ->\r
436             if (propertyName != dynamicInputPropertiesName) {\r
437                 val valueNode: JsonNode = jsonNode.at(BluePrintConstants.PATH_DIVIDER + propertyName)\r
438                         ?: NullNode.getInstance()\r
439                 setInputValue(propertyName, property, valueNode)\r
440             }\r
441         }\r
442 \r
443         val workflowDynamicInputs: JsonNode? = jsonNode.get(dynamicInputPropertiesName)\r
444 \r
445         workflowDynamicInputs?.let {\r
446             bluePrintContext.dataTypeByName(dynamicInputPropertiesName)?.properties?.forEach { propertyName, property ->\r
447                 val valueNode: JsonNode = workflowDynamicInputs.at(BluePrintConstants.PATH_DIVIDER + propertyName)\r
448                         ?: NullNode.getInstance()\r
449                 setInputValue(propertyName, property, valueNode)\r
450 \r
451             }\r
452         }\r
453     }\r
454 \r
455     override fun getJsonForNodeTemplateAttributeProperties(nodeTemplateName: String, keys: List<String>): JsonNode {\r
456 \r
457         val jsonNode: ObjectNode = jacksonObjectMapper().createObjectNode()\r
458         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)\r
459                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_ATTRIBUTES)\r
460                 .append(BluePrintConstants.PATH_DIVIDER).toString()\r
461         store.keys.filter {\r
462             it.startsWith(path)\r
463         }.map {\r
464             val key = it.replace(path, "")\r
465             if (keys.contains(key)) {\r
466                 val value = store[it] as JsonNode\r
467                 jsonNode.set(key, value)\r
468             }\r
469         }\r
470         return jsonNode\r
471     }\r
472 \r
473 \r
474 }