Implement Attributes/Outputs BE (part 1)
[sdc.git] / catalog-model / src / main / java / org / openecomp / sdc / be / model / Resource.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.be.model;
22
23 import java.util.List;
24 import java.util.Map;
25 import java.util.Optional;
26 import java.util.stream.Collectors;
27 import lombok.EqualsAndHashCode;
28 import lombok.Getter;
29 import lombok.Setter;
30 import lombok.ToString;
31 import org.openecomp.sdc.be.config.ConfigurationManager;
32 import org.openecomp.sdc.be.dao.utils.MapUtil;
33 import org.openecomp.sdc.be.datatypes.components.ResourceMetadataDataDefinition;
34 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
35 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
36
37 @Getter
38 @Setter
39 @EqualsAndHashCode(callSuper = true)
40 @ToString
41 public class Resource extends Component {
42
43     /**
44      * Please note that more than one "derivedFrom" resource is not currently supported by the app. The first list
45      * element is always addressed.
46      */
47     private List<String> derivedFrom;
48
49     /**
50      * The derivedList is a chain of derivedFrom. e.g. if resource C is derived from resource B that is derived from
51      * resource A - then A, B is the "DerivedList" of resource C
52      */
53     private List<String> derivedList;
54
55     private Map<String, String> derivedFromMapOfIdToName;
56
57     private String toscaVersion;
58
59     public Resource() {
60         super(new ResourceMetadataDefinition());
61         this.getComponentMetadataDefinition().getMetadataDataDefinition().setComponentType(ComponentTypeEnum.RESOURCE);
62     }
63
64     public Resource(ComponentMetadataDefinition componentMetadataDefinition) {
65         super(componentMetadataDefinition);
66         if (this.getComponentMetadataDefinition().getMetadataDataDefinition() == null) {
67             this.getComponentMetadataDefinition().componentMetadataDataDefinition =
68                 new ResourceMetadataDataDefinition();
69         }
70         this.getComponentMetadataDefinition().getMetadataDataDefinition().setComponentType(ComponentTypeEnum.RESOURCE);
71     }
72
73     public Boolean isAbstract() {
74         return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
75             .isAbstract();
76     }
77
78     public void setAbstract(Boolean isAbstract) {
79         ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
80             .setAbstract(isAbstract);
81     }
82
83     public String getCost() {
84         return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
85             .getCost();
86     }
87
88     public void setCost(String cost) {
89         ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition()).setCost(cost);
90     }
91
92     public String getLicenseType() {
93         return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
94             .getLicenseType();
95     }
96
97     public void setLicenseType(String licenseType) {
98         ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
99             .setLicenseType(licenseType);
100     }
101
102     public String getToscaResourceName() {
103         return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
104             .getToscaResourceName();
105     }
106
107     public void setToscaResourceName(String toscaResourceName) {
108         ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
109             .setToscaResourceName(toscaResourceName);
110     }
111
112     public ResourceTypeEnum getResourceType() {
113         return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
114             .getResourceType();
115     }
116
117     public void setResourceType(ResourceTypeEnum resourceType) {
118         ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
119             .setResourceType(resourceType);
120     }
121
122     public String getVendorName() {
123         return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
124             .getVendorName();
125     }
126
127     public void setVendorName(String vendorName) {
128         ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
129             .setVendorName(vendorName);
130     }
131
132     public String getVendorRelease() {
133         return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
134             .getVendorRelease();
135     }
136
137     public void setVendorRelease(String vendorRelease) {
138         ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
139             .setVendorRelease(vendorRelease);
140     }
141
142     public String getResourceVendorModelNumber() {
143         return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
144             .getResourceVendorModelNumber();
145     }
146
147     public void setResourceVendorModelNumber(String resourceVendorModelNumber) {
148         ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
149             .setResourceVendorModelNumber(resourceVendorModelNumber);
150     }
151
152     @Override
153     public String fetchGenericTypeToscaNameFromConfig() {
154         return fetchToscaNameFromConfigBasedOnCategory().orElse(fetchToscaNameFromConfigBasedOnAssetType());
155     }
156
157     public String fetchToscaNameFromConfigBasedOnAssetType() {
158         String result = super.fetchGenericTypeToscaNameFromConfig();
159         if (null == result) {
160             result = ConfigurationManager.getConfigurationManager().getConfiguration().getGenericAssetNodeTypes()
161                 .get(ResourceTypeEnum.VFC.getValue());
162         }
163         return result;
164     }
165
166     private Optional<String> fetchToscaNameFromConfigBasedOnCategory() {
167         return getHeadOption(this.getCategories()).flatMap(category -> getHeadOption(category.getSubcategories()).map(
168             subCategory -> fetchToscaNameFromConfigBasedOnCategory(category.getName(), subCategory.getName())));
169     }
170
171     private String fetchToscaNameFromConfigBasedOnCategory(final String resourceCategory,
172                                                            final String resourceSubCategory) {
173         return Optional
174             .ofNullable(ConfigurationManager.getConfigurationManager().getConfiguration().getResourceNodeTypes())
175             .map(categoryNames -> categoryNames.get(resourceCategory))
176             .map(subCategoryNames -> subCategoryNames.get(resourceSubCategory)).orElse(null);
177     }
178
179     @Override
180     public String assetType() {
181         return this.getResourceType().name();
182     }
183
184     @Override
185     public boolean shouldGenerateInputs() {
186         return !(this.getResourceType().isAtomicType());
187     }
188
189     @Override
190     public boolean deriveFromGeneric() {
191         return this.shouldGenerateInputs()
192             || (derivedFrom != null && derivedFrom.contains(fetchGenericTypeToscaNameFromConfig()));
193     }
194
195     public Map<String, List<RequirementCapabilityRelDef>> groupRelationsFromCsarByInstanceName(Resource resource) {
196         List<RequirementCapabilityRelDef> componentInstanceRelationsFromCsar = resource.getComponentInstancesRelations()
197             .stream().filter(r -> !r.isOriginUI()).collect(Collectors.toList());
198         Map<String, List<RequirementCapabilityRelDef>> relationsByInstanceId =
199             MapUtil.groupListBy(componentInstanceRelationsFromCsar, RequirementCapabilityRelDef::getFromNode);
200         return MapUtil.convertMapKeys(relationsByInstanceId,
201             instId -> getInstanceInvariantNameFromInstanceId(resource, instId));
202     }
203
204     private String getInstanceInvariantNameFromInstanceId(Resource resource, String instId) {
205         Optional<ComponentInstance> componentInstanceById = resource.getComponentInstanceById(instId);
206         return componentInstanceById.isPresent() ? componentInstanceById.get().getInvariantName() : null;
207     }
208
209 }