1b8a72a62Sopenharmony_ci/* 2b8a72a62Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3b8a72a62Sopenharmony_ci * 4b8a72a62Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 5b8a72a62Sopenharmony_ci * you may not use this file except in compliance with the License. 6b8a72a62Sopenharmony_ci * You may obtain a copy of the License at 7b8a72a62Sopenharmony_ci * 8b8a72a62Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 9b8a72a62Sopenharmony_ci * 10b8a72a62Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 11b8a72a62Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 12b8a72a62Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b8a72a62Sopenharmony_ci * See the License for the specific language governing permissions and 14b8a72a62Sopenharmony_ci * limitations under the License. 15b8a72a62Sopenharmony_ci */ 16b8a72a62Sopenharmony_ci 17b8a72a62Sopenharmony_cipackage ohos; 18b8a72a62Sopenharmony_ci 19b8a72a62Sopenharmony_ciimport com.alibaba.fastjson.JSON; 20b8a72a62Sopenharmony_ciimport com.alibaba.fastjson.serializer.SerializerFeature; 21b8a72a62Sopenharmony_ci 22b8a72a62Sopenharmony_ciimport java.io.File; 23b8a72a62Sopenharmony_ciimport java.text.SimpleDateFormat; 24b8a72a62Sopenharmony_ciimport java.util.ArrayList; 25b8a72a62Sopenharmony_ciimport java.util.Comparator; 26b8a72a62Sopenharmony_ciimport java.util.List; 27b8a72a62Sopenharmony_ci 28b8a72a62Sopenharmony_ci/** 29b8a72a62Sopenharmony_ci * scanFileSize info 30b8a72a62Sopenharmony_ci * 31b8a72a62Sopenharmony_ci * @since 2023/11/27 32b8a72a62Sopenharmony_ci */ 33b8a72a62Sopenharmony_ci 34b8a72a62Sopenharmony_cipublic class ScanStatFileSize { 35b8a72a62Sopenharmony_ci private static final String FILE_SIZE_FOLDER_NAME = "fileSize"; 36b8a72a62Sopenharmony_ci private static final String EMPTY_STRING = ""; 37b8a72a62Sopenharmony_ci private static final String FILE_SIZE_DESC = "find files whose size exceed the limit size"; 38b8a72a62Sopenharmony_ci private static final String FILE_SIZE_PARAM = "--stat-file-size"; 39b8a72a62Sopenharmony_ci private static final String FILE_SIZE_PARAM_SEPARATOR = " "; 40b8a72a62Sopenharmony_ci private static final String FILE_SIZE_PARAM_VALUE = "%s"; 41b8a72a62Sopenharmony_ci private static final String FILE_SIZE_RESULT_SIZE = "size"; 42b8a72a62Sopenharmony_ci private static final String FILE_SIZE_RESULT_FILE = "file"; 43b8a72a62Sopenharmony_ci private static final String TASK_TYPE = "taskType"; 44b8a72a62Sopenharmony_ci private static final String TASK_DESC = "taskDesc"; 45b8a72a62Sopenharmony_ci private static final String PARAM = "param"; 46b8a72a62Sopenharmony_ci private static final String START_TIME = "startTime"; 47b8a72a62Sopenharmony_ci private static final String STOP_TIME = "stopTime"; 48b8a72a62Sopenharmony_ci private static final String RESULT = "result"; 49b8a72a62Sopenharmony_ci private static final long FILE_SIZE_TYPE = 2L; 50b8a72a62Sopenharmony_ci private static final long SHOW_SIZE = 10L; 51b8a72a62Sopenharmony_ci private static final String HTML_BUTTON_SHOW = "<button id=\"show_%s\" type=\"button\" " 52b8a72a62Sopenharmony_ci + "onclick=\"show_%s()\" style=\"display: block\">more</button>"; 53b8a72a62Sopenharmony_ci private static final String HTML_BUTTON_HIDE = "<button id=\"hide_%s\" type=\"button\" " 54b8a72a62Sopenharmony_ci + "onclick=\"hide_%s()\" style=\"display: none\">close</button>"; 55b8a72a62Sopenharmony_ci private static final String UNPACK_NAME = "unpack"; 56b8a72a62Sopenharmony_ci private static final String HTML_TABLE = "<table%s>"; 57b8a72a62Sopenharmony_ci private static final String HTML_TABLE_END = "</table>"; 58b8a72a62Sopenharmony_ci private static final String CLASS_BOX_TABLE = " class=\"boxTable\""; 59b8a72a62Sopenharmony_ci private static final String CLASS_FILE_SIZE_TABLE = " class=\"fileSizeTable\""; 60b8a72a62Sopenharmony_ci private static final String CLASS_FILE_SIZE_LAYOUT = " class=\"fileSizeLayout\""; 61b8a72a62Sopenharmony_ci private static final String CLASS_FILE_SIZE_KEY = " class=\"fileSizeKey\""; 62b8a72a62Sopenharmony_ci private static final String CLASS_FILE_SIZE_VALUE = " class=\"fileSizeValue\""; 63b8a72a62Sopenharmony_ci private static final String CLASS_FILE_SIZE = " class=\"fileSize\""; 64b8a72a62Sopenharmony_ci private static final String HTML_TR = "<tr%s>"; 65b8a72a62Sopenharmony_ci private static final String HTML_TR_END = "</tr>"; 66b8a72a62Sopenharmony_ci private static final String HTML_TD = "<td%s>"; 67b8a72a62Sopenharmony_ci private static final String HTML_TD_END = "</td>"; 68b8a72a62Sopenharmony_ci private static final String CLASS_LAYOUT = " class=\"layout\""; 69b8a72a62Sopenharmony_ci private static final String CLASS_KEY = " class=\"key\""; 70b8a72a62Sopenharmony_ci private static final String CLASS_VALUE = " class=\"value\""; 71b8a72a62Sopenharmony_ci private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss:SSS"; 72b8a72a62Sopenharmony_ci private static final int INPUT_BYTE_SIZE = 1024; 73b8a72a62Sopenharmony_ci private static final Log LOG = new Log(ScanStatFileSize.class.toString()); 74b8a72a62Sopenharmony_ci 75b8a72a62Sopenharmony_ci private static class ParamModelFileSize { 76b8a72a62Sopenharmony_ci private String file = EMPTY_STRING; 77b8a72a62Sopenharmony_ci private long size; 78b8a72a62Sopenharmony_ci 79b8a72a62Sopenharmony_ci public long getSize() { 80b8a72a62Sopenharmony_ci return this.size; 81b8a72a62Sopenharmony_ci } 82b8a72a62Sopenharmony_ci public void setSize(long size) { 83b8a72a62Sopenharmony_ci this.size = size; 84b8a72a62Sopenharmony_ci } 85b8a72a62Sopenharmony_ci public String getFile() { 86b8a72a62Sopenharmony_ci return file; 87b8a72a62Sopenharmony_ci } 88b8a72a62Sopenharmony_ci public void setFile(String file) { 89b8a72a62Sopenharmony_ci this.file = file; 90b8a72a62Sopenharmony_ci } 91b8a72a62Sopenharmony_ci } 92b8a72a62Sopenharmony_ci 93b8a72a62Sopenharmony_ci private static class FileSizeResult { 94b8a72a62Sopenharmony_ci private long taskType = FILE_SIZE_TYPE; 95b8a72a62Sopenharmony_ci private String taskDesc = FILE_SIZE_DESC; 96b8a72a62Sopenharmony_ci private String param = FILE_SIZE_PARAM + FILE_SIZE_PARAM_SEPARATOR + FILE_SIZE_PARAM_VALUE; 97b8a72a62Sopenharmony_ci private String startTime = EMPTY_STRING; 98b8a72a62Sopenharmony_ci private String stopTime = EMPTY_STRING; 99b8a72a62Sopenharmony_ci private List<ParamModelFileSize> result = new ArrayList<>(); 100b8a72a62Sopenharmony_ci 101b8a72a62Sopenharmony_ci public long getTaskType() { 102b8a72a62Sopenharmony_ci return this.taskType; 103b8a72a62Sopenharmony_ci } 104b8a72a62Sopenharmony_ci public void setTaskType(long taskType) { 105b8a72a62Sopenharmony_ci this.taskType = taskType; 106b8a72a62Sopenharmony_ci } 107b8a72a62Sopenharmony_ci public String getTaskDesc() { 108b8a72a62Sopenharmony_ci return this.taskDesc; 109b8a72a62Sopenharmony_ci } 110b8a72a62Sopenharmony_ci public void setTaskDesc(String taskDesc) { 111b8a72a62Sopenharmony_ci this.taskDesc = taskDesc; 112b8a72a62Sopenharmony_ci } 113b8a72a62Sopenharmony_ci public String getParam() { 114b8a72a62Sopenharmony_ci return this.param; 115b8a72a62Sopenharmony_ci } 116b8a72a62Sopenharmony_ci public void setParam(String param) { 117b8a72a62Sopenharmony_ci this.param = param; 118b8a72a62Sopenharmony_ci } 119b8a72a62Sopenharmony_ci public String getStartTime() { 120b8a72a62Sopenharmony_ci return this.startTime; 121b8a72a62Sopenharmony_ci } 122b8a72a62Sopenharmony_ci public void setStartTime(String startTime) { 123b8a72a62Sopenharmony_ci this.startTime = startTime; 124b8a72a62Sopenharmony_ci } 125b8a72a62Sopenharmony_ci public String getStopTime() { 126b8a72a62Sopenharmony_ci return this.stopTime; 127b8a72a62Sopenharmony_ci } 128b8a72a62Sopenharmony_ci public void setStopTime(String stopTime) { 129b8a72a62Sopenharmony_ci this.stopTime = stopTime; 130b8a72a62Sopenharmony_ci } 131b8a72a62Sopenharmony_ci public List<ParamModelFileSize> getResult() { 132b8a72a62Sopenharmony_ci return this.result; 133b8a72a62Sopenharmony_ci } 134b8a72a62Sopenharmony_ci public void setResult(List<ParamModelFileSize> result) { 135b8a72a62Sopenharmony_ci this.result = result; 136b8a72a62Sopenharmony_ci } 137b8a72a62Sopenharmony_ci } 138b8a72a62Sopenharmony_ci 139b8a72a62Sopenharmony_ci /** 140b8a72a62Sopenharmony_ci * scan statFileSize. 141b8a72a62Sopenharmony_ci * 142b8a72a62Sopenharmony_ci * @param utility utility data 143b8a72a62Sopenharmony_ci * @param jsonList List<String> data 144b8a72a62Sopenharmony_ci * @param fileList List<String> data 145b8a72a62Sopenharmony_ci * @return fileSize html 146b8a72a62Sopenharmony_ci */ 147b8a72a62Sopenharmony_ci public String statFileSize(Utility utility, List<String> jsonList, List<String> fileList) { 148b8a72a62Sopenharmony_ci FileSizeResult fileSizeResult = new FileSizeResult(); 149b8a72a62Sopenharmony_ci fileSizeResult.setStartTime(getCurrentTime()); 150b8a72a62Sopenharmony_ci List<ParamModelFileSize> resList = new ArrayList<>(); 151b8a72a62Sopenharmony_ci for (String filePath : fileList) { 152b8a72a62Sopenharmony_ci long statFileSize = Long.parseLong(utility.getStatFileSize()); 153b8a72a62Sopenharmony_ci long size = FileUtils.getFileSize(filePath); 154b8a72a62Sopenharmony_ci if (size > statFileSize * INPUT_BYTE_SIZE) { 155b8a72a62Sopenharmony_ci ParamModelFileSize model = new ParamModelFileSize(); 156b8a72a62Sopenharmony_ci model.setFile(splitPath(filePath, UNPACK_NAME)); 157b8a72a62Sopenharmony_ci model.setSize(size); 158b8a72a62Sopenharmony_ci resList.add(model); 159b8a72a62Sopenharmony_ci } 160b8a72a62Sopenharmony_ci } 161b8a72a62Sopenharmony_ci resList.sort(Comparator.comparing(ParamModelFileSize::getSize).reversed()); 162b8a72a62Sopenharmony_ci fileSizeResult.setResult(resList); 163b8a72a62Sopenharmony_ci fileSizeResult.setParam(String.format(fileSizeResult.getParam(), utility.getStatFileSize())); 164b8a72a62Sopenharmony_ci fileSizeResult.setStopTime(getCurrentTime()); 165b8a72a62Sopenharmony_ci File parentFile = new File(utility.getOutPath()); 166b8a72a62Sopenharmony_ci if (!parentFile.exists() && !parentFile.mkdirs()) { 167b8a72a62Sopenharmony_ci LOG.error(ScanErrorEnum.SCAN_STAT_FILE_SIZE_CREATE_FILE_PARENT_ERROR.toString()); 168b8a72a62Sopenharmony_ci } 169b8a72a62Sopenharmony_ci String jsonStr = JSON.toJSONString(fileSizeResult, new SerializerFeature[] { 170b8a72a62Sopenharmony_ci SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, 171b8a72a62Sopenharmony_ci SerializerFeature.WriteDateUseDateFormat}); 172b8a72a62Sopenharmony_ci String taskTypeHtml = getHtmlRow(TASK_TYPE, fileSizeResult.getTaskType()); 173b8a72a62Sopenharmony_ci String taskDescHtml = getHtmlRow(TASK_DESC, fileSizeResult.getTaskDesc()); 174b8a72a62Sopenharmony_ci String paramHtml = getHtmlRow(PARAM, fileSizeResult.getParam()); 175b8a72a62Sopenharmony_ci String startTimeHtml = getHtmlRow(START_TIME, fileSizeResult.getStartTime()); 176b8a72a62Sopenharmony_ci String stopTimeHtml = getHtmlRow(STOP_TIME, fileSizeResult.getStopTime()); 177b8a72a62Sopenharmony_ci String resultValue = getResultHtmlFileSize(fileSizeResult.getResult()); 178b8a72a62Sopenharmony_ci String resultHtml = getHtmlRowResultClass(RESULT, resultValue); 179b8a72a62Sopenharmony_ci String htmlStr = String.format(HTML_TABLE, CLASS_BOX_TABLE) + taskTypeHtml + taskDescHtml + paramHtml 180b8a72a62Sopenharmony_ci + startTimeHtml + stopTimeHtml + resultHtml + HTML_TABLE_END; 181b8a72a62Sopenharmony_ci jsonList.add(jsonStr); 182b8a72a62Sopenharmony_ci return htmlStr; 183b8a72a62Sopenharmony_ci } 184b8a72a62Sopenharmony_ci 185b8a72a62Sopenharmony_ci private String splitPath(String path, String packageName) { 186b8a72a62Sopenharmony_ci String[] split = path.split(packageName); 187b8a72a62Sopenharmony_ci if (split.length > 1) { 188b8a72a62Sopenharmony_ci return split[1]; 189b8a72a62Sopenharmony_ci } else { 190b8a72a62Sopenharmony_ci return path; 191b8a72a62Sopenharmony_ci } 192b8a72a62Sopenharmony_ci } 193b8a72a62Sopenharmony_ci 194b8a72a62Sopenharmony_ci private static String getResultHtmlFileSize(List<ParamModelFileSize> models) { 195b8a72a62Sopenharmony_ci StringBuilder resultHtml = new StringBuilder(EMPTY_STRING); 196b8a72a62Sopenharmony_ci resultHtml.append(String.format(HTML_TABLE, CLASS_FILE_SIZE_TABLE)); 197b8a72a62Sopenharmony_ci String resultFieldHtml = getHtmlRowResult(FILE_SIZE_RESULT_FILE, FILE_SIZE_RESULT_SIZE, 198b8a72a62Sopenharmony_ci CLASS_FILE_SIZE_LAYOUT, CLASS_FILE_SIZE_KEY, CLASS_FILE_SIZE_VALUE); 199b8a72a62Sopenharmony_ci resultHtml.append(resultFieldHtml); 200b8a72a62Sopenharmony_ci for (int i = 0; i < models.size(); i++) { 201b8a72a62Sopenharmony_ci ParamModelFileSize model = models.get(i); 202b8a72a62Sopenharmony_ci String resultRowHtml; 203b8a72a62Sopenharmony_ci if (SHOW_SIZE > i) { 204b8a72a62Sopenharmony_ci resultRowHtml = getHtmlRowResult(model.getFile(), model.getSize(), 205b8a72a62Sopenharmony_ci CLASS_FILE_SIZE_LAYOUT, CLASS_FILE_SIZE_KEY, CLASS_FILE_SIZE_VALUE); 206b8a72a62Sopenharmony_ci } else { 207b8a72a62Sopenharmony_ci resultRowHtml = getHtmlRowResult(model.getFile(), model.getSize(), 208b8a72a62Sopenharmony_ci CLASS_FILE_SIZE, CLASS_FILE_SIZE_KEY, CLASS_FILE_SIZE_VALUE); 209b8a72a62Sopenharmony_ci } 210b8a72a62Sopenharmony_ci resultHtml.append(resultRowHtml); 211b8a72a62Sopenharmony_ci } 212b8a72a62Sopenharmony_ci resultHtml.append(HTML_TABLE_END); 213b8a72a62Sopenharmony_ci if (models.size() > SHOW_SIZE) { 214b8a72a62Sopenharmony_ci resultHtml.append(String.format(HTML_BUTTON_SHOW, FILE_SIZE_FOLDER_NAME, FILE_SIZE_FOLDER_NAME)); 215b8a72a62Sopenharmony_ci resultHtml.append(String.format(HTML_BUTTON_HIDE, FILE_SIZE_FOLDER_NAME, FILE_SIZE_FOLDER_NAME)); 216b8a72a62Sopenharmony_ci } 217b8a72a62Sopenharmony_ci return resultHtml.toString(); 218b8a72a62Sopenharmony_ci } 219b8a72a62Sopenharmony_ci 220b8a72a62Sopenharmony_ci private static String getHtmlRow(String key, String valve) { 221b8a72a62Sopenharmony_ci return String.format(HTML_TR, CLASS_LAYOUT) + String.format(HTML_TD, CLASS_KEY) + key + HTML_TD_END 222b8a72a62Sopenharmony_ci + String.format(HTML_TD, CLASS_VALUE) + valve + HTML_TD_END + HTML_TR_END; 223b8a72a62Sopenharmony_ci } 224b8a72a62Sopenharmony_ci 225b8a72a62Sopenharmony_ci private static String getHtmlRow(String key, long valve) { 226b8a72a62Sopenharmony_ci return String.format(HTML_TR, CLASS_LAYOUT) + String.format(HTML_TD, CLASS_KEY) + key + HTML_TD_END 227b8a72a62Sopenharmony_ci + String.format(HTML_TD, CLASS_VALUE) + valve + HTML_TD_END + HTML_TR_END; 228b8a72a62Sopenharmony_ci } 229b8a72a62Sopenharmony_ci 230b8a72a62Sopenharmony_ci private static String getHtmlRowResultClass(String key, String valve) { 231b8a72a62Sopenharmony_ci return String.format(HTML_TR, CLASS_LAYOUT) + String.format(HTML_TD, CLASS_KEY) + key + HTML_TD_END 232b8a72a62Sopenharmony_ci + String.format(HTML_TD, CLASS_VALUE) + valve + HTML_TD_END + HTML_TR_END; 233b8a72a62Sopenharmony_ci } 234b8a72a62Sopenharmony_ci 235b8a72a62Sopenharmony_ci private static String getHtmlRowResult(String key, String valve, 236b8a72a62Sopenharmony_ci String trClass, String tdClassKey, String tdClassValue) { 237b8a72a62Sopenharmony_ci return String.format(HTML_TR + HTML_TD + key + HTML_TD_END + HTML_TD + valve + HTML_TD_END + HTML_TR_END, 238b8a72a62Sopenharmony_ci trClass, tdClassKey, tdClassValue); 239b8a72a62Sopenharmony_ci } 240b8a72a62Sopenharmony_ci 241b8a72a62Sopenharmony_ci private static String getHtmlRowResult(String key, long valve, 242b8a72a62Sopenharmony_ci String trClass, String tdClassKey, String tdClassValue) { 243b8a72a62Sopenharmony_ci return String.format(HTML_TR + HTML_TD + key + HTML_TD_END + HTML_TD + valve + HTML_TD_END + HTML_TR_END, 244b8a72a62Sopenharmony_ci trClass, tdClassKey, tdClassValue); 245b8a72a62Sopenharmony_ci } 246b8a72a62Sopenharmony_ci 247b8a72a62Sopenharmony_ci private static String getCurrentTime() { 248b8a72a62Sopenharmony_ci long currentTimeMillis = System.currentTimeMillis(); 249b8a72a62Sopenharmony_ci return new SimpleDateFormat(DATE_FORMAT).format(currentTimeMillis); 250b8a72a62Sopenharmony_ci } 251b8a72a62Sopenharmony_ci} 252