2  * Copyright © 2017-2018 AT&T Intellectual Property.
\r 
   3  * Modifications Copyright © 2018 IBM.
\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 
   9  *     http://www.apache.org/licenses/LICENSE-2.0
\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 
  18 package org.onap.ccsdk.apps.controllerblueprints.core.service
\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 
  35 interface BluePrintRuntimeService<T> {
\r 
  39     fun bluePrintContext(): BluePrintContext
\r 
  41     fun getExecutionContext(): T
\r 
  43     fun setExecutionContext(executionContext: T)
\r 
  45     fun put(key: String, value: JsonNode)
\r 
  47     fun get(key: String): JsonNode?
\r 
  52       Get the Node Type Definition for the Node Template, Then iterate Node Type Properties and resolve the expressing
\r 
  54     fun resolveNodeTemplateProperties(nodeTemplateName: String): MutableMap<String, JsonNode>
\r 
  56     fun resolveNodeTemplateInterfaceOperationInputs(nodeTemplateName: String, interfaceName: String, operationName: String): MutableMap<String, JsonNode>
\r 
  58     fun resolveNodeTemplateInterfaceOperationOutputs(nodeTemplateName: String, interfaceName: String, operationName: String): MutableMap<String, JsonNode>
\r 
  60     fun resolveNodeTemplateArtifact(nodeTemplateName: String, artifactName: String): String
\r 
  62     fun setInputValue(propertyName: String, propertyDefinition: PropertyDefinition, value: JsonNode)
\r 
  64     fun setWorkflowInputValue(workflowName: String, propertyName: String, propertyDefinition: PropertyDefinition, value: JsonNode)
\r 
  66     fun setNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String, value: JsonNode)
\r 
  68     fun setNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String, value: JsonNode)
\r 
  70     fun setNodeTemplateOperationPropertyValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String, value: JsonNode)
\r 
  72     fun setNodeTemplateOperationInputValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String, value: JsonNode)
\r 
  74     fun setNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String, value: JsonNode)
\r 
  76     fun getInputValue(propertyName: String): JsonNode
\r 
  78     fun getNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String): JsonNode
\r 
  80     fun getNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String): JsonNode?
\r 
  82     fun getNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String): JsonNode?
\r 
  84     fun getNodeTemplateRequirementPropertyValue(nodeTemplateName: String, requirementName: String, propertyName: String): JsonNode?
\r 
  86     fun getNodeTemplateCapabilityPropertyValue(nodeTemplateName: String, capabilityName: String, propertyName: String): JsonNode?
\r 
  88     fun assignInputs(jsonNode: JsonNode)
\r 
  90     fun assignWorkflowInputs(workflowName: String, jsonNode: JsonNode)
\r 
  92     fun getJsonForNodeTemplateAttributeProperties(nodeTemplateName: String, keys: List<String>): JsonNode
\r 
  98  * @author Brinda Santh
\r 
 100 open class DefaultBluePrintRuntimeService(private var id: String, private var bluePrintContext: BluePrintContext)
