1ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng/*
2ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng * Copyright (C) 2012 The Android Open Source Project
3ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng *
4ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng * Licensed under the Apache License, Version 2.0 (the "License");
5ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng * you may not use this file except in compliance with the License.
6ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng * You may obtain a copy of the License at
7ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng *
8ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng *      http://www.apache.org/licenses/LICENSE-2.0
9ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng *
10ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng * Unless required by applicable law or agreed to in writing, software
11ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng * distributed under the License is distributed on an "AS IS" BASIS,
12ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng * See the License for the specific language governing permissions and
14ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng * limitations under the License.
15ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng */
16ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
17ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Chengpackage com.android.idegen;
18ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
19ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Chengimport com.google.common.base.Preconditions;
20ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Chengimport com.google.common.collect.Sets;
21ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Chengimport com.google.common.io.Files;
22ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
23ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Chengimport java.io.File;
24ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Chengimport java.io.IOException;
256818901ea085849aacf56a3206f9ea7bb6684129Chiao Chengimport java.nio.charset.Charset;
26ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Chengimport java.util.Arrays;
27ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Chengimport java.util.Set;
28ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Chengimport java.util.logging.Logger;
29ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
30ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng/**
31ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng * Build Intellij projects.
32ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng */
33ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Chengpublic class IntellijProject {
34ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
356818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng    public static final String FRAMEWORK_MODULE = "framework";
366818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng    public static final Charset CHARSET = Charset.forName("UTF-8");
376818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng
38ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    private static final Logger logger = Logger.getLogger(IntellijProject.class.getName());
39ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
406818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng    private static final String MODULES_TEMPLATE_FILE_NAME = "modules.xml";
416818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng    private static final String VCS_TEMPLATE_FILE_NAME = "vcs.xml";
426818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng
43ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    ModuleCache cache = ModuleCache.getInstance();
446818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng
45ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    File indexFile;
46ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    File repoRoot;
47ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    File projectIdeaDir;
48ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    String moduleName;
49ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
50ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    public IntellijProject(String indexFile, String moduleName) {
51ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        this.indexFile = new File(Preconditions.checkNotNull(indexFile));
52ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        this.moduleName = Preconditions.checkNotNull(moduleName);
53ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    }
54ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
55ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    private void init() throws IOException {
56ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        repoRoot = DirectorySearch.findRepoRoot(indexFile);
57ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        cache.init(indexFile);
58ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    }
59ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
60ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    public void build() throws IOException {
61ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        init();
62ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        buildFrameWorkModule();
63ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
64ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        // First pass, find all dependencies and cache them.
65ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        Module module = cache.getAndCache(moduleName);
66d7a603c968e341923d3d48e18c80e3a1b30de5bcChiao Cheng        if (module == null) {
67d7a603c968e341923d3d48e18c80e3a1b30de5bcChiao Cheng            logger.info("Module '" + moduleName + "' not found." +
68d7a603c968e341923d3d48e18c80e3a1b30de5bcChiao Cheng                    " Module names are case senstive.");
69d7a603c968e341923d3d48e18c80e3a1b30de5bcChiao Cheng            return;
70d7a603c968e341923d3d48e18c80e3a1b30de5bcChiao Cheng        }
71ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        projectIdeaDir = new File(module.getDir(), ".idea");
72ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        projectIdeaDir.mkdir();
73ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        copyTemplates();
74ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
75ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        // Second phase, build aggregate modules.
76ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        Set<String> deps = module.getAllDependencies();
77ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        for (String dep : deps) {
78ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            cache.buildAndCacheAggregatedModule(dep);
79ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        }
80ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
81ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        // Third phase, replace individual modules with aggregated modules
82ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        Iterable<Module> modules = cache.getModules();
83ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        for (Module mod : modules) {
84ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            replaceWithAggregate(mod);
85ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        }
86ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
87ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        // Finally create iml files for dependencies
88ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        for (Module mod : modules) {
89ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            mod.buildImlFile();
90ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        }
91ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
92ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        createModulesFile(module);
93ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        createVcsFile(module);
94ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        createNameFile(moduleName);
95ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    }
96ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
97ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    private void replaceWithAggregate(Module module) {
98ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        replaceWithAggregate(module.getDirectDependencies(), module.getName());
99ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        replaceWithAggregate(module.getAllDependencies(), module.getName());
100ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
101ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    }
102ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
103ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    private void replaceWithAggregate(Set<String> deps, String moduleName) {
104ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        for (String dep : Sets.newHashSet(deps)) {
105ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            String replacement = cache.getAggregateReplacementName(dep);
106ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            if (replacement != null) {
107ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
108ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng                deps.remove(dep);
109ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng                // There could be dependencies on self due to aggregation.
110ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng                // Only add if the replacement is not self.
111ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng                if (!replacement.equals(moduleName)) {
112ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng                    deps.add(replacement);
113ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng                }
114ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            }
115ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        }
116ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    }
117ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
118ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    /**
119ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng     * Framework module needs special handling due to one off resource path:
1206818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng     * frameworks/base/Android.mk
121ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng     */
122ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    private void buildFrameWorkModule() throws IOException {
1236818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng        String makeFile = cache.getMakeFile(FRAMEWORK_MODULE);
1246818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng        if (makeFile == null) {
1256818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng            logger.warning("Unable to find framework module: " + FRAMEWORK_MODULE +
1266818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng                    ". Skipping.");
1276818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng        } else {
1286818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng            logger.info("makefile: " + makeFile);
1296818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng            StandardModule frameworkModule = new FrameworkModule(FRAMEWORK_MODULE,
1306818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng                    makeFile);
1316818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng            frameworkModule.build();
1326818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng            cache.put(frameworkModule);
1336818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng        }
134ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    }
135ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
136ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    private void createModulesFile(Module module) throws IOException {
1376818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng        String modulesContent = Files.toString(
1386818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng                new File(DirectorySearch.findTemplateDir(),
1396818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng                        "idea" + File.separator + MODULES_TEMPLATE_FILE_NAME),
1406818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng                CHARSET);
141ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        StringBuilder sb = new StringBuilder();
142ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        File moduleIml = module.getImlFile();
143ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        sb.append("      <module fileurl=\"file://").append(moduleIml.getAbsolutePath())
144ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng                .append("\" filepath=\"").append(moduleIml.getAbsolutePath()).append("\" />\n");
145ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        for (String name : module.getAllDependencies()) {
146ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            Module mod = cache.getAndCache(name);
147ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            File iml = mod.getImlFile();
148ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            sb.append("      <module fileurl=\"file://").append(iml.getAbsolutePath())
149ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng                    .append("\" filepath=\"").append(iml.getAbsolutePath()).append("\" />\n");
150ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        }
151ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        modulesContent = modulesContent.replace("@MODULES@", sb.toString());
152ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
153ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        File out = new File(projectIdeaDir, "modules.xml");
154ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        logger.info("Creating " + out.getAbsolutePath());
1556818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng        Files.write(modulesContent, out, CHARSET);
156ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    }
157ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
158ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    private void createVcsFile(Module module) throws IOException {
1596818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng        String vcsTemplate = Files.toString(
1606818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng                new File(DirectorySearch.findTemplateDir(),
1616818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng                        "idea" + File.separator + VCS_TEMPLATE_FILE_NAME),
1626818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng                CHARSET);
163ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
164ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        StringBuilder sb = new StringBuilder();
165ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        for (String name : module.getAllDependencies()) {
166ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            Module mod = cache.getAndCache(name);
167ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            File dir = mod.getDir();
168ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            File gitRoot = new File(dir, ".git");
169ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            if (gitRoot.exists()) {
170ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng                sb.append("    <mapping directory=\"").append(dir.getAbsolutePath())
171ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng                        .append("\" vcs=\"Git\" />\n");
172ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            }
173ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        }
174ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        vcsTemplate = vcsTemplate.replace("@VCS@", sb.toString());
1756818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng        Files.write(vcsTemplate, new File(projectIdeaDir, "vcs.xml"), CHARSET);
176ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    }
177ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
178ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    private void createNameFile(String name) throws IOException {
1796818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng        File out = new File(projectIdeaDir, ".name");
1806818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng        Files.write(name, out, CHARSET);
181ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    }
182ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
183ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    private void copyTemplates() throws IOException {
1846818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng        File templateDir = DirectorySearch.findTemplateDir();
1856818901ea085849aacf56a3206f9ea7bb6684129Chiao Cheng        copyTemplates(new File(templateDir, "idea"), projectIdeaDir);
186ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    }
187ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
188ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    private void copyTemplates(File fromDir, File toDir) throws IOException {
189ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        toDir.mkdir();
190ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        File[] files = fromDir.listFiles();
191ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        for (File file : files) {
192ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            if (file.isDirectory()) {
193ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng                File destDir = new File(toDir, file.getName());
194ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng                copyTemplates(file, destDir);
195ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            } else {
196ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng                File toFile = new File(toDir, file.getName());
197ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng                logger.info("copying " + file.getAbsolutePath() + " to " +
198ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng                        toFile.getAbsolutePath());
199ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng                Files.copy(file, toFile);
200ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            }
201ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        }
202ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    }
203ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
204ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    public static void main(String[] args) {
205ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        logger.info("Args: " + Arrays.toString(args));
206ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
207ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        String indexFile = args[0];
208ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        String module = args[1];
209ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng
210ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        IntellijProject intellij = new IntellijProject(indexFile, module);
211ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        try {
212ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            intellij.build();
213ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        } catch (IOException e) {
214ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng            e.printStackTrace();
215ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng        }
216ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng    }
217ac0a18e0951eb74b6e556d7f2fdcce4d51d40adeChiao Cheng}
218