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