• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 package ohos;
17 
18 import com.alibaba.fastjson.JSONValidator;
19 import java.io.File;
20 import java.io.FileInputStream;
21 import java.io.FileReader;
22 import java.io.InputStreamReader;
23 import java.io.IOException;
24 import java.io.Reader;
25 import java.nio.charset.StandardCharsets;
26 import java.util.ArrayList;
27 import java.util.Arrays;
28 import java.util.Locale;
29 import java.util.Map;
30 import java.util.regex.Matcher;
31 import java.util.regex.Pattern;
32 import java.util.List;
33 import java.util.Optional;
34 
35 /**
36  * compress comment,command parser.
37  *
38  */
39 public class CompressVerify {
40     private static final String COMMA_SPLIT = ",";
41     private static final String JSON_PROFILE = "config.json";
42     private static final String MODULE_PROFILE = "module.json";
43     private static final String PATCH_PROFILE = "patch.json";
44     private static final String PKG_CONTEXT_INFO = "pkgContextInfo.json";
45     private static final String PROFILE_NAME = "CAPABILITY.profile";
46     private static final String INDEX_PROFILE = "resources.index";
47     private static final String RPCID_PROFILE = "rpcid.sc";
48     private static final String PACK_INFO = "pack.info";
49     private static final String PACK_RES = "pack.res";
50     private static final String HAP_SUFFIX = ".hap";
51     private static final String HAR_SUFFIX = ".har";
52     private static final String APP_SUFFIX = ".app";
53     private static final String APK_SUFFIX = ".apk";
54     private static final String DEX_SUFFIX = ".dex";
55     private static final String ABC_SUFFIX = ".abc";
56     private static final String SO_SUFFIX = ".so";
57     private static final String JAR_SUFFIX = ".jar";
58     private static final String TXT_SUFFIX = ".txt";
59     private static final String PNG_SUFFIX = ".png";
60     private static final String RES_SUFFIX = ".res";
61     private static final String HQF_SUFFIX = ".hqf";
62     private static final String APPQF_SUFFIX = ".appqf";
63     private static final String HSP_SUFFIX = ".hsp";
64     private static final String JSON_SUFFIX = ".json";
65     private static final String FALSE = "false";
66     private static final String ENTRY_CARD_DIRECTORY_NAME = "EntryCard";
67     private static final String VERSION_NAME_PATTERN = "^[0-9.]+|(?=.*[{])(?=.*[}])[0-9a-zA-Z_.{}]+$";
68     private static final String LINUX_FILE_SEPARATOR = "/";
69     private static final String BUNDLE_TYPE_SHARE = "shared";
70     private static final String BUNDLE_TYPE_APP = "app";
71     private static final String BUNDLE_TYPE_APP_SERVICE = "appService";
72     private static final String SKILLS_ENTITIES = "entities";
73     private static final String SKILLS_ACTIONS = "actions";
74     private static final String ACTION_SYSTEM_HOME = "action.system.home";
75     private static final String ENTITY_SYSTEM_HOME = "entity.system.home";
76     private static final String BUNDLE_NAME_PATTERN =
77             "([a-zA-Z]|[a-zA-Z]+(_*[0-9a-zA-Z])+)(\\.[0-9a-zA-Z]|\\.[0-9a-zA-Z]+(_*[0-9a-zA-Z])+){2,}";
78     private static final int BUNDLE_NAME_LEN_MIN = 7;
79     private static final int BUNDLE_NAME_LEN_MAX = 128;
80     private static final int MAX_LENGTH = 127;
81     private static final int MINI_NUM = 0;
82     private static final int MAXI_NUM = 2147483647;
83     private static final String API_RELEASE_TYPE_PATTERN = "^(Canary[1-9]\\d*)|(Beta[1-9]\\d*)|(Release[1-9]\\d*)$";
84     private static final String VERSION_CODE = "versionCode";
85     private static final String VERSION_NAME = "versionName";
86     private static final String DEVICE_TYPES = "deviceTypes";
87     private static final String BUNDLE_NAME = "bundleName";
88     private static final String MIN_COMPATIBLE_VERSION_CODE = "minCompatibleVersionCode";
89     private static final String MIN_API_VERSION = "minAPIVersion";
90     private static final String TARGET_API_VERSION = "targetAPIVersion";
91     private static final String API_RELEASE_TYPE = "apiReleaseType";
92     private static final String BUNDLE_TYPE = "bundleType";
93     private static final String INSTALLATION_FREE = "installationFree";
94     private static final String DELIVERY_WITH_INSTALL = "deliveryWithInstall";
95     private static final List<String> bundleTypeList =
96         Arrays.asList("app", "atomicService", "shared", "appService", "appPlugin");
97     private static final List<String> deviceTypeList =
98         Arrays.asList("default", "tablet", "tv", "wearable", "car", "2in1", "phone");
99     private static final Log LOG = new Log(CompressVerify.class.toString());
100 
101     private static final boolean TYPE_FILE = true;
102     private static final boolean TYPE_DIR = false;
103     private static final Integer ONE = 1;
104 
105     /**
106      * if args valid.
107      *
108      * @param utility common data
109      * @return commandVerify if command valid.
110      */
commandVerify(Utility utility)111     public static boolean commandVerify(Utility utility) {
112         if (utility == null) {
113             LOG.error(PackingToolErrMsg.COMMAND_VERIFY_FAILED.toString("Command verify utility is null."));
114             return false;
115         }
116 
117         if (!utility.getForceRewrite().isEmpty() && !"true".equals(utility.getForceRewrite())
118                 && !"false".equals(utility.getForceRewrite())) {
119             LOG.error(PackingToolErrMsg.COMMAND_VERIFY_FAILED.toString(
120                 "If the --force parameter is configured, the value must be either 'true' or 'false'."));
121             return false;
122         }
123         return commandPathVerify(utility);
124     }
125 
126     /**
127      * verify path.
128      *
129      * @param utility common data
130      * @return commandPathVerify if command valid.
131      */
commandPathVerify(Utility utility)132     private static boolean commandPathVerify(Utility utility) {
133         switch (utility.getMode()) {
134             case Utility.MODE_HAP:
135                 if (!utility.getBinPath().isEmpty() && utility.getJsonPath().isEmpty()) {
136                     return isOutPathValid(utility, HAP_SUFFIX);
137                 } else {
138                     return isVerifyValidInHapCommonMode(utility) && isVerifyValidInHapMode(utility);
139                 }
140             case Utility.MODE_HAR:
141                 return isVerifyValidInHarMode(utility);
142             case Utility.MODE_APP:
143                 return isVerifyValidInAppMode(utility);
144             case Utility.MODE_FAST_APP:
145                 return PackageUtil.isVerifyValidInFastAppMode(utility);
146             case Utility.MODE_RES:
147                 return isVerifyValidInResMode(utility);
148             case Utility.MODE_MULTI_APP:
149                 return isVerifyValidInMultiAppMode(utility);
150             case Utility.MODE_HQF:
151                 return isVerifyValidInHQFMode(utility);
152             case Utility.MODE_APPQF:
153                 return isVerifyValidInAPPQFMode(utility);
154             case Utility.MODE_HSP:
155                 return isVerifyValidInHspMode(utility);
156             case Utility.MODE_HAPADDITION:
157                 return isVerifyValidInHapAdditionMode(utility);
158             case Utility.VERSION_NORMALIZE:
159                 return validateVersionNormalizeMode(utility);
160             case Utility.PACKAGE_NORMALIZE:
161                 return validatePackageNormalizeMode(utility);
162             case Utility.GENERAL_NORMALIZE:
163                 return validateGeneralNormalizeMode(utility);
164             default:
165                 LOG.error(PackingToolErrMsg.COMMAND_MODE_INVALID.toString());
166                 return false;
167         }
168     }
169 
isBundleNameValid(String bundleName)170     private static boolean isBundleNameValid(String bundleName) {
171         if (bundleName != null &&
172                 bundleName.length() >= BUNDLE_NAME_LEN_MIN &&
173                 bundleName.length() <= BUNDLE_NAME_LEN_MAX) {
174             Pattern pattern = Pattern.compile(BUNDLE_NAME_PATTERN);
175             return pattern.matcher(bundleName).matches();
176         }
177         return false;
178     }
179 
validatePackageNormalizeMode(Utility utility)180     private static boolean validatePackageNormalizeMode(Utility utility) {
181         if (utility.getHspList().isEmpty()) {
182             String errMsg = "--hsp-list is empty.";
183             LOG.error(PackingToolErrMsg.PACKAGE_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
184             return false;
185         } else {
186             if (!compatibleProcess(utility, utility.getHspList(), utility.getFormattedHspPathList(), HSP_SUFFIX)) {
187                 String errMsg = "--hsp-list is invalid.";
188                 LOG.error(PackingToolErrMsg.PACKAGE_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
189                 return false;
190             }
191         }
192         if (!isBundleNameValid(utility.getBundleName())) {
193             String errMsg = "--bundle-name is invalid.";
194             LOG.error(PackingToolErrMsg.PACKAGE_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
195             return false;
196         }
197         if (utility.getVersionCode() <= 0) {
198             String errMsg = "--version-code is invalid.";
199             LOG.error(PackingToolErrMsg.PACKAGE_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
200             return false;
201         }
202         if (utility.getOutPath().isEmpty()) {
203             String errMsg = "--out-path is empty.";
204             LOG.error(PackingToolErrMsg.PACKAGE_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
205             return false;
206         }
207         File outDir = new File(utility.getOutPath());
208         if (!outDir.isDirectory()) {
209             String errMsg = "--out-path is not a directory.";
210             LOG.error(PackingToolErrMsg.PACKAGE_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
211             return false;
212         }
213         return true;
214     }
215 
validateVersionNormalizeMode(Utility utility)216     private static boolean validateVersionNormalizeMode(Utility utility) {
217         if (utility.getInputList().isEmpty()) {
218             String errMsg = "--input-list is empty.";
219             LOG.error(PackingToolErrMsg.VERSION_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
220             return false;
221         }
222 
223         if (!handleHapAndHspInput(utility, utility.getInputList(), utility.getFormattedHapList())) {
224             String errMsg = "--input-list is invalid.";
225             LOG.error(PackingToolErrMsg.VERSION_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
226             return false;
227         }
228 
229         if (utility.getFormattedHapList().isEmpty()) {
230             String errMsg = "--input-list is empty.";
231             LOG.error(PackingToolErrMsg.VERSION_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
232             return false;
233         }
234 
235         if (utility.getVersionCode() <= 0) {
236             String errMsg = "--version-code is invalid.";
237             LOG.error(PackingToolErrMsg.VERSION_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
238             return false;
239         }
240 
241         if (utility.getVersionName().isEmpty()) {
242             String errMsg = "--version-name is empty.";
243             LOG.error(PackingToolErrMsg.VERSION_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
244             return false;
245         }
246 
247         Pattern versionNamePattern = Pattern.compile(VERSION_NAME_PATTERN);
248         Matcher versionNameMatcher = versionNamePattern.matcher(utility.getVersionName());
249         if (!versionNameMatcher.matches()) {
250             String errMsg = "--version-name is invalid.";
251             LOG.error(PackingToolErrMsg.VERSION_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
252             return false;
253         }
254 
255         if (utility.getOutPath().isEmpty()) {
256             String errMsg = "--out-path is empty.";
257             LOG.error(PackingToolErrMsg.VERSION_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
258             return false;
259         }
260 
261         File outDir = new File(utility.getOutPath());
262         if (!outDir.isDirectory()) {
263             String errMsg = "--out-path is not a directory.";
264             LOG.error(PackingToolErrMsg.VERSION_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
265             return false;
266         }
267         return true;
268     }
269 
validateGeneralNormalizeMode(Utility utility)270     private static boolean validateGeneralNormalizeMode(Utility utility) {
271         if (utility.getInputList().isEmpty()) {
272             String errMsg = "--input-list is empty.";
273             LOG.error(PackingToolErrMsg.GENERAL_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
274             return false;
275         }
276 
277         if (!handleHapAndHspInput(utility, utility.getInputList(), utility.getFormattedHapList())) {
278             String errMsg = "--input-list is invalid.";
279             LOG.error(PackingToolErrMsg.GENERAL_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
280             return false;
281         }
282 
283         if (utility.getFormattedHapList().isEmpty()) {
284             String errMsg = "--input-list is empty.";
285             LOG.error(PackingToolErrMsg.GENERAL_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
286             return false;
287         }
288 
289         if (utility.getGeneralNormalizeList().contains(DEVICE_TYPES)) {
290             String[] types = utility.getDeviceTypes().split(",");
291             for (String type : types) {
292                 if (!deviceTypeList.contains(type)) {
293                     String errMsg = "--device-types is invalid.";
294                     LOG.error(PackingToolErrMsg.GENERAL_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
295                     return false;
296                 }
297             }
298         }
299 
300         if (utility.getGeneralNormalizeList().contains(VERSION_CODE)) {
301             if (utility.getVersionCode() < MINI_NUM || utility.getVersionCode() > MAXI_NUM ||
302                 (!utility.getParameterIsInvalid())) {
303                 String errMsg = "--version-code is invalid.";
304                 LOG.error(PackingToolErrMsg.GENERAL_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
305                 return false;
306             }
307         }
308 
309         if (utility.getGeneralNormalizeList().contains(VERSION_NAME)) {
310             Pattern versionNamePattern = Pattern.compile(VERSION_NAME_PATTERN);
311             Matcher versionNameMatcher = versionNamePattern.matcher(utility.getVersionName());
312             if (!versionNameMatcher.matches() || utility.getVersionName().length() > MAX_LENGTH) {
313                 String errMsg = "--version-name is invalid.";
314                 LOG.error(PackingToolErrMsg.GENERAL_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
315                 return false;
316             }
317         }
318 
319         if (utility.getGeneralNormalizeList().contains(BUNDLE_NAME)) {
320             if (!isBundleNameValid(utility.getBundleName())) {
321                 String errMsg = "--bundle-name is invalid.";
322                 LOG.error(PackingToolErrMsg.GENERAL_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
323                 return false;
324             }
325         }
326 
327         if (utility.getGeneralNormalizeList().contains(MIN_COMPATIBLE_VERSION_CODE)) {
328             if (utility.getMinCompatibleVersionCode() < MINI_NUM || utility.getMinCompatibleVersionCode() > MAXI_NUM ||
329                 (!utility.getParameterIsInvalid())) {
330                 String errMsg = "--min-compatible-version-code is invalid.";
331                 LOG.error(PackingToolErrMsg.GENERAL_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
332                 return false;
333             }
334         }
335 
336         if (utility.getGeneralNormalizeList().contains(MIN_API_VERSION)) {
337             if (utility.getMinAPIVersion() < MINI_NUM || utility.getMinAPIVersion() > MAXI_NUM ||
338                 (!utility.getParameterIsInvalid())) {
339                 String errMsg = "--min-api-version is invalid.";
340                 LOG.error(PackingToolErrMsg.GENERAL_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
341                 return false;
342             }
343         }
344 
345         if (utility.getGeneralNormalizeList().contains(TARGET_API_VERSION)) {
346             if (utility.getTargetAPIVersion() < MINI_NUM || utility.getTargetAPIVersion() > MAXI_NUM ||
347                 (!utility.getParameterIsInvalid())) {
348                 String errMsg = "--target-api-version is invalid.";
349                 LOG.error(PackingToolErrMsg.GENERAL_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
350                 return false;
351             }
352         }
353 
354         if (utility.getGeneralNormalizeList().contains(API_RELEASE_TYPE)) {
355             Pattern pattern = Pattern.compile(API_RELEASE_TYPE_PATTERN);
356             if (!pattern.matcher(utility.getApiReleaseType()).matches()) {
357                 String errMsg = "--api-release-type is invalid.";
358                 LOG.error(PackingToolErrMsg.GENERAL_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
359                 return false;
360             }
361         }
362 
363         if (utility.getGeneralNormalizeList().contains(BUNDLE_TYPE)) {
364             if (!bundleTypeList.contains(utility.getBundleType())) {
365                 String errMsg = "--bundle-type is invalid.";
366                 LOG.error(PackingToolErrMsg.GENERAL_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
367                 return false;
368             }
369         }
370 
371         if (utility.getGeneralNormalizeList().contains(INSTALLATION_FREE)) {
372             if (!Boolean.TRUE.toString().equals(utility.getInstallationFree())  &&
373                 !Boolean.FALSE.toString().equals(utility.getInstallationFree())) {
374                 String errMsg = "--installation-free is invalid.";
375                 LOG.error(PackingToolErrMsg.GENERAL_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
376                 return false;
377             }
378         }
379 
380         if (utility.getGeneralNormalizeList().contains(DELIVERY_WITH_INSTALL)) {
381             if (!Boolean.TRUE.toString().equals(utility.getDeliveryWithInstall())  &&
382                 !Boolean.FALSE.toString().equals(utility.getDeliveryWithInstall())) {
383                 String errMsg = "--delivery-with-install is invalid.";
384                 LOG.error(PackingToolErrMsg.GENERAL_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
385                 return false;
386             }
387         }
388 
389         if (utility.getOutPath().isEmpty()) {
390             String errMsg = "--out-path is empty.";
391             LOG.error(PackingToolErrMsg.GENERAL_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
392             return false;
393         }
394 
395         File outDir = new File(utility.getOutPath());
396         if (!outDir.isDirectory()) {
397             String errMsg = "--out-path is not a directory.";
398             LOG.error(PackingToolErrMsg.GENERAL_NORMALIZE_MODE_ARGS_INVALID.toString(errMsg));
399             return false;
400         }
401         return true;
402     }
403 
isValidRpcid(Utility utility)404     private static boolean isValidRpcid(Utility utility) {
405         if (!utility.getRpcidPath().isEmpty()) {
406             File file = new File(utility.getRpcidPath());
407             if (!file.isFile()) {
408                 String errMsg = "--rpcid-path is not a file.";
409                 LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
410                 return false;
411             }
412             if (!RPCID_PROFILE.equals(file.getName())) {
413                 String errMsg = "--rpcid-path must be the rpcid.sc file.";
414                 LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
415                 return false;
416             }
417         }
418         return true;
419     }
420 
isValidPackInfo(Utility utility)421     private static boolean isValidPackInfo(Utility utility) {
422         if (!utility.getPackInfoPath().isEmpty()) {
423             File file = new File(utility.getPackInfoPath());
424             if (!file.isFile()) {
425                 String errMsg = "--pack-info-path is not a file.";
426                 LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
427                 return false;
428             }
429             if (!PACK_INFO.equals(file.getName())) {
430                 String errMsg = "--pack-info-path must be the pack.info file.";
431                 LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
432                 return false;
433             }
434         }
435         return true;
436     }
437 
isVerifyValidInHapCommonMode(Utility utility)438     private static boolean isVerifyValidInHapCommonMode(Utility utility) {
439         if (utility.getJsonPath().isEmpty()) {
440             String errMsg = "--json-path is empty";
441             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
442             return false;
443         }
444         if (!isPathValid(utility.getJsonPath(), TYPE_FILE, JSON_PROFILE)
445                 && !isPathValid(utility.getJsonPath(), TYPE_FILE, MODULE_PROFILE)) {
446             String errMsg = "--json-path must be the config.json file or module.json file.";
447             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
448             return false;
449         }
450 
451         if (!isValidRpcid(utility) || !isValidPackInfo(utility)) {
452             return false;
453         }
454 
455         if (!utility.getApkPath().isEmpty() && !compatibleProcess(utility, utility.getApkPath(),
456                 utility.getFormattedApkPathList(), APK_SUFFIX)) {
457             String errMsg = "--shell-apk-path is invalid.";
458             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
459             return false;
460         }
461 
462         if (!utility.getProfilePath().isEmpty()) {
463             File file = new File(utility.getProfilePath());
464             if (!file.isFile() || !PROFILE_NAME.equals(file.getName())) {
465                 String errMsg = "--profile-path must be the CAPABILITY.profile file.";
466                 LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
467                 return false;
468             }
469         }
470 
471         if (!utility.getDexPath().isEmpty() && !compatibleProcess(utility, utility.getDexPath(),
472                 utility.getFormattedDexPathList(), DEX_SUFFIX)) {
473             String errMsg = "--dex-path is invalid.";
474             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
475             return false;
476         }
477 
478         if (!utility.getAbcPath().isEmpty() && !compatibleProcess(utility, utility.getAbcPath(),
479                 utility.getFormattedAbcPathList(), ABC_SUFFIX)) {
480             String errMsg = "--abc-path is invalid.";
481             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
482             return false;
483         }
484 
485         if (!utility.getDirList().isEmpty() && !splitDirList(utility, utility.getDirList(),
486                 utility.getFormatedDirList())) {
487             String errMsg = "--dir-list is invalid.";
488             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
489             return false;
490         }
491         if (!utility.getPkgContextPath().isEmpty()) {
492             File file = new File(utility.getPkgContextPath());
493             if (!file.isFile() || !PKG_CONTEXT_INFO.equals(file.getName())) {
494                 String errMsg = "--pkg-context-path file must be the pkgContextInfo.json file.";
495                 LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
496                 return false;
497             }
498         }
499         return true;
500     }
501 
502     /**
503      * parse and check args if valid in hap mode.
504      *
505      * @param utility common data
506      * @return isVerifyValidInHapMode if verify valid in hap mode.
507      */
isVerifyValidInHapMode(Utility utility)508     private static boolean isVerifyValidInHapMode(Utility utility) {
509         File file = new File(utility.getIndexPath());
510         if (!utility.getIndexPath().isEmpty() && !file.isFile() && INDEX_PROFILE.equals(file.getName())) {
511             String errMsg = "--index-path must be the resources.index file.";
512             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
513             return false;
514         }
515 
516         if (!utility.getSoPath().isEmpty() &&
517                 !compatibleProcess(utility, utility.getSoPath(), utility.getFormattedSoPathList(), SO_SUFFIX)) {
518             String errMsg = "--maple-so-path is invalid.";
519             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
520             return false;
521         }
522 
523         if (!utility.getAbilitySoPath().isEmpty() && !compatibleProcess(utility, utility.getAbilitySoPath(),
524                 utility.getFormattedAbilitySoPathList(), SO_SUFFIX)) {
525             String errMsg = "--ability-so-path is invalid.";
526             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
527             return false;
528         }
529 
530         if (isHapPathValid(utility.getSoDir())) {
531             String errMsg = "--maple-so-dir is invalid.";
532             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
533             return false;
534         }
535 
536         if (isHapPathValid(utility.getLibPath())) {
537             String errMsg = "--lib-path is invalid.";
538             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
539             return false;
540         }
541 
542         if (isHapPathValid(utility.getHnpPath())) {
543             String errMsg = "--hnp-path is invalid.";
544             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
545             return false;
546         }
547 
548         if (isHapPathValid(utility.getResPath())) {
549             String errMsg = "--res-path is invalid.";
550             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
551             return false;
552         }
553 
554         if (isHapPathValid(utility.getResourcesPath())) {
555             String errMsg = "--resources-path is invalid.";
556             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
557             return false;
558         }
559 
560         if (isHapPathValid(utility.getAssetsPath())) {
561             String errMsg = "--assets-path is invalid.";
562             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
563             return false;
564         }
565 
566         if (isHapPathValid(utility.getSharedLibsPath())) {
567             String errMsg = "--shared-libs-path is invalid.";
568             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
569             return false;
570         }
571 
572         if (!utility.getJarPath().isEmpty()
573                 && !compatibleProcess(utility, utility.getJarPath(), utility.getFormattedJarPathList(), JAR_SUFFIX)) {
574             String errMsg = "--jar-path is invalid.";
575             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
576             return false;
577         }
578 
579         if (!utility.getTxtPath().isEmpty()
580                 && !compatibleProcess(utility, utility.getTxtPath(), utility.getFormattedTxtPathList(), TXT_SUFFIX)) {
581             String errMsg = "--txt-path is invalid.";
582             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
583             return false;
584         }
585 
586         if (isHapPathValid(utility.getANPath())) {
587             String errMsg = "--an-path is invalid.";
588             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
589             return false;
590         }
591 
592         if (!utility.getEtsPath().isEmpty() && !isPathExists(utility.getEtsPath())) {
593             String errMsg = "--ets-path is invalid.";
594             LOG.error(PackingToolErrMsg.HAP_MODE_ARGS_INVALID.toString(errMsg));
595             return false;
596         }
597 
598         return isOutPathValid(utility, HAP_SUFFIX);
599     }
600 
601     /**
602      * check hap path if valid
603      *
604      * @param path path input
605      * @return isPathValid if path verify
606      */
isHapPathValid(String path)607     private static boolean isHapPathValid(String path) {
608         return (!path.isEmpty() && !isPathValid(path, TYPE_DIR, null));
609     }
610 
611     /**
612      * parse and check args if valid in har mode.
613      *
614      * @param utility common data
615      * @return isVerifyValidInHarMode if verify valid in har mode.
616      */
isVerifyValidInHarMode(Utility utility)617     private static boolean isVerifyValidInHarMode(Utility utility) {
618         if (utility.getJsonPath().isEmpty()) {
619             String errMsg = "--json-path is empty.";
620             LOG.error(PackingToolErrMsg.HAR_MODE_ARGS_INVALID.toString(errMsg));
621             return false;
622         }
623 
624         if (!isPathValid(utility.getJsonPath(), TYPE_FILE, JSON_PROFILE)
625                 && !isPathValid(utility.getJsonPath(), TYPE_FILE, MODULE_PROFILE)) {
626             String errMsg = "--json-path must be config.json or module.json file.";
627             LOG.error(PackingToolErrMsg.HAR_MODE_ARGS_INVALID.toString(errMsg));
628             return false;
629         }
630 
631         if (!utility.getJarPath().isEmpty()
632                 && !compatibleProcess(utility, utility.getJarPath(), utility.getFormattedJarPathList(), JAR_SUFFIX)) {
633             String errMsg = "--jar-path is invalid.";
634             LOG.error(PackingToolErrMsg.HAR_MODE_ARGS_INVALID.toString(errMsg));
635             return false;
636         }
637 
638         if (!utility.getTxtPath().isEmpty()
639                 && !compatibleProcess(utility, utility.getTxtPath(), utility.getFormattedTxtPathList(), TXT_SUFFIX)) {
640             String errMsg = "--txt-path is invalid.";
641             LOG.error(PackingToolErrMsg.HAR_MODE_ARGS_INVALID.toString(errMsg));
642             return false;
643         }
644 
645         if (!utility.getLibPath().isEmpty() && !isPathValid(utility.getLibPath(), TYPE_DIR, null)) {
646             String errMsg = "--lib-path is invalid.";
647             LOG.error(PackingToolErrMsg.HAR_MODE_ARGS_INVALID.toString(errMsg));
648             return false;
649         }
650 
651         if (!utility.getResPath().isEmpty() && !isPathValid(utility.getResPath(), TYPE_DIR, null)) {
652             String errMsg = "--res-path is invalid.";
653             LOG.error(PackingToolErrMsg.HAR_MODE_ARGS_INVALID.toString(errMsg));
654             return false;
655         }
656 
657         if (utility.getResourcesPath().isEmpty() || !isPathValid(utility.getResourcesPath(), TYPE_DIR, null)) {
658             String errMsg = "--resources-path is invalid.";
659             LOG.error(PackingToolErrMsg.HAR_MODE_ARGS_INVALID.toString(errMsg));
660             return false;
661         }
662 
663         if (!utility.getAssetsPath().isEmpty() && !isPathValid(utility.getAssetsPath(), TYPE_DIR, null)) {
664             String errMsg = "--assets-path is invalid.";
665             LOG.error(PackingToolErrMsg.HAR_MODE_ARGS_INVALID.toString(errMsg));
666             return false;
667         }
668 
669         return isOutPathValid(utility, HAR_SUFFIX);
670     }
671 
672     /**
673      * parse and check args if valid in app mode.
674      *
675      * @param utility common data
676      * @return isVerifyValidInAppMode if verify valid in app mode.
677      */
isVerifyValidInAppMode(Utility utility)678     private static boolean isVerifyValidInAppMode(Utility utility) {
679         if (!checkBundleTypeConsistency(utility)) {
680             String errMsg = "The bundleType is inconsistent for different HAP and HSP modules.";
681             LOG.error(PackingToolErrMsg.APP_MODE_ARGS_INVALID.toString(errMsg));
682             return false;
683         }
684 
685         if (!checkInputModulePath(utility)) {
686             LOG.warning("CompressVerify::isArgsValidInAppMode input hap-path or hspPath is invalid.");
687         }
688 
689         if (!utility.getHapPath().isEmpty()
690                 && !compatibleProcess(utility, utility.getHapPath(), utility.getFormattedHapPathList(), HAP_SUFFIX)) {
691             String errMsg = "--hap-path is invalid.";
692             LOG.error(PackingToolErrMsg.APP_MODE_ARGS_INVALID.toString(errMsg));
693             return false;
694         }
695 
696         if (!utility.getHspPath().isEmpty()
697                 && !compatibleProcess(utility, utility.getHspPath(), utility.getFormattedHspPathList(), HSP_SUFFIX)) {
698             String errMsg = "--hsp-path is invalid.";
699             LOG.error(PackingToolErrMsg.APP_MODE_ARGS_INVALID.toString(errMsg));
700             return false;
701         }
702 
703         if (utility.getPackInfoPath().isEmpty()) {
704             String errMsg = "--pack-info-path is empty.";
705             LOG.error(PackingToolErrMsg.APP_MODE_ARGS_INVALID.toString(errMsg));
706             return false;
707         }
708 
709         File file = new File(utility.getPackInfoPath());
710         if (!file.isFile() || !PACK_INFO.equals(file.getName())) {
711             String errMsg = "--pack-info-path is invalid.";
712             LOG.error(PackingToolErrMsg.APP_MODE_ARGS_INVALID.toString(errMsg));
713             return false;
714         }
715 
716         if (!isValidEncryptJsonFile(utility)) {
717             String errMsg = "--encrypt-path is invalid.";
718             LOG.error(PackingToolErrMsg.APP_MODE_ARGS_INVALID.toString(errMsg));
719             return false;
720         }
721 
722         if (!isValidPacJsonFile(utility)) {
723             String errMsg = "--pac-json-path is invalid.";
724             LOG.error(PackingToolErrMsg.APP_MODE_ARGS_INVALID.toString(errMsg));
725             return false;
726         }
727 
728         if (!utility.getSignaturePath().isEmpty() && !(new File(utility.getSignaturePath())).isFile()) {
729             String errMsg = "--signature-path is invalid.";
730             LOG.error(PackingToolErrMsg.APP_MODE_ARGS_INVALID.toString(errMsg));
731             return false;
732         }
733 
734         if (!utility.getCertificatePath().isEmpty() && !(new File(utility.getCertificatePath())).isFile()) {
735             String errMsg = "--certificate-path is invalid.";
736             LOG.error(PackingToolErrMsg.APP_MODE_ARGS_INVALID.toString(errMsg));
737             return false;
738         }
739 
740         if (!utility.getEntryCardPath().isEmpty() &&
741                 !compatibleProcess(utility, utility.getEntryCardPath(),
742                         utility.getformattedEntryCardPathList(), PNG_SUFFIX)) {
743             String errMsg = "--entrycard-path is invalid.";
744             LOG.error(PackingToolErrMsg.APP_MODE_ARGS_INVALID.toString(errMsg));
745             return false;
746         }
747         if (!utility.getPackResPath().isEmpty() && !isPathValid(utility.getPackResPath(), TYPE_FILE, PACK_RES)) {
748             String errMsg = "--pack-res-path is invalid.";
749             LOG.error(PackingToolErrMsg.APP_MODE_ARGS_INVALID.toString(errMsg));
750             return false;
751         }
752 
753         return isOutPathValid(utility, APP_SUFFIX);
754     }
755 
checkBundleTypeConsistency(Utility utility)756     private static boolean checkBundleTypeConsistency(Utility utility) {
757         String bundleType = new String();
758         List<String> tmpHapPathList = new ArrayList<>();
759         List<String> tmpHspPathList = new ArrayList<>();
760         compatibleProcess(utility, utility.getHapPath(), tmpHapPathList, HAP_SUFFIX);
761         compatibleProcess(utility, utility.getHspPath(), tmpHspPathList, HSP_SUFFIX);
762         try {
763             if (!tmpHapPathList.isEmpty()) {
764                 HapVerifyInfo hapVerifyInfo = Compressor.parseStageHapVerifyInfo(tmpHapPathList.get(0));
765                 bundleType = hapVerifyInfo.getBundleType();
766             } else if (!tmpHspPathList.isEmpty()) {
767                 HapVerifyInfo hapVerifyInfo = Compressor.parseStageHapVerifyInfo(tmpHspPathList.get(0));
768                 bundleType = hapVerifyInfo.getBundleType();
769             }
770             for (String hapPath : tmpHapPathList) {
771                 HapVerifyInfo hapVerifyInfo = Compressor.parseStageHapVerifyInfo(hapPath);
772                 if (!bundleType.equals(hapVerifyInfo.getBundleType())) {
773                     LOG.error(PackingToolErrMsg.CHECK_BUNDLETYPE_CONSISTENCY_FAILED.toString(
774                         "The bundleType is not same for different HAP modules."));
775                     return false;
776                 }
777             }
778             for (String hspPath : tmpHspPathList) {
779                 HapVerifyInfo hapVerifyInfo = Compressor.parseStageHapVerifyInfo(hspPath);
780                 if (!bundleType.equals(hapVerifyInfo.getBundleType())) {
781                     LOG.error(PackingToolErrMsg.CHECK_BUNDLETYPE_CONSISTENCY_FAILED.toString(
782                         "The bundleType is not same for different HSP modules."));
783                     return false;
784                 }
785             }
786         } catch (BundleException e) {
787             return true;
788         }
789         return true;
790     }
791 
checkInputModulePath(Utility utility)792     private static boolean checkInputModulePath(Utility utility) {
793         boolean isSharedApp = isSharedApp(utility);
794         boolean isAppService = isAppService(utility);
795         if (utility.getHapPath().isEmpty() && !isSharedApp && !isAppService) {
796             LOG.warning("CompressVerify::CheckInputModulePath hap-path is empty.");
797             return false;
798         }
799 
800         if (utility.getHspPath().isEmpty() && isAppService) {
801             LOG.warning("CompressVerify::CheckInputModulePath hsp-path is empty.");
802             return false;
803         }
804         return true;
805     }
806 
807     /**
808      * parse and check args if valid in multiApp mode.
809      *
810      * @param utility common data
811      * @return isVerifyValidInMultiAppMode if verify valid in multiApp mode.
812      */
isVerifyValidInMultiAppMode(Utility utility)813     private static boolean isVerifyValidInMultiAppMode(Utility utility) {
814         if (utility.getAppList().isEmpty() && utility.getHapList().isEmpty() && utility.getHspList().isEmpty()) {
815             String errMsg = "Input --app-list, --hap-list and --hsp-list are all empty.";
816             LOG.error(PackingToolErrMsg.MULTI_APP_MODE_ARGS_INVALID.toString(errMsg));
817             return false;
818         }
819         if (!utility.getAppList().isEmpty()) {
820             if (!compatibleProcess(utility, utility.getAppList(), utility.getFormattedAppList(), APP_SUFFIX)) {
821                 String errMsg = "--app-list is invalid.";
822                 LOG.error(PackingToolErrMsg.MULTI_APP_MODE_ARGS_INVALID.toString(errMsg));
823                 return false;
824             }
825         }
826         if (!utility.getHapList().isEmpty()) {
827             if (!compatibleProcess(utility, utility.getHapList(), utility.getFormattedHapList(), HAP_SUFFIX)) {
828                 String errMsg = "--hap-list is invalid.";
829                 LOG.error(PackingToolErrMsg.MULTI_APP_MODE_ARGS_INVALID.toString(errMsg));
830                 return false;
831             }
832         }
833 
834         if (!utility.getHspList().isEmpty()) {
835             if (!compatibleProcess(utility, utility.getHspList(), utility.getFormattedHapList(), HSP_SUFFIX)) {
836                 String errMsg = "--hsp-list is invalid.";
837                 LOG.error(PackingToolErrMsg.MULTI_APP_MODE_ARGS_INVALID.toString(errMsg));
838                 return false;
839             }
840         }
841 
842         if (!isValidEncryptJsonFile(utility)) {
843             String errMsg = "--encrypt-path is invalid.";
844             LOG.error(PackingToolErrMsg.MULTI_APP_MODE_ARGS_INVALID.toString(errMsg));
845             return false;
846         }
847 
848         if (!isValidPacJsonFile(utility)) {
849             String errMsg = "--pac-json-path is invalid.";
850             LOG.error(PackingToolErrMsg.MULTI_APP_MODE_ARGS_INVALID.toString(errMsg));
851             return false;
852         }
853 
854         File outFile = new File(utility.getOutPath());
855         if (("false".equals(utility.getForceRewrite())) && outFile.exists()) {
856             String errMsg = "--out-path file already exist, but --force is not 'true'.";
857             LOG.error(PackingToolErrMsg.MULTI_APP_MODE_ARGS_INVALID.toString(errMsg));
858             return false;
859         }
860         if (!outFile.getName().toLowerCase(Locale.ENGLISH).endsWith(APP_SUFFIX)) {
861             String errMsg = "--out-path must end with .app.";
862             LOG.error(PackingToolErrMsg.MULTI_APP_MODE_ARGS_INVALID.toString(errMsg));
863             return false;
864         }
865         return true;
866     }
867 
868 
869     /**
870      * parse and check args if valid in res mode.
871      *
872      * @param utility common data
873      * @return isVerifyValidInAppMode if verify valid in app mode.
874      */
isVerifyValidInResMode(Utility utility)875     private static boolean isVerifyValidInResMode(Utility utility) {
876         if (!isPathValid(utility.getPackInfoPath(), TYPE_FILE, PACK_INFO)) {
877             String errMsg = "--pack-info-path is invalid.";
878             LOG.error(PackingToolErrMsg.RES_MODE_ARGS_INVALID.toString(errMsg));
879             return false;
880         }
881 
882         if (!isDirectoryValidStrictCase(utility.getEntryCardPath(), ENTRY_CARD_DIRECTORY_NAME)) {
883             String errMsg = "The level-1 directory name must be EntryCard, current is " +
884                     utility.getEntryCardPath() + ".";
885             LOG.error(PackingToolErrMsg.RES_MODE_ARGS_INVALID.toString(errMsg));
886             return false;
887         }
888         if (!compatibleProcess(utility, utility.getEntryCardPath(),
889                 utility.getformattedEntryCardPathList(), PNG_SUFFIX)) {
890             String errMsg = "--entrycard-path is invalid.";
891             LOG.error(PackingToolErrMsg.RES_MODE_ARGS_INVALID.toString(errMsg));
892             return false;
893         }
894         return isOutPathValid(utility, RES_SUFFIX);
895     }
896 
isVerifyValidInHQFMode(Utility utility)897     private static boolean isVerifyValidInHQFMode(Utility utility) {
898         if (utility.getJsonPath().isEmpty()) {
899             String errMsg = "--json-path is empty, must input patch.json file when pack hqf file.";
900             LOG.error(PackingToolErrMsg.HQF_MODE_ARGS_INVALID.toString(errMsg));
901             return false;
902         }
903         if (!utility.getEtsPath().isEmpty()) {
904             if (!isPathValid(utility.getEtsPath(), TYPE_DIR, null)) {
905                 String errMsg = "--ets-path is invalid.";
906                 LOG.error(PackingToolErrMsg.HQF_MODE_ARGS_INVALID.toString(errMsg));
907                 return false;
908             }
909         }
910         if (!isPathValid(utility.getJsonPath(), TYPE_FILE, PATCH_PROFILE)) {
911             String errMsg = "--json-path is invalid.";
912             LOG.error(PackingToolErrMsg.HQF_MODE_ARGS_INVALID.toString(errMsg));
913             return false;
914         }
915         if (!utility.getLibPath().isEmpty()) {
916             if (!isPathValid(utility.getLibPath(), TYPE_DIR, null)) {
917                 String errMsg = "--lib-path is invalid.";
918                 LOG.error(PackingToolErrMsg.HQF_MODE_ARGS_INVALID.toString(errMsg));
919                 return false;
920             }
921         }
922         if (!utility.getResourcesPath().isEmpty()) {
923             if (!isPathValid(utility.getResourcesPath(), TYPE_DIR, null)) {
924                 String errMsg = "--resources-path is invalid.";
925                 LOG.error(PackingToolErrMsg.HQF_MODE_ARGS_INVALID.toString(errMsg));
926                 return false;
927             }
928         }
929         File outFile = new File(utility.getOutPath());
930         if ((FALSE.equals(utility.getForceRewrite())) && (outFile.exists())) {
931             String errMsg = "--out-path file already exist, but --force is not 'true'.";
932             LOG.error(PackingToolErrMsg.HQF_MODE_ARGS_INVALID.toString(errMsg));
933             return false;
934         }
935         if (!utility.getOutPath().endsWith(HQF_SUFFIX)) {
936             String errMsg = "--out-path file must end with .hqf.";
937             LOG.error(PackingToolErrMsg.HQF_MODE_ARGS_INVALID.toString(errMsg));
938             return false;
939         }
940         return true;
941     }
942 
isVerifyValidInAPPQFMode(Utility utility)943     private static boolean isVerifyValidInAPPQFMode(Utility utility) {
944         if (utility.getHqfList().isEmpty()) {
945             String errMsg = "--hqf-list is empty.";
946             LOG.error(PackingToolErrMsg.APPQF_MODE_ARGS_INVALID.toString(errMsg));
947             return false;
948         }
949         if (!compatibleProcess(utility, utility.getHqfList(), utility.getFormatedHQFList(), HQF_SUFFIX)) {
950             String errMsg = "--hqf-list is invalid.";
951             LOG.error(PackingToolErrMsg.APPQF_MODE_ARGS_INVALID.toString(errMsg));
952             return false;
953         }
954         File outFile = new File(utility.getOutPath());
955         if ((FALSE.equals(utility.getForceRewrite())) && outFile.exists()) {
956             String errMsg = "--out-path file already exist, but --force is not 'true'.";
957             LOG.error(PackingToolErrMsg.APPQF_MODE_ARGS_INVALID.toString(errMsg));
958             return false;
959         }
960         if (!outFile.getName().toLowerCase(Locale.ENGLISH).endsWith(APPQF_SUFFIX)) {
961             String errMsg = "--out-path must end with .appqf.";
962             LOG.error(PackingToolErrMsg.APPQF_MODE_ARGS_INVALID.toString(errMsg));
963             return false;
964         }
965         return true;
966     }
967 
968     /**
969      * Compatible file input and directory input
970      *
971      * @param utility   common data
972      * @param inputPath input path
973      * @param fileList  save files' path with list
974      * @param suffix    process type
975      * @return Returns {@code true} if the compatible is successful; returns {@code false} otherwise.
976      */
compatibleProcess(Utility utility, String inputPath, List<String> fileList, String suffix)977     public static boolean compatibleProcess(Utility utility, String inputPath,
978         List<String> fileList, String suffix) {
979         if (isPathValid(inputPath, TYPE_DIR, null)) {
980             File inputFile = new File(inputPath);
981             File[] files = inputFile.listFiles();
982             if (files == null) {
983                 return true;
984             }
985             for (File fileItem : files) {
986                 if (fileItem.getName().toLowerCase(Locale.ENGLISH).endsWith(suffix)) {
987                     fileList.add(fileItem.toString());
988                 }
989             }
990             return true;
991         } else {
992             String formattedPathItem = "";
993             List<String> pathList = removeDuplicatePath(inputPath);
994             for (String pathItem : pathList) {
995                 formattedPathItem = utility.getFormattedPath(pathItem);
996                 if (!isPathValid(formattedPathItem, TYPE_FILE, suffix)) {
997                     return false;
998                 }
999                 fileList.add(formattedPathItem);
1000             }
1001             return true;
1002         }
1003     }
1004 
handleHapAndHspInput(Utility utility, String inputPath, List<String> fileList)1005     private static boolean handleHapAndHspInput(Utility utility, String inputPath, List<String> fileList) {
1006         if (isPathValid(inputPath, TYPE_DIR, null)) {
1007             File inputFile = new File(inputPath);
1008             File[] files = inputFile.listFiles();
1009             if (files == null) {
1010                 return true;
1011             }
1012             for (File fileItem : files) {
1013                 if (fileItem.getName().toLowerCase(Locale.ENGLISH).endsWith(HSP_SUFFIX) ||
1014                     fileItem.getName().toLowerCase(Locale.ENGLISH).endsWith(HAP_SUFFIX)) {
1015                     fileList.add(fileItem.toString());
1016                 }
1017             }
1018             return true;
1019         } else {
1020             String formattedPathItem = "";
1021             List<String> pathList = removeDuplicatePath(inputPath);
1022             for (String pathItem : pathList) {
1023                 formattedPathItem = utility.getFormattedPath(pathItem);
1024                 if (!isPathValid(formattedPathItem, TYPE_FILE, HSP_SUFFIX) &&
1025                     !isPathValid(formattedPathItem, TYPE_FILE, HAP_SUFFIX)) {
1026                     String errMsg = "Input file " + formattedPathItem + " is invalid.";
1027                     LOG.error(PackingToolErrMsg.HANDLE_HAP_HSP_INPUT_FAILED.toString(errMsg));
1028                     return false;
1029                 }
1030                 fileList.add(formattedPathItem);
1031             }
1032             return true;
1033         }
1034     }
1035 
splitDirList(Utility utility, String dirList, List<String> fileList)1036     private static boolean splitDirList(Utility utility, String dirList, List<String> fileList) {
1037         List<String> pathList = removeDuplicatePath(dirList);
1038         for (String pathItem : pathList) {
1039             String formattedPathItem = utility.getFormattedPath(pathItem);
1040             if (!isPathValid(formattedPathItem, TYPE_DIR, null)) {
1041                 return false;
1042             }
1043             fileList.add(formattedPathItem);
1044         }
1045         return true;
1046     }
1047 
1048     /**
1049      * turn input path block to formatted path list
1050      *
1051      * @param utility common data
1052      * @param suffix  used to determine type
1053      * @return isVerifyValidInAppMode if verify valid in app mode.
1054      */
isOutPathValid(Utility utility, String suffix)1055     private static boolean isOutPathValid(Utility utility, String suffix) {
1056         File outFile = new File(utility.getOutPath());
1057 
1058         if (("false".equals(utility.getForceRewrite())) && (outFile.exists())) {
1059             LOG.error(PackingToolErrMsg.OUT_PATH_INVALID.toString("--out-path file already existed."));
1060             return false;
1061         }
1062 
1063         if (HAP_SUFFIX.equals(suffix)) {
1064             if (!outFile.getName().toLowerCase(Locale.ENGLISH).endsWith(HAP_SUFFIX)) {
1065                 LOG.error(PackingToolErrMsg.OUT_PATH_INVALID.toString("--out-path must end with .hap."));
1066                 return false;
1067             } else {
1068                 return true;
1069             }
1070         }
1071 
1072         if (HAR_SUFFIX.equals(suffix)) {
1073             if (!outFile.getName().toLowerCase(Locale.ENGLISH).endsWith(HAR_SUFFIX)) {
1074                 LOG.error(PackingToolErrMsg.OUT_PATH_INVALID.toString("--out-path must end with .har."));
1075                 return false;
1076             } else {
1077                 return true;
1078             }
1079         }
1080 
1081         if (APP_SUFFIX.equals(suffix)) {
1082             if (!outFile.getName().toLowerCase(Locale.ENGLISH).endsWith(APP_SUFFIX)) {
1083                 LOG.error(PackingToolErrMsg.OUT_PATH_INVALID.toString("--out-path must end with .app."));
1084                 return false;
1085             } else {
1086                 return true;
1087             }
1088         }
1089 
1090         if (RES_SUFFIX.equals(suffix)) {
1091             if (!outFile.getName().toLowerCase(Locale.ENGLISH).endsWith(RES_SUFFIX)) {
1092                 LOG.error(PackingToolErrMsg.OUT_PATH_INVALID.toString("--out-path must end with .res."));
1093                 return false;
1094             } else {
1095                 return true;
1096             }
1097         }
1098 
1099         if (HSP_SUFFIX.equals(suffix)) {
1100             if (!outFile.getName().toLowerCase(Locale.ENGLISH).endsWith(HSP_SUFFIX)) {
1101                 LOG.error(PackingToolErrMsg.OUT_PATH_INVALID.toString("--out-path must end with .hsp."));
1102                 return false;
1103             } else {
1104                 return true;
1105             }
1106         }
1107         return false;
1108     }
1109 
1110     /**
1111      * check path if valid
1112      *
1113      * @param path   path input
1114      * @param isFile type input
1115      * @param flag   flag input
1116      * @return isPathValid if path verify
1117      */
isPathValid(String path, boolean isFile, String flag)1118     private static boolean isPathValid(String path, boolean isFile, String flag) {
1119         File file = new File(path);
1120         if (isFile && (file.isFile()) && file.getName().toLowerCase(Locale.ENGLISH).endsWith(flag)) {
1121             return true;
1122         }
1123         return (!isFile) && file.isDirectory();
1124     }
1125 
isPathExists(String path)1126     private static boolean isPathExists(String path) {
1127         if (path != null && !path.isEmpty()) {
1128             File filePath = new File(path);
1129             return filePath.exists();
1130         }
1131         return false;
1132     }
1133 
isDirectoryValidStrictCase(String path, String directoryName)1134     private static boolean isDirectoryValidStrictCase(String path, String directoryName) {
1135         File file = new File(path);
1136         if (!file.exists()) {
1137             String errMsg = "The directory does not exist, directory path is: " + path + ".";
1138             LOG.error(PackingToolErrMsg.FILE_NOT_EXIST.toString(errMsg));
1139             return false;
1140         }
1141         if (file.isDirectory()) {
1142             return directoryName.equals(file.getName());
1143         }
1144         return false;
1145     }
1146 
1147     /**
1148      * remove duplicate in path.
1149      *
1150      * @param path input path, use comma separate.
1151      * @return result list
1152      */
removeDuplicatePath(String path)1153     private static List<String> removeDuplicatePath(String path) {
1154         String[] array = path.split(COMMA_SPLIT);
1155         List<String> list = new ArrayList<>();
1156 
1157         for (String item : array) {
1158             if (!list.contains(item)) {
1159                 list.add(item);
1160             }
1161         }
1162         return list;
1163     }
1164 
isVerifyValidInHspMode(Utility utility)1165     private static boolean isVerifyValidInHspMode(Utility utility) {
1166         if (utility.getJsonPath().isEmpty()) {
1167             String errMsg = "--json-path is empty.";
1168             LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString(errMsg));
1169             return false;
1170         }
1171 
1172         if (!isPathValid(utility.getJsonPath(), TYPE_FILE, MODULE_PROFILE)) {
1173             String errMsg = "--json-path must be the module.json file.";
1174             LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString(errMsg));
1175             return false;
1176         }
1177 
1178         if ((isBundleTypeShared(utility) || isBundleTypeAppService(utility))) {
1179             boolean hspHasAbilities = hspHasAbilities(utility);
1180             boolean hspHasExtensionAbilities = hspHasExtensionAbilities(utility);
1181             if (hspHasAbilities && hspHasExtensionAbilities) {
1182                 String errMsg = "shared/appService hsp has abilities and extensionAbilities.";
1183                 LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString(errMsg));
1184                 return false;
1185             }
1186             if (hspHasAbilities) {
1187                 LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString("shared/appService hsp has abilities."));
1188                 return false;
1189             }
1190             if (hspHasExtensionAbilities) {
1191                 LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString(
1192                         "shared/appService hsp has extensionAbilities."));
1193                 return false;
1194             }
1195         }
1196 
1197         if(hasHomeAbility(utility)) {
1198             LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString("hsp has entry ability."));
1199             return false;
1200         }
1201 
1202         if (hasHomeExtensionAbility(utility)) {
1203             LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString("hsp has entry extensionAbility."));
1204             return false;
1205         }
1206 
1207         if (!utility.getJarPath().isEmpty()
1208                 && !compatibleProcess(utility, utility.getJarPath(), utility.getFormattedJarPathList(), JAR_SUFFIX)) {
1209             String errMsg = "--jar-path is invalid.";
1210             LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString(errMsg));
1211             return false;
1212         }
1213 
1214         if (!utility.getTxtPath().isEmpty()
1215                 && !compatibleProcess(utility, utility.getTxtPath(), utility.getFormattedTxtPathList(), TXT_SUFFIX)) {
1216             String errMsg = "--txt-path is invalid.";
1217             LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString(errMsg));
1218             return false;
1219         }
1220 
1221         if (!utility.getLibPath().isEmpty() && !isPathValid(utility.getLibPath(), TYPE_DIR, null)) {
1222             String errMsg = "--lib-path is invalid.";
1223             LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString(errMsg));
1224             return false;
1225         }
1226 
1227         if (!utility.getResPath().isEmpty() && !isPathValid(utility.getResPath(), TYPE_DIR, null)) {
1228             String errMsg = "--res-path is invalid.";
1229             LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString(errMsg));
1230             return false;
1231         }
1232 
1233         if (!utility.getResourcesPath().isEmpty() && !isPathValid(utility.getResourcesPath(), TYPE_DIR, null)) {
1234             String errMsg = "--resources-path is invalid.";
1235             LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString(errMsg));
1236             return false;
1237         }
1238 
1239         if (!utility.getAssetsPath().isEmpty() && !isPathValid(utility.getAssetsPath(), TYPE_DIR, null)) {
1240             String errMsg = "--assets-path is invalid.";
1241             LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString(errMsg));
1242             return false;
1243         }
1244 
1245         if (!utility.getDirList().isEmpty() && !splitDirList(utility, utility.getDirList(),
1246                 utility.getFormatedDirList())) {
1247             String errMsg = "--dir-list is invalid.";
1248             LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString(errMsg));
1249             return false;
1250         }
1251 
1252         if (isHapPathValid(utility.getAPPath())) {
1253             String errMsg = "--ap-path is invalid.";
1254             LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString(errMsg));
1255             return false;
1256         }
1257 
1258         if (isHapPathValid(utility.getANPath())) {
1259             String errMsg = "--an-path is invalid.";
1260             LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString(errMsg));
1261             return false;
1262         }
1263 
1264         if (!utility.getPkgContextPath().isEmpty()) {
1265             File file = new File(utility.getPkgContextPath());
1266             if (!file.isFile() || !PKG_CONTEXT_INFO.equals(file.getName())) {
1267                 String errMsg = "--pkg-context-path file must be the pkgContextInfo.json file.";
1268                 LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString(errMsg));
1269                 return false;
1270             }
1271         }
1272 
1273         if (!utility.getEtsPath().isEmpty() && !isPathExists(utility.getEtsPath())) {
1274             String errMsg = "--ets-path is invalid.";
1275             LOG.error(PackingToolErrMsg.HSP_MODE_ARGS_INVALID.toString(errMsg));
1276             return false;
1277         }
1278 
1279         return isOutPathValid(utility, HSP_SUFFIX);
1280     }
1281 
isVerifyValidInHapAdditionMode(Utility utility)1282     private static boolean isVerifyValidInHapAdditionMode(Utility utility) {
1283         if (utility.getHapPath().isEmpty()) {
1284             String errMsg = "--hap-path is empty.";
1285             LOG.error(PackingToolErrMsg.HAP_ADDITION_MODE_ARGS_INVALID.toString(errMsg));
1286             return false;
1287         }
1288         String hapPath = utility.getAbsoluteHapPath();
1289         File hapFile = new File(hapPath);
1290         if (hapFile.isDirectory()) {
1291             String errMsg = "--hap-path cannot be a folder.";
1292             LOG.error(PackingToolErrMsg.HAP_ADDITION_MODE_ARGS_INVALID.toString(errMsg));
1293             return false;
1294         }
1295         if (!(hapPath.endsWith(HAP_SUFFIX) || hapPath.endsWith(HSP_SUFFIX))) {
1296             String errMsg = "--hap-path is invalid.";
1297             LOG.error(PackingToolErrMsg.HAP_ADDITION_MODE_ARGS_INVALID.toString(errMsg));
1298             return false;
1299         }
1300         if (!hapFile.exists()) {
1301             String errMsg = "--hap-path file does not exist.";
1302             LOG.error(PackingToolErrMsg.HAP_ADDITION_MODE_ARGS_INVALID.toString(errMsg));
1303             return false;
1304         }
1305         if (utility.getJsonPath().isEmpty()) {
1306             String errMsg = "--json-path is empty.";
1307             LOG.error(PackingToolErrMsg.HAP_ADDITION_MODE_ARGS_INVALID.toString(errMsg));
1308             return false;
1309         }
1310         if (!utility.getJsonPath().endsWith(JSON_SUFFIX)) {
1311             String errMsg = "--json-path is invalid.";
1312             LOG.error(PackingToolErrMsg.HAP_ADDITION_MODE_ARGS_INVALID.toString(errMsg));
1313             return false;
1314         }
1315         File jsonFile = new File(utility.getJsonPath());
1316         if (!jsonFile.exists()) {
1317             String errMsg = "--json-path file does not exist.";
1318             LOG.error(PackingToolErrMsg.HAP_ADDITION_MODE_ARGS_INVALID.toString(errMsg));
1319             return false;
1320         }
1321         if (!checkJsonIsValid(jsonFile)) {
1322             String errMsg = "The format of the --json-path file is invalid.";
1323             LOG.error(PackingToolErrMsg.HAP_ADDITION_MODE_ARGS_INVALID.toString(errMsg));
1324             return false;
1325         }
1326 
1327         if (utility.getOutPath().isEmpty()) {
1328             String errMsg = "--out-path is empty.";
1329             LOG.error(PackingToolErrMsg.HAP_ADDITION_MODE_ARGS_INVALID.toString(errMsg));
1330             return false;
1331         }
1332         File dir = new File(utility.getOutPath());
1333         if (dir.exists() && dir.isFile()) {
1334             String errMsg = "--out-path is file.";
1335             LOG.error(PackingToolErrMsg.HAP_ADDITION_MODE_ARGS_INVALID.toString(errMsg));
1336             return false;
1337         }
1338         File absoluteHapFile = new File(utility.getAbsoluteHapPath());
1339         String hapFileName = absoluteHapFile.getName();
1340         String destPath = utility.getOutPath() + LINUX_FILE_SEPARATOR + hapFileName;
1341         File destFile = new File(destPath);
1342         if ("false".equals(utility.getForceRewrite()) && destFile.exists()) {
1343             String errMsg = "--out-path file already exist, but --force is not 'true'.";
1344             LOG.error(PackingToolErrMsg.HAP_ADDITION_MODE_ARGS_INVALID.toString(errMsg));
1345             return false;
1346         }
1347         return true;
1348     }
1349 
checkJsonIsValid(File jsonFile)1350     private static boolean checkJsonIsValid(File jsonFile) {
1351         StringBuffer jsonData = new StringBuffer();
1352         try (FileReader fileReader = new FileReader(jsonFile);
1353              Reader reader = new InputStreamReader(new FileInputStream(jsonFile), StandardCharsets.UTF_8)) {
1354             int ch = 0;
1355             while ((ch = reader.read()) != -1) {
1356                 jsonData.append((char) ch);
1357             }
1358         } catch (IOException e) {
1359             String errMsg = "Check json file is valid exist IOException: ";
1360             LOG.error(PackingToolErrMsg.IO_EXCEPTION.toString(errMsg + e.getMessage()));
1361             return false;
1362         }
1363         JSONValidator validator = JSONValidator.from(jsonData.toString());
1364         return validator.validate();
1365     }
1366 
isSharedApp(Utility utility)1367     private static boolean isSharedApp(Utility utility) {
1368         if (!utility.getHapPath().isEmpty()) {
1369             return false;
1370         }
1371         if (utility.getHspPath().isEmpty()) {
1372             return false;
1373         }
1374         List<String> tmpHspPathList = new ArrayList<>();
1375         if (compatibleProcess(utility, utility.getHspPath(), tmpHspPathList, HSP_SUFFIX)
1376             && verifyIsSharedApp(tmpHspPathList)) {
1377             utility.setIsSharedApp(true);
1378             return true;
1379         }
1380         return false;
1381     }
1382 
isAppService(Utility utility)1383     private static boolean isAppService(Utility utility) {
1384         if (!utility.getHapPath().isEmpty()) {
1385             List<String> tmpHapPathList = new ArrayList<>();
1386             if (compatibleProcess(utility, utility.getHapPath(), tmpHapPathList, HSP_SUFFIX)
1387                     && verifyIsAppService(tmpHapPathList)) {
1388                 utility.setIsAppService(true);
1389                 return true;
1390             }
1391         }
1392         if (utility.getHspPath().isEmpty()) {
1393             return false;
1394         }
1395         List<String> tmpHspPathList = new ArrayList<>();
1396         if (compatibleProcess(utility, utility.getHspPath(), tmpHspPathList, HSP_SUFFIX)
1397                 && verifyIsAppService(tmpHspPathList)) {
1398             utility.setIsAppService(true);
1399             return true;
1400         }
1401         return false;
1402     }
verifyIsAppService(List<String> modulePathList)1403     private static boolean verifyIsAppService(List<String> modulePathList) {
1404         if (modulePathList.isEmpty()) {
1405             return false;
1406         }
1407         try {
1408             for (String modulePath : modulePathList) {
1409                 HapVerifyInfo hapVerifyInfo = Compressor.parseStageHapVerifyInfo(modulePath);
1410                 if (!hapVerifyInfo.getBundleType().equals(BUNDLE_TYPE_APP_SERVICE)) {
1411                     return false;
1412                 }
1413             }
1414         } catch (BundleException e) {
1415             return false;
1416         }
1417         return true;
1418     }
verifyIsSharedApp(List<String> hspPath)1419     private static boolean verifyIsSharedApp(List<String> hspPath) {
1420         try {
1421             HapVerifyInfo hapVerifyInfo = Compressor.parseStageHapVerifyInfo(hspPath.get(0));
1422             return hapVerifyInfo.getBundleType().equals(BUNDLE_TYPE_SHARE);
1423         } catch (BundleException e) {
1424             return false;
1425         }
1426     }
1427 
isBundleTypeShared(Utility utility)1428     private static boolean isBundleTypeShared(Utility utility) {
1429         try {
1430             Optional<String> optional = FileUtils.getFileContent(utility.getJsonPath());
1431             if(optional.isPresent()) {
1432                 return ModuleJsonUtil.parseStageBundleType(optional.get()).equals(BUNDLE_TYPE_SHARE);
1433             } else {
1434                 String errMsg = "Parse --json-path content failed.";
1435                 LOG.error(PackingToolErrMsg.BUNDLE_TYPE_SHARED_INVALID.toString(errMsg));
1436                 return false;
1437             }
1438         } catch (BundleException e) {
1439             LOG.error(PackingToolErrMsg.BUNDLE_TYPE_SHARED_INVALID.toString("BundleException: " + e.getMessage()));
1440             return false;
1441         }
1442     }
1443 
isBundleTypeAppService(Utility utility)1444     private static boolean isBundleTypeAppService(Utility utility) {
1445         try {
1446             Optional<String> optional = FileUtils.getFileContent(utility.getJsonPath());
1447             if(optional.isPresent()) {
1448                 return ModuleJsonUtil.parseStageBundleType(optional.get()).equals(BUNDLE_TYPE_APP_SERVICE);
1449             } else {
1450                 String errMsg = "Parse --json-path content failed.";
1451                 LOG.error(PackingToolErrMsg.BUNDLE_TYPE_APPSERVICE_INVALID.toString(errMsg));
1452                 return false;
1453             }
1454         } catch (BundleException e) {
1455             LOG.error(PackingToolErrMsg.BUNDLE_TYPE_APPSERVICE_INVALID.toString("BundleException: " + e.getMessage()));
1456             return false;
1457         }
1458     }
1459 
hspHasAbilities(Utility utility)1460     private static boolean hspHasAbilities(Utility utility) {
1461         try {
1462             Optional<String> optional = FileUtils.getFileContent(utility.getJsonPath());
1463             if(optional.isPresent()) {
1464                 return ModuleJsonUtil.parseModuleType(optional.get()).equals(BUNDLE_TYPE_SHARE) && !ModuleJsonUtil.parseAbilityNames(optional.get()).isEmpty();
1465             } else {
1466                 String errMsg = "Parse --json-path content failed.";
1467                 LOG.error(PackingToolErrMsg.HSP_HAS_ABILITIES_FAILED.toString(errMsg));
1468                 return false;
1469             }
1470         } catch (BundleException e) {
1471             LOG.error(PackingToolErrMsg.HSP_HAS_ABILITIES_FAILED.toString("BundleException: " + e.getMessage()));
1472             return false;
1473         }
1474     }
1475 
hspHasExtensionAbilities(Utility utility)1476     private static boolean hspHasExtensionAbilities(Utility utility) {
1477         try {
1478             Optional<String> optional = FileUtils.getFileContent(utility.getJsonPath());
1479             if (optional.isPresent()) {
1480                 return ModuleJsonUtil.parseModuleType(optional.get()).equals(BUNDLE_TYPE_SHARE) &&
1481                         !ModuleJsonUtil.parseExtensionAbilityName(optional.get()).isEmpty();
1482             } else {
1483                 String errMsg = "Parse --json-path content failed.";
1484                 LOG.error(PackingToolErrMsg.HSP_HAS_EXTENSION_ABILITIES_FAILED.toString(errMsg));
1485             }
1486         } catch (BundleException e) {
1487             LOG.error(PackingToolErrMsg.HSP_HAS_EXTENSION_ABILITIES_FAILED.toString(
1488                     "BundleException: " + e.getMessage()));
1489         }
1490         return false;
1491     }
1492 
hasHomeAbility(Utility utility)1493     private static boolean hasHomeAbility(Utility utility) {
1494         try {
1495             boolean result = false;
1496             Optional<String> optional = FileUtils.getFileContent(utility.getJsonPath());
1497             if(!optional.isPresent()) {
1498                 String errMsg = "Parse --json-path content failed.";
1499                 LOG.error(PackingToolErrMsg.HAS_HOME_ABILITY_INVALID.toString(errMsg));
1500                 return false;
1501             }
1502             Map<String, Boolean> abilitiesMap = ModuleJsonUtil.parseAbilitySkillsMap(optional.get());
1503             if (abilitiesMap.containsValue(true)) {
1504                 result = true;
1505             }
1506             LOG.info("CompressVerify::hasHomeAbilities result = " + result);
1507             return result;
1508         } catch (BundleException e) {
1509             LOG.error(PackingToolErrMsg.HAS_HOME_ABILITY_INVALID.toString("BundleException: " + e.getMessage()));
1510             return false;
1511         }
1512     }
1513 
1514     /**
1515      * Indicates whether the "--encrypt-path" parameter is valid.
1516      *
1517      * @param utility - compress parameters
1518      * @return true if "--encrypt-path" param exists and the file name is encrypt.json, or the "--encrypt-path"
1519      *         param is empty, or has no "--encrypt-path" param
1520      *         false other situations
1521      */
isValidEncryptJsonFile(Utility utility)1522     private static boolean isValidEncryptJsonFile(Utility utility) {
1523         if (!utility.getEncryptPath().isEmpty()) {
1524             File fileEncryptJson = new File(utility.getEncryptPath());
1525             return fileEncryptJson.isFile() && Constants.FILE_ENCRYPT_JSON.equals(fileEncryptJson.getName());
1526         }
1527         return true;
1528     }
1529 
1530     /**
1531      * Indicates whether the "--pac-json-path" parameter is valid.
1532      *
1533      * @param utility - compress parameters
1534      * @return true if "--pac-json-path" param exists and the file name is pac.json, or the "--pac-json-path"
1535      *         param is empty, or has no "--pac-json-path" param
1536      *         false other situations
1537      */
isValidPacJsonFile(Utility utility)1538     private static boolean isValidPacJsonFile(Utility utility) {
1539         if (!utility.getPacJsonPath().isEmpty()) {
1540             File filePacJson = new File(utility.getPacJsonPath());
1541             return filePacJson.isFile() && Constants.FILE_PAC_JSON.equals(filePacJson.getName());
1542         }
1543         return true;
1544     }
1545 
hasHomeExtensionAbility(Utility utility)1546     private static boolean hasHomeExtensionAbility(Utility utility) {
1547         try {
1548             boolean result = false;
1549             Optional<String> optional = FileUtils.getFileContent(utility.getJsonPath());
1550             if (!optional.isPresent()) {
1551                 String errMsg = "Parse --json-path content failed.";
1552                 LOG.error(PackingToolErrMsg.HAS_HOME_EXTENSION_ABILITY_INVALID.toString(errMsg));
1553                 return false;
1554             }
1555             Map<String, Boolean> extensionAbilitiesMap = ModuleJsonUtil.parseExtensionAbilitySkillsMap(optional.get());
1556             if (extensionAbilitiesMap.containsValue(true)) {
1557                 result = true;
1558             }
1559             LOG.info("CompressVerify::hasHomeExtensionAbility result = " + result);
1560             return result;
1561         } catch (BundleException e) {
1562             LOG.error(PackingToolErrMsg.HAS_HOME_EXTENSION_ABILITY_INVALID.toString(
1563                     "BundleException: " + e.getMessage()));
1564             return false;
1565         }
1566     }
1567 }
1568