Controller Blueprints Component Core
[ccsdk/apps.git] / components / core / src / main / kotlin / org / onap / ccsdk / apps / controllerblueprints / core / service / BluePrintExpressionService.kt
1 /*\r
2  * Copyright © 2017-2018 AT&T Intellectual Property.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 package org.onap.ccsdk.apps.controllerblueprints.core.service\r
18 \r
19 import com.fasterxml.jackson.databind.JsonNode\r
20 import com.fasterxml.jackson.databind.node.ArrayNode\r
21 import com.fasterxml.jackson.databind.node.ObjectNode\r
22 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException\r
23 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintTypes\r
24 import org.onap.ccsdk.apps.controllerblueprints.core.data.*\r
25 import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils\r
26 import com.att.eelf.configuration.EELFLogger\r
27 import com.att.eelf.configuration.EELFManager\r
28 \r
29 /**\r
30  *\r
31  *\r
32  * @author Brinda Santh\r
33  */\r
34 object BluePrintExpressionService {\r
35     val log: EELFLogger = EELFManager.getInstance().getLogger(this::class.toString())\r
36 \r
37     @JvmStatic\r
38     fun getExpressionData(propertyAssignment: Any): ExpressionData {\r
39         val propertyAssignmentNode: JsonNode = JacksonUtils.jsonNodeFromObject(propertyAssignment)\r
40         return getExpressionData(propertyAssignmentNode)\r
41     }\r
42 \r
43     @JvmStatic\r
44     fun getExpressionData(propertyAssignmentNode: JsonNode): ExpressionData {\r
45         log.trace("Assignment Data/Expression : {}", propertyAssignmentNode)\r
46         val expressionData = ExpressionData(valueNode = propertyAssignmentNode)\r
47         if (propertyAssignmentNode is ObjectNode) {\r
48 \r
49             val commands: Set<String> = propertyAssignmentNode.fieldNames().asSequence().toList().intersect(BluePrintTypes.validCommands())\r
50             if (commands.isNotEmpty()) {\r
51                 expressionData.isExpression = true\r
52                 expressionData.command = commands.first()\r
53                 expressionData.expressionNode = propertyAssignmentNode\r
54 \r
55                 when (expressionData.command) {\r
56                     org.onap.ccsdk.apps.controllerblueprints.core.BluePrintConstants.EXPRESSION_GET_INPUT -> {\r
57                         expressionData.inputExpression = populateInputExpression(propertyAssignmentNode)\r
58                     }\r
59                     org.onap.ccsdk.apps.controllerblueprints.core.BluePrintConstants.EXPRESSION_GET_ATTRIBUTE -> {\r
60                         expressionData.attributeExpression = populateAttributeExpression(propertyAssignmentNode)\r
61                     }\r
62                     org.onap.ccsdk.apps.controllerblueprints.core.BluePrintConstants.EXPRESSION_GET_PROPERTY -> {\r
63                         expressionData.propertyExpression = populatePropertyExpression(propertyAssignmentNode)\r
64                     }\r
65                     org.onap.ccsdk.apps.controllerblueprints.core.BluePrintConstants.EXPRESSION_GET_OPERATION_OUTPUT -> {\r
66                         expressionData.operationOutputExpression = populateOperationOutputExpression(propertyAssignmentNode)\r
67                     }\r
68                     org.onap.ccsdk.apps.controllerblueprints.core.BluePrintConstants.EXPRESSION_GET_ARTIFACT -> {\r
69                         expressionData.artifactExpression = populateArtifactExpression(propertyAssignmentNode)\r
70                     }\r
71                 }\r
72             }\r
73         }\r
74         return expressionData\r
75     }\r
76 \r
77     @JvmStatic\r
78     fun populateInputExpression(jsonNode: JsonNode): InputExpression {\r
79         return InputExpression(propertyName = jsonNode.first().textValue())\r
80     }\r
81 \r
82     @JvmStatic\r
83     fun populatePropertyExpression(jsonNode: JsonNode): PropertyExpression {\r
84         val arrayNode: ArrayNode = jsonNode.first() as ArrayNode\r
85         check(arrayNode.size() >= 2) {\r
86             throw BluePrintException(String.format("missing property expression, " +\r
87                     "it should be [ <modelable_entity_name>, <optional_req_or_cap_name>, <property_name>, " +\r
88                     "<nested_property_name_or_index_1>, ..., <nested_property_name_or_index_n> ] , but present {}", jsonNode))\r
89         }\r
90         var reqOrCapEntityName: String? = null\r
91         var propertyName = ""\r
92         var subProperty: String? = null\r
93         when {\r
94             arrayNode.size() == 2 -> propertyName = arrayNode[1].textValue()\r
95             arrayNode.size() == 3 -> {\r
96                 reqOrCapEntityName = arrayNode[1].textValue()\r
97                 propertyName = arrayNode[2].textValue()\r
98             }\r
99             arrayNode.size() > 3 -> {\r
100                 reqOrCapEntityName = arrayNode[1].textValue()\r
101                 propertyName = arrayNode[2].textValue()\r
102                 val propertyPaths: List<String> = arrayNode.filterIndexed { index, _ ->\r
103                     index >= 3\r
104                 }.map { it.textValue() }\r
105                 subProperty = propertyPaths.joinToString("/")\r
106             }\r
107         }\r
108 \r
109         return PropertyExpression(modelableEntityName = arrayNode[0].asText(),\r
110                 reqOrCapEntityName = reqOrCapEntityName,\r
111                 propertyName = propertyName,\r
112                 subPropertyName = subProperty\r
113         )\r
114     }\r
115 \r
116     @JvmStatic\r
117     fun populateAttributeExpression(jsonNode: JsonNode): AttributeExpression {\r
118         val arrayNode: ArrayNode = jsonNode.first() as ArrayNode\r
119         check(arrayNode.size() >= 2) {\r
120             throw BluePrintException(String.format("missing attribute expression, " +\r
121                     "it should be [ <modelable_entity_name>, <optional_req_or_cap_name>, <attribute_name>," +\r
122                     " <nested_attribute_name_or_index_1>, ..., <nested_attribute_name_or_index_n> ] , but present {}", jsonNode))\r
123         }\r
124 \r
125         var reqOrCapEntityName: String? = null\r
126         var attributeName = ""\r
127         var subAttributeName: String? = null\r
128         when {\r
129             arrayNode.size() == 2 -> attributeName = arrayNode[1].textValue()\r
130             arrayNode.size() == 3 -> {\r
131                 reqOrCapEntityName = arrayNode[1].textValue()\r
132                 attributeName = arrayNode[2].textValue()\r
133             }\r
134             arrayNode.size() > 3 -> {\r
135                 reqOrCapEntityName = arrayNode[1].textValue()\r
136                 attributeName = arrayNode[2].textValue()\r
137                 val propertyPaths: List<String> = arrayNode.filterIndexed { index, _ ->\r
138                     index >= 3\r
139                 }.map { it.textValue() }\r
140                 subAttributeName = propertyPaths.joinToString("/")\r
141             }\r
142         }\r
143         return AttributeExpression(modelableEntityName = arrayNode[0].asText(),\r
144                 reqOrCapEntityName = reqOrCapEntityName,\r
145                 attributeName = attributeName,\r
146                 subAttributeName = subAttributeName\r
147         )\r
148     }\r
149 \r
150     @JvmStatic\r
151     fun populateOperationOutputExpression(jsonNode: JsonNode): OperationOutputExpression {\r
152         val arrayNode: ArrayNode = jsonNode.first() as ArrayNode\r
153 \r
154         check(arrayNode.size() >= 4) {\r
155             throw BluePrintException(String.format("missing operation output expression, " +\r
156                     "it should be (<modelable_entity_name>, <interface_name>, <operation_name>, <output_variable_name>) , but present {}", jsonNode))\r
157         }\r
158         return OperationOutputExpression(modelableEntityName = arrayNode[0].asText(),\r
159                 interfaceName = arrayNode[1].asText(),\r
160                 operationName = arrayNode[2].asText(),\r
161                 propertyName = arrayNode[3].asText()\r
162         )\r
163     }\r
164 \r
165     @JvmStatic\r
166     fun populateArtifactExpression(jsonNode: JsonNode): ArtifactExpression {\r
167         val arrayNode: ArrayNode = jsonNode.first() as ArrayNode\r
168 \r
169         check(arrayNode.size() >= 2) {\r
170             throw BluePrintException(String.format("missing artifact expression, " +\r
171                     "it should be [ <modelable_entity_name>, <artifact_name>, <location>, <remove> ] , but present {}", jsonNode))\r
172         }\r
173         return ArtifactExpression(modelableEntityName = arrayNode[0].asText(),\r
174                 artifactName = arrayNode[1].asText(),\r
175                 location = arrayNode[2]?.asText() ?: "LOCAL_FILE",\r
176                 remove = arrayNode[3]?.asBoolean() ?: false\r
177         )\r
178     }\r
179 }