/* * Copyright (c) 2023 Huawei Device Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ohos; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Comparator; import java.util.List; /** * scanFileSize info * * @since 2023/11/27 */ public class ScanStatFileSize { private static final String FILE_SIZE_FOLDER_NAME = "fileSize"; private static final String EMPTY_STRING = ""; private static final String FILE_SIZE_DESC = "find files whose size exceed the limit size"; private static final String FILE_SIZE_PARAM = "--stat-file-size"; private static final String FILE_SIZE_PARAM_SEPARATOR = " "; private static final String FILE_SIZE_PARAM_VALUE = "%s"; private static final String FILE_SIZE_RESULT_SIZE = "size"; private static final String FILE_SIZE_RESULT_FILE = "file"; private static final String TASK_TYPE = "taskType"; private static final String TASK_DESC = "taskDesc"; private static final String PARAM = "param"; private static final String START_TIME = "startTime"; private static final String STOP_TIME = "stopTime"; private static final String RESULT = "result"; private static final long FILE_SIZE_TYPE = 2L; private static final long SHOW_SIZE = 10L; private static final String HTML_BUTTON_SHOW = ""; private static final String HTML_BUTTON_HIDE = ""; private static final String UNPACK_NAME = "unpack"; private static final String HTML_TABLE = ""; private static final String HTML_TABLE_END = ""; private static final String CLASS_BOX_TABLE = " class=\"boxTable\""; private static final String CLASS_FILE_SIZE_TABLE = " class=\"fileSizeTable\""; private static final String CLASS_FILE_SIZE_LAYOUT = " class=\"fileSizeLayout\""; private static final String CLASS_FILE_SIZE_KEY = " class=\"fileSizeKey\""; private static final String CLASS_FILE_SIZE_VALUE = " class=\"fileSizeValue\""; private static final String CLASS_FILE_SIZE = " class=\"fileSize\""; private static final String HTML_TR = ""; private static final String HTML_TR_END = ""; private static final String HTML_TD = ""; private static final String HTML_TD_END = ""; private static final String CLASS_LAYOUT = " class=\"layout\""; private static final String CLASS_KEY = " class=\"key\""; private static final String CLASS_VALUE = " class=\"value\""; private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss:SSS"; private static final int INPUT_BYTE_SIZE = 1024; private static final Log LOG = new Log(ScanStatFileSize.class.toString()); private static class ParamModelFileSize { private String file = EMPTY_STRING; private long size; public long getSize() { return this.size; } public void setSize(long size) { this.size = size; } public String getFile() { return file; } public void setFile(String file) { this.file = file; } } private static class FileSizeResult { private long taskType = FILE_SIZE_TYPE; private String taskDesc = FILE_SIZE_DESC; private String param = FILE_SIZE_PARAM + FILE_SIZE_PARAM_SEPARATOR + FILE_SIZE_PARAM_VALUE; private String startTime = EMPTY_STRING; private String stopTime = EMPTY_STRING; private List result = new ArrayList<>(); public long getTaskType() { return this.taskType; } public void setTaskType(long taskType) { this.taskType = taskType; } public String getTaskDesc() { return this.taskDesc; } public void setTaskDesc(String taskDesc) { this.taskDesc = taskDesc; } public String getParam() { return this.param; } public void setParam(String param) { this.param = param; } public String getStartTime() { return this.startTime; } public void setStartTime(String startTime) { this.startTime = startTime; } public String getStopTime() { return this.stopTime; } public void setStopTime(String stopTime) { this.stopTime = stopTime; } public List getResult() { return this.result; } public void setResult(List result) { this.result = result; } } /** * scan statFileSize. * * @param utility utility data * @param jsonList List data * @param fileList List data * @return fileSize html */ public String statFileSize(Utility utility, List jsonList, List fileList) { FileSizeResult fileSizeResult = new FileSizeResult(); fileSizeResult.setStartTime(getCurrentTime()); List resList = new ArrayList<>(); for (String filePath : fileList) { long statFileSize = Long.parseLong(utility.getStatFileSize()); long size = FileUtils.getFileSize(filePath); if (size > statFileSize * INPUT_BYTE_SIZE) { ParamModelFileSize model = new ParamModelFileSize(); model.setFile(splitPath(filePath, UNPACK_NAME)); model.setSize(size); resList.add(model); } } resList.sort(Comparator.comparing(ParamModelFileSize::getSize).reversed()); fileSizeResult.setResult(resList); fileSizeResult.setParam(String.format(fileSizeResult.getParam(), utility.getStatFileSize())); fileSizeResult.setStopTime(getCurrentTime()); File parentFile = new File(utility.getOutPath()); if (!parentFile.exists() && !parentFile.mkdirs()) { LOG.error(ScanErrorEnum.SCAN_STAT_FILE_SIZE_CREATE_FILE_PARENT_ERROR.toString()); } String jsonStr = JSON.toJSONString(fileSizeResult, new SerializerFeature[] { SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteDateUseDateFormat}); String taskTypeHtml = getHtmlRow(TASK_TYPE, fileSizeResult.getTaskType()); String taskDescHtml = getHtmlRow(TASK_DESC, fileSizeResult.getTaskDesc()); String paramHtml = getHtmlRow(PARAM, fileSizeResult.getParam()); String startTimeHtml = getHtmlRow(START_TIME, fileSizeResult.getStartTime()); String stopTimeHtml = getHtmlRow(STOP_TIME, fileSizeResult.getStopTime()); String resultValue = getResultHtmlFileSize(fileSizeResult.getResult()); String resultHtml = getHtmlRowResultClass(RESULT, resultValue); String htmlStr = String.format(HTML_TABLE, CLASS_BOX_TABLE) + taskTypeHtml + taskDescHtml + paramHtml + startTimeHtml + stopTimeHtml + resultHtml + HTML_TABLE_END; jsonList.add(jsonStr); return htmlStr; } private String splitPath(String path, String packageName) { String[] split = path.split(packageName); if (split.length > 1) { return split[1]; } else { return path; } } private static String getResultHtmlFileSize(List models) { StringBuilder resultHtml = new StringBuilder(EMPTY_STRING); resultHtml.append(String.format(HTML_TABLE, CLASS_FILE_SIZE_TABLE)); String resultFieldHtml = getHtmlRowResult(FILE_SIZE_RESULT_FILE, FILE_SIZE_RESULT_SIZE, CLASS_FILE_SIZE_LAYOUT, CLASS_FILE_SIZE_KEY, CLASS_FILE_SIZE_VALUE); resultHtml.append(resultFieldHtml); for (int i = 0; i < models.size(); i++) { ParamModelFileSize model = models.get(i); String resultRowHtml; if (SHOW_SIZE > i) { resultRowHtml = getHtmlRowResult(model.getFile(), model.getSize(), CLASS_FILE_SIZE_LAYOUT, CLASS_FILE_SIZE_KEY, CLASS_FILE_SIZE_VALUE); } else { resultRowHtml = getHtmlRowResult(model.getFile(), model.getSize(), CLASS_FILE_SIZE, CLASS_FILE_SIZE_KEY, CLASS_FILE_SIZE_VALUE); } resultHtml.append(resultRowHtml); } resultHtml.append(HTML_TABLE_END); if (models.size() > SHOW_SIZE) { resultHtml.append(String.format(HTML_BUTTON_SHOW, FILE_SIZE_FOLDER_NAME, FILE_SIZE_FOLDER_NAME)); resultHtml.append(String.format(HTML_BUTTON_HIDE, FILE_SIZE_FOLDER_NAME, FILE_SIZE_FOLDER_NAME)); } return resultHtml.toString(); } private static String getHtmlRow(String key, String valve) { return String.format(HTML_TR, CLASS_LAYOUT) + String.format(HTML_TD, CLASS_KEY) + key + HTML_TD_END + String.format(HTML_TD, CLASS_VALUE) + valve + HTML_TD_END + HTML_TR_END; } private static String getHtmlRow(String key, long valve) { return String.format(HTML_TR, CLASS_LAYOUT) + String.format(HTML_TD, CLASS_KEY) + key + HTML_TD_END + String.format(HTML_TD, CLASS_VALUE) + valve + HTML_TD_END + HTML_TR_END; } private static String getHtmlRowResultClass(String key, String valve) { return String.format(HTML_TR, CLASS_LAYOUT) + String.format(HTML_TD, CLASS_KEY) + key + HTML_TD_END + String.format(HTML_TD, CLASS_VALUE) + valve + HTML_TD_END + HTML_TR_END; } private static String getHtmlRowResult(String key, String valve, String trClass, String tdClassKey, String tdClassValue) { return String.format(HTML_TR + HTML_TD + key + HTML_TD_END + HTML_TD + valve + HTML_TD_END + HTML_TR_END, trClass, tdClassKey, tdClassValue); } private static String getHtmlRowResult(String key, long valve, String trClass, String tdClassKey, String tdClassValue) { return String.format(HTML_TR + HTML_TD + key + HTML_TD_END + HTML_TD + valve + HTML_TD_END + HTML_TR_END, trClass, tdClassKey, tdClassValue); } private static String getCurrentTime() { long currentTimeMillis = System.currentTimeMillis(); return new SimpleDateFormat(DATE_FORMAT).format(currentTimeMillis); } }