• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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