9eef1cad5ae417cb1d3b3a33b2f33e376fe15c51
[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.utils\r
19 \r
20 import com.fasterxml.jackson.annotation.JsonInclude\r
21 import com.fasterxml.jackson.core.type.TypeReference\r
22 import com.fasterxml.jackson.databind.JsonNode\r
23 import com.fasterxml.jackson.databind.SerializationFeature\r
24 import com.fasterxml.jackson.databind.node.ArrayNode\r
25 import com.fasterxml.jackson.databind.node.NullNode\r
26 import com.fasterxml.jackson.databind.node.ObjectNode\r
27 import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper\r
28 import org.apache.commons.io.FileUtils\r
29 import org.apache.commons.io.IOUtils\r
30 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintConstants\r
31 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException\r
32 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintTypes\r
33 import org.onap.ccsdk.apps.controllerblueprints.core.format\r
34 import org.slf4j.LoggerFactory\r
35 import java.io.File\r
36 import java.nio.charset.Charset\r
37 \r
38 /**\r
39  *\r
40  *\r
41  * @author Brinda Santh\r
42  */\r
43 object JacksonUtils {\r
44     private val log = LoggerFactory.getLogger(JacksonUtils::class.java)\r
45 \r
46     inline fun <reified T : Any> readValue(content: String): T =\r
47             jacksonObjectMapper().readValue(content, T::class.java)\r
48 \r
49     @JvmStatic\r
50     fun <T> readValue(content: String, valueType: Class<T>): T? {\r
51         return jacksonObjectMapper().readValue(content, valueType)\r
52     }\r
53 \r
54     @JvmStatic\r
55     fun <T> readValueFromFile(fileName: String, valueType: Class<T>): T? {\r
56         val content: String = FileUtils.readFileToString(File(fileName), Charset.defaultCharset())\r
57                 ?: throw BluePrintException(format("Failed to read json file : {}", fileName))\r
58         return readValue(content, valueType)\r
59     }\r
60 \r
61     @JvmStatic\r
62     fun <T> readValueFromClassPathFile(fileName: String, valueType: Class<T>): T? {\r
63         val content: String = IOUtils.toString(JacksonUtils::class.java.classLoader.getResourceAsStream(fileName), Charset.defaultCharset())\r
64                 ?: throw BluePrintException(String.format("Failed to read json file : %s", fileName))\r
65         return readValue(content, valueType)\r
66     }\r
67 \r
68     @JvmStatic\r
69     fun jsonNodeFromObject(from: kotlin.Any): JsonNode = jacksonObjectMapper().convertValue(from, JsonNode::class.java)\r
70 \r
71     @JvmStatic\r
72     fun jsonNodeFromClassPathFile(fileName: String): JsonNode {\r
73         val content: String = IOUtils.toString(JacksonUtils::class.java.classLoader.getResourceAsStream(fileName), Charset.defaultCharset())\r
74                 ?: throw BluePrintException(String.format("Failed to read json file : %s", fileName))\r
75         return jsonNode(content)\r
76     }\r
77 \r
78     @JvmStatic\r
79     fun jsonNodeFromFile(fileName: String): JsonNode {\r
80         val content: String = FileUtils.readFileToString(File(fileName), Charset.defaultCharset())\r
81                 ?: throw BluePrintException(format("Failed to read json file : {}", fileName))\r
82         return jsonNode(content)\r
83     }\r
84 \r
85     @JvmStatic\r
86     fun jsonNode(content: String): JsonNode {\r
87         return jacksonObjectMapper().readTree(content)\r
88     }\r
89 \r
90     @JvmStatic\r
91     fun getJson(any: kotlin.Any): String {\r
92         return getJson(any, false)\r
93     }\r
94 \r
95     @JvmStatic\r
96     fun getJson(any: kotlin.Any, pretty: Boolean = false): String {\r
97         val objectMapper = jacksonObjectMapper()\r
98         objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL)\r
99         if (pretty) {\r
100             objectMapper.enable(SerializationFeature.INDENT_OUTPUT)\r
101         }\r
102         return objectMapper.writeValueAsString(any)\r
103     }\r
104 \r
105     @JvmStatic\r
106     fun <T> getListFromJson(content: String, valueType: Class<T>): List<T>? {\r
107         val objectMapper = jacksonObjectMapper()\r
108         val javaType = objectMapper.typeFactory.constructCollectionType(List::class.java, valueType)\r
109         return objectMapper.readValue<List<T>>(content, javaType)\r
110     }\r
111 \r
112     @JvmStatic\r
113     fun <T> getListFromFile(fileName: String, valueType: Class<T>): List<T>? {\r
114         val content: String = FileUtils.readFileToString(File(fileName), Charset.defaultCharset())\r
115                 ?: throw BluePrintException(format("Failed to read json file : {}", fileName))\r
116         return getListFromJson(content, valueType)\r
117     }\r
118 \r
119     @JvmStatic\r
120     fun <T> getListFromClassPathFile(fileName: String, valueType: Class<T>): List<T>? {\r
121         val content: String = IOUtils.toString(JacksonUtils::class.java.classLoader.getResourceAsStream(fileName), Charset.defaultCharset())\r
122                 ?: throw BluePrintException(String.format("Failed to read json file : %s", fileName))\r
123         return getListFromJson(content, valueType)\r
124     }\r
125 \r
126     @JvmStatic\r
127     fun <T> getMapFromJson(content: String, valueType: Class<T>): MutableMap<String, T>? {\r
128         val objectMapper = jacksonObjectMapper()\r
129         val typeRef = object : TypeReference<MutableMap<String, T>>() {}\r
130         return objectMapper.readValue(content, typeRef)\r
131     }\r
132 \r
133     @JvmStatic\r
134     fun checkJsonNodeValueOfType(type: String, jsonNode: JsonNode): Boolean {\r
135         if (BluePrintTypes.validPrimitiveTypes().contains(type)) {\r
136             return checkJsonNodeValueOfPrimitiveType(type, jsonNode)\r
137         } else if (BluePrintTypes.validCollectionTypes().contains(type)) {\r
138             return checkJsonNodeValueOfCollectionType(type, jsonNode)\r
139         }\r
140         return false\r
141     }\r
142 \r
143     @JvmStatic\r
144     fun checkJsonNodeValueOfPrimitiveType(primitiveType: String, jsonNode: JsonNode): Boolean {\r
145         when (primitiveType) {\r
146             BluePrintConstants.DATA_TYPE_STRING -> {\r
147                 return jsonNode.isTextual\r
148             }\r
149             BluePrintConstants.DATA_TYPE_BOOLEAN -> {\r
150                 return jsonNode.isBoolean\r
151             }\r
152             BluePrintConstants.DATA_TYPE_INTEGER -> {\r
153                 return jsonNode.isInt\r
154             }\r
155             BluePrintConstants.DATA_TYPE_FLOAT -> {\r
156                 return jsonNode.isDouble\r
157             }\r
158             BluePrintConstants.DATA_TYPE_TIMESTAMP -> {\r
159                 return jsonNode.isTextual\r
160             }\r
161             else ->\r
162                 return false\r
163         }\r
164     }\r
165 \r
166     @JvmStatic\r
167     fun checkJsonNodeValueOfCollectionType(type: String, jsonNode: JsonNode): Boolean {\r
168         when (type) {\r
169             BluePrintConstants.DATA_TYPE_LIST ->\r
170                 return jsonNode.isArray\r
171             BluePrintConstants.DATA_TYPE_MAP ->\r
172                 return jsonNode.isContainerNode\r
173             else ->\r
174                 return false\r
175         }\r
176 \r
177     }\r
178 \r
179     @JvmStatic\r
180     fun populatePrimitiveValues(key: String, value: Any, primitiveType: String, objectNode: ObjectNode) {\r
181         if (BluePrintConstants.DATA_TYPE_BOOLEAN == primitiveType) {\r
182             objectNode.put(key, value as Boolean)\r
183         } else if (BluePrintConstants.DATA_TYPE_INTEGER == primitiveType) {\r
184             objectNode.put(key, value as Int)\r
185         } else if (BluePrintConstants.DATA_TYPE_FLOAT == primitiveType) {\r
186             objectNode.put(key, value as Float)\r
187         } else if (BluePrintConstants.DATA_TYPE_TIMESTAMP == primitiveType) {\r
188             objectNode.put(key, value as String)\r
189         } else {\r
190             objectNode.put(key, value as String)\r
191         }\r
192     }\r
193 \r
194     @JvmStatic\r
195     fun populatePrimitiveValues(value: Any, primitiveType: String, objectNode: ArrayNode) {\r
196         if (BluePrintConstants.DATA_TYPE_BOOLEAN == primitiveType) {\r
197             objectNode.add(value as Boolean)\r
198         } else if (BluePrintConstants.DATA_TYPE_INTEGER == primitiveType) {\r
199             objectNode.add(value as Int)\r
200         } else if (BluePrintConstants.DATA_TYPE_FLOAT == primitiveType) {\r
201             objectNode.add(value as Float)\r
202         } else if (BluePrintConstants.DATA_TYPE_TIMESTAMP == primitiveType) {\r
203             objectNode.add(value as String)\r
204         } else {\r
205             objectNode.add(value as String)\r
206         }\r
207     }\r
208 \r
209     @JvmStatic\r
210     fun populatePrimitiveDefaultValues(key: String, primitiveType: String, objectNode: ObjectNode) {\r
211         if (BluePrintConstants.DATA_TYPE_BOOLEAN == primitiveType) {\r
212             objectNode.put(key, false)\r
213         } else if (BluePrintConstants.DATA_TYPE_INTEGER == primitiveType) {\r
214             objectNode.put(key, 0)\r
215         } else if (BluePrintConstants.DATA_TYPE_FLOAT == primitiveType) {\r
216             objectNode.put(key, 0.0)\r
217         } else {\r
218             objectNode.put(key, "")\r
219         }\r
220     }\r
221 \r
222     @JvmStatic\r
223     fun populatePrimitiveDefaultValuesForArrayNode(primitiveType: String, arrayNode: ArrayNode) {\r
224         if (BluePrintConstants.DATA_TYPE_BOOLEAN == primitiveType) {\r
225             arrayNode.add(false)\r
226         } else if (BluePrintConstants.DATA_TYPE_INTEGER == primitiveType) {\r
227             arrayNode.add(0)\r
228         } else if (BluePrintConstants.DATA_TYPE_FLOAT == primitiveType) {\r
229             arrayNode.add(0.0)\r
230         } else {\r
231             arrayNode.add("")\r
232         }\r
233     }\r
234 \r
235     @JvmStatic\r
236     fun populateJsonNodeValues(key: String, nodeValue: JsonNode?, type: String, objectNode: ObjectNode) {\r
237         if (nodeValue == null || nodeValue is NullNode) {\r
238             objectNode.set(key, nodeValue)\r
239         } else if (BluePrintTypes.validPrimitiveTypes().contains(type)) {\r
240             if (BluePrintConstants.DATA_TYPE_BOOLEAN == type) {\r
241                 objectNode.put(key, nodeValue.asBoolean())\r
242             } else if (BluePrintConstants.DATA_TYPE_INTEGER == type) {\r
243                 objectNode.put(key, nodeValue.asInt())\r
244             } else if (BluePrintConstants.DATA_TYPE_FLOAT == type) {\r
245                 objectNode.put(key, nodeValue.floatValue())\r
246             } else if (BluePrintConstants.DATA_TYPE_TIMESTAMP == type) {\r
247                 objectNode.put(key, nodeValue.asText())\r
248             } else {\r
249                 objectNode.put(key, nodeValue.asText())\r
250             }\r
251         } else {\r
252             objectNode.set(key, nodeValue)\r
253         }\r
254     }\r
255 }