Fix 'Tosca Function get_input in Properties Assignment error'-bug
[sdc.git] / common-be / src / main / java / org / openecomp / sdc / be / datatypes / elements / PropertyDataDefinition.java
index e669d66..ee5cd0e 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
 
 package org.openecomp.sdc.be.datatypes.elements;
 
-import java.io.Serializable;
+import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
-
+import java.util.Set;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
 import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
+import org.openecomp.sdc.be.datatypes.tosca.ToscaGetFunctionType;
+
+@EqualsAndHashCode(callSuper = false)
+@Data
+public class PropertyDataDefinition extends ToscaDataDefinition {
+
+    private boolean definition = false;
+    private Boolean hidden = Boolean.FALSE;
+    private String uniqueId;
+    // "boolean", "string", "float", "integer", "version" })
+    private String type;
+    private Boolean required = Boolean.FALSE;
+    private String defaultValue;
+    private String description;
+    private SchemaDefinition schema;
+    private boolean password;
+    private String name;
+    private String value;
+    private String label;
+    private Boolean immutable = Boolean.FALSE;
+    private Boolean mappedToComponentProperty = Boolean.TRUE;
+    /**
+     * @deprecated use {@link #toscaFunction} instead
+     */
+    @Deprecated
+    private ToscaGetFunctionType toscaGetFunctionType;
+    /**
+     * @deprecated use {@link #toscaFunction} instead
+     */
+    @Deprecated
+    private ToscaGetFunctionDataDefinition toscaGetFunction;
+    private ToscaFunction toscaFunction;
+    private Collection<SubPropertyToscaFunction> subPropertyToscaFunctions;
+
+    private String inputPath;
+    private String status;
+    private String inputId;
+    private String instanceUniqueId;
+    private String model;
+    private String propertyId;
+    private String parentPropertyType;
+    private String subPropertyInputPath;
+    private List<Annotation> annotations;
+    private List<GetInputValueDataDefinition> getInputValues;
+    private Boolean isDeclaredListInput = Boolean.FALSE;
+    private List<GetPolicyValueDataDefinition> getPolicyValues;
+    private List<String> propertyConstraints;
+    private Map<String, String> metadata;
+    private boolean userCreated;
+
+    public PropertyDataDefinition() {
+        super();
+    }
+
+    public PropertyDataDefinition(Map<String, Object> pr) {
+        super(pr);
+    }
 
-import fj.data.Either;
+    public PropertyDataDefinition(final PropertyDataDefinition propertyDataDefinition) {
+        super();
+        this.setUniqueId(propertyDataDefinition.getUniqueId());
+        this.setRequired(propertyDataDefinition.isRequired());
+        this.setDefaultValue(propertyDataDefinition.getDefaultValue());
+        this.setDefinition(propertyDataDefinition.getDefinition());
+        this.setDescription(propertyDataDefinition.getDescription());
+        if (propertyDataDefinition.getSchema() != null) {
+            this.setSchema(new SchemaDefinition(propertyDataDefinition.getSchema()));
+        }
+        this.setPassword(propertyDataDefinition.isPassword());
+        this.setType(propertyDataDefinition.getType());
+        this.setName(propertyDataDefinition.getName());
+        this.setValue(propertyDataDefinition.getValue());
+        this.setHidden(propertyDataDefinition.isHidden());
+        this.setLabel(propertyDataDefinition.getLabel());
+        this.setImmutable(propertyDataDefinition.isImmutable());
+        this.setMappedToComponentProperty(propertyDataDefinition.isMappedToComponentProperty());
+        this.setParentUniqueId(propertyDataDefinition.getParentUniqueId());
+        this.setOwnerId(propertyDataDefinition.getOwnerId());
+        this.setGetInputValues(propertyDataDefinition.getGetInputValues());
+        this.setGetPolicyValues(propertyDataDefinition.getGetPolicyValues());
+        this.setInputPath(propertyDataDefinition.getInputPath());
+        this.setStatus(propertyDataDefinition.getStatus());
+        this.setInputId(propertyDataDefinition.getInputId());
+        this.setInstanceUniqueId(propertyDataDefinition.getInstanceUniqueId());
+        this.setModel(propertyDataDefinition.getModel());
+        this.setPropertyId(propertyDataDefinition.getPropertyId());
+        this.setToscaGetFunction(propertyDataDefinition.getToscaGetFunction());
+        this.setToscaGetFunctionType(propertyDataDefinition.getToscaGetFunctionType());
+        this.setToscaFunction(propertyDataDefinition.getToscaFunction());
+        this.parentPropertyType = propertyDataDefinition.getParentPropertyType();
+        this.subPropertyInputPath = propertyDataDefinition.getSubPropertyInputPath();
+        this.subPropertyToscaFunctions = propertyDataDefinition.getSubPropertyToscaFunctions();
+        if (isNotEmpty(propertyDataDefinition.annotations)) {
+            this.setAnnotations(propertyDataDefinition.annotations);
+        }
+        if (MapUtils.isNotEmpty(propertyDataDefinition.getMetadata())) {
+            setMetadata(new HashMap<>(propertyDataDefinition.getMetadata()));
+        }
+        if (isNotEmpty(propertyDataDefinition.getPropertyConstraints())) {
+            setPropertyConstraints(new ArrayList<>(propertyDataDefinition.getPropertyConstraints()));
+        }
+        this.setIsDeclaredListInput(propertyDataDefinition.getIsDeclaredListInput());
+        this.setUserCreated(propertyDataDefinition.isUserCreated());
+    }
 
+    public boolean isDefinition() {
+        return true;
+    }
 
-public class PropertyDataDefinition extends ToscaDataDefinition implements Serializable {
+    public boolean getDefinition() {
+        return definition;
+    }
 
-       /**
-        * 
-        */
-       private static final long serialVersionUID = 5798685557528432389L;
+    public Boolean isRequired() {
+        return required;
+    }
 
-       private String uniqueId;
+    public void setSchemaType(String schemaType) {
+        if (schema != null && schema.getProperty() != null) {
+            schema.getProperty().setType(schemaType);
+        }
+    }
 
-       // "boolean", "string", "float", "integer", "version" })
-       private String type;
+    public String getSchemaType() {
+        if (schema != null && schema.getProperty() != null) {
+            return schema.getProperty().getType();
+        }
+        return null;
+    }
 
-       private Boolean required = Boolean.FALSE;
+    public PropertyDataDefinition getSchemaProperty() {
+        if (schema != null) {
+            return schema.getProperty();
+        }
+        return null;
+    }
 
-       protected boolean definition = false;
+    public ToscaGetFunctionType getToscaGetFunctionType() {
+        if (isToscaGetFunction() && toscaFunction != null) {
+            return ((ToscaGetFunctionDataDefinition) toscaFunction).getFunctionType();
+        }
 
-       private String defaultValue;
+        return null;
+    }
 
-       private String description;
+    public Boolean isHidden() {
+        return hidden;
+    }
 
-       private SchemaDefinition schema;
+    public Boolean isImmutable() {
+        return immutable;
+    }
 
-       private boolean password;
+    public Boolean isMappedToComponentProperty() {
+        return mappedToComponentProperty;
+    }
 
-       private String name;
+    /**
+     * The resource id which this property belongs to
+     */
+    public String getParentUniqueId() {
+        return getOwnerId();
+    }
 
-       private String value;
+    public void setParentUniqueId(String parentUniqueId) {
+        setOwnerId(parentUniqueId);
+    }
 
-       private String label;
-       protected Boolean hidden = Boolean.FALSE;
-       private Boolean immutable = Boolean.FALSE;
-       
-       private String inputPath;
-    private String status;
+    public List<GetPolicyValueDataDefinition> safeGetGetPolicyValues() {
+        return CollectionUtils.isEmpty(getPolicyValues) ? new ArrayList<>() : getPolicyValues;
+    }
+
+    public boolean typeEquals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        PropertyDataDefinition other = (PropertyDataDefinition) obj;
+        if (this.getType() == null) {
+            return other.getType() == null;
+        }
+        if (!this.type.equals(other.type)) {
+            return false;
+        }
+        String thisSchemaType = this.getSchemaType();
+        String otherSchemaType = other.getSchemaType();
+        if (thisSchemaType == null) {
+            return otherSchemaType == null;
+        }
+        return thisSchemaType.equals(otherSchemaType);
+    }
+
+    @Override
+    public Object getToscaPresentationValue(JsonPresentationFields field) {
+        switch (field) {
+            case NAME:
+                return name;
+            case UNIQUE_ID:
+                return uniqueId;
+            case PASSWORD:
+                return password;
+            case TYPE:
+                return type;
+            case DEFINITION:
+                return definition;
+            case VALUE:
+                return value;
+            case DEFAULT_VALUE:
+                return defaultValue;
+            default:
+                return super.getToscaPresentationValue(field);
+        }
+    }
+
+    @Override
+    public void setToscaPresentationValue(JsonPresentationFields name, Object value) {
+        switch (name) {
+            case NAME:
+                setName((String) value);
+                break;
+            case UNIQUE_ID:
+                setUniqueId((String) value);
+                break;
+            case PASSWORD:
+                setPassword((Boolean) value);
+                break;
+            case TYPE:
+                setType((String) value);
+                break;
+            case DEFINITION:
+                setDefinition((Boolean) value);
+                break;
+            case VALUE:
+                setValue((String) value);
+                break;
+            case DEFAULT_VALUE:
+                setDefaultValue((String) value);
+                break;
+            default:
+                super.setToscaPresentationValue(name, value);
+                break;
+        }
+    }
+
+    private <T extends ToscaDataDefinition> boolean compareSchemaType(T other) {
+        return !"list".equals(type) && !"map".equals(type) || this.getSchema().getProperty().getType()
+            .equals(((PropertyDataDefinition) other).getSchema().getProperty().getType());
+    }
+
+    @Override
+    public <T extends ToscaDataDefinition> T mergeFunction(T other, boolean allowDefaultValueOverride) {
+        if (this.getType() != null && this.getType().equals(other.getToscaPresentationValue(JsonPresentationFields.TYPE)) && compareSchemaType(
+            other)) {
+            other.setOwnerId(getOwnerId());
+            if (allowDefaultValueOverride && getDefaultValue() != null && !getDefaultValue().isEmpty()) {
+                other.setToscaPresentationValue(JsonPresentationFields.DEFAULT_VALUE, getDefaultValue());
+            }
+            return other;
+        }
+        return null;
+    }
+
+    public void convertPropertyDataToInstancePropertyData() {
+        if (null != value) {
+            defaultValue = value;
+        }
+    }
+
+    public boolean isGetInputProperty() {
+        return this.getGetInputValues() != null && !this.getGetInputValues().isEmpty();
+    }
 
-       /**
-        * The resource id which this property belongs to
-        */
-       private String parentUniqueId;
-
-
-       private List<GetInputValueDataDefinition> getInputValues;
-       
-       public PropertyDataDefinition() {
-               super();
-       }
-
-       public PropertyDataDefinition(Map<String, Object> pr) {
-               super(pr);
-
-       }
-
-       public PropertyDataDefinition(PropertyDataDefinition p) {
-
-               super();
-               this.setUniqueId(p.getUniqueId());
-               this.setRequired(p.isRequired());
-               this.setDefaultValue(p.getDefaultValue());
-               this.setDescription(p.getDescription());
-               this.setSchema(p.getSchema());
-               this.setPassword(p.isPassword());
-               this.setType(p.getType());
-               this.setName(p.getName());
-               this.setValue(p.getValue());
-               this.setRequired(p.isRequired());
-               this.setHidden(p.isHidden());
-               this.setLabel(p.getLabel());
-               this.setImmutable(p.isImmutable());
-               this.setParentUniqueId(p.getParentUniqueId());
-               this.setOwnerId(p.getOwnerId());
-               this.setGetInputValues(p.getInputValues);
-               this.setInputPath(p.getInputPath());
-               this.setStatus(p.getStatus());
-
-       }
-
-       public String getInputPath() {
-               return inputPath;
-       }
-
-       public void setInputPath(String inputPath) {
-               this.inputPath = inputPath;
-       }
-
-       public String getName() {
-               return name;
-       }
-
-       public void setName(String name) {
-               this.name = name;
-       }
-
-       public String getValue() {
-               return value;
-       }
-
-       public void setValue(String value) {
-               this.value = value;
-       }
-
-       // @Override
-       public boolean isDefinition() {
-               return true;
-       }
-
-       public void setDefinition(boolean definition) {
-               this.definition = definition;
-       }
-
-       public String getType() {
-               return type;
-       }
-
-       public String getDefaultValue() {
-               return defaultValue;
-       }
-
-       public void setDefaultValue(String defaultValue) {
-               this.defaultValue = defaultValue;
-       }
-
-       public void setType(String type) {
-               this.type = type;
-       }
-
-       public Boolean isRequired() {
-               return required;
-       }
-
-       public void setRequired(Boolean required) {
-               this.required = required;
-       }
-
-       public String getDescription() {
-               return description;
-       }
-
-       public void setDescription(String description) {
-               this.description = description;
-       }
-
-       public boolean isPassword() {
-               return password;
-       }
-
-       public void setPassword(boolean password) {
-               this.password = password;
-       }
-
-       public String getUniqueId() {
-               return uniqueId;
-       }
-
-       public void setUniqueId(String uniqueId) {
-               this.uniqueId = uniqueId;
-       }
-
-       public SchemaDefinition getSchema() {
-               return schema;
-       }
-
-       public void setSchema(SchemaDefinition entrySchema) {
-               this.schema = entrySchema;
-       }
-
-       public String getLabel() {
-               return label;
-       }
-
-       public void setLabel(String label) {
-               this.label = label;
-       }
-
-       public Boolean isHidden() {
-               return hidden;
-       }
-
-       public void setHidden(Boolean hidden) {
-               this.hidden = hidden;
-       }
-
-       public Boolean isImmutable() {
-               return immutable;
-       }
-
-       public void setImmutable(Boolean immutable) {
-               this.immutable = immutable;
-       }
-       
-       
-       public String getParentUniqueId() {
-               return getOwnerId();
-       }
-
-       public void setParentUniqueId(String parentUniqueId) {
-               setOwnerId(parentUniqueId);
-       }
-
-
-       public List<GetInputValueDataDefinition> getGetInputValues() {
-               return getInputValues;
-       }
-
-       public void setGetInputValues(List<GetInputValueDataDefinition> getInputValues) {
-               this.getInputValues = getInputValues;
-       }
-       
-       public String getStatus() {
-               return status;
+    public void setAnnotations(List<Annotation> newAnnotations) {
+        Set<Annotation> annotationSet = isNotEmpty(newAnnotations) ? new HashSet<>(newAnnotations) : new HashSet<>();
+        //We would to prioritize the new valid annotations over the old ones if the same one existed.
+        if (this.annotations != null) {
+            annotationSet.addAll(this.annotations);
+        }
+        this.annotations = new ArrayList<>(annotationSet);
+        setToscaPresentationValue(JsonPresentationFields.ANNOTATIONS, this.annotations);
     }
 
-       public void setStatus(String status) {
-               this.status = status;
-       }
-       
-       @Override
-       public String toString() {
-               return "PropertyDataDefinition [uniqueId=" + uniqueId + ", type=" + type + ", required=" + required + ", defaultValue=" + defaultValue + ", description=" + description + ", entrySchema=" + schema + ", parentUniqueId=" + parentUniqueId + ", password=" + password + "]";
-       }
-
-       @Override
-       public int hashCode() {
-               final int prime = 31;
-               int result = 1;
-               result = prime * result + ((defaultValue == null) ? 0 : defaultValue.hashCode());
-               result = prime * result + (definition ? 1231 : 1237);
-               result = prime * result + ((description == null) ? 0 : description.hashCode());
-               result = prime * result + (password ? 1231 : 1237);
-               result = prime * result + ((required == null) ? 0 : required.hashCode());
-               result = prime * result + ((schema == null) ? 0 : schema.hashCode());
-               result = prime * result + ((type == null) ? 0 : type.hashCode());
-               result = prime * result + ((uniqueId == null) ? 0 : uniqueId.hashCode());
-               result = prime * result + ((parentUniqueId == null) ? 0 : parentUniqueId.hashCode());
-               result = prime * result + ((status == null) ? 0 : status.hashCode());
-               return result;
-       }
-
-       @Override
-       public boolean equals(Object obj) {
-               if (this == obj)
-                       return true;
-               if (obj == null)
-                       return false;
-               if (getClass() != obj.getClass())
-                       return false;
-               PropertyDataDefinition other = (PropertyDataDefinition) obj;
-               if (defaultValue == null) {
-                       if (other.defaultValue != null)
-                               return false;
-               } else if (!defaultValue.equals(other.defaultValue))
-                       return false;
-               if (definition != other.definition)
-                       return false;
-               if (description == null) {
-                       if (other.description != null)
-                               return false;
-               } else if (!description.equals(other.description))
-                       return false;
-               if (password != other.password)
-                       return false;
-               if (required == null) {
-                       if (other.required != null)
-                               return false;
-               } else if (!required.equals(other.required))
-                       return false;
-               if (schema == null) {
-                       if (other.schema != null)
-                               return false;
-               } else if (!schema.equals(other.schema))
-                       return false;
-               if (type == null) {
-                       if (other.type != null)
-                               return false;
-               } else if (!type.equals(other.type))
-                       return false;
-               if (parentUniqueId == null) {
-                       if (other.parentUniqueId != null)
-                               return false;
-               } else if (!parentUniqueId.equals(other.parentUniqueId))
-                       return false;
-               if (uniqueId == null) {
-                       if (other.uniqueId != null)
-                               return false;
-               } else if (!uniqueId.equals(other.uniqueId))
-                       return false;
-               if (status == null) {
-                       if (other.status != null)
-                               return false;
-               } else if (!status.equals(other.status))
-                       return false;
-               return true;
-       }
-
-       @Override
-       public Object getToscaPresentationValue(JsonPresentationFields field) {
-               switch (field) {
-               case NAME:
-                       return name;
-               case UNIQUE_ID:
-                       return uniqueId;
-               case PASSWORD:
-                       return password;
-               case TYPE:
-                       return type;
-               case DEFINITION:
-                       return definition;
-               case VALUE:
-                       return value;
-               case DEFAULT_VALUE:
-                       return defaultValue;
-               default:
-                       return super.getToscaPresentationValue(field);
-               }
-       }
-
-       private <T extends ToscaDataDefinition> boolean compareSchemaType(T other){
-               return !"list".equals(type) && !"map".equals(type) || this.getSchema().getProperty().getType().equals(((PropertyDataDefinition)other).getSchema().getProperty().getType());
-       }
-       
-       
-       @Override
-       public <T extends ToscaDataDefinition> T mergeFunction(T other, boolean allowDefaultValueOverride){
-               if(this.getType().equals(other.getToscaPresentationValue(JsonPresentationFields.TYPE)) && compareSchemaType(other)){
-                       other.setOwnerId(getOwnerId());
-                       if(allowDefaultValueOverride)
-                               other.setToscaPresentationValue(JsonPresentationFields.DEFAULT_VALUE, getDefaultValue());
-                       return other;
-               }
-               return null;
-       }
-               
+    public List<Annotation> getAnnotations() {
+        return (List<Annotation>) getToscaPresentationValue(JsonPresentationFields.ANNOTATIONS);
+    }
 
+    @JsonIgnoreProperties
+    public boolean isToscaFunction() {
+        return this.toscaGetFunctionType != null || this.toscaFunction != null;
+    }
 
+    @JsonIgnoreProperties
+    public boolean isToscaGetFunction() {
+        return this.toscaFunction != null
+            && (this.toscaFunction.getType() == ToscaFunctionType.GET_ATTRIBUTE
+            || this.toscaFunction.getType() == ToscaFunctionType.GET_INPUT
+            || this.toscaFunction.getType() == ToscaFunctionType.GET_PROPERTY);
+    }
+
+    @JsonIgnoreProperties
+    public boolean hasToscaFunction() {
+        return this.toscaFunction != null;
+    }
 
 }