Create new VSP, onboard from TOSCA file - UI
[sdc.git] / openecomp-be / lib / openecomp-heat-lib / src / main / java / org / openecomp / sdc / heat / services / tree / ToscaTreeManager.java
1 package org.openecomp.sdc.heat.services.tree;
2
3 import org.openecomp.core.utilities.file.FileContentHandler;
4 import org.openecomp.sdc.common.utils.SdcCommon;
5 import org.openecomp.sdc.datatypes.error.ErrorMessage;
6 import org.openecomp.sdc.heat.datatypes.structure.Artifact;
7 import org.openecomp.sdc.heat.datatypes.structure.HeatStructureTree;
8 import org.openecomp.sdc.logging.api.Logger;
9 import org.openecomp.sdc.logging.api.LoggerFactory;
10
11 import java.io.File;
12 import java.util.HashMap;
13 import java.util.List;
14 import java.util.Map;
15 import java.util.regex.Pattern;
16
17 public class ToscaTreeManager {
18
19   private static Logger logger = (Logger) LoggerFactory.getLogger(ToscaTreeManager.class);
20
21   private FileContentHandler csarContentMap = new FileContentHandler();
22   private byte[] manifest;
23   private HeatStructureTree tree = new HeatStructureTree();
24   private Map<String, Artifact> artifactRef = new HashMap<>();
25   private Map<String, HeatStructureTree> fileTreeRef = new HashMap<>();
26
27
28   public void addFile(String fileName, byte[] content) {
29     if (fileName.equals(SdcCommon.CSAR_MANIFEST_NAME)) {
30       manifest = content;
31
32     } else {
33       csarContentMap.addFile(fileName, content);
34     }
35   }
36
37   public void createTree(){
38     if (manifest == null) {
39       logger.error("Missing manifest file in the zip.");
40       return;
41     }
42
43     for(Map.Entry<String, byte[]> fileEntry : csarContentMap.getFiles().entrySet()){
44       String[] splitFilename = getFullFileNameAsArray(fileEntry.getKey());
45       addFileToTree(splitFilename, 0, tree);
46     }
47
48
49   }
50
51   private void addFileToTree(String[] splitFilename, int startIndex, HeatStructureTree parent){
52     fileTreeRef.putIfAbsent(splitFilename[startIndex], new HeatStructureTree());
53     HeatStructureTree heatStructureTree = fileTreeRef.get(splitFilename[startIndex]);
54     heatStructureTree.setFileName(splitFilename[startIndex]);
55     if(startIndex < splitFilename.length - 1){
56       addFileToTree(splitFilename, startIndex + 1, heatStructureTree);
57     }
58     parent.addHeatStructureTreeToNestedHeatList(heatStructureTree);
59   }
60
61   public void addErrors(Map<String, List<ErrorMessage>> validationErrors){
62     validationErrors.entrySet().stream().filter(entry -> {
63       return fileTreeRef.get(entry.getKey()) != null;
64     }).forEach(entry -> entry.getValue().stream().forEach(error ->
65         fileTreeRef.get(entry.getKey()).addErrorToErrorsList(error)));
66   }
67
68   private String[] getFullFileNameAsArray(String filename){
69     if(filename.contains("/")){
70       return filename.split("/");
71     }
72
73     return filename.split(Pattern.quote(File.separator));
74   }
75
76   public HeatStructureTree getTree(){
77     return tree;
78   }
79 }