diff options
author | andre.schmid <andre.schmid@est.tech> | 2022-08-10 14:50:08 +0100 |
---|---|---|
committer | Vasyl Razinkov <vasyl.razinkov@est.tech> | 2022-09-08 18:24:44 +0000 |
commit | 92b18f188105d5ba4b2c469cdfaedc7d2953d593 (patch) | |
tree | df7c7562faa99a76b0e6b5bc079de8d514b35006 /common-be/src/main/java/org | |
parent | c0c2637f201f488a74cb1916f05eece0cc207e9d (diff) |
Support TOSCA functions in Node Filters
Adds support to use tosca functions as value in the node property
filters and substitution filters
Change-Id: Id242691cc9ddd233245b58f052b9f0e2c7bbd66b
Issue-ID: SDC-4128
Signed-off-by: André Schmid <andre.schmid@est.tech>
Diffstat (limited to 'common-be/src/main/java/org')
16 files changed, 560 insertions, 28 deletions
diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/CINodeFilterDataDefinition.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/CINodeFilterDataDefinition.java index 22055e0620..bef9e52b8a 100644 --- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/CINodeFilterDataDefinition.java +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/CINodeFilterDataDefinition.java @@ -44,12 +44,12 @@ public class CINodeFilterDataDefinition extends ToscaDataDefinition implements S return getToscaPresentationValue(JsonPresentationFields.TOSCA_ID); } - public ListDataDefinition<RequirementNodeFilterPropertyDataDefinition> getProperties() { - return (ListDataDefinition<RequirementNodeFilterPropertyDataDefinition>) getToscaPresentationValue( + public ListDataDefinition<PropertyFilterDataDefinition> getProperties() { + return (ListDataDefinition<PropertyFilterDataDefinition>) getToscaPresentationValue( JsonPresentationFields.PROPERTIES); } - public void setProperties(ListDataDefinition<RequirementNodeFilterPropertyDataDefinition> properties) { + public void setProperties(ListDataDefinition<PropertyFilterDataDefinition> properties) { setToscaPresentationValue(JsonPresentationFields.PROPERTIES, properties); } diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/PropertyFilterConstraintDataDefinition.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/PropertyFilterConstraintDataDefinition.java new file mode 100644 index 0000000000..9284b530eb --- /dev/null +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/PropertyFilterConstraintDataDefinition.java @@ -0,0 +1,41 @@ +/* + * - + * ============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.databind.annotation.JsonDeserialize; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.openecomp.sdc.be.datatypes.enums.ConstraintType; +import org.openecomp.sdc.be.datatypes.enums.FilterValueType; +import org.openecomp.sdc.be.datatypes.enums.PropertyFilterTargetType; + +@Data +@NoArgsConstructor +@JsonDeserialize(using = PropertyFilterConstraintDataDefinitionJsonDeserializer.class) +public class PropertyFilterConstraintDataDefinition { + private String propertyName; + private String capabilityName; + private PropertyFilterTargetType targetType; + private ConstraintType operator; + private FilterValueType valueType; + private Object value; +} diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/PropertyFilterConstraintDataDefinitionJsonDeserializer.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/PropertyFilterConstraintDataDefinitionJsonDeserializer.java new file mode 100644 index 0000000000..a767133a4c --- /dev/null +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/PropertyFilterConstraintDataDefinitionJsonDeserializer.java @@ -0,0 +1,107 @@ +/* + * - + * ============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.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import org.openecomp.sdc.be.datatypes.enums.ConstraintType; +import org.openecomp.sdc.be.datatypes.enums.FilterValueType; +import org.openecomp.sdc.be.datatypes.enums.PropertyFilterTargetType; +import org.openecomp.sdc.be.utils.PropertyFilterConstraintDataDefinitionHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class PropertyFilterConstraintDataDefinitionJsonDeserializer extends StdDeserializer<PropertyFilterConstraintDataDefinition> { + + private static final Logger LOGGER = LoggerFactory.getLogger(PropertyFilterConstraintDataDefinitionJsonDeserializer.class); + private static final String COULD_NOT_PARSE_CLASS = "Could not parse {} value as {}"; + + public PropertyFilterConstraintDataDefinitionJsonDeserializer() { + this(null); + } + + public PropertyFilterConstraintDataDefinitionJsonDeserializer(Class<?> vc) { + super(vc); + } + + @Override + public PropertyFilterConstraintDataDefinition deserialize(final JsonParser jsonParser, final DeserializationContext context) throws IOException { + final JsonNode node = jsonParser.getCodec().readTree(jsonParser); + + if (node.isTextual()) { + return PropertyFilterConstraintDataDefinitionHelper.convertLegacyConstraint(node.asText()); + } + + final var propertyFilterConstraint = new PropertyFilterConstraintDataDefinition(); + if (node.get("propertyName") != null) { + propertyFilterConstraint.setPropertyName(node.get("propertyName").asText()); + } + if (node.get("capabilityName") != null) { + propertyFilterConstraint.setCapabilityName(node.get("capabilityName").asText()); + } + if (node.get("targetType") != null) { + propertyFilterConstraint.setTargetType(PropertyFilterTargetType.valueOf(node.get("targetType").asText())); + } + if (node.get("operator") != null) { + propertyFilterConstraint.setOperator(ConstraintType.valueOf(node.get("operator").asText())); + } + if (node.get("valueType") != null) { + propertyFilterConstraint.setValueType(FilterValueType.valueOf(node.get("valueType").asText())); + } + propertyFilterConstraint.setValue(deserializeValue(node.get("value"))); + + return propertyFilterConstraint; + } + + private Object deserializeValue(final JsonNode value) { + final ObjectMapper objectMapper = new ObjectMapper(); + try { + return objectMapper.treeToValue(value, ToscaFunction.class); + } catch (final Exception e) { + LOGGER.debug(COULD_NOT_PARSE_CLASS, PropertyFilterConstraintDataDefinition.class.getName(), ToscaFunction.class.getName(), e); + } + try { + return objectMapper.treeToValue(value, Map.class); + } catch (final Exception e) { + LOGGER.debug(COULD_NOT_PARSE_CLASS, PropertyFilterConstraintDataDefinition.class.getName(), Map.class.getName(), e); + } + try { + return objectMapper.treeToValue(value, List.class); + } catch (final Exception e) { + LOGGER.debug(COULD_NOT_PARSE_CLASS, PropertyFilterConstraintDataDefinition.class.getName(), List.class.getName(), e); + } + try { + return objectMapper.treeToValue(value, String.class); + } catch (final Exception e) { + LOGGER.debug(COULD_NOT_PARSE_CLASS, PropertyFilterConstraintDataDefinition.class.getName(), String.class.getName(), e); + } + + return null; + } + +} diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/RequirementNodeFilterPropertyDataDefinition.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/PropertyFilterDataDefinition.java index fff5dce9da..decdc6ea45 100644 --- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/RequirementNodeFilterPropertyDataDefinition.java +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/PropertyFilterDataDefinition.java @@ -15,19 +15,24 @@ */ package org.openecomp.sdc.be.datatypes.elements; -import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields; -import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition; - import java.io.Serializable; import java.util.List; +import org.apache.commons.collections4.CollectionUtils; +import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields; +import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition; -public class RequirementNodeFilterPropertyDataDefinition extends ToscaDataDefinition implements Serializable { +public class PropertyFilterDataDefinition extends ToscaDataDefinition implements Serializable { - public List<String> getConstraints() { - return (List<String>) getToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_CONSTRAINT); + public List<PropertyFilterConstraintDataDefinition> getConstraints() { + final List<PropertyFilterConstraintDataDefinition> constraintList = + (List<PropertyFilterConstraintDataDefinition>) getToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_CONSTRAINT); + if (CollectionUtils.isEmpty(constraintList)) { + return List.of(); + } + return constraintList; } - public void setConstraints(List<String> constraints) { + public void setConstraints(final List<PropertyFilterConstraintDataDefinition> constraints) { setToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_CONSTRAINT, constraints); } @@ -38,4 +43,5 @@ public class RequirementNodeFilterPropertyDataDefinition extends ToscaDataDefini public void setName(String name) { setToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_NAME, name); } + } diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/RequirementNodeFilterCapabilityDataDefinition.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/RequirementNodeFilterCapabilityDataDefinition.java index 34dc43760f..637bf5f646 100644 --- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/RequirementNodeFilterCapabilityDataDefinition.java +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/RequirementNodeFilterCapabilityDataDefinition.java @@ -37,12 +37,12 @@ public class RequirementNodeFilterCapabilityDataDefinition extends ToscaDataDefi setToscaPresentationValue(JsonPresentationFields.NAME, name); } - public ListDataDefinition<RequirementNodeFilterPropertyDataDefinition> getProperties() { - return (ListDataDefinition<RequirementNodeFilterPropertyDataDefinition>) getToscaPresentationValue( + public ListDataDefinition<PropertyFilterDataDefinition> getProperties() { + return (ListDataDefinition<PropertyFilterDataDefinition>) getToscaPresentationValue( JsonPresentationFields.PROPERTIES); } - public void setProperties(ListDataDefinition<RequirementNodeFilterPropertyDataDefinition> properties) { + public void setProperties(ListDataDefinition<PropertyFilterDataDefinition> properties) { setToscaPresentationValue(JsonPresentationFields.PROPERTIES, properties); } } diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/RequirementSubstitutionFilterCapabilityDataDefinition.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/RequirementSubstitutionFilterCapabilityDataDefinition.java index 242eb490ef..d5c1525f55 100644 --- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/RequirementSubstitutionFilterCapabilityDataDefinition.java +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/RequirementSubstitutionFilterCapabilityDataDefinition.java @@ -39,12 +39,12 @@ public class RequirementSubstitutionFilterCapabilityDataDefinition extends Tosca setToscaPresentationValue(JsonPresentationFields.NAME, name); } - public ListDataDefinition<RequirementNodeFilterPropertyDataDefinition> getProperties() { - return (ListDataDefinition<RequirementNodeFilterPropertyDataDefinition>) getToscaPresentationValue( + public ListDataDefinition<PropertyFilterDataDefinition> getProperties() { + return (ListDataDefinition<PropertyFilterDataDefinition>) getToscaPresentationValue( JsonPresentationFields.PROPERTIES); } - public void setProperties(final ListDataDefinition<RequirementNodeFilterPropertyDataDefinition> properties) { + public void setProperties(final ListDataDefinition<PropertyFilterDataDefinition> properties) { setToscaPresentationValue(JsonPresentationFields.PROPERTIES, properties); } } diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/SubstitutionFilterDataDefinition.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/SubstitutionFilterDataDefinition.java index beb5aac1d0..36c125a27b 100644 --- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/SubstitutionFilterDataDefinition.java +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/SubstitutionFilterDataDefinition.java @@ -46,12 +46,12 @@ public class SubstitutionFilterDataDefinition extends ToscaDataDefinition implem return getToscaPresentationValue(JsonPresentationFields.TOSCA_ID); } - public ListDataDefinition<RequirementSubstitutionFilterPropertyDataDefinition> getProperties() { - return (ListDataDefinition<RequirementSubstitutionFilterPropertyDataDefinition>) getToscaPresentationValue( + public ListDataDefinition<SubstitutionFilterPropertyDataDefinition> getProperties() { + return (ListDataDefinition<SubstitutionFilterPropertyDataDefinition>) getToscaPresentationValue( JsonPresentationFields.PROPERTIES); } - public void setProperties(final ListDataDefinition<RequirementSubstitutionFilterPropertyDataDefinition> properties) { + public void setProperties(final ListDataDefinition<SubstitutionFilterPropertyDataDefinition> properties) { setToscaPresentationValue(JsonPresentationFields.PROPERTIES, properties); } diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/RequirementSubstitutionFilterPropertyDataDefinition.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/SubstitutionFilterPropertyDataDefinition.java index b1b53bb4ae..977c374712 100644 --- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/RequirementSubstitutionFilterPropertyDataDefinition.java +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/SubstitutionFilterPropertyDataDefinition.java @@ -20,24 +20,25 @@ package org.openecomp.sdc.be.datatypes.elements; import java.io.Serializable; import java.util.List; -import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields; import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition; -public class RequirementSubstitutionFilterPropertyDataDefinition extends ToscaDataDefinition implements Serializable { +public class SubstitutionFilterPropertyDataDefinition extends ToscaDataDefinition implements Serializable { - public List<String> getConstraints() { - return (List<String>) getToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_CONSTRAINT); + private final PropertyFilterDataDefinition propertyFilterDataDefinition = new PropertyFilterDataDefinition(); + + public List<PropertyFilterConstraintDataDefinition> getConstraints() { + return propertyFilterDataDefinition.getConstraints(); } - public void setConstraints(final List<String> constraints) { - setToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_CONSTRAINT, constraints); + public void setConstraints(final List<PropertyFilterConstraintDataDefinition> constraints) { + propertyFilterDataDefinition.setConstraints(constraints); } public String getName() { - return (String) getToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_NAME); + return propertyFilterDataDefinition.getName(); } public void setName(final String name) { - setToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_NAME, name); + propertyFilterDataDefinition.setName(name); } } diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/ToscaFunction.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/ToscaFunction.java index 40664a133c..81b4ec73a9 100644 --- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/ToscaFunction.java +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/ToscaFunction.java @@ -26,7 +26,25 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @JsonDeserialize(using = ToscaFunctionJsonDeserializer.class) public interface ToscaFunction { + /** + * Gets the function type. + * + * @return the function type. + */ ToscaFunctionType getType(); + + /** + * Builds the tosca function value as string. + * + * @return the function value as string + */ String getValue(); + /** + * Returns the value mapped as a JSON object. + * + * @return the value as JSON object. + */ + Object getJsonObjectValue(); + } 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 index 363af1cdeb..c262699cc2 100644 --- 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 @@ -146,8 +146,11 @@ public class ToscaFunctionJsonDeserializer extends StdDeserializer<ToscaFunction final var toscaConcatFunction = new ToscaConcatFunction(); final List<ToscaFunctionParameter> functionParameterList = new ArrayList<>(); final JsonNode parametersNode = concatFunctionJsonNode.get("parameters"); + if (parametersNode == null) { + return toscaConcatFunction; + } if (!parametersNode.isArray()) { - throw context.instantiationException(List.class, ""); + throw context.instantiationException(List.class, "Expecting an array for the 'parameters' entry"); } for (final JsonNode parameterNode : parametersNode) { final JsonNode typeJsonNode = parameterNode.get("type"); diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/ToscaFunctionType.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/ToscaFunctionType.java index 4579ac2410..2636c4f6d7 100644 --- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/ToscaFunctionType.java +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/ToscaFunctionType.java @@ -25,6 +25,7 @@ import java.util.Arrays; import java.util.Optional; import lombok.AllArgsConstructor; import lombok.Getter; +import org.apache.commons.lang3.StringUtils; @AllArgsConstructor @Getter @@ -40,6 +41,9 @@ public enum ToscaFunctionType { private final String name; public static Optional<ToscaFunctionType> findType(final String functionType) { + if (StringUtils.isBlank(functionType)) { + return Optional.empty(); + } return Arrays.stream(values()).filter(toscaFunctionType -> toscaFunctionType.getName().equalsIgnoreCase(functionType)).findFirst(); } } diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/ToscaGetFunctionDataDefinition.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/ToscaGetFunctionDataDefinition.java index f19217e69c..4fe3f3ae13 100644 --- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/ToscaGetFunctionDataDefinition.java +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/ToscaGetFunctionDataDefinition.java @@ -21,6 +21,7 @@ package org.openecomp.sdc.be.datatypes.elements; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.google.gson.Gson; import java.util.ArrayList; import java.util.List; @@ -47,6 +48,7 @@ public class ToscaGetFunctionDataDefinition implements ToscaFunction, ToscaFunct //necessary for JSON conversions } + @JsonIgnore public boolean isSubProperty() { return propertyPathFromSource != null && propertyPathFromSource.size() > 1; } @@ -58,6 +60,7 @@ public class ToscaGetFunctionDataDefinition implements ToscaFunction, ToscaFunct return new Gson().toJson(getJsonObjectValue()); } + @JsonIgnore @Override public Object getJsonObjectValue() { if (functionType == null) { @@ -126,6 +129,7 @@ public class ToscaGetFunctionDataDefinition implements ToscaFunction, ToscaFunct } } + @JsonIgnore @Override public String getValue() { return this.generatePropertyValue(); diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/ConstraintType.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/ConstraintType.java new file mode 100644 index 0000000000..cef310ea01 --- /dev/null +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/ConstraintType.java @@ -0,0 +1,71 @@ +/* + * - + * ============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.enums; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import lombok.Getter; + +@Getter +public enum ConstraintType { + EQUAL("equal"), + IN_RANGE("in_range", "inRange"), + GREATER_THAN("greater_than", "greaterThan"), + GREATER_OR_EQUAL("greater_or_equal", "greaterOrEqual"), + LESS_OR_EQUAL("less_or_equal", "lessOrEqual"), + LENGTH("length"), + MIN_LENGTH("min_length", "minLength"), + MAX_LENGTH("max_length", "maxLength"), + VALID_VALUES("valid_values", "validValues"), + LESS_THAN("less_than", "lessThan"), + SCHEMA("schema"); + + private static final Set<ConstraintType> comparableConstraints = Set.of(ConstraintType.GREATER_THAN, ConstraintType.LESS_THAN); + private final String type; + private final List<String> typeAlias; + + + ConstraintType(final String type, final String... typeAliases) { + this.type = type; + if (typeAliases == null) { + this.typeAlias = Collections.emptyList(); + } else { + this.typeAlias = Arrays.asList(typeAliases); + } + } + + public static Optional<ConstraintType> findByType(final String type) { + if (type == null) { + return Optional.empty(); + } + return Arrays.stream(ConstraintType.values()) + .filter(constraintType -> constraintType.getType().equals(type) || constraintType.getTypeAlias().contains(type)) + .findFirst(); + } + + public boolean isComparable() { + return comparableConstraints.contains(this); + } + +} diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/FilterValueType.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/FilterValueType.java new file mode 100644 index 0000000000..cacc4b1bac --- /dev/null +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/FilterValueType.java @@ -0,0 +1,53 @@ +/* + * - + * ============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.enums; + +import java.util.Arrays; +import java.util.Optional; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.apache.commons.lang3.StringUtils; + +@AllArgsConstructor +@Getter +public enum FilterValueType { + STATIC("static", "static"), + GET_PROPERTY("get_property", "property"), + GET_INPUT("get_input", "service_input"), + GET_ATTRIBUTE("get_attribute", null), + YAML("yaml", null), + CONCAT("concat", null); + + private final String name; + private final String legacyName; + + public static Optional<FilterValueType> findByName(final String name) { + if (StringUtils.isEmpty(name)) { + return Optional.empty(); + } + return Arrays.stream(FilterValueType.values()).filter(filterValueType -> + filterValueType.getName().equalsIgnoreCase(name) || + (filterValueType.getLegacyName() != null && filterValueType.getLegacyName().equalsIgnoreCase(name)) + ).findFirst(); + } + +} diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/PropertyFilterTargetType.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/PropertyFilterTargetType.java new file mode 100644 index 0000000000..df472508fe --- /dev/null +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/PropertyFilterTargetType.java @@ -0,0 +1,26 @@ +/* + * - + * ============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.enums; + +public enum PropertyFilterTargetType { + CAPABILITY, PROPERTY +} diff --git a/common-be/src/main/java/org/openecomp/sdc/be/utils/PropertyFilterConstraintDataDefinitionHelper.java b/common-be/src/main/java/org/openecomp/sdc/be/utils/PropertyFilterConstraintDataDefinitionHelper.java new file mode 100644 index 0000000000..63c6781b94 --- /dev/null +++ b/common-be/src/main/java/org/openecomp/sdc/be/utils/PropertyFilterConstraintDataDefinitionHelper.java @@ -0,0 +1,198 @@ +/* + * - + * ============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.utils; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.openecomp.sdc.be.datatypes.elements.PropertyFilterConstraintDataDefinition; +import org.openecomp.sdc.be.datatypes.elements.ToscaConcatFunction; +import org.openecomp.sdc.be.datatypes.elements.ToscaFunction; +import org.openecomp.sdc.be.datatypes.elements.ToscaFunctionParameter; +import org.openecomp.sdc.be.datatypes.elements.ToscaFunctionType; +import org.openecomp.sdc.be.datatypes.elements.ToscaGetFunctionDataDefinition; +import org.openecomp.sdc.be.datatypes.elements.ToscaStringParameter; +import org.openecomp.sdc.be.datatypes.enums.ConstraintType; +import org.openecomp.sdc.be.datatypes.enums.FilterValueType; +import org.openecomp.sdc.be.datatypes.enums.PropertyFilterTargetType; +import org.openecomp.sdc.be.datatypes.enums.PropertySource; +import org.openecomp.sdc.be.datatypes.tosca.ToscaGetFunctionType; +import org.openecomp.sdc.exception.InvalidArgumentException; +import org.yaml.snakeyaml.Yaml; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class PropertyFilterConstraintDataDefinitionHelper { + + public static PropertyFilterConstraintDataDefinition convertLegacyConstraint(final String constraint) { + final var propertyFilterConstraint = new PropertyFilterConstraintDataDefinition(); + final Map<String, Object> constraintYaml = new Yaml().load(constraint); + final String propertyName = constraintYaml.keySet().iterator().next(); + propertyFilterConstraint.setPropertyName(propertyName); + final Map<String, Object> operatorYaml = (Map<String, Object>) constraintYaml.get(propertyName); + final String operator = operatorYaml.keySet().iterator().next(); + propertyFilterConstraint.setOperator(ConstraintType.findByType(operator).orElse(null)); + final Object valueYaml = operatorYaml.get(operator); + final Optional<ToscaFunction> toscaFunction = createToscaFunctionFromLegacyConstraintValue(valueYaml); + if (toscaFunction.isPresent()) { + propertyFilterConstraint.setValue(toscaFunction.get()); + } else { + propertyFilterConstraint.setValue(valueYaml); + } + propertyFilterConstraint.setValueType(detectValueType(valueYaml)); + propertyFilterConstraint.setTargetType(PropertyFilterTargetType.PROPERTY); + return propertyFilterConstraint; + } + + public static Optional<ToscaFunction> createToscaFunctionFromLegacyConstraintValue(final Object filterValue) { + if (!(filterValue instanceof Map)) { + return Optional.empty(); + } + final Map<?, ?> filterValueAsMap = (Map<?, ?>) filterValue; + final Set<?> keys = filterValueAsMap.keySet(); + if (keys.size() != 1) { + return Optional.empty(); + } + final Object toscaFunctionTypeObject = keys.iterator().next(); + if (!(toscaFunctionTypeObject instanceof String)) { + return Optional.empty(); + } + final ToscaFunctionType toscaFunctionType = ToscaFunctionType.findType((String) toscaFunctionTypeObject).orElse(null); + if (toscaFunctionType == null) { + return Optional.empty(); + } + switch (toscaFunctionType) { + case GET_INPUT: + return readLegacyGetInputConstraintValue(filterValueAsMap, toscaFunctionTypeObject); + case GET_ATTRIBUTE: + case GET_PROPERTY: + return readLegacyGetPropertyConstraintValue(filterValueAsMap, toscaFunctionTypeObject, toscaFunctionType); + case CONCAT: + return readLegacyConcatConstraintValue(filterValueAsMap, toscaFunctionTypeObject); + default: + return Optional.empty(); + } + } + + public static Optional<FilterValueType> convertFromToscaFunctionType(final ToscaFunctionType toscaFunctionType) { + return FilterValueType.findByName(toscaFunctionType.getName()); + } + + private static Optional<ToscaFunction> readLegacyConcatConstraintValue(Map<?, ?> filterValueAsMap, Object toscaFunctionType) { + final List<Object> concatValue; + try { + concatValue = (List<Object>) filterValueAsMap.get(toscaFunctionType); + } catch (final Exception ignored) { + return Optional.empty(); + } + if (concatValue.isEmpty()) { + return Optional.empty(); + } + final var toscaConcatFunction = new ToscaConcatFunction(); + for (Object parameter : concatValue) { + if (parameter instanceof String) { + final ToscaStringParameter toscaStringParameter = new ToscaStringParameter(); + toscaStringParameter.setValue((String) parameter); + toscaConcatFunction.addParameter(toscaStringParameter); + } else { + createToscaFunctionFromLegacyConstraintValue(parameter) + .ifPresent(toscaFunction -> toscaConcatFunction.addParameter((ToscaFunctionParameter) toscaFunction)); + } + } + return Optional.of(toscaConcatFunction); + } + + private static Optional<ToscaFunction> readLegacyGetPropertyConstraintValue(Map<?, ?> filterValueAsMap, Object toscaFunctionType, + ToscaFunctionType toscaFunctionType1) { + final var toscaGetFunction = new ToscaGetFunctionDataDefinition(); + toscaGetFunction.setFunctionType(ToscaGetFunctionType.fromToscaFunctionType(toscaFunctionType1) + .orElseThrow(() -> new InvalidArgumentException("Could not convert a ToscaFunctionType to a ToscaGetFunctionType")) + ); + final List<String> getFunctionValue; + try { + getFunctionValue = (List<String>) filterValueAsMap.get(toscaFunctionType); + } catch (final Exception ignored) { + return Optional.of(toscaGetFunction); + } + if (!getFunctionValue.isEmpty()) { + final Optional<PropertySource> propertySource = PropertySource.findType(getFunctionValue.get(0)); + if (propertySource.isPresent()) { + toscaGetFunction.setPropertySource(propertySource.get()); + } else { + toscaGetFunction.setPropertySource(PropertySource.INSTANCE); + toscaGetFunction.setSourceName(getFunctionValue.get(0)); + } + final List<String> propertyPathFromSource = getFunctionValue.subList(1, getFunctionValue.size()); + toscaGetFunction.setPropertyPathFromSource(propertyPathFromSource); + toscaGetFunction.setPropertyName(propertyPathFromSource.get(propertyPathFromSource.size() - 1)); + } + return Optional.of(toscaGetFunction); + } + + private static Optional<ToscaFunction> readLegacyGetInputConstraintValue(Map<?, ?> filterValueAsMap, Object toscaFunctionType) { + final var toscaGetFunction = new ToscaGetFunctionDataDefinition(); + toscaGetFunction.setFunctionType(ToscaGetFunctionType.GET_INPUT); + final List<String> getFunctionValue; + final Object valueAsObject = filterValueAsMap.get(toscaFunctionType); + if (valueAsObject instanceof String) { + getFunctionValue = List.of((String) valueAsObject); + } else if (valueAsObject instanceof List) { + try { + getFunctionValue = (List<String>) filterValueAsMap.get(toscaFunctionType); + } catch (final Exception ignored) { + return Optional.empty(); + } + } else { + return Optional.empty(); + } + + toscaGetFunction.setPropertyPathFromSource(getFunctionValue); + if (!getFunctionValue.isEmpty()) { + toscaGetFunction.setPropertyName(getFunctionValue.get(getFunctionValue.size() - 1)); + } + toscaGetFunction.setPropertySource(PropertySource.SELF); + return Optional.of(toscaGetFunction); + } + + private static FilterValueType detectValueType(final Object value) { + if (value instanceof Map) { + final Map<?, ?> valueAsMap = (Map<?, ?>) value; + if (valueAsMap.containsKey(ToscaFunctionType.CONCAT.getName())) { + return FilterValueType.CONCAT; + } + if (valueAsMap.containsKey(ToscaFunctionType.GET_ATTRIBUTE.getName())) { + return FilterValueType.GET_ATTRIBUTE; + } + if (valueAsMap.containsKey(ToscaFunctionType.GET_PROPERTY.getName())) { + return FilterValueType.GET_PROPERTY; + } + if (valueAsMap.containsKey(ToscaFunctionType.GET_INPUT.getName())) { + return FilterValueType.GET_INPUT; + } + } + + return FilterValueType.STATIC; + } + +} |