Rename packages from openecomp to onap.
[sdc.git] / openecomp-be / lib / openecomp-tosca-lib / src / main / java / org / openecomp / sdc / tosca / services / impl / ToscaFileOutputServiceCsarImpl.java
1 /*
2  * Copyright © 2016-2017 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
17 package org.openecomp.sdc.tosca.services.impl;
18
19 import org.apache.commons.io.IOUtils;
20 import org.openecomp.core.utilities.file.FileContentHandler;
21 import org.openecomp.core.utilities.file.FileUtils;
22 import org.openecomp.sdc.common.errors.CoreException;
23 import org.openecomp.sdc.logging.api.Logger;
24 import org.openecomp.sdc.logging.api.LoggerFactory;
25 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
26 import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
27 import org.openecomp.sdc.tosca.exceptions.CsarCreationErrorBuilder;
28 import org.openecomp.sdc.tosca.exceptions.CsarMissingEntryPointErrorBuilder;
29 import org.openecomp.sdc.tosca.services.ToscaFileOutputService;
30
31 import java.io.BufferedOutputStream;
32 import java.io.ByteArrayInputStream;
33 import java.io.ByteArrayOutputStream;
34 import java.io.File;
35 import java.io.IOException;
36 import java.io.InputStream;
37 import java.util.Map;
38 import java.util.zip.ZipEntry;
39 import java.util.zip.ZipOutputStream;
40
41
42 public class ToscaFileOutputServiceCsarImpl implements ToscaFileOutputService {
43   static final String EXTERNAL_ARTIFACTS_FOLDER_NAME = "Artifacts";
44   private static final String DEFINITIONS_FOLDER_NAME = "Definitions";
45   private static final String ARTIFACTS_FOLDER_NAME = "Artifacts";
46   //todo currently duplicated, to be changed when external artifacts are separated from internal
47   private static final String TOSCA_META_FOLDER_NAME = "TOSCA-Metadata";
48   private static final String TOSCA_META_FILE_VERSION = "TOSCA-Meta-File-Version";
49   private static final String TOSCA_META_FILE_VERSION_VALUE = "1.0";
50   private static final String TOSCA_META_FILE_NAME = "TOSCA.meta";
51   private static final String CSAR_VERSION = "CSAR-Version";
52   private static final String CSAR_VERSION_VALUE = "1.1";
53   private static final String CREATED_BY = "Created-By";
54   private static final String CREATED_BY_VALUE = "ASDC Onboarding portal";
55   private static final String ENTRY_DEFINITIONS = "Entry-Definitions";
56   private static final String META_FILE_DELIMITER = ":";
57   private static final String SPACE = " ";
58   private static final String FILE_SEPARATOR = File.separator;
59   private static final Logger logger = LoggerFactory.getLogger(ToscaFileOutputServiceCsarImpl.class);
60
61
62   @Override
63   public byte[] createOutputFile(ToscaServiceModel toscaServiceModel,
64                                  FileContentHandler externalArtifacts) {
65     ByteArrayOutputStream baos = new ByteArrayOutputStream();
66     try (ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(baos))) {
67       packDefinitions(zos, toscaServiceModel.getServiceTemplates());
68       FileContentHandler artifactFiles = toscaServiceModel.getArtifactFiles();
69       if (artifactFiles != null && !artifactFiles.isEmpty()) {
70         packArtifacts(zos, artifactFiles);
71       }
72       if (toscaServiceModel.getEntryDefinitionServiceTemplate() == null) {
73         throw new CoreException(new CsarMissingEntryPointErrorBuilder().build());
74       }
75       createAndPackToscaMetaFile(zos, toscaServiceModel.getEntryDefinitionServiceTemplate());
76       if (externalArtifacts != null) {
77         packExternalArtifacts(zos, externalArtifacts);
78       }
79     } catch (IOException ex) {
80       throw new CoreException(new CsarCreationErrorBuilder().build(), ex);
81     }
82     return baos.toByteArray();
83   }
84
85
86   @Override
87   public String createMetaFile(String entryDefinitionsFileName) {
88     return TOSCA_META_FILE_VERSION + META_FILE_DELIMITER + SPACE + TOSCA_META_FILE_VERSION_VALUE
89         + System.lineSeparator()
90         + CSAR_VERSION + META_FILE_DELIMITER + SPACE + CSAR_VERSION_VALUE + System.lineSeparator()
91         + CREATED_BY + META_FILE_DELIMITER + SPACE + CREATED_BY_VALUE + System.lineSeparator()
92         + ENTRY_DEFINITIONS + META_FILE_DELIMITER + SPACE + DEFINITIONS_FOLDER_NAME
93         + FILE_SEPARATOR
94         + entryDefinitionsFileName;
95   }
96
97   @Override
98   public String getArtifactsFolderName() {
99     return ARTIFACTS_FOLDER_NAME;
100   }
101
102   private void createAndPackToscaMetaFile(ZipOutputStream zos, String entryDefinitionsFileName)
103       throws IOException {
104     String metaFile = createMetaFile(entryDefinitionsFileName);
105     zos.putNextEntry(
106         new ZipEntry(TOSCA_META_FOLDER_NAME + FILE_SEPARATOR + TOSCA_META_FILE_NAME));
107     writeBytesToZip(zos, new ByteArrayInputStream(metaFile.getBytes()));
108   }
109
110   private void packDefinitions(ZipOutputStream zos, Map<String, ServiceTemplate> serviceTemplates)
111       throws IOException {
112     for (Map.Entry<String, ServiceTemplate> serviceTemplate : serviceTemplates.entrySet()) {
113       String fileName = serviceTemplate.getKey();
114       zos.putNextEntry(new ZipEntry(DEFINITIONS_FOLDER_NAME + FILE_SEPARATOR + fileName));
115       writeBytesToZip(zos,
116           FileUtils.convertToInputStream(serviceTemplate.getValue(), FileUtils.FileExtension.YAML));
117     }
118   }
119
120   private void packExternalArtifacts(ZipOutputStream zos, FileContentHandler externalArtifacts) {
121
122     for (String filenameIncludingPath : externalArtifacts.getFileList()) {
123       try {
124         zos.putNextEntry(new ZipEntry(filenameIncludingPath));
125         writeBytesToZip(zos, externalArtifacts.getFileContent(filenameIncludingPath));
126
127       } catch (IOException ex) {
128         throw new RuntimeException(ex);
129       } finally {
130         try {
131           zos.closeEntry();
132         } catch (IOException ignore) {
133             logger.debug(ignore.getMessage(), ignore);
134         }
135       }
136     }
137
138   }
139
140   private void packArtifacts(ZipOutputStream zos, FileContentHandler artifacts) {
141
142     for (String fileName : artifacts.getFileList()) {
143       try {
144         zos.putNextEntry(new ZipEntry(ARTIFACTS_FOLDER_NAME + FILE_SEPARATOR + fileName));
145         writeBytesToZip(zos, artifacts.getFileContent(fileName));
146
147       } catch (IOException ex) {
148         throw new RuntimeException(ex);
149       } finally {
150         try {
151           zos.closeEntry();
152         } catch (IOException ignore) {
153             logger.debug(ignore.getMessage(), ignore);
154         }
155       }
156     }
157
158   }
159
160   private void writeBytesToZip(ZipOutputStream zos, InputStream is) throws IOException {
161     if(is != null){
162       IOUtils.copy(is, zos);
163     }
164   }
165 }