diff options
author | Muthuramalingam, Brinda Santh <bs2796@att.com> | 2019-01-14 17:08:01 -0500 |
---|---|---|
committer | Muthuramalingam, Brinda Santh <bs2796@att.com> | 2019-01-14 17:08:01 -0500 |
commit | a630b5cdb3bab6d80703a4c1843058b11b977fb5 (patch) | |
tree | b27b85a8d231c76f695724266796c3db9a11b330 /components/core/src/main | |
parent | 3f215fdd8239c8a32614d84c5b2dab518dbc819c (diff) |
Add velocity engine template service
Change-Id: Idde39b587b41328e5a5e2e32ab32c29cd27d4855
Issue-ID: CCSDK-941
Signed-off-by: Muthuramalingam, Brinda Santh <bs2796@att.com>
Diffstat (limited to 'components/core/src/main')
2 files changed, 107 insertions, 1 deletions
diff --git a/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/service/BluePrintTemplateService.kt b/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/service/BluePrintTemplateService.kt new file mode 100644 index 00000000..d175fdde --- /dev/null +++ b/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/service/BluePrintTemplateService.kt @@ -0,0 +1,94 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.ccsdk.apps.controllerblueprints.core.service + +import com.fasterxml.jackson.core.io.CharTypes +import com.fasterxml.jackson.databind.JsonNode +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.node.JsonNodeFactory +import com.fasterxml.jackson.databind.node.TextNode +import org.apache.commons.lang3.BooleanUtils +import org.apache.commons.lang3.StringUtils +import org.apache.velocity.VelocityContext +import org.apache.velocity.app.Velocity +import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintProcessorException +import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils +import java.io.StringWriter + +open class BluePrintTemplateService { + + companion object { + + /** + * Generate Content from Velocity Template and JSON Content. + */ + fun generateContent(template: String, json: String, + ignoreJsonNull: Boolean = false, + additionalContext: MutableMap<String, Any> = hashMapOf()): String { + Velocity.init() + val mapper = ObjectMapper() + val nodeFactory = BluePrintJsonNodeFactory() + mapper.setNodeFactory(nodeFactory) + + val jsonNode = mapper.readValue<JsonNode>(json, JsonNode::class.java) + ?: throw BluePrintProcessorException("couldn't get json node from json") + + if (ignoreJsonNull) + JacksonUtils.removeJsonNullNode(jsonNode) + + val velocityContext = VelocityContext() + velocityContext.put("StringUtils", StringUtils::class.java) + velocityContext.put("BooleanUtils", BooleanUtils::class.java) + /** + * Add the Custom Velocity Context API + */ + additionalContext.forEach { name, value -> velocityContext.put(name, value) } + /** + * Add the JSON Data to the context + */ + jsonNode.fields().forEach { entry -> + velocityContext.put(entry.key, entry.value) + } + + val stringWriter = StringWriter() + Velocity.evaluate(velocityContext, stringWriter, "TemplateData", template) + stringWriter.flush() + return stringWriter.toString() + } + } +} + +/** + * Customise JsonNodeFactory adn TextNode, Since it introduces quotes for string data. + */ +open class BluePrintJsonNodeFactory : JsonNodeFactory() { + override fun textNode(text: String): TextNode { + return BluePrintTextNode(text) + } +} + +open class BluePrintTextNode(v: String) : TextNode(v) { + override fun toString(): String { + var len = this._value.length + len = len + 2 + (len shr 4) + val sb = StringBuilder(len) + CharTypes.appendQuoted(sb, this._value) + return sb.toString() + } + +} + diff --git a/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonUtils.kt b/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonUtils.kt index 58a82079..6321a838 100644 --- a/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonUtils.kt +++ b/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonUtils.kt @@ -21,10 +21,10 @@ import com.att.eelf.configuration.EELFManager import com.fasterxml.jackson.annotation.JsonInclude
import com.fasterxml.jackson.core.type.TypeReference
import com.fasterxml.jackson.databind.JsonNode
+import com.fasterxml.jackson.databind.SerializationFeature
import com.fasterxml.jackson.databind.node.ArrayNode
import com.fasterxml.jackson.databind.node.NullNode
import com.fasterxml.jackson.databind.node.ObjectNode
-import com.fasterxml.jackson.databind.SerializationFeature
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
@@ -56,6 +56,18 @@ class JacksonUtils { return jacksonObjectMapper().treeToValue(node, valueType)
}
+ fun removeJsonNullNode(node: JsonNode) {
+ val it = node.iterator()
+ while (it.hasNext()) {
+ val child = it.next()
+ if (child.isNull) {
+ it.remove()
+ } else {
+ removeJsonNullNode(child)
+ }
+ }
+ }
+
fun getContent(fileName: String): String = runBlocking {
async {
try {
|