Changing isNull condition to isNullOrEmpty to make sure Empty value doesn't get assigned to resource
Issue-ID: CCSDK-1748
Signed-off-by: Singal, Kapil (ks220y) <ks220y@att.com>
Change-Id: I0744537c7ddec80f20ffd7e6545b947439f63743
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
+
<parent>
<groupId>org.onap.ccsdk.cds.blueprintsprocessor</groupId>
<artifactId>cba-parent</artifactId>
<version>0.7.0-SNAPSHOT</version>
</parent>
+
<groupId>org.onap.ccsdk.cds.components.cba</groupId>
<artifactId>capability_cli</artifactId>
+
<name>CBA Capability CLI</name>
<description>CBA Capability CLI</description>
val skipTagsProp = getOptionalOperationInput(INPUT_SKIP_TAGS)
val askLimitOnLaunch = jtLaunchReqs.at("/ask_limit_on_launch").asBoolean()
- if (askLimitOnLaunch && limitProp.isNotNull()) {
+ if (askLimitOnLaunch && !limitProp.isNullOrMissing()) {
payload.set(INPUT_LIMIT_TO_HOST, limitProp)
}
val askTagsOnLaunch = jtLaunchReqs.at("/ask_tags_on_launch").asBoolean()
- if (askTagsOnLaunch && tagsProp.isNotNull()) {
+ if (askTagsOnLaunch && !tagsProp.isNullOrMissing()) {
payload.set(INPUT_TAGS, tagsProp)
}
- if (askTagsOnLaunch && skipTagsProp.isNotNull()) {
+ if (askTagsOnLaunch && !skipTagsProp.isNullOrMissing()) {
payload.set("skip_tags", skipTagsProp)
}
}
val askInventoryOnLaunch = jtLaunchReqs.at("/ask_inventory_on_launch").asBoolean()
- if (askInventoryOnLaunch && inventoryProp.isNotNull()) {
+ if (askInventoryOnLaunch && !inventoryProp.isNullOrMissing()) {
var inventoryKeyId = if (inventoryProp is TextNode) {
resolveInventoryIdByName(awxClient, inventoryProp.textValue())?.asJsonPrimitive()
} else {
logger.trace("Reference dictionary key (${it.key}) resulted in value ($expressionValue)")
namedParameters[it.key] = expressionValue
}
- logger.info("Parameter information : ($namedParameters)")
+ if (namedParameters.isNotEmpty()) {
+ logger.info("Parameter information : ($namedParameters)")
+ }
return namedParameters
}
val outputKeyMapping = checkNotNull(sourceProperties.outputKeyMapping) {
"failed to get output-key-mappings for $dName under $dSource properties"
}
- logger.info("Response processing type($type)")
+ logger.info("Response processing type ($type)")
val responseNode = checkNotNull(JacksonUtils.getJsonNode(rows)) {
"Failed to get database query result into Json node."
open fun setFromInput(resourceAssignment: ResourceAssignment): Boolean {
try {
val value = raRuntimeService.getInputValue(resourceAssignment.name)
- if (value.returnNullIfMissing() != null) {
+ if (!value.isNullOrMissing()) {
ResourceAssignmentUtils.setResourceDataValue(resourceAssignment, raRuntimeService, value)
return true
}
val outputKeyMapping = checkNotNull(sourceProperties.outputKeyMapping) {
"failed to get output-key-mappings for $dName under $dSource properties"
}
- logger.info("Response processing type($type)")
+ logger.info("Response processing type ($type)")
val responseNode = checkNotNull(JacksonUtils.jsonNode(restResponse).at(path)) {
"Failed to find path ($path) in response ($restResponse)"
val resourceProp = checkNotNull(resourceAssignment.property) {
"Failed to populate mandatory resource resource mapping $resourceAssignment"
}
- if (resourceProp.required != null && resourceProp.required!!
- && (resourceProp.value == null || resourceProp.value!!.returnNullIfMissing() == null)
- ) {
+ if (resourceProp.required != null && resourceProp.required!! && resourceProp.value.isNullOrMissing()) {
logger.error("failed to populate mandatory resource mapping ($resourceAssignment)")
throw BluePrintProcessorException("failed to populate mandatory resource mapping ($resourceAssignment)")
}
val type = resourceAssignment.property!!.type
val valueToPrint = getValueToLog(metadata, responseNode)
- logger.info("For template key (${resourceAssignment.name}) setting value as ($valueToPrint)")
+ logger.info("For template key (${resourceAssignment.name}) trying to get value from responseNode ($valueToPrint)")
return when (type) {
in BluePrintTypes.validPrimitiveTypes() -> {
+ // Primitive Types
parseResponseNodeForPrimitiveTypes(responseNode, outputKeyMapping)
}
in BluePrintTypes.validCollectionTypes() -> {
responseNode: JsonNode,
outputKeyMapping: MutableMap<String, String>
): JsonNode {
- if (responseNode.isComplexType()) {
- val outputKey = outputKeyMapping.keys.firstOrNull()
- var returnNode = if (responseNode is ArrayNode) {
- val arrayNode = responseNode.toList()
- if (outputKey.isNullOrEmpty()) {
- arrayNode.first()
- } else {
- arrayNode.firstOrNull { element ->
- element.isComplexType() && element.has(outputKeyMapping[outputKey])
- }
- }
- } else {
- responseNode
- }
+ // Return responseNode if is not a Complex Type
+ if (!responseNode.isComplexType()) {
+ return responseNode
+ }
- if (returnNode.isNull() || returnNode!!.isComplexType() && !returnNode.has(outputKeyMapping[outputKey])) {
- throw BluePrintProcessorException("Fail to find output key mapping ($outputKey) in the responseNode.")
- }
- return if (returnNode.isComplexType()) {
- returnNode[outputKeyMapping[outputKey]]
+ val outputKey = outputKeyMapping.keys.firstOrNull()
+ var returnNode = if (responseNode is ArrayNode) {
+ val arrayNode = responseNode.toList()
+ if (outputKey.isNullOrEmpty()) {
+ arrayNode.first()
} else {
- returnNode
+ arrayNode.firstOrNull { element ->
+ element.isComplexType() && element.has(outputKeyMapping[outputKey])
+ }
}
+ } else {
+ responseNode
}
- if (outputKeyMapping.isNotEmpty()) {
- throw BluePrintProcessorException("Fail to find key-value in response node to map output-key-mapping.")
+
+ if (returnNode.isNullOrMissing() || returnNode!!.isComplexType() && !returnNode.has(outputKeyMapping[outputKey])) {
+ throw BluePrintProcessorException("Fail to find output key mapping ($outputKey) in the responseNode.")
+ }
+ return if (returnNode.isComplexType()) {
+ returnNode[outputKeyMapping[outputKey]]
+ } else {
+ returnNode
}
- return responseNode
}
private fun parseResponseNodeForCollection(
fun getValueToLog(metadata: MutableMap<String, String>?, value: Any): Any {
return if (checkIfLogIsProtected(metadata)) {
- "*************"
+ "******REDACTED******"
} else {
value
}
fun <T> JsonNode.asType(clazzType: Class<T>): T {
return JacksonUtils.readValue(this, clazzType)
- ?: throw BluePrintException("couldn't convert JsonNode of type $clazzType")
+ ?: throw BluePrintException("couldn't convert JsonNode of type $clazzType")
}
fun JsonNode.asListOfString(): List<String> {
return this.asListOfString()
}
-fun JsonNode.returnNullIfMissing(): JsonNode? {
- return if (this is NullNode || this is MissingNode) {
+fun <T : JsonNode> T?.returnNullIfMissing(): JsonNode? {
+ return if (this == null || this is NullNode || this is MissingNode) {
null
- } else this
+ }
+ else this
}
-fun <T : JsonNode> T?.isNull(): Boolean {
+fun <T : JsonNode> T?.isNullOrMissing(): Boolean {
return this == null || this is NullNode || this is MissingNode
}
-fun <T : JsonNode> T?.isNotNull(): Boolean {
- return !(this == null || this is NullNode || this is MissingNode)
-}
-
/**
* Convert Json to map of json node, the root fields will be map keys
*/
assertNull(missingValue)
}
+ @Test
+ fun testIsNullOrMissing() {
+ assertTrue(NullNode.instance.isNullOrMissing())
+ assertTrue(MissingNode.getInstance().isNullOrMissing())
+
+ assertFalse(TextNode("").isNullOrMissing())
+ assertFalse("".asJsonType().isNullOrMissing())
+ assertFalse("hello".asJsonType().isNullOrMissing())
+ assertFalse("{\"key\": \"value\"}".asJsonType().isNullOrMissing())
+ assertFalse(TextNode("hello").isNullOrMissing())
+ }
+
+ @Test
+ fun testIsComplexType() {
+ assertFalse(NullNode.instance.isComplexType())
+ assertFalse(MissingNode.getInstance().isComplexType())
+
+ assertFalse(TextNode("").isComplexType())
+ assertFalse("".asJsonType().isComplexType())
+ assertFalse("hello".asJsonType().isComplexType())
+ assertFalse(TextNode("hello").isComplexType())
+
+ assertTrue("{\"key\": \"value\"}".asJsonType().isComplexType())
+ assertTrue("[{\"key\": \"value\"},{\"key\": \"value\"}]".asJsonType().isComplexType())
+ }
+
@Test(expected = BluePrintException::class)
fun testRootFieldsToMap() {
1.asJsonType().rootFieldsToMap()
var updatedBy: String? = null
override fun toString(): String {
- return StringBuilder()
- .append("[")
- .append("name=", name)
- .append(", status=", status)
- .append(", property=", property?.value ?: "")
- .append(", dictionaryName=", dictionaryName)
- .append(", dictionarySource=", dictionarySource)
- .append("]")
- .toString()
+ return """
+ [
+ name = $name
+ status = $status
+ property [
+ defaultValue = ${property?.defaultValue}
+ required = ${property?.required}
+ metadata = ${property?.metadata}
+ ]
+ dictionaryName = $dictionaryName
+ dictionarySource = $dictionarySource
+ ]
+ """.trimIndent()
}
}