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