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