\r 
 101     : BluePrintRuntimeService<MutableMap<String, JsonNode>> {
\r 
 103     private val log: EELFLogger = EELFManager.getInstance().getLogger(BluePrintRuntimeService::class.toString())
\r 
 105     private var store: MutableMap<String, JsonNode> = hashMapOf()
\r 
 107     override fun id(): String {
\r 
 111     override fun bluePrintContext(): BluePrintContext {
\r 
 112         return bluePrintContext
\r 
 115     override fun getExecutionContext(): MutableMap<String, JsonNode> {
\r 
 119     @Suppress("UNCHECKED_CAST")
\r 
 120     override fun setExecutionContext(executionContext: MutableMap<String, JsonNode>) {
\r 
 121         this.store = executionContext
\r 
 124     override fun put(key: String, value: JsonNode) {
\r 
 128     override fun get(key: String): JsonNode {
\r 
 129         return store[key] ?: throw BluePrintProcessorException("failed to get execution property($key)")
\r 
 132     override fun cleanRuntime() {
\r 
 136     private fun getJsonNode(key: String): JsonNode {
\r 
 141         Get the Node Type Definition for the Node Template, Then iterate Node Type Properties and resolve the expressing
\r 
 143     override fun resolveNodeTemplateProperties(nodeTemplateName: String): MutableMap<String, JsonNode> {
\r 
 144         log.info("resolveNodeTemplatePropertyValues for node template ({})", nodeTemplateName)
\r 
 145         val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()
\r 
 147         val nodeTemplate: NodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)
\r 
 149         val propertyAssignments: MutableMap<String, JsonNode> =
\r 
 150                 nodeTemplate.properties as MutableMap<String, JsonNode>
\r 
 152         // Get the Node Type Definitions
\r 
 153         val nodeTypeProperties: MutableMap<String, PropertyDefinition> =
\r 
 154                 bluePrintContext.nodeTypeChainedProperties(nodeTemplate.type)!!
\r 
 156         // Iterate Node Type Properties
\r 
 157         nodeTypeProperties.forEach { nodeTypePropertyName, nodeTypeProperty ->
\r 
 158             // Get the Express or Value for the Node Template
\r 
 159             val propertyAssignment: Any? = propertyAssignments[nodeTypePropertyName]
\r 
 161             var resolvedValue: JsonNode = NullNode.getInstance()
\r 
 162             if (propertyAssignment != null) {
\r 
 163                 // Resolve the Expressing
\r 
 164                 val propertyAssignmentExpression = PropertyAssignmentService(this)
\r 
 165                 resolvedValue = propertyAssignmentExpression.resolveAssignmentExpression(nodeTemplateName, nodeTypePropertyName, propertyAssignment)
\r 
 167                 // Assign default value to the Operation
\r 
 168                 nodeTypeProperty.defaultValue?.let { defaultValue ->
\r 
 169                     resolvedValue = defaultValue
\r 
 172             // Set for Return of method
\r 
 173             propertyAssignmentValue[nodeTypePropertyName] = resolvedValue
\r 
 175         log.info("resolved property definition for node template ({}), values ({})", nodeTemplateName, propertyAssignmentValue)
\r 
 176         return propertyAssignmentValue
\r 
 179     override fun resolveNodeTemplateInterfaceOperationInputs(nodeTemplateName: String,
\r 
 180                                                              interfaceName: String, operationName: String): MutableMap<String, JsonNode> {
\r 
 181         log.info("resolveNodeTemplateInterfaceOperationInputs for node template ({}),interface name ({}), " +
\r 
 182                 "operationName({})", nodeTemplateName, interfaceName, operationName)
\r 
 184         val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()
\r 
 186         val propertyAssignments: MutableMap<String, Any> =
\r 
 187                 bluePrintContext.nodeTemplateInterfaceOperationInputs(nodeTemplateName, interfaceName, operationName) as? MutableMap<String, Any>
\r 
 188                         ?: throw BluePrintException(String.format("failed to get input definitions for node template (%s), " +
\r 
 189                                 "interface name (%s), operationName(%s)", nodeTemplateName, interfaceName, operationName))
\r 
 191         val nodeTypeName = bluePrintContext.nodeTemplateByName(nodeTemplateName).type
\r 
 193         val nodeTypeInterfaceOperationInputs: MutableMap<String, PropertyDefinition> =
\r 
 194                 bluePrintContext.nodeTypeInterfaceOperationInputs(nodeTypeName, interfaceName, operationName)
\r 
 195                         ?: throw BluePrintException(String.format("failed to get input definitions for node type (%s), " +
\r 
 196                                 "interface name (%s), operationName(%s)", nodeTypeName, interfaceName, operationName))
\r 
 198         log.info("input definition for node template ({}), values ({})", nodeTemplateName, propertyAssignments)
\r 
 200         // Iterate Node Type Properties
\r 
 201         nodeTypeInterfaceOperationInputs.forEach { nodeTypePropertyName, nodeTypeProperty ->
\r 
 202             // Get the Express or Value for the Node Template
\r 
 203             val propertyAssignment: Any? = propertyAssignments[nodeTypePropertyName]
\r 
 205             var resolvedValue: JsonNode = NullNode.getInstance()
\r 
 206             if (propertyAssignment != null) {
\r 
 207                 // Resolve the Expressing
\r 
 208                 val propertyAssignmentExpression = PropertyAssignmentService(this)
\r 
 209                 resolvedValue = propertyAssignmentExpression.resolveAssignmentExpression(nodeTemplateName, nodeTypePropertyName, propertyAssignment)
\r 
 211                 // Assign default value to the Operation
\r 
 212                 nodeTypeProperty.defaultValue?.let {
\r 
 213                     resolvedValue = JacksonUtils.jsonNodeFromObject(nodeTypeProperty.defaultValue!!)
\r 
 216             // Set for Return of method
\r 
 217             propertyAssignmentValue[nodeTypePropertyName] = resolvedValue
\r 
 219         log.trace("resolved input assignments for node template ({}), values ({})", nodeTemplateName,
\r 
 220                 propertyAssignmentValue)
\r 
 222         return propertyAssignmentValue
\r 
 226     override fun resolveNodeTemplateInterfaceOperationOutputs(nodeTemplateName: String,
\r 
 227                                                               interfaceName: String, operationName: String): MutableMap<String, JsonNode> {
\r 
 228         log.info("resolveNodeTemplateInterfaceOperationOutputs for node template ({}),interface name ({}), " +
\r 
 229                 "operationName({})", nodeTemplateName, interfaceName, operationName)
\r 
 231         val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()
\r 
 233         val propertyAssignments: MutableMap<String, Any> =
\r 
 234                 bluePrintContext.nodeTemplateInterfaceOperationOutputs(nodeTemplateName, interfaceName, operationName) as? MutableMap<String, Any>
\r 
 235                         ?: throw BluePrintException(String.format("failed to get output definitions for node template (%s), " +
\r 
 236                                 "interface name (%s), operationName(%s)", nodeTemplateName, interfaceName, operationName))
\r 
 238         val nodeTypeName = bluePrintContext.nodeTemplateByName(nodeTemplateName).type
\r 
 240         val nodeTypeInterfaceOperationOutputs: MutableMap<String, PropertyDefinition> =
\r 
 241                 bluePrintContext.nodeTypeInterfaceOperationOutputs(nodeTypeName, interfaceName, operationName)
\r 
 242                         ?: throw BluePrintException(String.format("failed to get input definitions for node type (%s), " +
\r 
 243                                 "interface name (%s), operationName(%s)", nodeTypeName, interfaceName, operationName))
\r 
 245         // Iterate Node Type Properties
\r 
 246         nodeTypeInterfaceOperationOutputs.forEach { nodeTypePropertyName, nodeTypeProperty ->
\r 
 248             // Get the Express or Value for the Node Template
\r 
 249             val propertyAssignment: Any? = propertyAssignments[nodeTypePropertyName]
\r 
 251             var resolvedValue: JsonNode = NullNode.getInstance()
\r 
 252             if (propertyAssignment != null) {
\r 
 253                 // Resolve the Expressing
\r 
 254                 val propertyAssignmentExpression = PropertyAssignmentService(this)
\r 
 255                 resolvedValue = propertyAssignmentExpression.resolveAssignmentExpression(nodeTemplateName, nodeTypePropertyName, propertyAssignment)
\r 
 257                 // Assign default value to the Operation
\r 
 258                 nodeTypeProperty.defaultValue?.let {
\r 
 259                     resolvedValue = JacksonUtils.jsonNodeFromObject(nodeTypeProperty.defaultValue!!)
\r 
 262             // Set for Return of method
\r 
 263             propertyAssignmentValue[nodeTypePropertyName] = resolvedValue
\r 
 265             // Store  operation output values into context
\r 
 266             setNodeTemplateOperationOutputValue(nodeTemplateName, interfaceName, operationName, nodeTypePropertyName, resolvedValue)
\r 
 267             log.trace("resolved output assignments for node template ({}), property name ({}), value ({})", nodeTemplateName, nodeTypePropertyName, resolvedValue)
\r 
 269         return propertyAssignmentValue
\r 
 272     override fun resolveNodeTemplateArtifact(nodeTemplateName: String,
\r 
 273                                              artifactName: String): String {
\r 
 274         val nodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)
\r 
 276         val artifactDefinition: ArtifactDefinition = nodeTemplate.artifacts?.get(artifactName)
\r 
 277                 ?: throw BluePrintProcessorException(String.format("failed to get artifat definition {} from the node template"
\r 
 279         val propertyAssignmentExpression = PropertyAssignmentService(this)
\r 
 280         return propertyAssignmentExpression.artifactContent(artifactDefinition)
\r 
 284     override fun setInputValue(propertyName: String, propertyDefinition: PropertyDefinition, value: JsonNode) {
\r 
 285         val path = StringBuilder(BluePrintConstants.PATH_INPUTS)
\r 
 286                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
\r 
 287         log.trace("setting input path ({}), values ({})", path, value)
\r 
 291     override fun setWorkflowInputValue(workflowName: String, propertyName: String, propertyDefinition: PropertyDefinition, value: JsonNode) {
\r 
 292         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_WORKFLOWS).append(BluePrintConstants.PATH_DIVIDER).append(workflowName)
\r 
 293                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INPUTS)
\r 
 294                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
\r 
 295                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
\r 
 299     override fun setNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String, value: JsonNode) {
\r 
 301         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
\r 
 302                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
\r 
 303                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
\r 
 307     override fun setNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String, value: JsonNode) {
\r 
 309         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
\r 
 310                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_ATTRIBUTES)
\r 
 311                 .append(BluePrintConstants.PATH_DIVIDER).append(attributeName).toString()
\r 
 315     override fun setNodeTemplateOperationPropertyValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String,
\r 
 317         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
\r 
 318                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES).append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)
\r 
 319                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS).append(BluePrintConstants.PATH_DIVIDER).append(operationName)
\r 
 320                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
\r 
 321                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
\r 
 322         log.trace("setting operation property path ({}), values ({})", path, value)
\r 
 326     override fun setNodeTemplateOperationInputValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String,
\r 
 328         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
\r 
 329                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES).append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)
\r 
 330                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS).append(BluePrintConstants.PATH_DIVIDER).append(operationName)
\r 
 331                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INPUTS)
\r 
 332                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
\r 
 333                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
\r 
 337     override fun setNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String,
\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_INTERFACES).append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)
\r 
 341                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS).append(BluePrintConstants.PATH_DIVIDER).append(operationName)
\r 
 342                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OUTPUTS)
\r 
 343                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
\r 
 344                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
\r 
 349     override fun getInputValue(propertyName: String): JsonNode {
\r 
 350         val path = StringBuilder(BluePrintConstants.PATH_INPUTS)
\r 
 351                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
\r 
 352         return getJsonNode(path)
\r 
 355     override fun getNodeTemplateOperationOutputValue(nodeTemplateName: String, interfaceName: String, operationName: String, propertyName: String): JsonNode {
\r 
 356         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
\r 
 357                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES).append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)
\r 
 358                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS).append(BluePrintConstants.PATH_DIVIDER).append(operationName)
\r 
 359                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OUTPUTS).append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
\r 
 360                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
\r 
 361         return getJsonNode(path)
\r 
 364     override fun getNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String): JsonNode {
\r 
 365         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
\r 
 366                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
\r 
 367                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
\r 
 368         return getJsonNode(path)
\r 
 371     override fun getNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String): JsonNode {
\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         return getJsonNode(path)
\r 
 378     override fun getNodeTemplateRequirementPropertyValue(nodeTemplateName: String, requirementName: String, propertyName:
\r 
 379     String): 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_REQUIREMENTS).append(requirementName)
\r 
 382                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
\r 
 383                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
\r 
 384         return getJsonNode(path)
\r 
 387     override fun getNodeTemplateCapabilityPropertyValue(nodeTemplateName: String, capabilityName: String, propertyName:
\r 
 388     String): JsonNode {
\r 
 389         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
\r 
 390                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_CAPABILITIES).append(capabilityName)
\r 
 391                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
\r 
 392                 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
\r 
 393         return getJsonNode(path)
\r 
 396     override fun assignInputs(jsonNode: JsonNode) {
\r 
 397         log.info("assignInputs from input JSON ({})", jsonNode.toString())
\r 
 398         bluePrintContext.inputs?.forEach { propertyName, property ->
\r 
 399             val valueNode: JsonNode = jsonNode.at(BluePrintConstants.PATH_DIVIDER + propertyName)
\r 
 400                     ?: NullNode.getInstance()
\r 
 401             setInputValue(propertyName, property, valueNode)
\r 
 405     override fun assignWorkflowInputs(workflowName: String, jsonNode: JsonNode) {
\r 
 406         log.info("assign workflow {} input value ({})", workflowName, jsonNode.toString())
\r 
 408         bluePrintContext.workflowByName(workflowName).inputs?.forEach { propertyName, property ->
\r 
 409             val valueNode: JsonNode = jsonNode.at(BluePrintConstants.PATH_DIVIDER + propertyName)
\r 
 410                     ?: NullNode.getInstance()
\r 
 411             setInputValue(propertyName, property, valueNode)
\r 
 415     override fun getJsonForNodeTemplateAttributeProperties(nodeTemplateName: String, keys: List<String>): JsonNode {
\r 
 417         val jsonNode: ObjectNode = jacksonObjectMapper().createObjectNode()
\r 
 418         val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES).append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
\r 
 419                 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_ATTRIBUTES)
\r 
 420                 .append(BluePrintConstants.PATH_DIVIDER).toString()
\r 
 421         store.keys.filter {
\r 
 422             it.startsWith(path)
\r 
 424             val key = it.replace(path, "")
\r 
 425             if (keys.contains(key)) {
\r 
 426                 val value = store[it] as JsonNode
\r 
 427                 jsonNode.set(key, value)
\r