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