re base code
[sdc.git] / catalog-model / src / main / java / org / openecomp / sdc / be / model / Component.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 com.fasterxml.jackson.annotation.JsonIgnore;
24 import com.google.common.collect.Maps;
25 import org.apache.commons.collections.MapUtils;
26 import org.openecomp.sdc.be.config.ConfigurationManager;
27 import org.openecomp.sdc.be.dao.utils.MapUtil;
28 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
29 import org.openecomp.sdc.be.model.category.CategoryDefinition;
30 import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
31 import org.openecomp.sdc.be.model.jsontitan.datamodel.ToscaElementTypeEnum;
32 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
33 import static java.util.Collections.emptyList;
34 import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
35 import org.openecomp.sdc.be.datatypes.elements.PolicyDataDefinition;
36 import org.openecomp.sdc.be.datatypes.elements.PolicyTargetType;
37 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
38 import java.util.*;
39 import java.util.function.Predicate;
40 import java.util.stream.Collectors;
41
42 import static java.util.Collections.emptyList;
43 import static java.util.Collections.emptyMap;
44 import static java.util.stream.Collectors.toMap;
45 import static org.apache.commons.collections.CollectionUtils.isEmpty;
46 import static org.apache.commons.collections.MapUtils.isEmpty;
47
48 public abstract class Component {
49
50     private ComponentMetadataDefinition componentMetadataDefinition;
51     private Map<String, ArtifactDefinition> artifacts;
52     private Map<String, ArtifactDefinition> deploymentArtifacts;
53     private Map<String, ArtifactDefinition> toscaArtifacts;
54     private List<CategoryDefinition> categories;
55     private List<ComponentInstance> componentInstances;
56     private List<RequirementCapabilityRelDef> componentInstancesRelations;
57     private Map<String, List<ComponentInstanceInput>> componentInstancesInputs;
58     private Map<String, List<ComponentInstanceProperty>> componentInstancesProperties;
59     private Map<String, List<ComponentInstanceProperty>> componentInstancesAttributes;
60     private Map<String, List<CapabilityDefinition>> capabilities;
61     private Map<String, List<RequirementDefinition>> requirements;
62     private List<InputDefinition> inputs;
63     private List<GroupDefinition> groups;
64     private Map<String, PolicyDefinition> policies;
65     private String derivedFromGenericType;
66     private String derivedFromGenericVersion;
67     private String toscaType;
68     protected List<AdditionalInformationDefinition> additionalInformation;
69
70     public Component(ComponentMetadataDefinition componentMetadataDefinition) {
71         this.componentMetadataDefinition = componentMetadataDefinition;
72     }
73
74     public String getDerivedFromGenericVersion() {
75         return derivedFromGenericVersion;
76     }
77
78     public void setDerivedFromGenericVersion(String derivedFromGenericVersion) {
79         this.derivedFromGenericVersion = derivedFromGenericVersion;
80     }
81
82     public String getDerivedFromGenericType() {
83         return derivedFromGenericType;
84     }
85
86     public void setDerivedFromGenericType(String derivedFromGenericType) {
87         this.derivedFromGenericType = derivedFromGenericType;
88     }
89
90
91     @JsonIgnore
92     public ComponentMetadataDefinition getComponentMetadataDefinition() {
93         return componentMetadataDefinition;
94     }
95
96     public Map<String, ArtifactDefinition> getArtifacts() {
97         return artifacts;
98     }
99
100     public void setArtifacts(Map<String, ArtifactDefinition> artifacts) {
101         this.artifacts = artifacts;
102     }
103
104     public Map<String, ArtifactDefinition> getToscaArtifacts() {
105         return toscaArtifacts;
106     }
107
108     public void setToscaArtifacts(Map<String, ArtifactDefinition> toscaArtifacts) {
109         this.toscaArtifacts = toscaArtifacts;
110     }
111
112     public String getUniqueId() {
113         return componentMetadataDefinition.getMetadataDataDefinition().getUniqueId();
114     }
115
116     public void setUniqueId(String uniqueId) {
117         componentMetadataDefinition.getMetadataDataDefinition().setUniqueId(uniqueId);
118     }
119
120     public void setName(String name) {
121         componentMetadataDefinition.getMetadataDataDefinition().setName(name);
122     }
123
124     public void setVersion(String version) {
125         componentMetadataDefinition.getMetadataDataDefinition().setVersion(version);
126     }
127
128     public void setHighestVersion(Boolean isHighestVersion) {
129         componentMetadataDefinition.getMetadataDataDefinition().setHighestVersion(isHighestVersion);
130     }
131
132     public void setCreationDate(Long creationDate) {
133         componentMetadataDefinition.getMetadataDataDefinition().setCreationDate(creationDate);
134     }
135
136     public void setLastUpdateDate(Long lastUpdateDate) {
137         componentMetadataDefinition.getMetadataDataDefinition().setLastUpdateDate(lastUpdateDate);
138     }
139
140     public void setDescription(String description) {
141         componentMetadataDefinition.getMetadataDataDefinition().setDescription(description);
142     }
143
144     public void setState(LifecycleStateEnum state) {
145         componentMetadataDefinition.getMetadataDataDefinition().setState(state.name());
146     }
147
148     public void setTags(List<String> tags) {
149         componentMetadataDefinition.getMetadataDataDefinition().setTags(tags);
150     }
151
152     public void setConformanceLevel(String conformanceLevel) {
153         componentMetadataDefinition.getMetadataDataDefinition().setConformanceLevel(conformanceLevel);
154     }
155
156     public void setIcon(String icon) {
157         componentMetadataDefinition.getMetadataDataDefinition().setIcon(icon);
158     }
159
160     public void setContactId(String contactId) {
161         componentMetadataDefinition.getMetadataDataDefinition().setContactId(contactId);
162     }
163
164     public String getCreatorUserId() {
165         return this.componentMetadataDefinition.getMetadataDataDefinition().getCreatorUserId();
166     }
167
168     public void setCreatorUserId(String creatorUserId) {
169         this.componentMetadataDefinition.getMetadataDataDefinition().setCreatorUserId(creatorUserId);
170     }
171
172     public String getCreatorFullName() {
173         return this.componentMetadataDefinition.getMetadataDataDefinition().getCreatorFullName();
174     }
175
176     public void setCreatorFullName(String creatorFullName) {
177         this.componentMetadataDefinition.getMetadataDataDefinition().setCreatorFullName(creatorFullName);
178     }
179
180     public String getLastUpdaterUserId() {
181         return this.componentMetadataDefinition.getMetadataDataDefinition().getLastUpdaterUserId();
182     }
183
184     public void setLastUpdaterUserId(String lastUpdaterUserId) {
185         this.componentMetadataDefinition.getMetadataDataDefinition().setLastUpdaterUserId(lastUpdaterUserId);
186     }
187
188     public String getLastUpdaterFullName() {
189         return this.componentMetadataDefinition.getMetadataDataDefinition().getLastUpdaterFullName();
190     }
191
192     public void setLastUpdaterFullName(String lastUpdaterFullName) {
193         this.componentMetadataDefinition.getMetadataDataDefinition().setLastUpdaterFullName(lastUpdaterFullName);
194     }
195
196     public String getName() {
197         return componentMetadataDefinition.getMetadataDataDefinition().getName();
198     }
199
200     public String getVersion() {
201         return componentMetadataDefinition.getMetadataDataDefinition().getVersion();
202     }
203
204     public Boolean isHighestVersion() {
205         return componentMetadataDefinition.getMetadataDataDefinition().isHighestVersion();
206     }
207
208     public Long getCreationDate() {
209         return componentMetadataDefinition.getMetadataDataDefinition().getCreationDate();
210     }
211
212     public Long getLastUpdateDate() {
213         return componentMetadataDefinition.getMetadataDataDefinition().getLastUpdateDate();
214     }
215
216     public String getDescription() {
217         return componentMetadataDefinition.getMetadataDataDefinition().getDescription();
218     }
219
220     public LifecycleStateEnum getLifecycleState() {
221         if (componentMetadataDefinition.getMetadataDataDefinition().getState() != null) {
222             return LifecycleStateEnum.valueOf(componentMetadataDefinition.getMetadataDataDefinition().getState());
223         }
224         else {
225             return null;
226         }
227     }
228
229     public List<String> getTags() {
230         return componentMetadataDefinition.getMetadataDataDefinition().getTags();
231     }
232
233     public String getConformanceLevel() {
234         return componentMetadataDefinition.getMetadataDataDefinition().getConformanceLevel();
235     }
236
237     public String getIcon() {
238         return componentMetadataDefinition.getMetadataDataDefinition().getIcon();
239     }
240
241     public String getContactId() {
242         return componentMetadataDefinition.getMetadataDataDefinition().getContactId();
243     }
244
245     public List<InputDefinition> getInputs() {
246         return inputs;
247     }
248
249     public List<InputDefinition> safeGetInputs() {
250         return inputs == null ? new ArrayList<>() : inputs;
251     }
252
253     public void setInputs(List<InputDefinition> inputs) {
254         this.inputs = inputs;
255     }
256
257     public void setLifecycleState(LifecycleStateEnum state) {
258         if (state != null) {
259             this.componentMetadataDefinition.getMetadataDataDefinition().setState(state.name());
260         }
261     }
262
263     public String getUUID() {
264         return componentMetadataDefinition.getMetadataDataDefinition().getUUID();
265     }
266
267     public void setUUID(String uUID) {
268         componentMetadataDefinition.getMetadataDataDefinition().setUUID(uUID);
269     }
270
271     public void setSystemName(String systemName) {
272         componentMetadataDefinition.getMetadataDataDefinition().setSystemName(systemName);
273     }
274
275     public String getSystemName() {
276         return componentMetadataDefinition.getMetadataDataDefinition().getSystemName();
277     }
278
279     public void setAllVersions(Map<String, String> allVersions) {
280         componentMetadataDefinition.getMetadataDataDefinition().setAllVersions(allVersions);
281     }
282
283     public Map<String, String> getAllVersions() {
284         return componentMetadataDefinition.getMetadataDataDefinition().getAllVersions();
285     }
286
287     public Map<String, ArtifactDefinition> getDeploymentArtifacts() {
288         return deploymentArtifacts;
289     }
290
291     public void setDeploymentArtifacts(Map<String, ArtifactDefinition> deploymentArtifacts) {
292         this.deploymentArtifacts = deploymentArtifacts;
293     }
294
295     public Map<String, ArtifactDefinition> getAllArtifacts() {
296         HashMap<String, ArtifactDefinition> allArtifacts = new HashMap<>();
297         allArtifacts.putAll(Optional.ofNullable(this.deploymentArtifacts).orElse(emptyMap()));
298         allArtifacts.putAll(Optional.ofNullable(this.artifacts).orElse(emptyMap()));
299         return allArtifacts;
300     }
301
302     public List<CategoryDefinition> getCategories() {
303         return categories;
304     }
305
306     public void setCategories(List<CategoryDefinition> categories) {
307         this.categories = categories;
308     }
309
310     public String getNormalizedName() {
311         return componentMetadataDefinition.getMetadataDataDefinition().getNormalizedName();
312     }
313
314     public void setNormalizedName(String normalizedName) {
315         componentMetadataDefinition.getMetadataDataDefinition().setNormalizedName(normalizedName);
316     }
317
318     public ComponentTypeEnum getComponentType() {
319         return this.componentMetadataDefinition.getMetadataDataDefinition().getComponentType();
320     }
321
322     public void setComponentType(ComponentTypeEnum componentType) {
323         this.componentMetadataDefinition.getMetadataDataDefinition().setComponentType(componentType);
324     }
325
326     public Map<String, List<CapabilityDefinition>> getCapabilities() {
327         if (MapUtils.isEmpty(capabilities)) {
328             capabilities = Maps.newHashMap();
329         }
330         return capabilities;
331     }
332
333     public void setCapabilities(Map<String, List<CapabilityDefinition>> capabilities) {
334         this.capabilities = capabilities;
335     }
336
337     public Map<String, List<RequirementDefinition>> getRequirements() {
338         return requirements;
339     }
340
341     public void setRequirements(Map<String, List<RequirementDefinition>> requirements) {
342         this.requirements = requirements;
343     }
344
345     public List<ComponentInstance> getComponentInstances() {
346         return componentInstances;
347     }
348     
349     public List<ComponentInstance> safeGetComponentInstances() {
350         if(componentInstances != null) {
351                 return componentInstances;
352         }else {
353                 return emptyList();
354         }
355     }
356
357     public Optional<ComponentInstance> fetchInstanceById(String instanceId) {
358         return Optional.ofNullable(MapUtil.toMap(componentInstances, ComponentInstance::getUniqueId).get(instanceId));
359     }
360
361     public Map<String, ArtifactDefinition> safeGetComponentInstanceDeploymentArtifacts(String componentInstanceId) {
362         return getComponentInstanceById(componentInstanceId).map(ComponentInstance::safeGetDeploymentArtifacts)
363                                                             .orElse(emptyMap());
364     }
365
366     public Map<String, ArtifactDefinition> safeGetComponentInstanceInformationalArtifacts(String componentInstanceId) {
367         return getComponentInstanceById(componentInstanceId).map(ComponentInstance::safeGetInformationalArtifacts)
368                                                             .orElse(emptyMap());
369     }
370
371     public List<ArtifactDefinition> safeGetComponentInstanceHeatArtifacts(String componentInstanceId) {
372         return safeGetComponentInstanceDeploymentArtifacts(componentInstanceId)
373                 .values()
374                 .stream()
375                 .filter(artifact -> ArtifactTypeEnum.HEAT_ENV.name().equals(artifact.getArtifactType()))
376                 .collect(Collectors.toList());
377     }
378
379     public void setComponentInstances(List<ComponentInstance> resourceInstances) {
380         this.componentInstances = resourceInstances;
381     }
382
383     public List<RequirementCapabilityRelDef> getComponentInstancesRelations() {
384         return componentInstancesRelations;
385     }
386
387     public void setComponentInstancesRelations(List<RequirementCapabilityRelDef> resourceInstancesRelations) {
388         this.componentInstancesRelations = resourceInstancesRelations;
389     }
390
391     public Map<String, List<ComponentInstanceProperty>> getComponentInstancesProperties() {
392         return componentInstancesProperties;
393     }
394
395     public Map<String, List<ComponentInstanceProperty>> safeGetComponentInstancesProperties() {
396         return componentInstancesProperties == null ? emptyMap() : componentInstancesProperties;
397     }
398
399     public Map<String, List<ComponentInstanceInput>> safeGetComponentInstancesInputs() {
400         return componentInstancesInputs == null ? emptyMap() : componentInstancesInputs;
401     }
402
403     public List<ComponentInstanceProperty> safeGetComponentInstanceProperties(String cmptInstacneId) {
404         return this.safeGetComponentInstanceEntity(cmptInstacneId, this.componentInstancesProperties);
405     }
406
407     public List<ComponentInstanceInput> safeGetComponentInstanceInput(String comptInstanceId) {
408         return this.safeGetComponentInstanceEntity(comptInstanceId, this.componentInstancesInputs);
409     }
410
411     public void setComponentInstancesProperties(
412             Map<String, List<ComponentInstanceProperty>> resourceInstancesProperties) {
413         this.componentInstancesProperties = resourceInstancesProperties;
414     }
415
416     public Boolean getIsDeleted() {
417         return componentMetadataDefinition.getMetadataDataDefinition().isDeleted();
418     }
419
420     public void setIsDeleted(Boolean isDeleted) {
421         componentMetadataDefinition.getMetadataDataDefinition().setIsDeleted(isDeleted);
422     }
423
424     public String getProjectCode() {
425         return componentMetadataDefinition.getMetadataDataDefinition().getProjectCode();
426     }
427
428     public void setProjectCode(String projectCode) {
429         componentMetadataDefinition.getMetadataDataDefinition().setProjectCode(projectCode);
430     }
431
432     public String getCsarUUID() {
433         return componentMetadataDefinition.getMetadataDataDefinition().getCsarUUID();
434     }
435
436     public void setCsarUUID(String csarUUID) {
437         componentMetadataDefinition.getMetadataDataDefinition().setCsarUUID(csarUUID);
438     }
439
440     public String getCsarVersion() {
441         return componentMetadataDefinition.getMetadataDataDefinition().getCsarVersion();
442     }
443
444     public void setCsarVersion(String csarVersion) {
445         componentMetadataDefinition.getMetadataDataDefinition().setCsarVersion(csarVersion);
446     }
447
448     public String getImportedToscaChecksum() {
449         return componentMetadataDefinition.getMetadataDataDefinition().getImportedToscaChecksum();
450     }
451
452     public void setImportedToscaChecksum(String importedToscaChecksum) {
453         componentMetadataDefinition.getMetadataDataDefinition().setImportedToscaChecksum(importedToscaChecksum);
454     }
455
456     public String getInvariantUUID() {
457         return componentMetadataDefinition.getMetadataDataDefinition().getInvariantUUID();
458     }
459
460     public void setInvariantUUID(String invariantUUID) {
461         componentMetadataDefinition.getMetadataDataDefinition().setInvariantUUID(invariantUUID);
462     }
463
464     public Optional<ComponentInstance> getComponentInstanceById(String id) {
465         return getComponentInstanceByPredicate(instance -> id.equals(instance.getUniqueId()));
466     }
467
468     public Optional<ComponentInstance> getComponentInstanceByName(String name) {
469         return getComponentInstanceByPredicate(instance -> name.equals(instance.getName()));
470     }
471
472     private Optional<ComponentInstance> getComponentInstanceByPredicate(Predicate<ComponentInstance> predicate) {
473         if (componentInstances == null) {
474             return Optional.empty();
475         }
476         return componentInstances.stream().filter(predicate).findFirst();
477     }
478
479     public List<GroupDefinition> getGroups() {
480         return groups;
481     }
482
483     public List<GroupDefinition> safeGetGroups() {
484         return groups == null ? emptyList() : groups;
485     }
486
487     public Optional<GroupDefinition> getGroupById(String id) {
488         return getGroupByPredicate(group -> group.getUniqueId().equals(id));
489     }
490
491     public Optional<GroupDefinition> getGroupByInvariantName(String name) {
492         return getGroupByPredicate(group -> name.equals(group.getInvariantName()));
493     }
494
495     public boolean containsGroupWithInvariantName(String invariantName) {
496         return groups != null && groups.stream().anyMatch(gr -> invariantName.equals(gr.getInvariantName()));
497     }
498
499     private Optional<GroupDefinition> getGroupByPredicate(Predicate<GroupDefinition> predicate) {
500         if (groups == null) {
501             return Optional.empty();
502         }
503         return groups.stream()
504                      .filter(predicate)
505                      .findAny();
506     }
507
508     public void setGroups(List<GroupDefinition> groups) {
509         this.groups = groups;
510     }
511
512     public void addGroups(List<GroupDefinition> groupsToAdd) {
513         if (groups == null) {
514             groups = new ArrayList<>();
515         }
516         groups.addAll(groupsToAdd);
517     }
518
519     public Map<String, PolicyDefinition> getPolicies() {
520         return policies;
521     }
522
523     public void setPolicies(Map<String, PolicyDefinition> policies) {
524         this.policies = policies;
525     }
526
527     @Override
528     public int hashCode() {
529         final int prime = 31;
530         int result = 1;
531         result = prime * result + ((artifacts == null) ? 0 : artifacts.hashCode());
532         result = prime * result + ((categories == null) ? 0 : categories.hashCode());
533         result = prime * result + ((componentMetadataDefinition == null) ? 0 : componentMetadataDefinition.hashCode());
534         result = prime * result + ((deploymentArtifacts == null) ? 0 : deploymentArtifacts.hashCode());
535         result = prime * result + ((capabilities == null) ? 0 : capabilities.hashCode());
536         result = prime * result + ((requirements == null) ? 0 : requirements.hashCode());
537         result = prime * result + ((componentInstances == null) ? 0 : componentInstances.hashCode());
538         result = prime * result
539                 + ((componentInstancesProperties == null) ? 0 : componentInstancesProperties.hashCode());
540         result = prime * result
541                 + ((componentInstancesAttributes == null) ? 0 : componentInstancesAttributes.hashCode());
542         result = prime * result + ((componentInstancesInputs == null) ? 0 : componentInstancesInputs.hashCode());
543         result = prime * result + ((componentInstancesRelations == null) ? 0 : componentInstancesRelations.hashCode());
544         result = prime * result + ((groups == null) ? 0 : groups.hashCode());
545         result = prime * result + ((policies == null) ? 0 : policies.hashCode());
546         result = prime * result + ((derivedFromGenericType == null) ? 0 : derivedFromGenericType.hashCode());
547         result = prime * result + ((derivedFromGenericVersion == null) ? 0 : derivedFromGenericVersion.hashCode());
548         return result;
549     }
550
551     @Override
552     public boolean equals(Object obj) {
553         if (this == obj) {
554             return true;
555         }
556         if (obj == null) {
557             return false;
558         }
559         if (getClass() != obj.getClass()) {
560             return false;
561         }
562         Component other = (Component) obj;
563         if (artifacts == null) {
564             if (other.artifacts != null) {
565                 return false;
566             }
567         }
568         else if (!artifacts.equals(other.artifacts)) {
569             return false;
570         }
571         if (categories == null) {
572             if (other.categories != null) {
573                 return false;
574             }
575         }
576         else if (!categories.equals(other.categories)) {
577             return false;
578         }
579         if (componentMetadataDefinition == null) {
580             if (other.componentMetadataDefinition != null) {
581                 return false;
582             }
583         }
584         else if (!componentMetadataDefinition.equals(other.componentMetadataDefinition)) {
585             return false;
586         }
587
588         if (deploymentArtifacts == null) {
589             if (other.deploymentArtifacts != null) {
590                 return false;
591             }
592         }
593         else if (!deploymentArtifacts.equals(other.deploymentArtifacts)) {
594             return false;
595         }
596
597         if (componentInstances == null) {
598             if (other.componentInstances != null) {
599                 return false;
600             }
601         }
602         else if (!componentInstances.equals(other.componentInstances)) {
603             return false;
604         }
605         if (componentInstancesProperties == null) {
606             if (other.componentInstancesProperties != null) {
607                 return false;
608             }
609         }
610         else if (!componentInstancesProperties.equals(other.componentInstancesProperties)) {
611             return false;
612         }
613
614         if (!Objects.equals(componentInstancesAttributes, other.componentInstancesAttributes)) {
615             return false;
616         }
617         if (!Objects.equals(componentInstancesInputs, other.componentInstancesInputs)) {
618             return false;
619         }
620         if (componentInstancesRelations == null) {
621             if (other.componentInstancesRelations != null) {
622                 return false;
623             }
624         }
625         else if (!componentInstancesRelations.equals(other.componentInstancesRelations)) {
626             return false;
627         }
628         if (requirements == null) {
629             if (other.requirements != null) {
630                 return false;
631             }
632         }
633         else if (!requirements.equals(other.requirements)) {
634             return false;
635         }
636         if (capabilities == null) {
637             if (other.capabilities != null) {
638                 return false;
639             }
640         }
641         else if (!capabilities.equals(other.capabilities)) {
642             return false;
643         }
644         if (groups == null) {
645             if (other.groups != null) {
646                 return false;
647             }
648         }
649         else if (!groups.equals(other.groups)) {
650             return false;
651         }
652         if (policies == null) {
653             if (other.policies != null) {
654                 return false;
655             }
656         }
657         else if (!policies.equals(other.policies)) {
658             return false;
659         }
660         if (derivedFromGenericType == null) {
661             if (other.derivedFromGenericType != null) {
662                 return false;
663             }
664         }
665         else if (!derivedFromGenericType.equals(other.derivedFromGenericType)) {
666             return false;
667         }
668         if (derivedFromGenericVersion == null) {
669             if (other.derivedFromGenericVersion != null) {
670                 return false;
671             }
672         }
673         else if (!derivedFromGenericVersion.equals(other.derivedFromGenericVersion)) {
674             return false;
675         }
676         return true;
677     }
678
679     public void addCategory(String category, String subCategory) {
680         if (category != null || subCategory != null) {
681             if (categories == null) {
682                 categories = new ArrayList<>();
683             }
684             CategoryDefinition selectedCategory = null;
685             for (CategoryDefinition categoryDef : categories) {
686                 if (categoryDef.getName().equals(category)) {
687                     selectedCategory = categoryDef;
688                 }
689             }
690             if (selectedCategory == null) {
691                 selectedCategory = new CategoryDefinition();
692                 selectedCategory.setName(category);
693                 categories.add(selectedCategory);
694             }
695             List<SubCategoryDefinition> subcategories = selectedCategory.getSubcategories();
696             if (subcategories == null) {
697                 subcategories = new ArrayList<>();
698                 selectedCategory.setSubcategories(subcategories);
699             }
700             SubCategoryDefinition selectedSubcategory = null;
701             for (SubCategoryDefinition subcategory : subcategories) {
702                 if (subcategory.getName().equals(subCategory)) {
703                     selectedSubcategory = subcategory;
704                 }
705             }
706             if (selectedSubcategory == null) {
707                 selectedSubcategory = new SubCategoryDefinition();
708                 selectedSubcategory.setName(subCategory);
709                 subcategories.add(selectedSubcategory);
710             }
711         }
712     }
713
714     public void addCategory(CategoryDefinition category) {
715         addCategory(category, null);
716     }
717
718     public void addCategory(CategoryDefinition category, SubCategoryDefinition subCategory) {
719         if (categories == null) {
720             categories = new ArrayList<>();
721         }
722         boolean foundCat = false;
723         for (CategoryDefinition cat : categories) {
724             if (cat.getName().equals(category.getName())) {
725                 foundCat = true;
726                 if (subCategory != null) {
727                     List<SubCategoryDefinition> subcategories = cat.getSubcategories();
728                     if (subcategories == null) {
729                         subcategories = new ArrayList<>();
730                         cat.setSubcategories(subcategories);
731                     }
732                     for (SubCategoryDefinition subcat : subcategories) {
733                         boolean foundSub = false;
734                         if (subcat.getName().equals(subCategory.getName())) {
735                             foundSub = true;
736                         }
737                         if (!foundSub) {
738                             subcategories.add(subCategory);
739                             break;
740                         }
741                     }
742                 }
743             }
744         }
745         if (!foundCat) {
746             if (subCategory != null) {
747                 category.addSubCategory(subCategory);
748             }
749             categories.add(category);
750         }
751     }
752
753     public Map<String, List<ComponentInstanceProperty>> getComponentInstancesAttributes() {
754         return componentInstancesAttributes;
755     }
756
757     public void setComponentInstancesAttributes(
758             Map<String, List<ComponentInstanceProperty>> componentInstancesAttributes) {
759         this.componentInstancesAttributes = componentInstancesAttributes;
760     }
761
762     public Map<String, List<ComponentInstanceInput>> getComponentInstancesInputs() {
763         return componentInstancesInputs;
764     }
765
766     public Map<String, List<PropertyDataDefinition>> safeGetGroupsProperties() {
767         if (isEmpty(groups)) {
768             return emptyMap();
769         }
770         return groups.stream()
771               .filter(gr -> Objects.nonNull(gr.getProperties()))
772               .collect(toMap(GroupDataDefinition::getUniqueId,
773                              GroupDataDefinition::getProperties));
774     }
775
776     public Map<String, List<PropertyDataDefinition>> safeGetPolicyProperties() {
777         if (isEmpty(policies)) {
778             return emptyMap();
779         }
780         return policies.values()
781                 .stream()
782                 .filter(policy -> Objects.nonNull(policy.getProperties()))
783                 .collect(toMap(PolicyDataDefinition::getUniqueId,
784                                PolicyDataDefinition::getProperties));
785     }
786
787     public List<ComponentInstanceInput> safeGetComponentInstanceInputsByName(String cmptInstanceName) {
788         List<ComponentInstanceInput> emptyPropsList = emptyList();
789         if (this.componentInstancesInputs == null) {
790             return emptyPropsList;
791         }
792         return this.componentInstances.stream()
793                                       .filter(ci -> ci.getName().equals(cmptInstanceName))
794                                       .map(ComponentInstance::getUniqueId)
795                                       .map(instanceId -> safeGetComponentInstanceEntity(instanceId, this.componentInstancesInputs))
796                                       .findAny()
797                                       .orElse(emptyPropsList);
798     }
799
800     private <T> List<T> safeGetComponentInstanceEntity(String cmptInstanceId, Map<String, List<T>> instanceEntities) {
801         List<T> emptyPropsList = emptyList();
802         if (instanceEntities == null) {
803             return emptyPropsList;
804         }
805         List<T> cmptInstanceProps = instanceEntities.get(cmptInstanceId);
806         return cmptInstanceProps == null ? emptyPropsList : cmptInstanceProps;
807     }
808
809
810     public void setComponentInstancesInputs(Map<String, List<ComponentInstanceInput>> componentInstancesInputs) {
811         this.componentInstancesInputs = componentInstancesInputs;
812     }
813
814     public void setSpecificComponetTypeArtifacts(Map<String, ArtifactDefinition> specificComponentTypeArtifacts) {
815         // Implement where needed
816     }
817
818     public void setMetadataDefinition(ComponentMetadataDefinition metadataDefinition) {
819         this.componentMetadataDefinition = metadataDefinition;
820     }
821
822     public String fetchGenericTypeToscaNameFromConfig() {
823         // Implement where needed
824         return ConfigurationManager.getConfigurationManager()
825                                    .getConfiguration()
826                                    .getGenericAssetNodeTypes()
827                                    .get(this.assetType());
828     }
829
830     public String assetType() {
831         // Implement where needed
832         return this.getComponentType().getValue();
833     }
834
835     public boolean shouldGenerateInputs() {
836         // Implement where needed
837         return true;
838     }
839
840     public boolean deriveFromGeneric() {
841         // Implement where needed
842         return true;
843     }
844
845     public void setDerivedFromGenericInfo(Resource genericType) {
846         derivedFromGenericType = genericType.getToscaResourceName();
847         derivedFromGenericVersion = genericType.getVersion();
848     }
849
850     public boolean isTopologyTemplate() {
851         return ToscaElementTypeEnum.TOPOLOGY_TEMPLATE.getValue().equals(toscaType);
852     }
853
854     public String getToscaType() {
855         return toscaType;
856     }
857
858     public void setToscaType(String toscaType) {
859         this.toscaType = toscaType;
860     }
861
862     public List<AdditionalInformationDefinition> getAdditionalInformation() {
863         return additionalInformation;
864     }
865
866     public void setAdditionalInformation(List<AdditionalInformationDefinition> additionalInformation) {
867         this.additionalInformation = additionalInformation;
868     }
869
870     public PolicyDefinition getPolicyById(String id) {
871         return policies != null ? policies.get(id) : null;
872     }
873
874     public List<PolicyDefinition> resolvePoliciesList() {
875         if (policies == null) {
876             return emptyList();
877         }
878         return new ArrayList<>(policies.values());
879     }
880
881     public List<PolicyDefinition> resolvePoliciesContainingTarget(String targetId, PolicyTargetType targetType) {
882         Predicate<PolicyDefinition> containsTarget = policy -> policy.containsTarget(targetId, targetType);
883         return resolvePoliciesByPredicate(containsTarget);
884     }
885
886     private List<PolicyDefinition> resolvePoliciesByPredicate(Predicate<PolicyDefinition> policyPredicate) {
887         if (policies == null) {
888             return emptyList();
889         }
890         return policies.values().stream()
891                        .filter(policyPredicate)
892                        .collect(Collectors.toList());
893     }
894
895     public List<GroupDefinition> resolveGroupsByMember(String instanceId) {
896         if (groups == null) {
897             return emptyList();
898         }
899         return groups.stream()
900                      .filter(group -> group.containsInstanceAsMember(instanceId))
901                      .collect(Collectors.toList());
902     }
903
904     public String getActualComponentType() {
905         return componentMetadataDefinition.getMetadataDataDefinition().getActualComponentType();
906     }
907
908     public Boolean isArchived() { return componentMetadataDefinition.getMetadataDataDefinition().isArchived(); }
909
910     public void setArchived(Boolean archived) { componentMetadataDefinition.getMetadataDataDefinition().setArchived(archived); }
911
912     public Long getArchiveTime() { return componentMetadataDefinition.getMetadataDataDefinition().getArchiveTime(); }
913
914     public void setArchiveTime(Long archiveTime) { componentMetadataDefinition.getMetadataDataDefinition().setArchiveTime(archiveTime); }
915
916     public Boolean isVspArchived() { return componentMetadataDefinition.getMetadataDataDefinition().isVspArchived();    }
917
918     public void setVspArchived(Boolean vspArchived) { componentMetadataDefinition.getMetadataDataDefinition().setVspArchived(vspArchived); }
919
920 }