Update vulnerable package dependencies
[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 package org.openecomp.sdc.be.tosca.utils;
17
18 import java.io.File;
19 import java.util.HashMap;
20 import java.util.HashSet;
21 import java.util.Map;
22 import java.util.Objects;
23 import java.util.Set;
24 import java.util.stream.Collectors;
25 import org.apache.commons.collections.MapUtils;
26 import org.apache.commons.text.WordUtils;
27 import org.openecomp.sdc.be.components.impl.ImportUtils.Constants;
28 import org.openecomp.sdc.be.datatypes.components.ResourceMetadataDataDefinition;
29 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
30 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
31 import org.openecomp.sdc.be.model.ArtifactDefinition;
32 import org.openecomp.sdc.be.model.Component;
33 import org.openecomp.sdc.be.model.ComponentInstance;
34 import org.openecomp.sdc.be.model.InterfaceDefinition;
35 import org.openecomp.sdc.be.model.Operation;
36 import org.openecomp.sdc.be.model.Resource;
37 import org.openecomp.sdc.be.model.Service;
38 import org.openecomp.sdc.be.tosca.CsarUtils;
39 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
40 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
41
42 public class OperationArtifactUtil {
43
44     public static final String BPMN_ARTIFACT_PATH = "BPMN";
45
46     private OperationArtifactUtil() {
47         //Hiding implicit public constructor
48     }
49
50     /**
51      * This method assumes that operation.getImplementation() is not NULL  ( it should be verified by the caller method)
52      *
53      * @param operation the specific operation name
54      * @return the full path including file name for operation's artifacts
55      */
56     public static String createOperationArtifactPath(Component component, ComponentInstance componentInstance, OperationDataDefinition operation,
57                                                      boolean isAssociatedComponent) {
58         if (!(component instanceof Resource || component instanceof Service)) {
59             return null;
60         }
61         if (isAssociatedComponent) {
62             // Service Proxy is only in Node Template interface
63             if (componentInstance != null) {
64                 return createOperationArtifactPathInService(
65                     componentInstance.getToscaComponentName() + "_v" + componentInstance.getComponentVersion(), operation);
66             }
67             // Resource Instance is part of Node Type interface
68             else {
69                 ResourceMetadataDataDefinition resourceMetadataDataDefinition = (ResourceMetadataDataDefinition) component
70                     .getComponentMetadataDefinition().getMetadataDataDefinition();
71                 return createOperationArtifactPathInService(resourceMetadataDataDefinition.getToscaResourceName() + "_v" + component.getVersion(),
72                     operation);
73             }
74         }
75         return createOperationArtifactPathInComponent(operation);
76     }
77
78     private static String createOperationArtifactPathInComponent(OperationDataDefinition operation) {
79         final String implementationArtifactName = operation.getImplementation().getArtifactName();
80         if (artifactNameIsALiteralValue(implementationArtifactName)) {
81             return implementationArtifactName.substring(1, implementationArtifactName.length() - 1);
82         } else {
83             return CsarUtils.ARTIFACTS + File.separator + WordUtils.capitalizeFully(ArtifactGroupTypeEnum.DEPLOYMENT.name()) + File.separator
84                 + ArtifactTypeEnum.WORKFLOW.getType() + File.separator + BPMN_ARTIFACT_PATH + File.separator + implementationArtifactName;
85         }
86     }
87
88     public static boolean artifactNameIsALiteralValue(final String artifactName) {
89         return (artifactName.startsWith(Constants.QUOTE) || artifactName.startsWith(Constants.ESCAPED_DOUBLE_QUOTE)) && (
90             artifactName.endsWith(Constants.QUOTE) || artifactName.endsWith(Constants.ESCAPED_DOUBLE_QUOTE));
91     }
92
93     private static String createOperationArtifactPathInService(String toscaComponentName, OperationDataDefinition operation) {
94         return CsarUtils.ARTIFACTS + File.separator + toscaComponentName + File.separator + WordUtils
95             .capitalizeFully(ArtifactGroupTypeEnum.DEPLOYMENT.name()) + File.separator + ArtifactTypeEnum.WORKFLOW.getType() + File.separator
96             + BPMN_ARTIFACT_PATH + File.separator + operation.getImplementation().getArtifactName();
97     }
98
99     public static Map<String, ArtifactDefinition> getDistinctInterfaceOperationArtifactsByName(Component originComponent) {
100         Map<String, ArtifactDefinition> distinctInterfaceArtifactsByName = new HashMap<>();
101         Map<String, InterfaceDefinition> interfaces = originComponent.getInterfaces();
102         if (MapUtils.isEmpty(interfaces)) {
103             return distinctInterfaceArtifactsByName;
104         }
105         Map<String, ArtifactDefinition> interfaceArtifacts = interfaces.values().stream()
106             .flatMap(interfaceDefinition -> interfaceDefinition.getOperationsMap().values().stream()).map(Operation::getImplementationArtifact)
107             .filter(Objects::nonNull)
108             .collect(Collectors.toMap(ArtifactDataDefinition::getUniqueId, artifactDefinition -> artifactDefinition, (a1, a2) -> a1));
109         if (MapUtils.isNotEmpty(interfaceArtifacts)) {
110             Set<String> artifactNameSet = new HashSet<>();
111             for (Map.Entry<String, ArtifactDefinition> interfaceArtifactEntry : interfaceArtifacts.entrySet()) {
112                 String artifactName = interfaceArtifactEntry.getValue().getArtifactName();
113                 if (artifactNameSet.contains(artifactName)) {
114                     continue;
115                 }
116                 distinctInterfaceArtifactsByName.put(interfaceArtifactEntry.getKey(), interfaceArtifactEntry.getValue());
117                 artifactNameSet.add(artifactName);
118             }
119         }
120         return distinctInterfaceArtifactsByName;
121     }
122 }