/* * Copyright © 2019 IBM. * * 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.cds.controllerblueprints.core.dsl import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.node.ArrayNode import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants import org.onap.ccsdk.cds.controllerblueprints.core.asJsonPrimitive import org.onap.ccsdk.cds.controllerblueprints.core.asJsonType import org.onap.ccsdk.cds.controllerblueprints.core.asListOfString import org.onap.ccsdk.cds.controllerblueprints.core.data.ArtifactDefinition import org.onap.ccsdk.cds.controllerblueprints.core.data.ArtifactType import org.onap.ccsdk.cds.controllerblueprints.core.data.AttributeDefinition import org.onap.ccsdk.cds.controllerblueprints.core.data.CapabilityDefinition import org.onap.ccsdk.cds.controllerblueprints.core.data.ConstraintClause import org.onap.ccsdk.cds.controllerblueprints.core.data.DataType import org.onap.ccsdk.cds.controllerblueprints.core.data.EntityType import org.onap.ccsdk.cds.controllerblueprints.core.data.EntrySchema import org.onap.ccsdk.cds.controllerblueprints.core.data.InterfaceDefinition import org.onap.ccsdk.cds.controllerblueprints.core.data.NodeType import org.onap.ccsdk.cds.controllerblueprints.core.data.OperationDefinition import org.onap.ccsdk.cds.controllerblueprints.core.data.PolicyType import org.onap.ccsdk.cds.controllerblueprints.core.data.PropertyDefinition import org.onap.ccsdk.cds.controllerblueprints.core.data.RelationshipType import org.onap.ccsdk.cds.controllerblueprints.core.data.RequirementDefinition import org.onap.ccsdk.cds.controllerblueprints.core.jsonAsJsonType open class EntityTypeBuilder( private val id: String, private val version: String, private val derivedFrom: String, private val description: String? = "" ) { var metadata: MutableMap? = null var properties: MutableMap? = null var attributes: MutableMap? = null fun metadata(key: String, value: String) { if (metadata == null) metadata = hashMapOf() metadata!![key] = value } fun attribute(id: String, type: String, required: Boolean, description: String? = "") { if (attributes == null) attributes = hashMapOf() val attribute = AttributeDefinitionBuilder(id, type, required, description).build() attributes!![id] = attribute } fun attribute( id: String, type: String, required: Boolean, description: String? = "", block: AttributeDefinitionBuilder.() -> Unit ) { if (attributes == null) attributes = hashMapOf() val attribute = AttributeDefinitionBuilder(id, type, required, description).apply(block).build() attributes!![id] = attribute } fun property(id: String, type: String, required: Boolean, description: String? = "") { if (properties == null) properties = hashMapOf() val property = PropertyDefinitionBuilder(id, type, required, description).build() properties!![id] = property } fun property( id: String, type: String, required: Boolean, description: String? = "", block: PropertyDefinitionBuilder.() -> Unit ) { if (properties == null) properties = hashMapOf() val property = PropertyDefinitionBuilder(id, type, required, description).apply(block).build() properties!![id] = property } fun buildEntityType(entity: EntityType) { entity.id = id entity.description = description entity.version = version entity.derivedFrom = derivedFrom entity.metadata = metadata entity.properties = properties entity.attributes = attributes } } class NodeTypeBuilder( id: String, version: String, derivedFrom: String, description: String? ) : EntityTypeBuilder(id, version, derivedFrom, description) { private var nodeType = NodeType() private var capabilities: MutableMap? = null private var requirements: MutableMap? = null private var interfaces: MutableMap? = null private var artifacts: MutableMap? = null fun capability(id: String, type: String, description: String, block: CapabilityDefinitionBuilder.() -> Unit) { if (capabilities == null) capabilities = hashMapOf() capabilities!![id] = CapabilityDefinitionBuilder(id, type, description).apply(block).build() } fun requirement(id: String, capability: String, node: String, relationship: String, description: String) { if (requirements == null) requirements = hashMapOf() requirements!![id] = RequirementDefinitionBuilder(id, capability, node, relationship, description).build() } fun requirement( id: String, capability: String, node: String, relationship: String, description: String, block: RequirementDefinitionBuilder.() -> Unit ) { if (requirements == null) requirements = hashMapOf() requirements!![id] = RequirementDefinitionBuilder(id, capability, node, relationship, description) .apply(block).build() } fun artifact(id: String, type: String, file: String) { if (artifacts == null) artifacts = hashMapOf() artifacts!![id] = ArtifactDefinitionBuilder(id, type, file).build() } private fun nodeInterface(id: String, block: InterfaceDefinitionBuilder.() -> Unit) { if (interfaces == null) interfaces = hashMapOf() interfaces!![id] = InterfaceDefinitionBuilder(id).apply(block).build() } fun operation(interfaceName: String, description: String?, block: OperationDefinitionBuilder.() -> Unit) { if (interfaces == null) interfaces = hashMapOf() val interfaceDefinition = InterfaceDefinition() val defaultOperationName = "process" interfaceDefinition.operations = hashMapOf() interfaceDefinition.operations!![defaultOperationName] = OperationDefinitionBuilder(defaultOperationName, description).apply(block).build() interfaces!![interfaceName] = interfaceDefinition } fun build(): NodeType { buildEntityType(nodeType) nodeType.capabilities = capabilities nodeType.requirements = requirements nodeType.interfaces = interfaces nodeType.artifacts = artifacts return nodeType } } class ArtifactTypeBuilder( id: String, version: String, derivedFrom: String, description: String? ) : EntityTypeBuilder(id, version, derivedFrom, description) { private var artifactType = ArtifactType() private var fileExt: MutableList? = null fun fileExt(vararg fileExts: String) { if (fileExt == null) fileExt = arrayListOf() fileExts.forEach { fileExt!!.add(it) } } fun build(): ArtifactType { buildEntityType(artifactType) artifactType.fileExt = fileExt return artifactType } } class PolicyTypeBuilder( id: String, version: String, derivedFrom: String, description: String? ) : EntityTypeBuilder(id, version, derivedFrom, description) { private var policyType = PolicyType() fun targets(targetsStr: String) { val arrayNode = targetsStr.jsonAsJsonType() as ArrayNode targets(arrayNode.asListOfString()) } fun targets(target: List) { policyType.targets = target.toMutableList() } fun build(): PolicyType { buildEntityType(policyType) return policyType } } class RelationshipTypeBuilder( private val id: String, private val version: String, derivedFrom: String, private val description: String? ) : EntityTypeBuilder(id, version, derivedFrom, description) { private var relationshipType = RelationshipType() fun validTargetTypes(validTargetTypesStr: String) { val arrayNode = validTargetTypesStr.jsonAsJsonType() as ArrayNode validTargetTypes(arrayNode.asListOfString()) } fun validTargetTypes(validTargetTypes: List) { relationshipType.validTargetTypes = validTargetTypes.toMutableList() } fun build(): RelationshipType { buildEntityType(relationshipType) relationshipType.id = id relationshipType.version = version relationshipType.description = description return relationshipType } } class DataTypeBuilder( id: String, version: String, derivedFrom: String, description: String? ) : EntityTypeBuilder(id, version, derivedFrom, description) { private var dataType = DataType() fun constrain(block: ConstraintClauseBuilder.() -> Unit) { if (dataType.constraints == null) { dataType.constraints = mutableListOf() } val constraintClause = ConstraintClauseBuilder().apply(block).build() dataType.constraints!!.add(constraintClause) } fun build(): DataType { buildEntityType(dataType) return dataType } } class CapabilityDefinitionBuilder(private val id: String, private val type: String, private val description: String? = "") { private var capabilityDefinition = CapabilityDefinition() private val properties: MutableMap = hashMapOf() fun property(id: String, type: String? = BluePrintConstants.DATA_TYPE_STRING, required: Boolean? = false, description: String? = "") { val property = PropertyDefinitionBuilder(id, type, required, description).build() properties[id] = property } fun build(): CapabilityDefinition { capabilityDefinition.id = id capabilityDefinition.description = description capabilityDefinition.type = type capabilityDefinition.properties = properties return capabilityDefinition } } class RequirementDefinitionBuilder( private val id: String, private val capability: String, private val node: String, private val relationship: String, private val description: String? = "" ) { private var requirementDefinition = RequirementDefinition() fun build(): RequirementDefinition { requirementDefinition.id = id requirementDefinition.description = description requirementDefinition.capability = capability requirementDefinition.node = node requirementDefinition.relationship = relationship return requirementDefinition } } class InterfaceDefinitionBuilder(private val id: String) { private var interfaceDefinition: InterfaceDefinition = InterfaceDefinition() private var operations: MutableMap? = null fun operation(id: String, description: String? = "", block: OperationDefinitionBuilder.() -> Unit) { if (operations == null) operations = hashMapOf() operations!![id] = OperationDefinitionBuilder(id, description).apply(block).build() } fun build(): InterfaceDefinition { interfaceDefinition.id = id interfaceDefinition.operations = operations return interfaceDefinition } } class OperationDefinitionBuilder( private val id: String, private val description: String? = "" ) { private var operationDefinition: OperationDefinition = OperationDefinition() fun inputs(block: PropertiesDefinitionBuilder.() -> Unit) { operationDefinition.inputs = PropertiesDefinitionBuilder().apply(block).build() } fun outputs(block: PropertiesDefinitionBuilder.() -> Unit) { operationDefinition.outputs = PropertiesDefinitionBuilder().apply(block).build() } fun build(): OperationDefinition { operationDefinition.id = id operationDefinition.description = description return operationDefinition } } class AttributeDefinitionBuilder( private val id: String, private val type: String? = BluePrintConstants.DATA_TYPE_STRING, private val required: Boolean? = false, private val description: String? = "" ) { private var attributeDefinition: AttributeDefinition = AttributeDefinition() fun entrySchema(entrySchemaType: String) { attributeDefinition.entrySchema = EntrySchemaBuilder(entrySchemaType).build() } fun entrySchema(entrySchemaType: String, block: EntrySchemaBuilder.() -> Unit) { attributeDefinition.entrySchema = EntrySchemaBuilder(entrySchemaType).apply(block).build() } fun constrain(block: ConstraintClauseBuilder.() -> Unit) { if (attributeDefinition.constraints == null) { attributeDefinition.constraints = mutableListOf() } val constraintClause = ConstraintClauseBuilder().apply(block).build() attributeDefinition.constraints!!.add(constraintClause) } fun defaultValue(defaultValue: Any) { defaultValue(defaultValue.asJsonType()) } fun defaultValue(defaultValue: JsonNode) { attributeDefinition.defaultValue = defaultValue } fun build(): AttributeDefinition { attributeDefinition.id = id attributeDefinition.type = type!! attributeDefinition.required = required attributeDefinition.description = description return attributeDefinition } } class PropertiesDefinitionBuilder { private val properties: MutableMap = hashMapOf() fun property(id: String, property: PropertyDefinition) { properties[id] = property } fun property(id: String, type: String?, required: Boolean?, description: String? = "") { val property = PropertyDefinitionBuilder(id, type, required, description).build() properties[id] = property } fun property( id: String, type: String?, required: Boolean?, description: String? = "", block: PropertyDefinitionBuilder.() -> Unit ) { val property = PropertyDefinitionBuilder(id, type, required, description).apply(block).build() properties[id] = property } fun build(): MutableMap { return properties } } class PropertyDefinitionBuilder( private val id: String, private val type: String? = BluePrintConstants.DATA_TYPE_STRING, private val required: Boolean? = false, private val description: String? = "" ) { private var propertyDefinition: PropertyDefinition = PropertyDefinition() fun entrySchema(entrySchemaType: String) { propertyDefinition.entrySchema = EntrySchemaBuilder(entrySchemaType).build() } fun entrySchema(entrySchemaType: String, block: EntrySchemaBuilder.() -> Unit) { propertyDefinition.entrySchema = EntrySchemaBuilder(entrySchemaType).apply(block).build() } fun constrain(block: ConstraintClauseBuilder.() -> Unit) { if (propertyDefinition.constraints == null) { propertyDefinition.constraints = mutableListOf() } val constraintClause = ConstraintClauseBuilder().apply(block).build() propertyDefinition.constraints!!.add(constraintClause) } fun defaultValue(defaultValue: Any) { defaultValue(defaultValue.asJsonType()) } fun defaultValue(defaultValue: JsonNode) { propertyDefinition.defaultValue = defaultValue } fun metadata(name: String, value: String) { if (propertyDefinition.metadata == null) { propertyDefinition.metadata = hashMapOf() } propertyDefinition.metadata!![name] = value } fun value(value: Any) { value(value.asJsonType()) } fun value(value: JsonNode) { propertyDefinition.value = value } fun build(): PropertyDefinition { propertyDefinition.id = id propertyDefinition.type = type!! propertyDefinition.required = required propertyDefinition.description = description return propertyDefinition } } class ConstraintsClauseBuilder { val constraints: MutableList = mutableListOf() fun constrain(block: ConstraintClauseBuilder.() -> Unit) { val constraintClause = ConstraintClauseBuilder().apply(block).build() constraints.add(constraintClause) } fun build(): MutableList { return constraints } } class ConstraintClauseBuilder { private val constraintClause = ConstraintClause() fun equal(equal: Any) = equal(equal.asJsonType()) fun equal(equal: JsonNode) { constraintClause.equal = equal } fun greaterOrEqual(greaterOrEqual: Any) { constraintClause.greaterOrEqual = greaterOrEqual.asJsonPrimitive() } fun greaterThan(greaterThan: Any) { constraintClause.greaterThan = greaterThan.asJsonPrimitive() } fun lessOrEqual(lessOrEqual: Any) { constraintClause.lessOrEqual = lessOrEqual.asJsonPrimitive() } fun lessThan(lessThan: Any) { constraintClause.lessThan = lessThan.asJsonPrimitive() } fun inRange(inRangeStr: String) = inRange(inRangeStr.jsonAsJsonType() as ArrayNode) fun inRange(inRangeNode: ArrayNode) { constraintClause.inRange = inRangeNode.toMutableList() } fun validValues(validValuesStr: String) = validValues(validValuesStr.jsonAsJsonType() as ArrayNode) fun validValues(validValuesNode: ArrayNode) = validValues(validValuesNode.toMutableList()) fun validValues(validValues: List) { constraintClause.validValues = validValues.toMutableList() } fun length(length: Any) { constraintClause.length = length.asJsonPrimitive() } fun minLength(minLength: Any) { constraintClause.minLength = minLength.asJsonPrimitive() } fun maxLength(maxLength: Any) { constraintClause.maxLength = maxLength.asJsonPrimitive() } fun pattern(pattern: String) { constraintClause.pattern = pattern } fun schema(schema: String) { constraintClause.schema = schema } fun build(): ConstraintClause { return constraintClause } } class EntrySchemaBuilder(private val type: String) { private var entrySchema: EntrySchema = EntrySchema() fun constrain(block: ConstraintClauseBuilder.() -> Unit) { if (entrySchema.constraints == null) { entrySchema.constraints = mutableListOf() } val constraintClause = ConstraintClauseBuilder().apply(block).build() entrySchema.constraints!!.add(constraintClause) } fun build(): EntrySchema { entrySchema.type = type return entrySchema } }