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