re base code
[sdc.git] / test-apis-ci / src / main / java / org / openecomp / sdc / ci / tests / execute / devCI / ArtifactFromCsar.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.ci.tests.execute.devCI;
22
23 import org.apache.commons.codec.digest.DigestUtils;
24 import org.apache.commons.io.FileUtils;
25 import org.apache.commons.io.IOUtils;
26 import org.openecomp.sdc.ci.tests.datatypes.GroupHeatMetaDefinition;
27 import org.openecomp.sdc.ci.tests.datatypes.HeatMetaFirstLevelDefinition;
28 import org.openecomp.sdc.ci.tests.datatypes.TypeHeatMetaDefinition;
29 import org.openecomp.sdc.ci.tests.utils.CsarParserUtils;
30
31 import java.io.File;
32 import java.io.FileInputStream;
33 import java.io.FileOutputStream;
34 import java.io.IOException;
35 import java.nio.file.DirectoryStream;
36 import java.nio.file.Files;
37 import java.nio.file.Path;
38 import java.nio.file.Paths;
39 import java.util.*;
40 import java.util.stream.Collectors;
41 import java.util.zip.ZipEntry;
42 import java.util.zip.ZipInputStream;
43
44 public class ArtifactFromCsar {
45         
46
47         public static void main(String[] args) throws Exception {
48                 String zipFile = "C:\\Users\\rp955r\\Documents\\InTesting\\resource-CivfonboardedFdnt2f792348-csar.csar";
49                 
50 //              Map<String, Object> combinedMap = combineHeatArtifacstWithFolderArtifacsToMap(zipFile);
51                 
52                 Map<String, Object> vfcArtifacts = ArtifactFromCsar.getVFCArtifacts(zipFile);
53                 
54                 System.out.println("1234o");
55         }
56         
57         public static Map<String, Object> combineHeatArtifacstWithFolderArtifacsToMap(String pathToCsar) throws Exception {
58                 return combineHeatArtifacstWithFolderArtifacsToMap(pathToCsar, "output");
59         }
60         
61         public static Map<String, Object> combineHeatArtifacstWithFolderArtifacsToMap(String pathToCsar, String outputCsar) throws Exception {
62                 File csarFile = new File(pathToCsar);
63                 
64                 
65                 File dir = new File(csarFile.getParent() + File.separator + outputCsar);
66                         dir.mkdir();
67                         if(!dir.exists()) {
68                 }
69
70                 String outputFolder = dir.getPath();
71                 unZip(pathToCsar, outputFolder);
72                 File directory = new File(outputFolder + File.separator + "Artifacts" + File.separator );
73                 
74                 Map<String, Object> artifactsMap = combineHeatArtifacstWithFolderArtifacsToMap(getMapArtifactFromFolderStructure(directory), getDeploymentArtifactListFromHeatMeta(csarFile, directory));
75                 FileUtils.cleanDirectory(new File(outputFolder));
76                 
77                 return artifactsMap;
78         }
79         
80         public static Map<String, Object> getVFCArtifacts(String pathToCsar) throws Exception{
81                 String outputFolder = unzipCsarFile(pathToCsar);
82                 File directory = new File(outputFolder + File.separator + "Artifacts" + File.separator );
83                 Map<String, Object> artifactsMap = getMapArtifactFromFolderStructure(directory);
84                 cleanFolders(outputFolder);
85                 
86                 return artifactsMap;
87         }
88         
89         private static Map<String, Object> combineHeatArtifacstWithFolderArtifacsToMap(Map<String, Object> map, List<HeatMetaFirstLevelDefinition> rlist) {
90                 if(map.get("Deployment") != null) {
91                         rlist.addAll((Collection<? extends HeatMetaFirstLevelDefinition>) map.get("Deployment"));
92                 }
93                 map.put("Deployment", rlist);
94                 return map;
95         }
96         
97         private static List<HeatMetaFirstLevelDefinition> getDeploymentArtifactListFromHeatMeta(File pathToCsar, File directory) throws Exception {
98                 List<HeatMetaFirstLevelDefinition> artifactList = new LinkedList<HeatMetaFirstLevelDefinition>();
99                 
100                 List<TypeHeatMetaDefinition> listTypeHeatMetaDefinition = CsarParserUtils.getListTypeHeatMetaDefinition(pathToCsar);
101
102             for(TypeHeatMetaDefinition typeHeatMetaDefinition : listTypeHeatMetaDefinition){
103                 for(GroupHeatMetaDefinition groupHeatMetaDefinition : typeHeatMetaDefinition.getGroupHeatMetaDefinition()){
104                         artifactList.addAll(groupHeatMetaDefinition.getArtifactList());
105                 }
106             }
107                 
108             List<HeatMetaFirstLevelDefinition> listArtifactWithTypesByList = getListArtifactWithTypesByList(directory, artifactList);
109                 return listArtifactWithTypesByList;
110 //          return artifactList;
111                 
112         }
113         
114         private static Map<String, Object> getMapArtifactFromFolderStructure(File pathToArtifactFolder) throws IOException {
115                 
116                 Map<String, Object> map = new HashMap<String, Object>();
117                 
118                 
119                 final Path dir = Paths.get(pathToArtifactFolder.getPath());
120                 final DirectoryStream<Path> dirStream = Files.newDirectoryStream(dir);
121                 
122                 dirStream.forEach(currFile -> {
123                         File file = currFile.toFile();
124                                 if (file.isDirectory()) {
125                                         System.out.println(file.getName());
126                                         if(file.getName().toLowerCase().equals("deployment") || file.getName().toLowerCase().equals("informational")) {
127                                                 map.put(file.getName(), getListArtifactWithTypes(file));
128                                         } else {
129                                                 try {
130                                                         map.put(file.getName(), getMapArtifactFromFolderStructure(file));
131                                                 } catch (IOException e) {
132                                                         e.printStackTrace();
133                                                 }
134                                         }
135                                 }
136                 });
137                 
138                 dirStream.close();
139                 
140
141                 
142 //              
143 //              File[] fileList = pathToArtifactFolder.listFiles();
144 //              for(File file: fileList) {
145 //                      if (file.isDirectory()) {
146 //                              
147 //                              System.out.println(file.getName());
148 //                              if(file.getName().equals("Deployment") || file.getName().equals("Informational")) {
149 //                                      map.put(file.getName(), getListArtifactWithTypes(file));
150 //                              } else {
151 //                                      map.put(file.getName(), getMapArtifactFromFolderStructure(file));
152 //                              }
153 //                      }
154 //              }
155                 return map;
156         }
157         
158         
159         
160         private static List<HeatMetaFirstLevelDefinition> getListArtifactWithTypes(File folderPath) {
161                 List<HeatMetaFirstLevelDefinition> artifactList = new LinkedList<HeatMetaFirstLevelDefinition>();
162                 
163                 File[] fileList = folderPath.listFiles();
164                 
165                 for(File file: fileList) {
166                         File[] artifacts = file.listFiles();
167                         
168                         for(File artifact: artifacts) {
169 //                              HeatMetaFirstLevelDefinition heatMetaFirstLevelDefinition = new HeatMetaFirstLevelDefinition(file.getName(), artifact.getName());
170                                 HeatMetaFirstLevelDefinition heatMetaFirstLevelDefinition = new HeatMetaFirstLevelDefinition(artifact.getName(), file.getName(), crunchifyGetMd5ForFile(artifact));
171                                 artifactList.add(heatMetaFirstLevelDefinition);
172                         }
173                 }
174                 
175                 return artifactList;
176         }
177         
178         private static List<HeatMetaFirstLevelDefinition> getListArtifactWithTypesByList(File folderPath, List<HeatMetaFirstLevelDefinition> artifactLogicList) {
179                                 
180                 
181                 File[] fileList = folderPath.listFiles();
182                 
183                 
184                 
185                 for (HeatMetaFirstLevelDefinition heatMetaFirstLevelDefinition : artifactLogicList) {
186                         
187                         String fileName = heatMetaFirstLevelDefinition.getFileName();
188                         
189                         for (File fileFromFolder : fileList) {
190                                 if ( fileFromFolder.getName().equals(fileName)){
191                                         heatMetaFirstLevelDefinition.setCheckSum(crunchifyGetMd5ForFile(fileFromFolder));
192                                 }
193                                 
194                         }
195                  }
196
197                 return artifactLogicList;
198         }
199         
200         public static String crunchifyGetMd5ForFile(File crunchifyFile) {
201                 String crunchifyValue = null;
202                 FileInputStream crunchifyInputStream = null;
203                 try {
204                         crunchifyInputStream = new FileInputStream(crunchifyFile);
205  
206                         // md5Hex converts an array of bytes into an array of characters representing the hexadecimal values of each byte in order.
207                         // The returned array will be double the length of the passed array, as it takes two characters to represent any given byte.
208                         crunchifyValue = DigestUtils.md5Hex(IOUtils.toByteArray(crunchifyInputStream));
209                 } catch (IOException e) {
210                         e.printStackTrace();
211                 } finally {
212                         IOUtils.closeQuietly(crunchifyInputStream);
213                 }
214                 return crunchifyValue;
215         }
216         
217         public static void unZip(String zipFile, String outputFolder) {
218                 byte[] buffer = new byte[1024];
219
220              try{
221                 File folder = new File(outputFolder);
222                 
223                 if(!folder.exists()){
224                         folder.mkdir();
225                 }
226
227                 ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile));
228                 ZipEntry ze = zis.getNextEntry();
229
230                 while(ze!=null){
231
232                    String fileName = ze.getName();
233                    File newFile = new File(outputFolder + File.separator + fileName);
234                    
235                    if(ze.isDirectory()) {
236                            newFile.mkdir();
237                            ze = zis.getNextEntry();
238                            continue;
239                    }
240
241                     new File(newFile.getParent()).mkdirs();
242                     FileOutputStream fos = new FileOutputStream(newFile);
243
244                     int len;
245                     while ((len = zis.read(buffer)) > 0) {
246                         fos.write(buffer, 0, len);
247                     }
248
249                     fos.close();
250                     ze = zis.getNextEntry();
251                 }
252
253                 zis.closeEntry();
254                 zis.close();
255
256             } catch (IOException ex) {
257                ex.printStackTrace();
258             }
259
260         }
261         
262     private static void cleanFolders(String outputFolder) throws IOException {
263                 System.gc();
264                 FileUtils.cleanDirectory(new File(outputFolder));
265                 FileUtils.deleteDirectory(new File(outputFolder));
266         }
267
268     private static String unzipCsarFile(String pathToCsar) {
269                 File csarFile = new File(pathToCsar);
270                 
271                 
272                 File dir = new File(csarFile.getParent() + File.separator + "output-" + UUID.randomUUID());
273                 if(!dir.exists()) {
274                         dir.mkdirs();
275                 }
276
277                 String outputFolder = dir.getPath();
278                 ArtifactFromCsar.unZip(pathToCsar, outputFolder);
279                 return outputFolder;
280         }
281
282         public static String[] getArtifactNamesFromCsar(String path, String csarFile) throws Exception {
283                 Map<String, Object> combinedMap = combineHeatArtifacstWithFolderArtifacsToMap(path + csarFile);
284                 LinkedList<HeatMetaFirstLevelDefinition> deploymentArtifacts = ((LinkedList<HeatMetaFirstLevelDefinition>) combinedMap.get("Deployment"));
285                 List<String> artifactNamesList = deploymentArtifacts.stream().map(e -> e.getFileName()).collect(Collectors.toList());
286                 Object[] artifactNamesObjectArr = artifactNamesList.toArray();
287                 String[] artifactNamesFromFile = Arrays.copyOf(artifactNamesObjectArr, artifactNamesObjectArr.length, String[].class);
288                 return artifactNamesFromFile;
289         }
290
291 }