From 92b18f188105d5ba4b2c469cdfaedc7d2953d593 Mon Sep 17 00:00:00 2001 From: "andre.schmid" Date: Wed, 10 Aug 2022 14:50:08 +0100 Subject: Support TOSCA functions in Node Filters MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../elements/CINodeFilterDataDefinition.java | 6 +- .../PropertyFilterConstraintDataDefinition.java | 41 +++++ ...erConstraintDataDefinitionJsonDeserializer.java | 107 +++++++++++ .../elements/PropertyFilterDataDefinition.java | 47 +++++ ...uirementNodeFilterCapabilityDataDefinition.java | 6 +- ...equirementNodeFilterPropertyDataDefinition.java | 41 ----- ...SubstitutionFilterCapabilityDataDefinition.java | 6 +- ...ntSubstitutionFilterPropertyDataDefinition.java | 43 ----- .../elements/SubstitutionFilterDataDefinition.java | 6 +- .../SubstitutionFilterPropertyDataDefinition.java | 44 +++++ .../sdc/be/datatypes/elements/ToscaFunction.java | 18 ++ .../elements/ToscaFunctionJsonDeserializer.java | 5 +- .../be/datatypes/elements/ToscaFunctionType.java | 4 + .../elements/ToscaGetFunctionDataDefinition.java | 4 + .../sdc/be/datatypes/enums/ConstraintType.java | 71 ++++++++ .../sdc/be/datatypes/enums/FilterValueType.java | 53 ++++++ .../datatypes/enums/PropertyFilterTargetType.java | 26 +++ ...opertyFilterConstraintDataDefinitionHelper.java | 198 +++++++++++++++++++++ 18 files changed, 629 insertions(+), 97 deletions(-) create mode 100644 common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/PropertyFilterConstraintDataDefinition.java create mode 100644 common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/PropertyFilterConstraintDataDefinitionJsonDeserializer.java create mode 100644 common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/PropertyFilterDataDefinition.java delete mode 100644 common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/RequirementNodeFilterPropertyDataDefinition.java delete mode 100644 common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/RequirementSubstitutionFilterPropertyDataDefinition.java create mode 100644 common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/SubstitutionFilterPropertyDataDefinition.java create mode 100644 common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/ConstraintType.java create mode 100644 common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/FilterValueType.java create mode 100644 common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/PropertyFilterTargetType.java create mode 100644 common-be/src/main/java/org/openecomp/sdc/be/utils/PropertyFilterConstraintDataDefinitionHelper.java (limited to 'common-be/src/main/java') 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 getProperties() { - return (ListDataDefinition) getToscaPresentationValue( + public ListDataDefinition getProperties() { + return (ListDataDefinition) getToscaPresentationValue( JsonPresentationFields.PROPERTIES); } - public void setProperties(ListDataDefinition properties) { + public void setProperties(ListDataDefinition 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 { + + 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/PropertyFilterDataDefinition.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/PropertyFilterDataDefinition.java new file mode 100644 index 0000000000..decdc6ea45 --- /dev/null +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/PropertyFilterDataDefinition.java @@ -0,0 +1,47 @@ +/* + * Copyright © 2016-2018 European Support Limited + * + * 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.openecomp.sdc.be.datatypes.elements; + +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 PropertyFilterDataDefinition extends ToscaDataDefinition implements Serializable { + + public List getConstraints() { + final List constraintList = + (List) getToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_CONSTRAINT); + if (CollectionUtils.isEmpty(constraintList)) { + return List.of(); + } + return constraintList; + } + + public void setConstraints(final List constraints) { + setToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_CONSTRAINT, constraints); + } + + public String getName() { + return (String) getToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_NAME); + } + + 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 getProperties() { - return (ListDataDefinition) getToscaPresentationValue( + public ListDataDefinition getProperties() { + return (ListDataDefinition) getToscaPresentationValue( JsonPresentationFields.PROPERTIES); } - public void setProperties(ListDataDefinition properties) { + public void setProperties(ListDataDefinition properties) { setToscaPresentationValue(JsonPresentationFields.PROPERTIES, properties); } } 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/RequirementNodeFilterPropertyDataDefinition.java deleted file mode 100644 index fff5dce9da..0000000000 --- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/RequirementNodeFilterPropertyDataDefinition.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright © 2016-2018 European Support Limited - * - * 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.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; - -public class RequirementNodeFilterPropertyDataDefinition extends ToscaDataDefinition implements Serializable { - - public List getConstraints() { - return (List) getToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_CONSTRAINT); - } - - public void setConstraints(List constraints) { - setToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_CONSTRAINT, constraints); - } - - public String getName() { - return (String) getToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_NAME); - } - - 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/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 getProperties() { - return (ListDataDefinition) getToscaPresentationValue( + public ListDataDefinition getProperties() { + return (ListDataDefinition) getToscaPresentationValue( JsonPresentationFields.PROPERTIES); } - public void setProperties(final ListDataDefinition properties) { + public void setProperties(final ListDataDefinition 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/RequirementSubstitutionFilterPropertyDataDefinition.java deleted file mode 100644 index b1b53bb4ae..0000000000 --- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/RequirementSubstitutionFilterPropertyDataDefinition.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * Copyright (C) 2020 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 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 List getConstraints() { - return (List) getToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_CONSTRAINT); - } - - public void setConstraints(final List constraints) { - setToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_CONSTRAINT, constraints); - } - - public String getName() { - return (String) getToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_NAME); - } - - public void setName(final String name) { - setToscaPresentationValue(JsonPresentationFields.PROPERTY_FILTER_NAME, name); - } -} 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 getProperties() { - return (ListDataDefinition) getToscaPresentationValue( + public ListDataDefinition getProperties() { + return (ListDataDefinition) getToscaPresentationValue( JsonPresentationFields.PROPERTIES); } - public void setProperties(final ListDataDefinition properties) { + public void setProperties(final ListDataDefinition properties) { setToscaPresentationValue(JsonPresentationFields.PROPERTIES, properties); } diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/SubstitutionFilterPropertyDataDefinition.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/SubstitutionFilterPropertyDataDefinition.java new file mode 100644 index 0000000000..977c374712 --- /dev/null +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/SubstitutionFilterPropertyDataDefinition.java @@ -0,0 +1,44 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2020 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 java.io.Serializable; +import java.util.List; +import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition; + +public class SubstitutionFilterPropertyDataDefinition extends ToscaDataDefinition implements Serializable { + + private final PropertyFilterDataDefinition propertyFilterDataDefinition = new PropertyFilterDataDefinition(); + + public List getConstraints() { + return propertyFilterDataDefinition.getConstraints(); + } + + public void setConstraints(final List constraints) { + propertyFilterDataDefinition.setConstraints(constraints); + } + + public String getName() { + return propertyFilterDataDefinition.getName(); + } + + public void setName(final String 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 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 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 comparableConstraints = Set.of(ConstraintType.GREATER_THAN, ConstraintType.LESS_THAN); + private final String type; + private final List 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 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 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 constraintYaml = new Yaml().load(constraint); + final String propertyName = constraintYaml.keySet().iterator().next(); + propertyFilterConstraint.setPropertyName(propertyName); + final Map operatorYaml = (Map) 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 = 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 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 convertFromToscaFunctionType(final ToscaFunctionType toscaFunctionType) { + return FilterValueType.findByName(toscaFunctionType.getName()); + } + + private static Optional readLegacyConcatConstraintValue(Map filterValueAsMap, Object toscaFunctionType) { + final List concatValue; + try { + concatValue = (List) 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 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 getFunctionValue; + try { + getFunctionValue = (List) filterValueAsMap.get(toscaFunctionType); + } catch (final Exception ignored) { + return Optional.of(toscaGetFunction); + } + if (!getFunctionValue.isEmpty()) { + final Optional 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 propertyPathFromSource = getFunctionValue.subList(1, getFunctionValue.size()); + toscaGetFunction.setPropertyPathFromSource(propertyPathFromSource); + toscaGetFunction.setPropertyName(propertyPathFromSource.get(propertyPathFromSource.size() - 1)); + } + return Optional.of(toscaGetFunction); + } + + private static Optional readLegacyGetInputConstraintValue(Map filterValueAsMap, Object toscaFunctionType) { + final var toscaGetFunction = new ToscaGetFunctionDataDefinition(); + toscaGetFunction.setFunctionType(ToscaGetFunctionType.GET_INPUT); + final List getFunctionValue; + final Object valueAsObject = filterValueAsMap.get(toscaFunctionType); + if (valueAsObject instanceof String) { + getFunctionValue = List.of((String) valueAsObject); + } else if (valueAsObject instanceof List) { + try { + getFunctionValue = (List) 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; + } + +} -- cgit 1.2.3-korg