2 * Copyright (c) 2016, Huawei Technologies Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package org.onap.vfc.nfvo.vnfm.gvnfm.jujuvnfmadapter.common;
19 import java.io.BufferedInputStream;
20 import java.io.BufferedOutputStream;
22 import java.io.FileInputStream;
23 import java.io.FileNotFoundException;
24 import java.io.FileOutputStream;
25 import java.io.IOException;
26 import java.util.ArrayList;
27 import java.util.HashMap;
28 import java.util.List;
30 import java.util.zip.GZIPInputStream;
31 import java.util.zip.ZipEntry;
32 import java.util.zip.ZipInputStream;
34 import org.apache.commons.compress.archivers.ArchiveInputStream;
35 import org.apache.commons.compress.archivers.ArchiveStreamFactory;
36 import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
37 import org.apache.commons.compress.compressors.CompressorStreamFactory;
38 import org.apache.commons.compress.compressors.xz.XZCompressorInputStream;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
47 * @author quanzhong@huawei.com
48 * @version NFVO 0.5 Oct 28, 2016
50 public class UnCompressUtil {
52 private static Logger log = LoggerFactory.getLogger(UnCompressUtil.class);
54 public static Map<String, String> archiveMap = new HashMap<String, String>();
56 public static Map<String, String> compressorMap = new HashMap<String, String>();
60 archiveMap.put(ArchiveStreamFactory.AR, ArchiveStreamFactory.AR);
61 archiveMap.put(ArchiveStreamFactory.ARJ, ArchiveStreamFactory.ARJ);
62 archiveMap.put(ArchiveStreamFactory.CPIO, ArchiveStreamFactory.CPIO);
63 archiveMap.put(ArchiveStreamFactory.DUMP, ArchiveStreamFactory.DUMP);
64 archiveMap.put(ArchiveStreamFactory.JAR, ArchiveStreamFactory.JAR);
65 archiveMap.put(ArchiveStreamFactory.SEVEN_Z, ArchiveStreamFactory.SEVEN_Z);
66 archiveMap.put(ArchiveStreamFactory.TAR, ArchiveStreamFactory.TAR);
67 archiveMap.put(ArchiveStreamFactory.ZIP, ArchiveStreamFactory.ZIP);
70 compressorMap.put(CompressorStreamFactory.BZIP2, CompressorStreamFactory.BZIP2);
71 compressorMap.put(CompressorStreamFactory.DEFLATE, CompressorStreamFactory.DEFLATE);
72 compressorMap.put(CompressorStreamFactory.GZIP, CompressorStreamFactory.GZIP);
73 compressorMap.put(CompressorStreamFactory.LZMA, CompressorStreamFactory.LZMA);
74 compressorMap.put(CompressorStreamFactory.PACK200, CompressorStreamFactory.PACK200);
75 compressorMap.put(CompressorStreamFactory.SNAPPY_FRAMED, CompressorStreamFactory.SNAPPY_FRAMED);
76 compressorMap.put(CompressorStreamFactory.SNAPPY_RAW, CompressorStreamFactory.SNAPPY_RAW);
77 compressorMap.put(CompressorStreamFactory.XZ, CompressorStreamFactory.XZ);
78 compressorMap.put(CompressorStreamFactory.Z, CompressorStreamFactory.Z);
86 * @param outputDirectory
91 public static boolean unCompressGzip(String zipfileName, String outputDirectory, List<String> fileNames) {
92 FileInputStream fis = null;
93 ArchiveInputStream in = null;
94 BufferedInputStream bis = null;
96 fis = new FileInputStream(zipfileName);
97 GZIPInputStream gis = new GZIPInputStream(new BufferedInputStream(fis));
98 in = new ArchiveStreamFactory().createArchiveInputStream("tar", gis);
99 bis = new BufferedInputStream(in);
100 TarArchiveEntry entry = (TarArchiveEntry)in.getNextEntry();
101 while(entry != null) {
102 String name = entry.getName();
103 String[] names = name.split("/");
104 String fileName = outputDirectory;
105 for(int i = 0; i < names.length; i++) {
106 String str = names[i];
107 fileName = fileName + File.separator + str;
109 if(name.endsWith("/")) {
110 FileUtils.mkDirs(fileName);
112 File file = getRealFileName(outputDirectory, name);
113 if(null != fileNames) {
114 fileNames.add(file.getName());
116 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
118 while((b = bis.read()) != -1) {
121 log.debug("ungzip to:" + file.getCanonicalPath());
125 entry = (TarArchiveEntry)in.getNextEntry();
128 } catch(Exception e) {
129 log.error("UnCompressGZip faield:", e);
136 } catch(IOException e) {
137 log.error("UnCompressGZip faield:", e);
142 public static void unCompressAllZip(String sourcePath, String targetPath) throws FileNotFoundException {
143 for(File file : FileUtils.listFiles(new File(sourcePath))) {
144 unCompressZip(file.getAbsolutePath(),
145 targetPath + File.separator + file.getName().substring(0, file.getName().lastIndexOf(".")),new ArrayList<String>());
153 * @param sourceFile unzipPath
154 * @param targetPath zippath
158 public static boolean unCompressZip(String sourceFile, String targetPath,List<String> fileNames) {
160 BufferedOutputStream dest = null;
161 FileInputStream fis = new FileInputStream(sourceFile);
162 ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
163 ZipEntry entry = null;
164 while((entry = zis.getNextEntry()) != null) {
165 String name = entry.getName();
166 String[] names = name.split("/");
167 String fileName = targetPath;
168 for(int i = 0; i < names.length; i++) {
169 String str = names[i];
170 fileName = fileName + File.separator + str;
172 if(name.endsWith("/")) {
173 FileUtils.mkDirs(fileName);
176 byte data[] = new byte[2048];
177 File file = getRealFileName(targetPath, name);
178 fileNames.add(file.getName());
179 dest = new BufferedOutputStream(new FileOutputStream(file));
181 while((count = zis.read(data, 0, 2048)) != -1) {
182 dest.write(data, 0, count);
184 log.debug("unzip to:" + file.getCanonicalPath());
191 } catch(Exception e) {
192 log.error("UnCompressZip faield:", e);
197 private static File getRealFileName(String zippath, String absFileName) {
198 String[] dirs = absFileName.split("/", absFileName.length());
200 File ret = new File(zippath);
202 if(dirs.length > 1) {
203 for(int i = 0; i < dirs.length - 1; i++) {
204 ret = new File(ret, dirs[i]);
212 ret = new File(ret, dirs[dirs.length - 1]);
222 * @param outputDirectory
227 public static boolean unCompressTarXZ(String zipfileName, String outputDirectory, List<String> fileNames) {
228 ArchiveInputStream in = null;
229 BufferedInputStream bis = null;
231 XZCompressorInputStream xzis =
232 new XZCompressorInputStream(new BufferedInputStream(new FileInputStream(zipfileName)));
233 in = new ArchiveStreamFactory().createArchiveInputStream("tar", xzis);
234 bis = new BufferedInputStream(in);
235 TarArchiveEntry entry = (TarArchiveEntry)in.getNextEntry();
236 while(entry != null) {
237 String name = entry.getName();
238 String[] names = name.split("/");
239 String fileName = outputDirectory;
240 for(int i = 0; i < names.length; i++) {
241 String str = names[i];
242 fileName = fileName + File.separator + str;
244 if(name.endsWith("/")) {
245 FileUtils.mkDirs(fileName);
247 File file = getRealFileName(outputDirectory, name);
248 if(null != fileNames) {
249 fileNames.add(file.getName());
251 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
253 while((b = bis.read()) != -1) {
256 log.debug("ungzip to:" + file.getCanonicalPath());
260 entry = (TarArchiveEntry)in.getNextEntry();
263 } catch(Exception e) {
264 log.error("unCompressTarXZ faield:", e);
270 } catch(IOException e) {
271 log.error("unCompressTarXZ faield:", e);
278 * only support .zip/.tar.gz/.tar.xz
282 * @param outputDirectory
287 public static boolean unCompress(String zipfileName, String outputDirectory, List<String> fileNames) {
288 if(zipfileName.endsWith(".zip")){
289 return unCompressZip(zipfileName,outputDirectory,fileNames);
290 }else if(zipfileName.endsWith(".tar.gz")){
291 return unCompressGzip(zipfileName,outputDirectory,fileNames);
292 }else if(zipfileName.endsWith(".tar.xz")){
293 return unCompressTarXZ(zipfileName,outputDirectory,fileNames);
295 log.error("not supprot file type:->"+zipfileName);