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