Add collaboration feature
[sdc.git] / openecomp-be / lib / openecomp-sdc-vendor-software-product-lib / openecomp-sdc-vendor-software-product-core / src / main / java / org / openecomp / sdc / vendorsoftwareproduct / services / impl / filedatastructuremodule / ManifestCreatorNamingConventionImpl.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.vendorsoftwareproduct.services.impl.filedatastructuremodule;
22
23 import org.apache.commons.collections4.CollectionUtils;
24 import org.openecomp.core.utilities.file.FileContentHandler;
25 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
26 import org.openecomp.sdc.heat.datatypes.manifest.ManifestContent;
27 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
28 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
29 import org.openecomp.sdc.vendorsoftwareproduct.services.HeatFileAnalyzer;
30 import org.openecomp.sdc.vendorsoftwareproduct.services.filedatastructuremodule.ManifestCreator;
31 import org.openecomp.sdc.vendorsoftwareproduct.types.candidateheat.AnalyzedZipHeatFiles;
32 import org.openecomp.sdc.vendorsoftwareproduct.types.candidateheat.Constants;
33 import org.openecomp.sdc.vendorsoftwareproduct.types.candidateheat.FilesDataStructure;
34 import org.openecomp.sdc.vendorsoftwareproduct.types.candidateheat.Module;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38 import java.util.ArrayList;
39 import java.util.Collection;
40 import java.util.HashSet;
41 import java.util.List;
42 import java.util.Map;
43 import java.util.Objects;
44 import java.util.Optional;
45 import java.util.Set;
46 import java.util.regex.Pattern;
47
48 public class ManifestCreatorNamingConventionImpl implements ManifestCreator {
49   protected static final Logger logger =
50       LoggerFactory.getLogger(ManifestCreatorNamingConventionImpl.class);
51   private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
52
53
54   @Override
55   public Optional<ManifestContent> createManifest(
56       VspDetails vspDetails, FilesDataStructure filesDataStructure) {
57
58
59     mdcDataDebugMessage.debugEntryMessage(null, null);
60
61     if (Objects.isNull(filesDataStructure)) {
62       return Optional.empty();
63     }
64
65     List<FileData> fileDataList = new ArrayList<>();
66     addModulesToManifestFileDataList(filesDataStructure, fileDataList);
67     addNestedToManifest(filesDataStructure, fileDataList);
68     addArtifactsToManifestFileDataList(filesDataStructure, fileDataList);
69     ManifestContent manifestContent = createManifest(vspDetails, fileDataList);
70
71     mdcDataDebugMessage.debugExitMessage(null);
72     return Optional.of(manifestContent);
73   }
74
75   private void addNestedToManifest(
76       FilesDataStructure filesDataStructure, List<FileData> fileDataList) {
77
78
79     mdcDataDebugMessage.debugEntryMessage(null);
80
81     if (CollectionUtils.isNotEmpty(filesDataStructure.getNested())) {
82       for (String nested : filesDataStructure.getNested()) {
83         fileDataList.add(createBaseFileData(FileData.Type.HEAT, nested));
84       }
85     }
86
87     mdcDataDebugMessage.debugExitMessage(null);
88   }
89
90   @Override
91   public Optional<ManifestContent> createManifest(VspDetails vspDetails,
92                                                   FileContentHandler fileContentHandler,
93                                                   AnalyzedZipHeatFiles analyzedZipHeatFiles) {
94     logger.info("Trying to generate manifest");
95     if (Objects.isNull(fileContentHandler)
96         || CollectionUtils.isEmpty(fileContentHandler.getFileList())) {
97       logger.info("fileContentHandler or filesList is empty. ManifestContent will not be created");
98       return Optional.empty();
99     }
100
101     Map<String, byte[]> files = fileContentHandler.getFiles();
102
103     List<FileData> fileDataList =
104         createFileDataListFromZipFiles(fileContentHandler, files,
105             analyzedZipHeatFiles.getFilesNotEligbleForModules());
106     ManifestContent manifestContent = createManifest(vspDetails, fileDataList);
107
108     return Optional.of(manifestContent);
109   }
110
111   private ManifestContent createManifest(VspDetails vspDetails, List<FileData> fileDataList) {
112     ManifestContent manifestContent = new ManifestContent();
113     manifestContent.setName(vspDetails.getName());
114     manifestContent.setDescription(vspDetails.getDescription());
115     manifestContent
116         .setVersion(vspDetails.getVersion() == null ? null : vspDetails.getVersion().toString());
117     // vsp version, need to check in confluence
118     manifestContent.setData(fileDataList);
119     return manifestContent;
120   }
121
122   private List<FileData> createFileDataListFromZipFiles(FileContentHandler fileContentHandler,
123                                                         Map<String, byte[]> files,
124                                                         Collection<String> filesNotEligibleForModules) {
125
126     Set<String> processedFiles = new HashSet<>();
127     List<FileData> fileDataList = new ArrayList<>();
128     for (String fileName : files.keySet()) {
129       if (processedFiles.contains(fileName)) {
130         continue;
131       }
132       if (isFileBaseFile(fileName)) {
133         fileDataList
134             .add(createModuleFileData(
135                 fileName, true, processedFiles, fileContentHandler.getFileList(), fileDataList));
136       } else if (isFileModuleFile(fileName, filesNotEligibleForModules)) {
137         fileDataList
138             .add(createModuleFileData(
139                 fileName, false, processedFiles, fileContentHandler.getFileList(), fileDataList));
140       } else {
141         if (HeatFileAnalyzer.isYamlFile(fileName)) {
142           fileDataList.add(createBasicFileData(fileName, FileData.Type.HEAT, null));
143         } else if (HeatFileAnalyzer.isEnvFile(fileName)) {
144           fileDataList.add(createBasicFileData(fileName, FileData.Type.HEAT_ENV, null));
145         } else {
146           fileDataList.add(createBasicFileData(fileName, FileData.Type.OTHER, null));
147         }
148       }
149     }
150     return fileDataList;
151   }
152
153   private boolean doesHeatTemplateVersionExist(byte[] value) {
154     return false;
155   }
156
157   private boolean isFileModuleFile(String fileName, Collection<String> filesCannotBeModule) {
158     return !filesCannotBeModule.contains(fileName);
159   }
160
161   @Override
162   public boolean isFileBaseFile(String fileName) {
163     return Pattern.matches(Constants.BASE_HEAT_REGEX, fileName) && !isVolFile(fileName);
164   }
165
166
167   private void addArtifactsToManifestFileDataList(
168       FilesDataStructure filesDataStructure, List<FileData> fileDataList) {
169
170
171     mdcDataDebugMessage.debugEntryMessage(null);
172
173     Collection<String> forArtifacts = CollectionUtils
174         .union(filesDataStructure.getArtifacts(), filesDataStructure.getUnassigned());
175     if (CollectionUtils.isNotEmpty(forArtifacts)) {
176       for (String artifact : forArtifacts) {
177         fileDataList.add(createBaseFileData(FileData.Type.OTHER, artifact));
178       }
179     }
180
181     mdcDataDebugMessage.debugExitMessage(null);
182   }
183
184   private void addModulesToManifestFileDataList(
185       FilesDataStructure filesDataStructure, List<FileData> fileDataList) {
186
187
188     mdcDataDebugMessage.debugEntryMessage(null);
189
190     if (CollectionUtils.isNotEmpty(filesDataStructure.getModules())) {
191       for (Module module : filesDataStructure.getModules()) {
192         FileData fileData = createBaseFileData(FileData.Type.HEAT, module.getYaml());
193         fileData.setBase(module.getIsBase());
194         addEnv(module, fileData);
195         addVolume(module, fileData);
196         fileDataList.add(fileData);
197       }
198     }
199
200     mdcDataDebugMessage.debugExitMessage(null);
201   }
202
203   private void addEnv(Module module, FileData fileData) {
204     if (Objects.nonNull(module.getEnv())) {
205       FileData env = createBaseFileData(FileData.Type.HEAT_ENV, module.getEnv());
206       fileData.addFileData(env);
207     }
208   }
209
210   private void addVolume(Module module, FileData fileData) {
211     String volModule = module.getVol();
212     if (Objects.nonNull(volModule)) {
213       FileData vol = createBaseFileData(FileData.Type.HEAT_VOL, volModule);
214       if (Objects.nonNull(module.getVolEnv())) {
215         vol.addFileData(createBaseFileData(FileData.Type.HEAT_ENV, module.getVolEnv()));
216       }
217       fileData.addFileData(vol);
218     }
219   }
220
221   private FileData createBaseFileData(FileData.Type heat, String yaml) {
222     FileData fileData = new FileData();
223     fileData.setType(heat);
224     fileData.setFile(yaml);
225     return fileData;
226   }
227
228   private FileData createModuleFileData(
229       String moduleFileName, boolean isBase, Set<String> processedFiles,
230       Set<String> fileNames, List<FileData> fileDataList) {
231     FileData moduleFileData = createBasicFileData(moduleFileName, FileData.Type.HEAT, isBase);
232     Optional<String> volFile = fetchRelatedVolume(moduleFileName, fileNames);
233     volFile.ifPresent(vol -> {
234       markFileAsProcessed(vol, processedFiles);
235       removeFromFileDataListIfAlreadyProcessed(fileDataList, vol);
236       FileData volFileData = createBasicFileData(vol, FileData.Type.HEAT_VOL, null);
237       Optional<String> envFile = fetchRelatedEnv(vol, fileNames);
238       envFile.ifPresent(env -> {
239         markFileAsProcessed(env, processedFiles);
240         removeFromFileDataListIfAlreadyProcessed(fileDataList, env);
241         FileData envFileData = createBasicFileData(env, FileData.Type.HEAT_ENV, null);
242         volFileData.addFileData(envFileData);
243       });
244       moduleFileData.addFileData(volFileData);
245     });
246     Optional<String> envFile = fetchRelatedEnv(moduleFileName, fileNames);
247     envFile.ifPresent(env -> {
248       markFileAsProcessed(env, processedFiles);
249       FileData envFileData = createBasicFileData(env, FileData.Type.HEAT_ENV, null);
250       moduleFileData.addFileData(envFileData);
251     });
252     return moduleFileData;
253   }
254
255   private void removeFromFileDataListIfAlreadyProcessed(List<FileData> fileDataList, String vol) {
256     fileDataList.removeIf(fileData -> fileData.getFile().equals(vol));
257   }
258
259   private FileData createBasicFileData(String fileName, FileData.Type type, Boolean isBase) {
260     FileData fileData = new FileData();
261     if (isBase != null) {
262       fileData.setBase(isBase);
263     }
264     fileData.setType(type);
265     fileData.setFile(fileName);
266     return fileData;
267   }
268
269   private Optional<String> fetchRelatedEnv(String fileName, Set<String> fileNames) {
270     String envFileName
271         = fileName.substring(0, fileName.lastIndexOf(".")) + Constants.ENV_FILE_EXTENSION;
272     return fileNames.contains(envFileName) ? Optional.of(envFileName) : Optional.empty();
273   }
274
275   private Optional<String> fetchRelatedVolume(String fileName, Set<String> fileNames) {
276
277     String volFile1stExt =
278         extractVolFileName(fileName, ".yaml");
279     String volFile2ndExt =
280         extractVolFileName(fileName, ".yml");
281
282     if (fileNames.contains(volFile1stExt)) {
283       return Optional.of(volFile1stExt);
284     }
285     if (fileNames.contains(volFile2ndExt)) {
286       return Optional.of(volFile2ndExt);
287     }
288     return Optional.empty();
289   }
290
291   private String extractVolFileName(String fileName, String fileExt) {
292     return fileName.substring(
293         0, fileName.lastIndexOf("."))
294         + Constants.VOL_FILE_NAME_SUFFIX + fileExt;
295   }
296
297
298   private boolean isVolFile(String fileName) {
299     return fileName
300         .endsWith(
301             Constants.VOL_FILE_NAME_SUFFIX + ".yaml")
302         || fileName.endsWith(Constants.VOL_FILE_NAME_SUFFIX + ".yml");
303   }
304
305
306   private void markFileAsProcessed(String fileName, Set<String> processedFiles) {
307     processedFiles.add(fileName);
308   }
309 }