diff options
Diffstat (limited to 'common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/ToscaFunctionJsonDeserializer.java')
-rw-r--r-- | common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/ToscaFunctionJsonDeserializer.java | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/ToscaFunctionJsonDeserializer.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/ToscaFunctionJsonDeserializer.java new file mode 100644 index 0000000000..74aed12471 --- /dev/null +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/ToscaFunctionJsonDeserializer.java @@ -0,0 +1,151 @@ +/* + * - + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Nordix Foundation. + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdc.be.datatypes.elements; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import org.apache.commons.lang3.StringUtils; +import org.openecomp.sdc.be.datatypes.enums.PropertySource; +import org.openecomp.sdc.be.datatypes.tosca.ToscaGetFunctionType; +import org.yaml.snakeyaml.Yaml; + +public class ToscaFunctionJsonDeserializer extends StdDeserializer<ToscaFunction> { + + public ToscaFunctionJsonDeserializer() { + this(null); + } + + public ToscaFunctionJsonDeserializer(Class<?> vc) { + super(vc); + } + + @Override + public ToscaFunction deserialize(final JsonParser jsonParser, final DeserializationContext context) throws IOException { + final JsonNode node = jsonParser.getCodec().readTree(jsonParser); + return deserializeToscaFunction(node, context); + } + + private ToscaFunction deserializeToscaFunction(final JsonNode node, final DeserializationContext context) throws IOException { + final String functionType; + if (node.get("type") != null) { + functionType = node.get("type").asText(); + } else if (node.get("functionType") != null) { + //support for legacy tosca function + functionType = node.get("functionType").asText(); + } else { + throw context.instantiationException(ToscaFunction.class, "Attribute type not provided"); + } + final ToscaFunctionType toscaFunctionType = ToscaFunctionType.findType(functionType) + .orElseThrow(() -> context.instantiationException(ToscaFunction.class, + String.format("Invalid function type '%s' or attribute type not provided", functionType)) + ); + if (toscaFunctionType == ToscaFunctionType.GET_INPUT || toscaFunctionType == ToscaFunctionType.GET_ATTRIBUTE + || toscaFunctionType == ToscaFunctionType.GET_PROPERTY) { + return deserializeToscaGetFunction(toscaFunctionType, node, context); + } + + if (toscaFunctionType == ToscaFunctionType.CONCAT) { + return this.deserializeConcatFunction(node, context); + } + + if (toscaFunctionType == ToscaFunctionType.YAML) { + return this.deserializeYamlFunction(node); + } + + return null; + } + + private ToscaFunction deserializeYamlFunction(JsonNode node) { + var yamlFunction = new CustomYamlFunction(); + final Object value = new Yaml().load(node.get("value").asText()); + yamlFunction.setYamlValue(value); + return yamlFunction; + } + + private ToscaGetFunctionDataDefinition deserializeToscaGetFunction(final ToscaFunctionType toscaFunctionType, final JsonNode node, + final DeserializationContext context) throws JsonMappingException { + final ToscaGetFunctionDataDefinition toscaGetFunction = new ToscaGetFunctionDataDefinition(); + toscaGetFunction.setFunctionType(ToscaGetFunctionType.fromToscaFunctionType(toscaFunctionType).orElse(null)); + toscaGetFunction.setSourceName(node.get("sourceName").asText()); + toscaGetFunction.setPropertyUniqueId(node.get("propertyUniqueId").asText()); + final String propertySource = node.get("propertySource").asText(); + if (StringUtils.isNotEmpty(propertySource)) { + final PropertySource propertySource1 = PropertySource.findType(propertySource).orElseThrow(() -> + context.instantiationException(ToscaGetFunctionDataDefinition.class, + String.format("Invalid propertySource '%s'", propertySource)) + ); + toscaGetFunction.setPropertySource(propertySource1); + } + toscaGetFunction.setPropertyName(node.get("propertyName").asText()); + toscaGetFunction.setSourceName(node.get("sourceName").asText()); + toscaGetFunction.setSourceUniqueId(node.get("sourceUniqueId").asText()); + final JsonNode propertyPathFromSourceNode = node.get("propertyPathFromSource"); + if (propertyPathFromSourceNode != null) { + if (!propertyPathFromSourceNode.isArray()) { + throw context.instantiationException(ToscaGetFunctionDataDefinition.class, "Expecting an array for propertyPathFromSource attribute"); + } + final List<String> pathFromSource = new ArrayList<>(); + propertyPathFromSourceNode.forEach(jsonNode -> pathFromSource.add(jsonNode.asText())); + toscaGetFunction.setPropertyPathFromSource(pathFromSource); + } + + return toscaGetFunction; + } + + private ToscaConcatFunction deserializeConcatFunction(final JsonNode concatFunctionJsonNode, + final DeserializationContext context) throws IOException { + final var toscaConcatFunction = new ToscaConcatFunction(); + final List<ToscaFunctionParameter> functionParameterList = new ArrayList<>(); + final JsonNode parametersNode = concatFunctionJsonNode.get("parameters"); + if (!parametersNode.isArray()) { + throw context.instantiationException(List.class, ""); + } + for (final JsonNode parameterNode : parametersNode) { + final JsonNode typeJsonNode = parameterNode.get("type"); + if (typeJsonNode == null) { + throw context.instantiationException(ToscaConcatFunction.class, "TOSCA concat function parameter type attribute not provided"); + } + final String parameterType = typeJsonNode.asText(); + final ToscaFunctionType toscaFunctionType = ToscaFunctionType.findType(parameterType) + .orElseThrow(() -> context.instantiationException(ToscaConcatFunction.class, + String.format("Invalid TOSCA concat function parameter type '%s'", parameterType)) + ); + if (toscaFunctionType == ToscaFunctionType.STRING) { + final ToscaStringParameter toscaStringParameter = new ToscaStringParameter(); + toscaStringParameter.setValue(parameterNode.get("value").asText()); + functionParameterList.add(toscaStringParameter); + } else { + final ToscaFunction toscaFunction = this.deserializeToscaFunction(parameterNode, context); + functionParameterList.add((ToscaFunctionParameter) toscaFunction); + } + } + toscaConcatFunction.setParameters(functionParameterList); + return toscaConcatFunction; + } + +} |