• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
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 ohos;
18 
19 import com.alibaba.fastjson.JSON;
20 import com.alibaba.fastjson.serializer.SerializerFeature;
21 
22 import java.io.BufferedInputStream;
23 import java.io.File;
24 import java.io.FileInputStream;
25 import java.io.FileOutputStream;
26 import java.io.IOException;
27 import java.text.SimpleDateFormat;
28 import java.util.ArrayList;
29 import java.util.HashMap;
30 import java.util.Iterator;
31 import java.util.List;
32 import java.util.Comparator;
33 import java.util.zip.ZipEntry;
34 import java.util.zip.ZipInputStream;
35 
36 /**
37  * scan info
38  *
39  * @since 2023/11/27
40  */
41 
42 public class ScanStatSuffix {
43     private static final String TRUE = "true";
44     private static final String FALSE = "false";
45     private static final String SUFFIX_FOLDER_NAME = "suffix";
46     private static final String UNPACK_NAME = "unpack";
47     private static final String EMPTY_STRING = "";
48     private static final String RESULT_FILES = "files";
49     private static final String RESULT_TOTAL_SIZE = "totalSize";
50     private static final String SUFFIX_DESC = "show files group by file type[.suffix]";
51     private static final String SUFFIX_PARAM = "--stat-suffix";
52     private static final String SUFFIX_TYPE_UNKNOWN = "unknownType";
53     private static final String TASK_TYPE = "taskType";
54     private static final String TASK_DESC = "taskDesc";
55     private static final String PARAM = "param";
56     private static final String START_TIME = "startTime";
57     private static final String STOP_TIME = "stopTime";
58     private static final String PATH_LIST = "pathList";
59     private static final String RESULT = "result";
60     private static final String HAP = ".hap";
61     private static final String HSP = ".hsp";
62     private static final String FILE_TYPE_SO = "so";
63     private static final String TMP_FOLDER_NAME = "temporary";
64     private static final String LIBS_NAME = "libs";
65     private static final String USER_DIR = "user.dir";
66     private static final String STATEMENT_FILE = "file:";
67     private static final String STATEMENT_SIZE = "size:";
68     private static final String STATEMENT_COMPRESS = "compress:";
69     private static final int BUFFER_SIZE = 10 * 1024;
70     private static final long SUFFIX_TYPE = 3L;
71     private static final long SCAN_LEVEL = 2L;
72     private static final long SHOW_SIZE = 10L;
73     private static final String SPLIT_POINT = "\\.";
74     private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss:SSS";
75 
76     private static final String HTML_BUTTON_SHOW = "<button id=\"show_%s\" type=\"button\" "
77             + "onclick=\"show_%s()\" style=\"display: block\">more</button>";
78     private static final String HTML_BUTTON_HIDE = "<button id=\"hide_%s\" type=\"button\" "
79             + "onclick=\"hide_%s()\" style=\"display: none\">close</button>";
80     private static final String TABLE_BOXTABLE = "<table class=\"boxTable\">";
81     private static final String TABLE_END = "</table>";
82     private static final String TABLE_SUFFIX = "<table class=\"suffixTable\">";
83     private static final String HTML_UL_HEAD = "<ul>";
84     private static final String HTML_UL_END = "</ul>";
85     private static final String HTML_LI_HEAD = "<li>";
86     private static final String HTML_LI_END = "</li>";
87     private static final String HTML_BR_HEAD = "<br>";
88     private static final String HTML_LI_SUFFIX = "<li class=\"suffix\">";
89     private static final String HTML_TR_STYLE = "<tr class=\"layout\"><td class=\"key\">";
90     private static final String HTML_TD_STYLE = "</td><td class=\"value\">";
91     private static final String HTML_TDTR_END = "</td></tr>";
92     private static final String HTML_TDTR_HEAD = "<tr%s><td%s>";
93     private static final String HTML_TDTR_SEND = "</td><td%s>";
94     private static final String HTML_TRTD_STYLE = "<tr class=\"result\"><td class=\"key\">";
95     private static final String CLASS_SUFFIXLAYOUT = " class=\"suffixLayout\"";
96     private static final String CLASS_SUFFIXKEY = " class=\"suffixKey\"";
97     private static final String CLASS_SUFFIXVALUE = " class=\"suffixValue\"";
98     private static final String CLASS_TRTD_SUFFIXVALUE = "<tr class=\"suffixLayout\"><td class=\"suffixKey\">";
99     private static final String CLASS_TD_SUFFIXVALUE = "</td><td class=\"suffixValue\">";
100     private static final Log LOG = new Log(ScanStatSuffix.class.toString());
101 
102     private static class FileInfo {
103         private String file;
104         private long size;
105 
getFile()106         public String getFile() {
107             return this.file;
108         }
setFile(String file)109         public void setFile(String file) {
110             this.file = file;
111         }
getSize()112         public long getSize() {
113             return this.size;
114         }
setSize(long size)115         public void setSize(long size) {
116             this.size = size;
117         }
118     }
119 
120     private static class SoFile extends FileInfo {
121         private String compress = FALSE;
122 
getCompress()123         public String getCompress() {
124             return this.compress;
125         }
setCompress(String compress)126         public void setCompress(String compress) {
127             this.compress = compress;
128         }
129     }
130 
131     private static class ParamModelSuffix {
132         private String suffix;
133         private long totalSize;
134         private List files = new ArrayList<>();
135 
getSuffix()136         public String getSuffix() {
137             return this.suffix;
138         }
setSuffix(String suffix)139         public void setSuffix(String suffix) {
140             this.suffix = suffix;
141         }
getTotalSize()142         public long getTotalSize() {
143             return this.totalSize;
144         }
setTotalSize(long totalSize)145         public void setTotalSize(long totalSize) {
146             this.totalSize = totalSize;
147         }
getFiles()148         public List getFiles() {
149             return this.files;
150         }
setFiles(List files)151         public void setFiles(List files) {
152             this.files = files;
153         }
154     }
155 
156     private static class SuffixResult {
157         private long taskType;
158         private String taskDesc;
159         private String param;
160         private String startTime;
161         private String stopTime;
162         private List<String> pathList = new ArrayList<>();
163         private List<ParamModelSuffix> result = new ArrayList<>();
164 
getTaskType()165         public long getTaskType() {
166             return this.taskType;
167         }
setTaskType(long taskType)168         public void setTaskType(long taskType) {
169             this.taskType = taskType;
170         }
getTaskDesc()171         public String getTaskDesc() {
172             return this.taskDesc;
173         }
setTaskDesc(String taskDesc)174         public void setTaskDesc(String taskDesc) {
175             this.taskDesc = taskDesc;
176         }
getParam()177         public String getParam() {
178             return this.param;
179         }
setParam(String param)180         public void setParam(String param) {
181             this.param = param;
182         }
getStartTime()183         public String getStartTime() {
184             return this.startTime;
185         }
setStartTime(String startTime)186         public void setStartTime(String startTime) {
187             this.startTime = startTime;
188         }
getStopTime()189         public String getStopTime() {
190             return this.stopTime;
191         }
setStopTime(String stopTime)192         public void setStopTime(String stopTime) {
193             this.stopTime = stopTime;
194         }
getResult()195         public List<ParamModelSuffix> getResult() {
196             return this.result;
197         }
setResult(List<ParamModelSuffix> result)198         public void setResult(List<ParamModelSuffix> result) {
199             this.result = result;
200         }
getPathList()201         public List<String> getPathList() {
202             return this.pathList;
203         }
setPathList(List<String> pathList)204         public void setPathList(List<String> pathList) {
205             this.pathList = pathList;
206         }
207     }
208 
209     /**
210      * scan statSuffix.
211      *
212      * @param utility utility data
213      * @param jsonList List<String> data
214      * @param fileList List<String> data
215      * @return suffix html
216      * @throws BundleException Throws this exception if unpacking exception
217      */
statSuffix(Utility utility, List<String> jsonList, List<String> fileList)218     public String statSuffix(Utility utility, List<String> jsonList, List<String> fileList)
219             throws BundleException {
220         SuffixResult suffixResult = new SuffixResult();
221         suffixResult.setTaskType(SUFFIX_TYPE);
222         suffixResult.setTaskDesc(SUFFIX_DESC);
223         suffixResult.setParam(SUFFIX_PARAM);
224         suffixResult.setStartTime(getCurrentTime());
225         String currentDir = System.getProperty(USER_DIR);
226         String outPath = currentDir + File.separator + TMP_FOLDER_NAME;
227         String packageName = utility.getInput();
228         unpackHap(packageName, outPath);
229         ArrayList<String> soList = new ArrayList<>();
230         suffixResult.setPathList(getPathListData(outPath, packageName, soList));
231         List<ParamModelSuffix> resulList = setMapData(outPath, fileList, soList);
232         File deleteFile = new File(outPath);
233         deleteFile(deleteFile);
234         resulList.sort(Comparator.comparing(ParamModelSuffix::getTotalSize).reversed());
235         suffixResult.setResult(resulList);
236         File parentFile = new File(utility.getOutPath());
237         if (!parentFile.exists() && !parentFile.mkdirs()) {
238             LOG.error(ScanErrorEnum.SUFFIX_MKDIRS_ERROR.toString());
239         }
240         suffixResult.setStopTime(getCurrentTime());
241         String htmlStr = setHtmlData(suffixResult);
242         String jsonStr = JSON.toJSONString(suffixResult, new SerializerFeature[] {
243                 SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue,
244                 SerializerFeature.WriteDateUseDateFormat});
245         jsonList.add(jsonStr);
246         return htmlStr;
247     }
248 
getPathListData(String outPath, String packageName, ArrayList<String> soList)249     private List<String> getPathListData(String outPath, String packageName, ArrayList<String> soList) {
250         List<String> pathList = new ArrayList<>();
251         FileUtils.getFileList(outPath, soList);
252         File pack = new File(packageName);
253         for (String file : soList) {
254             if (file.contains(HAP) || file.contains(HSP)) {
255                 file = splitPath(file, TMP_FOLDER_NAME);
256                 pathList.add(pack.getName() + file);
257             }
258         }
259         return pathList;
260     }
261 
setMapData(String outPath, List<String> fileList, ArrayList<String> soList)262     private List<ParamModelSuffix> setMapData(String outPath, List<String> fileList, ArrayList<String> soList) {
263         HashMap<String, List<FileInfo>> sameSuffixMap = new HashMap<>();
264         List<ParamModelSuffix> resulList = new ArrayList<>();
265         for (String filePath : fileList) {
266             sameSuffixMap = accountFileType(sameSuffixMap, filePath);
267         }
268         Iterator<String> iterator = sameSuffixMap.keySet().iterator();
269         while (iterator.hasNext()) {
270             String next = iterator.next();
271             ParamModelSuffix paramModelSuffix = new ParamModelSuffix();
272             paramModelSuffix.setSuffix(next);
273             if (next.equalsIgnoreCase(FILE_TYPE_SO)) {
274                 List<SoFile> soFiles = new ArrayList<>();
275                 List<FileInfo> fileInfoList = sameSuffixMap.get(next);
276                 long sum = 0L;
277                 for (FileInfo param : fileInfoList) {
278                     SoFile soFile = new SoFile();
279                     soFile.setSize(param.getSize());
280                     String soFilePath = param.getFile();
281                     soFilePath = splitPath(soFilePath, UNPACK_NAME);
282                     soFile.setFile(soFilePath);
283                     int index = soFilePath.indexOf(File.separator + LIBS_NAME);
284                     String hapPath = soFilePath.substring(0, index);
285                     File hapFile = new File(hapPath);
286                     long oldSize = getOldSize(soList, hapFile);
287                     long newSize = getNewSize(fileInfoList, hapFile);
288                     soFile.setCompress(oldSize < newSize ? TRUE : FALSE);
289                     soFiles.add(soFile);
290                     sum += param.getSize();
291                 }
292                 File deleteFile = new File(outPath);
293                 deleteFile(deleteFile);
294                 paramModelSuffix.setTotalSize(sum);
295                 soFiles.sort(Comparator.comparing(SoFile::getSize).reversed());
296                 paramModelSuffix.setFiles(soFiles);
297             } else {
298                 List<FileInfo> fileInfoList = sameSuffixMap.get(next);
299                 for (FileInfo fileInfo : fileInfoList) {
300                     String path = fileInfo.getFile();
301                     fileInfo.setFile(splitPath(path, UNPACK_NAME));
302                 }
303                 fileInfoList.sort(Comparator.comparing(FileInfo::getSize).reversed());
304                 paramModelSuffix.setFiles(fileInfoList);
305                 long sum = fileInfoList.stream().mapToLong(FileInfo::getSize).sum();
306                 paramModelSuffix.setTotalSize(sum);
307             }
308             resulList.add(paramModelSuffix);
309         }
310         return resulList;
311     }
312 
313     private String setHtmlData(SuffixResult suffixResult) {
314         String pathHtml = EMPTY_STRING;
315         if (suffixResult.getPathList() != null && !suffixResult.getPathList().isEmpty()) {
316             pathHtml = getPathListHtml(suffixResult.getPathList());
317         }
318         String pathListHtml = EMPTY_STRING;
319         if (!pathHtml.isEmpty() || !EMPTY_STRING.equals(pathHtml)) {
320             pathListHtml = getHtmlRow(PATH_LIST, pathHtml);
321         }
322         String taskTypeHtml = getHtmlRow(TASK_TYPE, suffixResult.getTaskType());
323         String taskDescHtml = getHtmlRow(TASK_DESC, suffixResult.getTaskDesc());
324         String paramHtml = getHtmlRow(PARAM, suffixResult.getParam());
325         String startTimeHtml = getHtmlRow(START_TIME, suffixResult.getStartTime());
326         String stopTimeHtml = getHtmlRow(STOP_TIME, suffixResult.getStopTime());
327         String resultValue = getResultHtmlOfSuffix(suffixResult.getResult());
328         String resultHtml = getHtmlRowResultClass(RESULT, resultValue);
329         return TABLE_BOXTABLE + taskTypeHtml + taskDescHtml + paramHtml
330                 + startTimeHtml + stopTimeHtml + pathListHtml + resultHtml + TABLE_END;
331     }
332 
333     private String splitPath(String path, String packageName) {
334         String[] split = path.split(packageName);
335         if (split.length > 1) {
336             return split[1];
337         } else {
338             return path;
339         }
340     }
341 
getOldSize(List<String> soList, File hapFile)342     private long getOldSize(List<String> soList, File hapFile) {
343         long oldSize = 0L;
344         for (String file : soList) {
345             File tmp = new File(file);
346             if (tmp.getName().equals(hapFile.getName())) {
347                 oldSize = tmp.length();
348             }
349         }
350         return oldSize;
351     }
352 
getNewSize(List<FileInfo> fileInfoList, File hapFile)353     private long getNewSize(List<FileInfo> fileInfoList, File hapFile) {
354         long newSize = 0L;
355         for (FileInfo fileInfo : fileInfoList) {
356             if (fileInfo.getFile().contains(hapFile.getPath())) {
357                 File tmp = new File(fileInfo.getFile());
358                 newSize += tmp.length();
359             }
360         }
361         return newSize;
362     }
363 
accountFileType(HashMap<String, List<FileInfo>> map, String path)364     private static HashMap<String, List<FileInfo>> accountFileType(HashMap<String, List<FileInfo>> map, String path) {
365         File file = new File(path);
366         String[] split = file.getName().split(SPLIT_POINT);
367         if (split.length > 1) {
368             String suffix = split[split.length - 1];
369             if (map.containsKey(suffix)) {
370                 accountType(map, file, suffix);
371             } else {
372                 accountTypeUnknown(map, file, suffix);
373             }
374         } else if (split.length == 1) { // no suffix
375             if (map.containsKey(SUFFIX_TYPE_UNKNOWN)) {
376                 accountType(map, file, SUFFIX_TYPE_UNKNOWN);
377             } else {
378                 accountTypeUnknown(map, file, SUFFIX_TYPE_UNKNOWN);
379             }
380         }
381         return map;
382     }
383 
accountType(HashMap<String, List<FileInfo>> hashMap, File file, String key)384     private static void accountType(HashMap<String, List<FileInfo>> hashMap, File file, String key) {
385         FileInfo fileInfo = getFileInfo(file);
386         List<FileInfo> fileInfoList = hashMap.get(key);
387         fileInfoList.add(fileInfo);
388         hashMap.put(key, fileInfoList);
389     }
390 
accountTypeUnknown(HashMap<String, List<FileInfo>> hashMap, File file, String key)391     private static void accountTypeUnknown(HashMap<String, List<FileInfo>> hashMap, File file, String key) {
392         FileInfo fileInfo = getFileInfo(file);
393         List<FileInfo> fileInfoList = new ArrayList<>();
394         fileInfoList.add(fileInfo);
395         hashMap.put(key, fileInfoList);
396     }
397 
getFileInfo(File file)398     private static FileInfo getFileInfo(File file) {
399         FileInfo fileInfo = new FileInfo();
400         fileInfo.setFile(file.getPath());
401         long size = FileUtils.getFileSize(file.getPath());
402         fileInfo.setSize(size);
403         return fileInfo;
404     }
405 
getPathListHtml(List<String> models)406     private static String getPathListHtml(List<String> models) {
407         StringBuilder pathListHtml = new StringBuilder(EMPTY_STRING);
408         for (String strHtml : models) {
409             pathListHtml.append(strHtml).append(HTML_BR_HEAD);
410         }
411         return pathListHtml.toString();
412     }
413 
getResultHtmlOfSuffix(List<ParamModelSuffix> models)414     private static String getResultHtmlOfSuffix(List<ParamModelSuffix> models) {
415         StringBuilder resultHtml = new StringBuilder(EMPTY_STRING);
416         resultHtml.append(HTML_UL_HEAD);
417         for (int i = 0; i < models.size(); i++) {
418             ParamModelSuffix model = models.get(i);
419             String filesHtml;
420             if (model.getSuffix().equalsIgnoreCase(FILE_TYPE_SO)) {
421                 filesHtml = getHtmlRowFileSo(RESULT_FILES, model.getFiles());
422             } else {
423                 filesHtml = getHtmlRowFile(RESULT_FILES, model.getFiles());
424             }
425             String liHtml;
426             if (SHOW_SIZE > i) {
427                 liHtml = HTML_LI_HEAD;
428             } else {
429                 liHtml = HTML_LI_SUFFIX;
430             }
431             String suffixHtml = getHtmlRowResult(SUFFIX_FOLDER_NAME, model.getSuffix(),
432                     CLASS_SUFFIXLAYOUT, CLASS_SUFFIXKEY, CLASS_SUFFIXVALUE);
433             String totalSizeHtml = getHtmlRowResult(RESULT_TOTAL_SIZE, model.getTotalSize(),
434                     CLASS_SUFFIXLAYOUT, CLASS_SUFFIXKEY, CLASS_SUFFIXVALUE);
435             String modelHtml = liHtml + TABLE_SUFFIX
436                     + suffixHtml + totalSizeHtml + filesHtml + TABLE_END + HTML_LI_END;
437             resultHtml.append(modelHtml);
438         }
439         resultHtml.append(HTML_UL_END);
440         if (models.size() > SHOW_SIZE) {
441             resultHtml.append(String.format(HTML_BUTTON_SHOW, SUFFIX_FOLDER_NAME, SUFFIX_FOLDER_NAME));
442             resultHtml.append(String.format(HTML_BUTTON_HIDE, SUFFIX_FOLDER_NAME, SUFFIX_FOLDER_NAME));
443         }
444         return resultHtml.toString();
445     }
446 
getHtmlRow(String key, String valve)447     private static String getHtmlRow(String key, String valve) {
448         return HTML_TR_STYLE + key + HTML_TD_STYLE + valve + HTML_TDTR_END;
449     }
450 
getHtmlRow(String key, long valve)451     private static String getHtmlRow(String key, long valve) {
452         return HTML_TR_STYLE + key + HTML_TD_STYLE + valve + HTML_TDTR_END;
453     }
454 
getHtmlRowResultClass(String key, String valve)455     private static String getHtmlRowResultClass(String key, String valve) {
456         return HTML_TRTD_STYLE + key + HTML_TD_STYLE + valve + HTML_TDTR_END;
457     }
458 
getHtmlRowResult(String key, String valve, String trClass, String tdClassKey, String tdClassValue)459     private static String getHtmlRowResult(String key, String valve,
460                                            String trClass, String tdClassKey, String tdClassValue) {
461         return String.format(HTML_TDTR_HEAD + key + HTML_TDTR_SEND + valve + HTML_TDTR_END,
462                 trClass, tdClassKey, tdClassValue);
463     }
464 
getHtmlRowResult(String key, long valve, String trClass, String tdClassKey, String tdClassValue)465     private static String getHtmlRowResult(String key, long valve,
466                                            String trClass, String tdClassKey, String tdClassValue) {
467         return String.format(HTML_TDTR_HEAD + key + HTML_TDTR_SEND + valve + HTML_TDTR_END,
468                 trClass, tdClassKey, tdClassValue);
469     }
470 
getHtmlRowFile(String key, List<FileInfo> files)471     private static String getHtmlRowFile(String key, List<FileInfo> files) {
472         StringBuilder resValve = new StringBuilder(EMPTY_STRING);
473         for (FileInfo file : files) {
474             resValve.insert(0, STATEMENT_FILE + file.getFile() + HTML_BR_HEAD);
475             resValve.insert(0, STATEMENT_SIZE + file.getSize() + HTML_BR_HEAD);
476         }
477         return CLASS_TRTD_SUFFIXVALUE + key + CLASS_TD_SUFFIXVALUE + resValve + HTML_TDTR_END;
478     }
479 
getHtmlRowFileSo(String key, List<SoFile> files)480     private static String getHtmlRowFileSo(String key, List<SoFile> files) {
481         StringBuilder resValve = new StringBuilder(EMPTY_STRING);
482         for (SoFile soFile : files) {
483             resValve.insert(0, STATEMENT_FILE + soFile.getFile() + HTML_BR_HEAD);
484             resValve.insert(0, STATEMENT_SIZE + soFile.getSize() + HTML_BR_HEAD);
485             resValve.insert(0, STATEMENT_COMPRESS + soFile.getCompress() + HTML_BR_HEAD);
486         }
487         return CLASS_TRTD_SUFFIXVALUE + key + CLASS_TD_SUFFIXVALUE + resValve + HTML_TDTR_END;
488     }
489 
getCurrentTime()490     private static String getCurrentTime() {
491         long currentTimeMillis = System.currentTimeMillis();
492         return new SimpleDateFormat(DATE_FORMAT).format(currentTimeMillis);
493     }
494 
unpackHap(String srcPath, String outPath)495     private static void unpackHap(String srcPath, String outPath) throws BundleException {
496         try (FileInputStream fis = new FileInputStream(srcPath);
497              ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(fis))) {
498             File destDir = new File(outPath);
499             if (!destDir.exists()) {
500                 destDir.mkdirs();
501             }
502             unpackEntryToFile(zipInputStream, outPath);
503         } catch (IOException e) {
504             LOG.error(ScanErrorEnum.SUFFIX_UNPACK_ERROR + e.getMessage());
505             throw new BundleException(ScanErrorEnum.SUFFIX_UNPACK_ERROR.msg + e.getMessage());
506         }
507     }
508 
unpackEntryToFile(ZipInputStream zipInputStream, String outPath)509     private static void unpackEntryToFile(ZipInputStream zipInputStream, String outPath)
510             throws BundleException, IOException {
511         ZipEntry entry;
512         while ((entry = zipInputStream.getNextEntry()) != null) {
513             String entryName = entry.getName();
514             File entryFile = new File(outPath, entryName);
515 
516             if (entry.isDirectory()) {
517                 entryFile.mkdirs();
518                 zipInputStream.closeEntry();
519                 continue;
520             }
521             File parent = entryFile.getParentFile();
522             if (!parent.exists()) {
523                 parent.mkdirs();
524             }
525             try (FileOutputStream fos = new FileOutputStream(entryFile)) {
526                 byte[] buffer = new byte[BUFFER_SIZE];
527                 int bytesRead;
528                 while ((bytesRead = zipInputStream.read(buffer)) != -1) {
529                     fos.write(buffer, 0, bytesRead);
530                 }
531             } catch (IOException e) {
532                 LOG.error(ScanErrorEnum.SUFFIX_UNPACK_STREAM_ERROR + e.getMessage());
533                 throw new BundleException(ScanErrorEnum.SUFFIX_UNPACK_STREAM_ERROR.msg + e.getMessage());
534             }
535             zipInputStream.closeEntry();
536         }
537     }
538 
deleteFile(File file)539     private static void deleteFile(File file) {
540         if (file == null || !file.exists()) {
541             return;
542         }
543         if (file.isDirectory()) {
544             File[] files = file.listFiles();
545             for (File fileTmp : files) {
546                 deleteFile(fileTmp);
547             }
548         }
549         file.delete();
550     }
551 }
552