1b8a72a62Sopenharmony_ci/*
2b8a72a62Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3b8a72a62Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4b8a72a62Sopenharmony_ci * you may not use this file except in compliance with the License.
5b8a72a62Sopenharmony_ci * You may obtain a copy of the License at
6b8a72a62Sopenharmony_ci *
7b8a72a62Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8b8a72a62Sopenharmony_ci *
9b8a72a62Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10b8a72a62Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11b8a72a62Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12b8a72a62Sopenharmony_ci * See the License for the specific language governing permissions and
13b8a72a62Sopenharmony_ci * limitations under the License.
14b8a72a62Sopenharmony_ci */
15b8a72a62Sopenharmony_ci
16b8a72a62Sopenharmony_cipackage ohos;
17b8a72a62Sopenharmony_ci
18b8a72a62Sopenharmony_ciimport java.io.File;
19b8a72a62Sopenharmony_ciimport java.util.Optional;
20b8a72a62Sopenharmony_ci
21b8a72a62Sopenharmony_ci/**
22b8a72a62Sopenharmony_ci * hap package to bin package tool main class.
23b8a72a62Sopenharmony_ci *
24b8a72a62Sopenharmony_ci */
25b8a72a62Sopenharmony_cipublic class ConvertHapToBin {
26b8a72a62Sopenharmony_ci    private static final String HAP_PATH = "--hap-path";
27b8a72a62Sopenharmony_ci    private static final String BIN_PATH = "--bin-path";
28b8a72a62Sopenharmony_ci    private static final String PROJECT_PATH = "--project-path";
29b8a72a62Sopenharmony_ci    private static final String OUTPUT_PATH = "output";
30b8a72a62Sopenharmony_ci    private static final int PARA_COUNT = 4;
31b8a72a62Sopenharmony_ci    private static final Log LOG = new Log(ConvertHapToBin.class.toString());
32b8a72a62Sopenharmony_ci
33b8a72a62Sopenharmony_ci    /**
34b8a72a62Sopenharmony_ci     * generate binary file from hap package
35b8a72a62Sopenharmony_ci     *
36b8a72a62Sopenharmony_ci     * @param hapPath: hap path
37b8a72a62Sopenharmony_ci     * @param binPath: bin path
38b8a72a62Sopenharmony_ci     * @return true: success, false: fail
39b8a72a62Sopenharmony_ci     */
40b8a72a62Sopenharmony_ci    public static boolean packHapTobin(final String hapPath, final String binPath) {
41b8a72a62Sopenharmony_ci        if (hapPath.isEmpty() || binPath.isEmpty()) {
42b8a72a62Sopenharmony_ci            LOG.error("hapPath or binPath is null");
43b8a72a62Sopenharmony_ci            return false;
44b8a72a62Sopenharmony_ci        }
45b8a72a62Sopenharmony_ci
46b8a72a62Sopenharmony_ci        if (!FileUtils.checkFileIsExists(hapPath)) {
47b8a72a62Sopenharmony_ci            return false;
48b8a72a62Sopenharmony_ci        }
49b8a72a62Sopenharmony_ci
50b8a72a62Sopenharmony_ci        Optional<String> absHapPath = FileUtils.getFormatedPath(hapPath);
51b8a72a62Sopenharmony_ci        File file = new File(absHapPath.get());
52b8a72a62Sopenharmony_ci        String projectPath = file.getParent() + File.separator + OUTPUT_PATH;
53b8a72a62Sopenharmony_ci        FileUtils.unzip(absHapPath.get(), projectPath);
54b8a72a62Sopenharmony_ci
55b8a72a62Sopenharmony_ci        if (!BinaryTool.generateBinaryFile(projectPath, binPath)) {
56b8a72a62Sopenharmony_ci            LOG.error("create bin file failed!");
57b8a72a62Sopenharmony_ci            return false;
58b8a72a62Sopenharmony_ci        }
59b8a72a62Sopenharmony_ci        // delete project path
60b8a72a62Sopenharmony_ci        FileUtils.deleteDirectory(projectPath);
61b8a72a62Sopenharmony_ci        return true;
62b8a72a62Sopenharmony_ci    }
63b8a72a62Sopenharmony_ci
64b8a72a62Sopenharmony_ci    /**
65b8a72a62Sopenharmony_ci     * generate binary file from hap project
66b8a72a62Sopenharmony_ci     *
67b8a72a62Sopenharmony_ci     * @param projectPath: project path
68b8a72a62Sopenharmony_ci     * @param binPath: bin path
69b8a72a62Sopenharmony_ci     * @return true: success, false: fail
70b8a72a62Sopenharmony_ci     */
71b8a72a62Sopenharmony_ci    public static boolean packProjectTobin(final String projectPath, final String binPath) {
72b8a72a62Sopenharmony_ci        if (projectPath.isEmpty() || binPath.isEmpty()) {
73b8a72a62Sopenharmony_ci            LOG.error("projectPath or binPath is null");
74b8a72a62Sopenharmony_ci            return false;
75b8a72a62Sopenharmony_ci        }
76b8a72a62Sopenharmony_ci
77b8a72a62Sopenharmony_ci        if (!FileUtils.checkFileIsExists(projectPath)) {
78b8a72a62Sopenharmony_ci            return false;
79b8a72a62Sopenharmony_ci        }
80b8a72a62Sopenharmony_ci
81b8a72a62Sopenharmony_ci        Optional<String> absProjectPath = FileUtils.getFormatedPath(projectPath);
82b8a72a62Sopenharmony_ci        if (!BinaryTool.generateBinaryFile(absProjectPath.get(), binPath)) {
83b8a72a62Sopenharmony_ci            LOG.error("create bin file failed!");
84b8a72a62Sopenharmony_ci            return false;
85b8a72a62Sopenharmony_ci        }
86b8a72a62Sopenharmony_ci        return true;
87b8a72a62Sopenharmony_ci    }
88b8a72a62Sopenharmony_ci
89b8a72a62Sopenharmony_ci    /**
90b8a72a62Sopenharmony_ci     * tool main function.
91b8a72a62Sopenharmony_ci     *
92b8a72a62Sopenharmony_ci     * @param args command line
93b8a72a62Sopenharmony_ci     */
94b8a72a62Sopenharmony_ci    public static void main(String[] args) {
95b8a72a62Sopenharmony_ci        if (args.length != PARA_COUNT) {
96b8a72a62Sopenharmony_ci            LOG.error("param length is wrong!");
97b8a72a62Sopenharmony_ci            return;
98b8a72a62Sopenharmony_ci        }
99b8a72a62Sopenharmony_ci        String hapPath = "";
100b8a72a62Sopenharmony_ci        String binPath = "";
101b8a72a62Sopenharmony_ci        String projectPath = "";
102b8a72a62Sopenharmony_ci        int count = 0;
103b8a72a62Sopenharmony_ci        for (String para : args) {
104b8a72a62Sopenharmony_ci            if (HAP_PATH.equals(para) && count < args.length - 1) {
105b8a72a62Sopenharmony_ci                hapPath = args[count + 1];
106b8a72a62Sopenharmony_ci            }
107b8a72a62Sopenharmony_ci
108b8a72a62Sopenharmony_ci            if (PROJECT_PATH.equals(para) && count < args.length - 1) {
109b8a72a62Sopenharmony_ci                projectPath = args[count + 1];
110b8a72a62Sopenharmony_ci            }
111b8a72a62Sopenharmony_ci
112b8a72a62Sopenharmony_ci            if (BIN_PATH.equals(para) && count < args.length - 1) {
113b8a72a62Sopenharmony_ci                binPath = args[count + 1];
114b8a72a62Sopenharmony_ci            }
115b8a72a62Sopenharmony_ci            count++;
116b8a72a62Sopenharmony_ci        }
117b8a72a62Sopenharmony_ci        if (!hapPath.isEmpty() && !binPath.isEmpty()) {
118b8a72a62Sopenharmony_ci            packHapTobin(hapPath, binPath);
119b8a72a62Sopenharmony_ci        }
120b8a72a62Sopenharmony_ci
121b8a72a62Sopenharmony_ci        if (!projectPath.isEmpty() && !binPath.isEmpty()) {
122b8a72a62Sopenharmony_ci            packProjectTobin(projectPath, binPath);
123b8a72a62Sopenharmony_ci        }
124b8a72a62Sopenharmony_ci    }
125b8a72a62Sopenharmony_ci}