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