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