Catalog alignment
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / tosca / utils / OperationArtifactUtil.java
1 /*
2  * Copyright © 2016-2018 European Support Limited
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.openecomp.sdc.be.tosca.utils;
18
19 import org.apache.commons.collections.MapUtils;
20 import org.apache.commons.lang.WordUtils;
21 import org.openecomp.sdc.be.datatypes.components.ResourceMetadataDataDefinition;
22 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
23 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
24 import org.openecomp.sdc.be.model.ArtifactDefinition;
25 import org.openecomp.sdc.be.model.Component;
26 import org.openecomp.sdc.be.model.ComponentInstance;
27 import org.openecomp.sdc.be.model.InterfaceDefinition;
28 import org.openecomp.sdc.be.model.Operation;
29 import org.openecomp.sdc.be.model.Resource;
30 import org.openecomp.sdc.be.model.Service;
31 import org.openecomp.sdc.be.tosca.CsarUtils;
32 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
33 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
34
35 import java.io.File;
36 import java.util.HashMap;
37 import java.util.HashSet;
38 import java.util.Map;
39 import java.util.Objects;
40 import java.util.Set;
41 import java.util.stream.Collectors;
42
43 public class OperationArtifactUtil {
44
45     public static final String BPMN_ARTIFACT_PATH = "BPMN";
46
47     private OperationArtifactUtil() {
48         //Hiding implicit public constructor
49     }
50
51     /**
52      * This method assumes that operation.getImplementation() is not NULL  ( it should be verified by the caller method)
53      *
54      * @param operation     the specific operation name
55      * @return the full path including file name for operation's artifacts
56      */
57     public static String createOperationArtifactPath(Component component, ComponentInstance componentInstance,
58                                               OperationDataDefinition operation, boolean isAssociatedComponent) {
59         if (!(component instanceof Resource || component instanceof Service)) {
60             return null;
61         }
62
63         if (isAssociatedComponent) {
64             // Service Proxy is only in Node Template interface
65             if(componentInstance != null) {
66                 return createOperationArtifactPathInService(componentInstance.getToscaComponentName()
67                                                                     + "_v" + componentInstance.getComponentVersion(), operation);
68             }
69             // Resource Instance is part of Node Type interface
70             else {
71                 ResourceMetadataDataDefinition resourceMetadataDataDefinition =
72                         (ResourceMetadataDataDefinition) component.getComponentMetadataDefinition().getMetadataDataDefinition();
73                 return createOperationArtifactPathInService(resourceMetadataDataDefinition.getToscaResourceName()
74                                                                     + "_v" + component.getVersion(), operation);
75             }
76         }
77         return createOperationArtifactPathInComponent(operation);
78     }
79
80
81     private static String createOperationArtifactPathInComponent(OperationDataDefinition operation) {
82         return CsarUtils.ARTIFACTS + File.separator + WordUtils.capitalizeFully(ArtifactGroupTypeEnum.DEPLOYMENT.name())
83                 + File.separator + ArtifactTypeEnum.WORKFLOW.name() + File.separator + BPMN_ARTIFACT_PATH
84                 + File.separator + operation.getImplementation().getArtifactName();
85     }
86
87     private static String createOperationArtifactPathInService(String toscaComponentName,
88                                                           OperationDataDefinition operation) {
89         return CsarUtils.ARTIFACTS + File.separator + toscaComponentName + File.separator +
90                 WordUtils.capitalizeFully(ArtifactGroupTypeEnum.DEPLOYMENT.name()) + File.separator +
91                 ArtifactTypeEnum.WORKFLOW.name() + File.separator + BPMN_ARTIFACT_PATH + File.separator +
92                 operation.getImplementation().getArtifactName();
93     }
94
95     public static Map<String, ArtifactDefinition> getDistinctInterfaceOperationArtifactsByName(Component originComponent) {
96         Map<String, ArtifactDefinition> distinctInterfaceArtifactsByName = new HashMap<>();
97         Map<String, InterfaceDefinition> interfaces = originComponent.getInterfaces();
98         if (MapUtils.isEmpty(interfaces)) {
99             return distinctInterfaceArtifactsByName;
100         }
101         Map<String, ArtifactDefinition> interfaceArtifacts = interfaces.values().stream()
102                 .flatMap(interfaceDefinition -> interfaceDefinition.getOperationsMap().values().stream())
103                 .map(Operation::getImplementationArtifact).filter(Objects::nonNull)
104                 .collect(Collectors.toMap(ArtifactDataDefinition::getUniqueId,
105                         artifactDefinition -> artifactDefinition, (a1, a2) -> a1));
106         if (MapUtils.isNotEmpty(interfaceArtifacts)) {
107             Set<String> artifactNameSet = new HashSet<>();
108             for (Map.Entry<String, ArtifactDefinition> interfaceArtifactEntry : interfaceArtifacts.entrySet()) {
109                 String artifactName = interfaceArtifactEntry.getValue().getArtifactName();
110                 if (artifactNameSet.contains(artifactName)) {
111                     continue;
112                 }
113                 distinctInterfaceArtifactsByName.put(interfaceArtifactEntry.getKey(),
114                         interfaceArtifactEntry.getValue());
115                 artifactNameSet.add(artifactName);
116             }
117
118         }
119         return distinctInterfaceArtifactsByName;
120     }
121 }