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