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