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