4ff2a6ea85d37ffd6d6ddaef1d10f8a0c050a58d
[ccsdk/cds.git] /
1 /*
2  * Copyright (C) 2019 Bell Canada. All rights reserved.
3  *
4  * NOTICE:  All the intellectual and technical concepts contained herein are
5  * proprietary to Bell Canada and are protected by trade secret or copyright law.
6  * Unauthorized copying of this file, via any medium is strictly prohibited.
7  */
8
9 package org.onap.ccsdk.cds.cdssdclistener.service;
10
11 import java.io.File;
12 import java.io.FileOutputStream;
13 import java.io.IOException;
14 import java.io.InputStream;
15 import java.io.OutputStream;
16 import java.nio.file.Files;
17 import java.nio.file.Path;
18 import java.nio.file.Paths;
19 import java.util.Enumeration;
20 import java.util.regex.Pattern;
21 import java.util.zip.ZipEntry;
22 import java.util.zip.ZipFile;
23 import org.apache.tomcat.util.http.fileupload.IOUtils;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26 import org.springframework.beans.factory.annotation.Value;
27 import org.springframework.boot.context.properties.ConfigurationProperties;
28 import org.springframework.stereotype.Component;
29
30 @Component
31 @ConfigurationProperties("listenerservice")
32 public class ListenerServiceImpl implements ListenerService {
33
34     @Value("${listenerservice.config.csarArchive}")
35     private String csarArchivePath;
36
37     @Value("${listenerservice.config.cbaArchive}")
38     private String cbaArchivePath;
39
40     private static final String CBA_ZIP_PATH = "Artifacts/Resources/[a-zA-Z0-9-_]+/Deployment/CONTROLLER_BLUEPRINT_ARCHIVE/[a-zA-Z0-9-_]+[.]zip";
41     private static final Logger LOGGER = LoggerFactory.getLogger(ListenerServiceImpl.class);
42
43     @Override
44     public void extractBluePrint(String csarArchivePath, String cbaArchivePath) {
45         Path cbaStorageDir = getStorageDirectory(cbaArchivePath);
46         try (ZipFile zipFile = new ZipFile(csarArchivePath)) {
47             Enumeration<? extends ZipEntry> entries = zipFile.entries();
48             while (entries.hasMoreElements()) {
49                 ZipEntry entry = entries.nextElement();
50                 String fileName = entry.getName();
51                 if (Pattern.matches(CBA_ZIP_PATH, fileName)) {
52                     final String cbaArchiveName = Paths.get(fileName).getFileName().toString();
53                     storeBluePrint(zipFile, cbaArchiveName, cbaStorageDir, entry);
54                 }
55             }
56         } catch (Exception e) {
57             LOGGER.error("Failed to extract blueprint", e);
58         }
59     }
60
61     private void storeBluePrint(ZipFile zipFile, String fileName, Path cbaArchivePath, ZipEntry entry) {
62         final String changedFileName = fileName + ".zip";
63         Path targetLocation = cbaArchivePath.resolve(changedFileName);
64         File targetZipFile = new File(targetLocation.toString());
65
66         try {
67             targetZipFile.createNewFile();
68
69         } catch (IOException e) {
70             LOGGER.error("Could not able to create file {}", targetZipFile, e);
71         }
72
73         try (InputStream inputStream = zipFile.getInputStream(entry); OutputStream out = new FileOutputStream(
74             targetZipFile)) {
75             IOUtils.copy(inputStream, out);
76         } catch (Exception e) {
77             LOGGER.error("Failed to put zip file into target location {}", targetLocation, e);
78         }
79     }
80
81     private Path getStorageDirectory(String path) {
82         Path fileStorageLocation = Paths.get(path).toAbsolutePath().normalize();
83
84         if (!Files.exists(fileStorageLocation)) {
85             try {
86                 return Files.createDirectories(fileStorageLocation);
87             } catch (IOException e) {
88                 LOGGER.error("Fail to create directory", e);
89             }
90         }
91         return fileStorageLocation;
92     }
93
94     @Override
95     public void saveBluePrintToCdsDatabase(ZipFile file) {
96         //TODO
97     }
98 }