f835cbe52e0003bc4e930bd51cacb91d7f5439a1
[ccsdk/cds.git] /
1 /*
2  * Copyright © 2019 IBM, Bell Canada.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.onap.ccsdk.cds.controllerblueprints.core.service
18
19 import com.fasterxml.jackson.databind.JsonNode
20 import com.fasterxml.jackson.databind.ObjectMapper
21 import com.hubspot.jinjava.Jinjava
22 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
23 import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.BluePrintJsonNodeFactory
24 import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.BlueprintTemplateService
25 import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
26
27
28 object BluePrintJinjaTemplateService: BlueprintTemplateService {
29
30     override suspend fun generateContent(template: String, json: String, ignoreJsonNull: Boolean,
31                                  additionalContext: MutableMap<String, Any>): String {
32         // Load template
33         val jinJava = Jinjava()
34         val mapper = ObjectMapper()
35         val nodeFactory = BluePrintJsonNodeFactory()
36         mapper.nodeFactory = nodeFactory
37
38         // Add the JSON Data to the context
39         if (json.isNotEmpty()) {
40             val jsonNode = mapper.readValue<JsonNode>(json, JsonNode::class.java)
41                     ?: throw BluePrintProcessorException("couldn't get json node from json")
42             if (ignoreJsonNull)
43                 JacksonUtils.removeJsonNullNode(jsonNode)
44             jsonNode.fields().forEach { entry ->
45                 additionalContext[entry.key] = entry.value
46             }
47         }
48
49         return jinJava.render(template, additionalContext.toMap())
50     }
51 }
52