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