Allow to select properties in the get_attribute function 21/130521/8
authorvasraz <vasyl.razinkov@est.tech>
Tue, 30 Aug 2022 17:17:21 +0000 (18:17 +0100)
committerVasyl Razinkov <vasyl.razinkov@est.tech>
Fri, 2 Sep 2022 12:46:09 +0000 (12:46 +0000)
Signed-off-by: Vasyl Razinkov <vasyl.razinkov@est.tech>
Change-Id: Ib35d5d1e3d83ed8e87ce45c20e9cc1a641c5bde2
Issue-ID: SDC-4149

catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/validation/ToscaFunctionValidatorImpl.java
catalog-ui/src/app/models.ts
catalog-ui/src/app/ng2/pages/properties-assignment/tosca-function/tosca-get-function/tosca-get-function.component.ts
catalog-ui/src/app/ng2/services/component-services/topology-template.service.ts

index ed37347..083a03f 100644 (file)
@@ -24,6 +24,8 @@ package org.openecomp.sdc.be.components.impl.validation;
 import fj.data.Either;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.onap.sdc.tosca.datatypes.model.PropertyType;
@@ -63,42 +65,51 @@ public class ToscaFunctionValidatorImpl implements ToscaFunctionValidator {
     private <T extends PropertyDataDefinition> void validateToscaGetFunction(T property, Component parentComponent) {
         final ToscaGetFunctionDataDefinition toscaGetFunction = (ToscaGetFunctionDataDefinition) property.getToscaFunction();
         validateGetToscaFunctionAttributes(toscaGetFunction);
-        validateGetPropertySource(toscaGetFunction.getFunctionType(), toscaGetFunction.getPropertySource());
-        if (toscaGetFunction.getFunctionType() == ToscaGetFunctionType.GET_INPUT) {
-            validateGetFunction(property, parentComponent.getInputs(), parentComponent.getModel());
-            return;
-        }
-        if (toscaGetFunction.getFunctionType() == ToscaGetFunctionType.GET_PROPERTY) {
-            if (toscaGetFunction.getPropertySource() == PropertySource.SELF) {
-                validateGetFunction(property, parentComponent.getProperties(), parentComponent.getModel());
-            } else if (toscaGetFunction.getPropertySource() == PropertySource.INSTANCE) {
-                final ComponentInstance componentInstance =
-                    parentComponent.getComponentInstanceById(toscaGetFunction.getSourceUniqueId())
+        final ToscaGetFunctionType functionType = toscaGetFunction.getFunctionType();
+        validateGetPropertySource(functionType, toscaGetFunction.getPropertySource());
+        final String model = parentComponent.getModel();
+        switch (functionType) {
+            case GET_INPUT:
+                validateGetFunction(property, parentComponent.getInputs(), model);
+                break;
+            case GET_PROPERTY:
+                if (toscaGetFunction.getPropertySource() == PropertySource.SELF) {
+                    validateGetFunction(property, parentComponent.getProperties(), model);
+                } else if (toscaGetFunction.getPropertySource() == PropertySource.INSTANCE) {
+                    final ComponentInstance componentInstance =
+                        parentComponent.getComponentInstanceById(toscaGetFunction.getSourceUniqueId())
+                            .orElseThrow(ToscaGetFunctionExceptionSupplier.instanceNotFound(toscaGetFunction.getSourceName()));
+                    validateGetFunction(property, componentInstance.getProperties(), model);
+                }
+                break;
+            case GET_ATTRIBUTE:
+                if (toscaGetFunction.getPropertySource() == PropertySource.SELF) {
+                    validateGetFunction(property, combine(parentComponent.getProperties(), parentComponent.getAttributes()), model);
+                } else if (toscaGetFunction.getPropertySource() == PropertySource.INSTANCE) {
+                    final ComponentInstance componentInstance = parentComponent.getComponentInstanceById(toscaGetFunction.getSourceUniqueId())
                         .orElseThrow(ToscaGetFunctionExceptionSupplier.instanceNotFound(toscaGetFunction.getSourceName()));
-                validateGetFunction(property, componentInstance.getProperties(), parentComponent.getModel());
-            }
-
-            return;
-        }
-        if (toscaGetFunction.getFunctionType() == ToscaGetFunctionType.GET_ATTRIBUTE) {
-            if (toscaGetFunction.getPropertySource() == PropertySource.SELF) {
-                validateGetFunction(property, parentComponent.getAttributes(), parentComponent.getModel());
-            } else if (toscaGetFunction.getPropertySource() == PropertySource.INSTANCE) {
-                final ComponentInstance componentInstance =
-                    parentComponent.getComponentInstanceById(toscaGetFunction.getSourceUniqueId())
-                        .orElseThrow(ToscaGetFunctionExceptionSupplier.instanceNotFound(toscaGetFunction.getSourceName()));
-                validateGetFunction(property, componentInstance.getAttributes(), parentComponent.getModel());
-            }
-
-            return;
+                    validateGetFunction(property, combine(componentInstance.getProperties(), componentInstance.getAttributes()), model);
+                }
+                break;
+            default:
+                throw ToscaGetFunctionExceptionSupplier.functionNotSupported(functionType).get();
         }
+    }
 
-        throw ToscaGetFunctionExceptionSupplier.functionNotSupported(toscaGetFunction.getFunctionType()).get();
+    private List<? extends ToscaPropertyData> combine(final List<? extends ToscaPropertyData> parentProperties,
+                                                     final List<? extends ToscaPropertyData> parentAttributes) {
+        if (CollectionUtils.isNotEmpty(parentProperties) && CollectionUtils.isNotEmpty(parentAttributes)) {
+            return Stream.concat(parentProperties.stream(), parentAttributes.stream()).collect(Collectors.toList());
+        }
+        if (CollectionUtils.isEmpty(parentProperties)) {
+            return parentAttributes;
+        }
+        return parentProperties;
     }
 
     private <T extends PropertyDataDefinition> void validateGetFunction(final T property,
-                                                                    final List<? extends ToscaPropertyData> parentProperties,
-                                                                    final String model) {
+                                                                        final List<? extends ToscaPropertyData> parentProperties,
+                                                                        final String model) {
         final ToscaGetFunctionDataDefinition toscaGetFunction = (ToscaGetFunctionDataDefinition) property.getToscaFunction();
         if (CollectionUtils.isEmpty(parentProperties)) {
             throw ToscaGetFunctionExceptionSupplier
index 7604b67..d201942 100644 (file)
  * ============LICENSE_END=========================================================
  */
 
-/**
- * Created by ob0695 on 2/23/2017.
- */
-import from = require("core-js/fn/array/from");
 export * from './models/activity';
 export * from './models/additional-information';
 export * from './models/app-config';
@@ -48,7 +44,6 @@ export * from './models/graph/zones/policy-instance';
 export * from './models/graph/zones/zone';
 export * from './models/graph/zones/zone-instance';
 export * from './models/csar-component';
-//export * from './models/data-type-properties';
 export * from './models/properties-inputs/property-be-model';
 export * from './models/properties-inputs/property-fe-model';
 export * from './models/properties-inputs/property-fe-map';
@@ -57,6 +52,15 @@ export * from './models/properties-inputs/property-declare-api-model';
 export * from './models/properties-inputs/property-input-detail';
 export * from './models/properties-inputs/input-fe-model';
 export * from './models/properties-inputs/simple-flat-property';
+export * from './models/attributes-outputs/attribute-be-model';
+export * from './models/attributes-outputs/attribute-fe-model';
+export * from './models/attributes-outputs/attribute-fe-map';
+export * from './models/attributes-outputs/attribute-output-detail';
+export * from './models/attributes-outputs/attribute-declare-api-model';
+export * from './models/attributes-outputs/derived-fe-attribute';
+export * from './models/attributes-outputs/output-be-model';
+export * from './models/attributes-outputs/output-fe-model';
+export * from './models/attributes-outputs/simple-flat-attribute';
 export * from './models/data-types-map';
 export * from './models/data-types';
 export * from './models/distribution';
@@ -128,4 +132,4 @@ export * from './models/relationship-types';
 export * from './models/tosca-presentation';
 export * from './models/node-types';
 export * from './models/capability-types';
-export * from './models/service-csar';
\ No newline at end of file
+export * from './models/service-csar';
index 8f50cc1..64d155a 100644 (file)
@@ -18,7 +18,7 @@
  */
 
 import {Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges} from '@angular/core';
-import {AttributeModel, ComponentMetadata, DataTypeModel, PropertyBEModel, PropertyModel} from 'app/models';
+import {AttributeBEModel, ComponentMetadata, DataTypeModel, PropertyBEModel, PropertyModel} from 'app/models';
 import {TopologyTemplateService} from "../../../../services/component-services/topology-template.service";
 import {WorkspaceService} from "../../../workspace/workspace.service";
 import {PropertiesService} from "../../../../services/properties.service";
@@ -224,7 +224,7 @@ export class ToscaGetFunctionComponent implements OnInit, OnChanges {
         this.startLoading();
         const propertiesObservable: Observable<ComponentGenericResponse> = this.getPropertyObservable();
         propertiesObservable.subscribe( (response: ComponentGenericResponse) => {
-            const properties: Array<PropertyBEModel | AttributeModel> = this.extractProperties(response);
+            const properties: Array<PropertyBEModel | AttributeBEModel> = this.extractProperties(response);
             if (!properties || properties.length === 0) {
                 const msgCode = this.getNotFoundMsgCode();
                 this.dropDownErrorMsg = this.translateService.translate(msgCode, {type: this.propertyTypeToString()});
@@ -267,22 +267,22 @@ export class ToscaGetFunctionComponent implements OnInit, OnChanges {
         return this.property.type;
     }
 
-    private extractProperties(componentGenericResponse: ComponentGenericResponse): Array<PropertyBEModel | AttributeModel> {
+    private extractProperties(componentGenericResponse: ComponentGenericResponse): Array<PropertyBEModel | AttributeBEModel> {
         if (this.isGetInput()) {
             return componentGenericResponse.inputs;
         }
-        const propertySource = this.propertySource.value;
+        const instanceId = this.instanceNameAndIdMap.get(this.propertySource.value);
         if (this.isGetProperty()) {
             if (this.isPropertySourceSelf()) {
                 return componentGenericResponse.properties;
             }
-            const componentInstanceProperties: PropertyModel[] = componentGenericResponse.componentInstancesProperties[this.instanceNameAndIdMap.get(propertySource)];
-            return this.removeSelectedProperty(componentInstanceProperties);
+            return this.removeSelectedProperty(componentGenericResponse.componentInstancesProperties[instanceId]);
         }
         if (this.isPropertySourceSelf()) {
-            return componentGenericResponse.attributes;
+            return [...(componentGenericResponse.attributes || []), ...(componentGenericResponse.properties || [])];
         }
-        return componentGenericResponse.componentInstancesAttributes[this.instanceNameAndIdMap.get(propertySource)];
+        return [...(componentGenericResponse.componentInstancesAttributes[instanceId] || []),
+            ...(componentGenericResponse.componentInstancesProperties[instanceId] || [])];
     }
 
     private isPropertySourceSelf() {
@@ -301,9 +301,9 @@ export class ToscaGetFunctionComponent implements OnInit, OnChanges {
         }
         if (this.isGetAttribute()) {
             if (this.isPropertySourceSelf()) {
-                return this.topologyTemplateService.findAllComponentAttributes(this.componentMetadata.componentType, this.componentMetadata.uniqueId);
+                return this.topologyTemplateService.findAllComponentAttributesAndProperties(this.componentMetadata.componentType, this.componentMetadata.uniqueId);
             }
-            return this.topologyTemplateService.findAllComponentInstanceAttributes(this.componentMetadata.componentType, this.componentMetadata.uniqueId);
+            return this.topologyTemplateService.getComponentInstanceAttributesAndProperties(this.componentMetadata.uniqueId, this.componentMetadata.componentType);
         }
     }
 
@@ -322,7 +322,7 @@ export class ToscaGetFunctionComponent implements OnInit, OnChanges {
         this.propertyDropdownList.sort((a, b) => a.propertyLabel.localeCompare(b.propertyLabel));
     }
 
-    private addPropertiesToDropdown(properties: Array<PropertyBEModel | AttributeModel>): void {
+    private addPropertiesToDropdown(properties: Array<PropertyBEModel | AttributeBEModel>): void {
         for (const property of properties) {
             if (this.hasSameType(property)) {
                 this.addPropertyToDropdown({
@@ -337,8 +337,8 @@ export class ToscaGetFunctionComponent implements OnInit, OnChanges {
         }
     }
 
-    private fillPropertyDropdownWithMatchingChildProperties(inputProperty: PropertyBEModel | AttributeModel,
-                                                            parentPropertyList: Array<PropertyBEModel | AttributeModel> = []): void {
+    private fillPropertyDropdownWithMatchingChildProperties(inputProperty: PropertyBEModel | AttributeBEModel,
+                                                            parentPropertyList: Array<PropertyBEModel | AttributeBEModel> = []): void {
         const dataTypeFound: DataTypeModel = this.dataTypeService.getDataTypeByModelAndTypeName(this.componentMetadata.model, inputProperty.type);
         if (!dataTypeFound || !dataTypeFound.properties) {
             return;
@@ -358,7 +358,7 @@ export class ToscaGetFunctionComponent implements OnInit, OnChanges {
         });
     }
 
-    private hasSameType(property: PropertyBEModel | AttributeModel) {
+    private hasSameType(property: PropertyBEModel | AttributeBEModel) {
         if (this.typeHasSchema(this.property.type)) {
             if (!property.schema || !property.schema.property) {
                 return false;
@@ -440,4 +440,4 @@ export interface PropertyDropdownValue {
 export interface ToscaGetFunctionValidationEvent {
     isValid: boolean,
     toscaGetFunction: ToscaGetFunction,
-}
\ No newline at end of file
+}
index a2abb38..c497e01 100644 (file)
@@ -163,6 +163,10 @@ export class TopologyTemplateService {
         return this.getComponentDataByFieldsName(componentType, componentUniqueId, [COMPONENT_FIELDS.COMPONENT_ATTRIBUTES]);
     }
 
+    findAllComponentAttributesAndProperties(componentType: string, componentUniqueId: string): Observable<ComponentGenericResponse> {
+        return this.getComponentDataByFieldsName(componentType, componentUniqueId, [COMPONENT_FIELDS.COMPONENT_ATTRIBUTES, COMPONENT_FIELDS.COMPONENT_PROPERTIES]);
+    }
+
     getCapabilitiesAndRequirements(componentType: string, componentId: string): Observable<ComponentGenericResponse> {
         return this.getComponentDataByFieldsName(componentType, componentId, [COMPONENT_FIELDS.COMPONENT_REQUIREMENTS, COMPONENT_FIELDS.COMPONENT_CAPABILITIES]);
     }