2 * Copyright © 2017-2018 AT&T Intellectual Property.
3 * Modifications Copyright © 2018-2019 IBM, Bell Canada.
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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 package org.onap.ccsdk.cds.controllerblueprints.core.service
20 import com.fasterxml.jackson.databind.JsonNode
21 import com.fasterxml.jackson.databind.node.NullNode
22 import com.fasterxml.jackson.databind.node.ObjectNode
23 import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
24 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
25 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintError
26 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
27 import org.onap.ccsdk.cds.controllerblueprints.core.asJsonNode
28 import org.onap.ccsdk.cds.controllerblueprints.core.asJsonType
29 import org.onap.ccsdk.cds.controllerblueprints.core.common.ApplicationConstants.LOG_REDACTED
30 import org.onap.ccsdk.cds.controllerblueprints.core.data.ArtifactDefinition
31 import org.onap.ccsdk.cds.controllerblueprints.core.data.NodeTemplate
32 import org.onap.ccsdk.cds.controllerblueprints.core.data.PropertyDefinition
33 import org.onap.ccsdk.cds.controllerblueprints.core.returnNullIfMissing
34 import org.onap.ccsdk.cds.controllerblueprints.core.rootFieldsToMap
35 import org.onap.ccsdk.cds.controllerblueprints.core.utils.BluePrintMetadataUtils
36 import org.onap.ccsdk.cds.controllerblueprints.core.utils.PropertyDefinitionUtils.Companion.hasLogProtect
37 import org.slf4j.LoggerFactory
40 interface BluePrintRuntimeService<T> {
44 fun bluePrintContext(): BluePrintContext
46 fun getExecutionContext(): T
48 fun setExecutionContext(executionContext: T)
50 fun put(key: String, value: JsonNode)
52 fun get(key: String): JsonNode?
54 fun check(key: String): Boolean
58 fun getAsString(key: String): String?
60 fun getAsBoolean(key: String): Boolean?
62 fun getAsInt(key: String): Int?
64 fun getAsDouble(key: String): Double?
66 fun getBluePrintError(): BluePrintError
68 fun setBluePrintError(bluePrintError: BluePrintError)
70 fun loadEnvironments(type: String, fileName: String)
72 fun resolveNodeTemplatePropertyAssignments(
73 nodeTemplateName: String,
74 propertyDefinitions: MutableMap<String, PropertyDefinition>,
75 propertyAssignments: MutableMap<String, JsonNode>
76 ): MutableMap<String, JsonNode>
78 fun resolvePropertyDefinitions(name: String, propertyDefinitions: MutableMap<String, PropertyDefinition>):
79 MutableMap<String, JsonNode>
81 fun resolvePropertyAssignments(name: String, propertyAssignments: MutableMap<String, JsonNode>):
82 MutableMap<String, JsonNode>
84 fun resolveNodeTemplateProperties(nodeTemplateName: String): MutableMap<String, JsonNode>
86 fun resolveNodeTemplateCapabilityProperties(nodeTemplateName: String, capabilityName: String): MutableMap<String,
89 fun resolveNodeTemplateInterfaceOperationInputs(
90 nodeTemplateName: String,
91 interfaceName: String,
93 ): MutableMap<String, JsonNode>
95 fun resolveNodeTemplateInterfaceOperationOutputs(
96 nodeTemplateName: String,
97 interfaceName: String,
99 ): MutableMap<String, JsonNode>
101 fun resolveNodeTemplateArtifact(nodeTemplateName: String, artifactName: String): String
103 fun resolveNodeTemplateArtifactDefinition(nodeTemplateName: String, artifactName: String): ArtifactDefinition
105 fun resolveDSLExpression(dslPropertyName: String): JsonNode
107 fun setInputValue(propertyName: String, value: JsonNode)
109 fun setWorkflowInputValue(
110 workflowName: String,
111 propertyName: String,
112 propertyDefinition: PropertyDefinition,
116 fun setNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String, value: JsonNode)
118 fun setNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String, value: JsonNode)
120 fun setNodeTemplateOperationPropertyValue(
121 nodeTemplateName: String,
122 interfaceName: String,
123 operationName: String,
124 propertyName: String,
128 fun setNodeTemplateOperationInputValue(
129 nodeTemplateName: String,
130 interfaceName: String,
131 operationName: String,
132 propertyName: String,
136 fun setNodeTemplateOperationOutputValue(
137 nodeTemplateName: String,
138 interfaceName: String,
139 operationName: String,
140 propertyName: String,
144 fun getInputValue(propertyName: String): JsonNode
146 fun getNodeTemplateOperationOutputValue(
147 nodeTemplateName: String,
148 interfaceName: String,
149 operationName: String,
153 fun getNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String): JsonNode?
155 fun getNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String): JsonNode?
157 fun assignInputs(jsonNode: JsonNode)
159 fun assignWorkflowInputs(workflowName: String, jsonNode: JsonNode)
161 fun resolveWorkflowOutputs(workflowName: String): MutableMap<String, JsonNode>
163 fun getJsonForNodeTemplateAttributeProperties(nodeTemplateName: String, keys: List<String>): JsonNode
169 * @author Brinda Santh
171 open class DefaultBluePrintRuntimeService(private var id: String, private var bluePrintContext: BluePrintContext) :
172 BluePrintRuntimeService<MutableMap<String, JsonNode>> {
175 private val log = LoggerFactory.getLogger(BluePrintRuntimeService::class.toString())
177 private var store: MutableMap<String, JsonNode> = hashMapOf()
179 private var bluePrintError = BluePrintError()
183 * Load Blueprint Environments Properties
185 val absoluteEnvFilePath = bluePrintContext.rootPath.plus(File.separator)
186 .plus(BluePrintConstants.TOSCA_ENVIRONMENTS_DIR)
187 loadEnvironments(BluePrintConstants.PROPERTY_BPP, absoluteEnvFilePath)
190 override fun id(): String {
194 override fun bluePrintContext(): BluePrintContext {
195 return bluePrintContext
198 override fun getExecutionContext(): MutableMap<String, JsonNode> {
202 @Suppress("UNCHECKED_CAST")
203 override fun setExecutionContext(executionContext: MutableMap<String, JsonNode>) {
204 this.store = executionContext
207 override fun put(key: String, value: JsonNode) {
211 override fun get(key: String): JsonNode {
212 return store[key] ?: throw BluePrintProcessorException("failed to get execution property($key)")
215 override fun check(key: String): Boolean {
216 return store.containsKey(key)
219 override fun cleanRuntime() {
223 private fun getJsonNode(key: String): JsonNode {
227 override fun getAsString(key: String): String? {
228 return get(key).asText()
231 override fun getAsBoolean(key: String): Boolean? {
232 return get(key).asBoolean()
235 override fun getAsInt(key: String): Int? {
236 return get(key).asInt()
239 override fun getAsDouble(key: String): Double? {
240 return get(key).asDouble()
243 override fun getBluePrintError(): BluePrintError {
244 return this.bluePrintError
247 override fun setBluePrintError(bluePrintError: BluePrintError) {
248 this.bluePrintError = bluePrintError
251 override fun loadEnvironments(type: String, fileName: String) {
252 BluePrintMetadataUtils.environmentFileProperties(fileName).forEach { key, value ->
253 setNodeTemplateAttributeValue(type, key.toString(), value.asJsonType())
258 * Resolve any property assignments for the node
260 override fun resolveNodeTemplatePropertyAssignments(
261 nodeTemplateName: String,
262 propertyDefinitions: MutableMap<String, PropertyDefinition>,
263 propertyAssignments: MutableMap<String, JsonNode>
265 MutableMap<String, JsonNode> {
267 val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()
269 propertyDefinitions.forEach { (nodeTypePropertyName, nodeTypeProperty) ->
270 // Get the Express or Value for the Node Template
271 val propertyAssignment: JsonNode? = propertyAssignments[nodeTypePropertyName]
273 var resolvedValue: JsonNode = NullNode.getInstance()
274 if (propertyAssignment != null) {
275 // Resolve the Expressing
276 val propertyAssignmentExpression = PropertyAssignmentService(this)
277 resolvedValue = propertyAssignmentExpression.resolveAssignmentExpression(
278 nodeTemplateName, nodeTypePropertyName, propertyAssignment
282 // Set default value if null
283 if (resolvedValue is NullNode) {
284 nodeTypeProperty.defaultValue?.let { resolvedValue = nodeTypeProperty.defaultValue!! }
287 // Set for Return of method
288 propertyAssignmentValue[nodeTypePropertyName] = resolvedValue
290 return propertyAssignmentValue
293 override fun resolvePropertyDefinitions(name: String, propertyDefinitions: MutableMap<String, PropertyDefinition>):
294 MutableMap<String, JsonNode> {
295 val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()
297 propertyDefinitions.forEach { propertyName, propertyDefinition ->
298 val propertyAssignmentExpression = PropertyAssignmentService(this)
299 val expression = propertyDefinition.value ?: propertyDefinition.defaultValue
300 if (expression != null) {
301 propertyAssignmentValue[propertyName] =
302 propertyAssignmentExpression.resolveAssignmentExpression(name, propertyName, expression)
305 return propertyAssignmentValue
308 override fun resolvePropertyAssignments(name: String, propertyAssignments: MutableMap<String, JsonNode>):
309 MutableMap<String, JsonNode> {
310 val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()
312 propertyAssignments.forEach { (propertyName, propertyExpression) ->
313 val propertyAssignmentExpression = PropertyAssignmentService(this)
314 propertyAssignmentValue[propertyName] =
315 propertyAssignmentExpression.resolveAssignmentExpression(name, propertyName, propertyExpression)
317 return propertyAssignmentValue
320 override fun resolveNodeTemplateProperties(nodeTemplateName: String): MutableMap<String, JsonNode> {
321 log.info("resolveNodeTemplatePropertyValues for node template ({})", nodeTemplateName)
323 val nodeTemplate: NodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)
325 val propertyAssignments: MutableMap<String, JsonNode> = nodeTemplate.properties!!
327 // Get the Node Type Definitions
328 val nodeTypePropertiesDefinitions: MutableMap<String, PropertyDefinition> = bluePrintContext
329 .nodeTypeChainedProperties(nodeTemplate.type)!!
332 * Resolve the NodeTemplate Property Assignment Values.
334 return resolveNodeTemplatePropertyAssignments(nodeTemplateName, nodeTypePropertiesDefinitions, propertyAssignments)
337 override fun resolveNodeTemplateCapabilityProperties(nodeTemplateName: String, capabilityName: String):
338 MutableMap<String, JsonNode> {
339 log.info("resolveNodeTemplateCapabilityProperties for node template($nodeTemplateName) capability($capabilityName)")
340 val nodeTemplate: NodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)
342 val propertyAssignments = nodeTemplate.capabilities?.get(capabilityName)?.properties ?: hashMapOf()
344 val propertyDefinitions = bluePrintContext.nodeTemplateNodeType(nodeTemplateName)
345 .capabilities?.get(capabilityName)?.properties ?: hashMapOf()
348 * Resolve the Capability Property Assignment Values.
350 return resolveNodeTemplatePropertyAssignments(nodeTemplateName, propertyDefinitions, propertyAssignments)
353 override fun resolveNodeTemplateInterfaceOperationInputs(
354 nodeTemplateName: String,
355 interfaceName: String,
356 operationName: String
357 ): MutableMap<String, JsonNode> {
359 "resolveNodeTemplateInterfaceOperationInputs for node template ($nodeTemplateName), " +
360 "interface name($interfaceName), operationName($operationName)"
363 val propertyAssignments: MutableMap<String, JsonNode> =
364 bluePrintContext.nodeTemplateInterfaceOperationInputs(nodeTemplateName, interfaceName, operationName)
367 val nodeTypeName = bluePrintContext.nodeTemplateByName(nodeTemplateName).type
369 val nodeTypeInterfaceOperationInputs: MutableMap<String, PropertyDefinition> =
370 bluePrintContext.nodeTypeInterfaceOperationInputs(nodeTypeName, interfaceName, operationName)
373 log.info("input definition for node template ($nodeTemplateName), values ($propertyAssignments)")
376 * Resolve the Property Input Assignment Values.
378 return resolveNodeTemplatePropertyAssignments(nodeTemplateName, nodeTypeInterfaceOperationInputs, propertyAssignments)
381 override fun resolveNodeTemplateInterfaceOperationOutputs(
382 nodeTemplateName: String,
383 interfaceName: String,
384 operationName: String
385 ): MutableMap<String, JsonNode> {
387 "resolveNodeTemplateInterfaceOperationOutputs for node template ($nodeTemplateName),interface name " +
388 "($interfaceName), operationName($operationName)"
391 val propertyAssignments: MutableMap<String, JsonNode> =
392 bluePrintContext.nodeTemplateInterfaceOperationOutputs(nodeTemplateName, interfaceName, operationName)
395 val nodeTypeName = bluePrintContext.nodeTemplateByName(nodeTemplateName).type
397 val nodeTypeInterfaceOperationOutputs: MutableMap<String, PropertyDefinition> =
398 bluePrintContext.nodeTypeInterfaceOperationOutputs(nodeTypeName, interfaceName, operationName)
401 * Resolve the Property Output Assignment Values.
403 val propertyAssignmentValue =
404 resolveNodeTemplatePropertyAssignments(nodeTemplateName, nodeTypeInterfaceOperationOutputs, propertyAssignments)
406 // Store operation output values into context
407 propertyAssignmentValue.forEach { (key, value) ->
408 setNodeTemplateOperationOutputValue(nodeTemplateName, interfaceName, operationName, key, value)
410 return propertyAssignmentValue
413 override fun resolveNodeTemplateArtifact(nodeTemplateName: String, artifactName: String): String {
414 val artifactDefinition: ArtifactDefinition =
415 resolveNodeTemplateArtifactDefinition(nodeTemplateName, artifactName)
416 val propertyAssignmentExpression = PropertyAssignmentService(this)
417 return propertyAssignmentExpression.artifactContent(artifactDefinition)
420 override fun resolveNodeTemplateArtifactDefinition(
421 nodeTemplateName: String,
423 ): ArtifactDefinition {
424 val nodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName)
426 return nodeTemplate.artifacts?.get(artifactName)
427 ?: throw BluePrintProcessorException(
428 "failed to get artifact definition($artifactName) from the node template"
433 * Read the DSL Property reference, If there is any expression, then resolve those expression and return as Json
436 override fun resolveDSLExpression(dslPropertyName: String): JsonNode {
437 val propertyAssignments = bluePrintContext.dslPropertiesByName(dslPropertyName)
438 return if (BluePrintExpressionService.checkContainsExpression(propertyAssignments) &&
439 propertyAssignments is ObjectNode
442 val rootKeyMap = propertyAssignments.rootFieldsToMap()
443 val propertyAssignmentValue: MutableMap<String, JsonNode> = hashMapOf()
444 rootKeyMap.forEach { (propertyName, propertyValue) ->
445 val propertyAssignmentExpression = PropertyAssignmentService(this)
446 propertyAssignmentValue[propertyName] = propertyAssignmentExpression
447 .resolveAssignmentExpression("DSL", propertyName, propertyValue)
449 propertyAssignmentValue.asJsonNode()
455 override fun setInputValue(propertyName: String, value: JsonNode) {
456 val path = """${BluePrintConstants.PATH_INPUTS}${BluePrintConstants.PATH_DIVIDER}$propertyName"""
460 override fun setWorkflowInputValue(
461 workflowName: String,
462 propertyName: String,
463 propertyDefinition: PropertyDefinition,
466 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_WORKFLOWS)
467 .append(BluePrintConstants.PATH_DIVIDER).append(workflowName)
468 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INPUTS)
469 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
470 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
474 override fun setNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String, value: JsonNode) {
475 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
476 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
477 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
478 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
482 override fun setNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String, value: JsonNode) {
483 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
484 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
485 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_ATTRIBUTES)
486 .append(BluePrintConstants.PATH_DIVIDER).append(attributeName).toString()
490 override fun setNodeTemplateOperationPropertyValue(
491 nodeTemplateName: String,
492 interfaceName: String,
493 operationName: String,
494 propertyName: String,
497 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
498 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
499 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES)
500 .append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)
501 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS)
502 .append(BluePrintConstants.PATH_DIVIDER).append(operationName)
503 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
504 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
505 log.trace("setting operation property path ({}), values ({})", path, value)
509 override fun setNodeTemplateOperationInputValue(
510 nodeTemplateName: String,
511 interfaceName: String,
512 operationName: String,
513 propertyName: String,
516 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
517 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
518 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES)
519 .append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)
520 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS)
521 .append(BluePrintConstants.PATH_DIVIDER).append(operationName)
522 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INPUTS)
523 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
524 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
528 override fun setNodeTemplateOperationOutputValue(
529 nodeTemplateName: String,
530 interfaceName: String,
531 operationName: String,
532 propertyName: String,
535 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
536 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
537 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES)
538 .append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)
539 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS)
540 .append(BluePrintConstants.PATH_DIVIDER).append(operationName)
541 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OUTPUTS)
542 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
543 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
547 override fun getInputValue(propertyName: String): JsonNode {
548 val path = StringBuilder(BluePrintConstants.PATH_INPUTS)
549 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
550 return getJsonNode(path)
553 override fun getNodeTemplateOperationOutputValue(
554 nodeTemplateName: String,
555 interfaceName: String,
556 operationName: String,
559 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
560 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
561 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_INTERFACES)
562 .append(BluePrintConstants.PATH_DIVIDER).append(interfaceName)
563 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OPERATIONS)
564 .append(BluePrintConstants.PATH_DIVIDER).append(operationName)
565 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_OUTPUTS)
566 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
567 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
568 return getJsonNode(path)
571 override fun getNodeTemplatePropertyValue(nodeTemplateName: String, propertyName: String): JsonNode {
572 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
573 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
574 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_PROPERTIES)
575 .append(BluePrintConstants.PATH_DIVIDER).append(propertyName).toString()
576 return getJsonNode(path)
579 override fun getNodeTemplateAttributeValue(nodeTemplateName: String, attributeName: String): JsonNode {
580 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
581 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
582 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_ATTRIBUTES)
583 .append(BluePrintConstants.PATH_DIVIDER).append(attributeName).toString()
584 return getJsonNode(path)
587 override fun assignInputs(jsonNode: JsonNode) {
588 log.info("assignInputs from input JSON ({})", jsonNode.toString())
589 bluePrintContext.inputs()?.forEach { propertyName, property ->
590 val valueNode: JsonNode = jsonNode.at(BluePrintConstants.PATH_DIVIDER + propertyName)
591 ?: property.defaultValue
592 ?: NullNode.getInstance()
593 setInputValue(propertyName, valueNode)
597 override fun assignWorkflowInputs(workflowName: String, jsonNode: JsonNode) {
598 log.info("Deriving input data for workflow: ($workflowName)")
600 val dynamicInputPropertiesName = "$workflowName-properties"
602 bluePrintContext.workflowByName(workflowName).inputs
603 ?.filter { (propertyName, property) -> propertyName != dynamicInputPropertiesName }
604 ?.forEach { propertyName, property -> findAndSetInputValue(propertyName, property, jsonNode) }
605 // Load Dynamic data Types
606 jsonNode.get(dynamicInputPropertiesName)?.let {
607 bluePrintContext.dataTypeByName("dt-$dynamicInputPropertiesName")
609 ?.forEach { propertyName, property -> findAndSetInputValue(propertyName, property, it) }
613 private fun findAndSetInputValue(propertyName: String, property: PropertyDefinition, jsonNode: JsonNode) {
614 val valueNode = jsonNode.at(BluePrintConstants.PATH_DIVIDER + propertyName)
615 .returnNullIfMissing()
616 ?: property.defaultValue
617 ?: NullNode.getInstance()
618 val loggableValue = if (hasLogProtect(property)) LOG_REDACTED else valueNode.toString()
619 log.info("Setting input data - attribute:($propertyName) value:($loggableValue)")
620 setInputValue(propertyName, valueNode)
623 override fun resolveWorkflowOutputs(workflowName: String): MutableMap<String, JsonNode> {
624 log.info("resolveWorkflowOutputs for workflow($workflowName)")
625 val outputs = bluePrintContext.workflowByName(workflowName).outputs ?: mutableMapOf()
626 return resolvePropertyDefinitions("WORKFLOW", outputs)
629 override fun getJsonForNodeTemplateAttributeProperties(nodeTemplateName: String, keys: List<String>): JsonNode {
631 val jsonNode: ObjectNode = jacksonObjectMapper().createObjectNode()
632 val path: String = StringBuilder(BluePrintConstants.PATH_NODE_TEMPLATES)
633 .append(BluePrintConstants.PATH_DIVIDER).append(nodeTemplateName)
634 .append(BluePrintConstants.PATH_DIVIDER).append(BluePrintConstants.PATH_ATTRIBUTES)
635 .append(BluePrintConstants.PATH_DIVIDER).toString()
639 val key = it.replace(path, "")
640 if (keys.contains(key)) {
641 val value = store[it] as JsonNode
642 jsonNode.set(key, value)