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