diff --git a/tools/idegen/src/com/android/idegen/Constants.java b/tools/idegen/src/com/android/idegen/Constants.java deleted file mode 100644 index f541dd48d..000000000 --- a/tools/idegen/src/com/android/idegen/Constants.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.idegen; - -import java.nio.charset.Charset; - -/** - * Constants - */ -public class Constants { - - public static final Charset CHARSET = Charset.forName("UTF-8"); - - public static final String REL_TEMPLATE_DIR = "development/tools/idegen/templates"; - public static final String REL_MODULES_TEMPLATE = REL_TEMPLATE_DIR + "/idea/modules.xml"; - public static final String REL_VCS_TEMPLATE = REL_TEMPLATE_DIR + "/idea/vcs.xml"; - public static final String REL_IML_TEMPLATE = REL_TEMPLATE_DIR + "/module-template.iml"; - - public static final String REL_OUT_APP_DIR = "out/target/common/obj/APPS"; - - public static final String FRAMEWORK_MODULE = "framework"; - public static final String[] AUTO_DEPENDENCIES = new String[]{ - FRAMEWORK_MODULE, "libcore" - }; - public static final String[] DIRS_WITH_AUTO_DEPENDENCIES = new String[] { - "packages", "vendor", "frameworks/ex", "frameworks/opt", "frameworks/support" - }; - - // Framework needs a special constant for it's intermediates because it does not follow - // normal conventions. - public static final String FRAMEWORK_INTERMEDIATES = "framework-res_intermediates"; -} diff --git a/tools/idegen/src/com/android/idegen/DirectorySearch.java b/tools/idegen/src/com/android/idegen/DirectorySearch.java index 1bbf99ff8..2ff23e3de 100644 --- a/tools/idegen/src/com/android/idegen/DirectorySearch.java +++ b/tools/idegen/src/com/android/idegen/DirectorySearch.java @@ -21,8 +21,12 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; import java.io.File; +import java.io.FileNotFoundException; import java.io.FilenameFilter; +import java.net.URISyntaxException; import java.util.HashSet; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -31,6 +35,8 @@ import java.util.regex.Pattern; */ public class DirectorySearch { + private static final Logger logger = Logger.getLogger(DirectorySearch.class.getName()); + private static final HashSet SOURCE_DIRS = Sets.newHashSet(); static { SOURCE_DIRS.add("src"); @@ -40,6 +46,9 @@ public class DirectorySearch { private static final Pattern EXCLUDE_PATTERN = Pattern.compile("values-..(-.*)*"); private static File repoRoot = null; + public static final String REL_TEMPLATE_DIR = "templates"; + public static final String REL_TEMPLATE_PATH_FROM_ROOT = "development/tools/idegen/" + + REL_TEMPLATE_DIR; /** * Find the repo root. This is the root branch directory of a full repo checkout. @@ -138,4 +147,38 @@ public class DirectorySearch { return builder.build(); } + + private static File templateDirCurrent = null; + private static File templateDirRoot = null; + + public static File findTemplateDir() throws FileNotFoundException { + // Cache optimization. + if (templateDirCurrent != null && templateDirCurrent.exists()) return templateDirCurrent; + if (templateDirRoot != null && templateDirRoot.exists()) return templateDirRoot; + + File currentDir = null; + try { + currentDir = new File(IntellijProject.class.getProtectionDomain().getCodeSource() + .getLocation().toURI().getPath()).getParentFile(); + } catch (URISyntaxException e) { + logger.log(Level.SEVERE, "Could not get jar location.", e); + return null; + } + + // First check relative to current run directory. + templateDirCurrent = new File(currentDir, REL_TEMPLATE_DIR); + if (templateDirCurrent.exists()) { + return templateDirCurrent; + } else { + // Then check relative to root directory. + templateDirRoot = new File(repoRoot, REL_TEMPLATE_PATH_FROM_ROOT); + if (templateDirRoot.exists()) { + return templateDirRoot; + } + } + throw new FileNotFoundException( + "Unable to find template dir. Tried the following locations:\n" + + templateDirCurrent.getAbsolutePath() + "\n" + + templateDirRoot.getAbsolutePath()); + } } diff --git a/tools/idegen/src/com/android/idegen/FrameworkModule.java b/tools/idegen/src/com/android/idegen/FrameworkModule.java index bfcd1fab3..8743925e4 100644 --- a/tools/idegen/src/com/android/idegen/FrameworkModule.java +++ b/tools/idegen/src/com/android/idegen/FrameworkModule.java @@ -25,15 +25,19 @@ import java.io.File; */ public class FrameworkModule extends StandardModule { + // Framework needs a special constant for it's intermediates because it does not follow + // normal conventions. + private static final String FRAMEWORK_INTERMEDIATES = "framework-res_intermediates"; + public FrameworkModule(String moduleName, String makeFile) { - super(Constants.FRAMEWORK_MODULE, makeFile, true); + super(IntellijProject.FRAMEWORK_MODULE, makeFile, true); } @Override protected String buildIntermediates() { StringBuilder sb = new StringBuilder(); File intermediates = new File(repoRoot, - Constants.REL_OUT_APP_DIR + File.separator + Constants.FRAMEWORK_INTERMEDIATES); + REL_OUT_APP_DIR + File.separator + FRAMEWORK_INTERMEDIATES); ImmutableList intermediateSrcDirs = DirectorySearch.findSourceDirs(intermediates); sb.append(" \n"); for (File src : intermediateSrcDirs) { diff --git a/tools/idegen/src/com/android/idegen/IntellijProject.java b/tools/idegen/src/com/android/idegen/IntellijProject.java index 95bbe7676..e49a12b72 100644 --- a/tools/idegen/src/com/android/idegen/IntellijProject.java +++ b/tools/idegen/src/com/android/idegen/IntellijProject.java @@ -22,6 +22,7 @@ import com.google.common.io.Files; import java.io.File; import java.io.IOException; +import java.nio.charset.Charset; import java.util.Arrays; import java.util.Set; import java.util.logging.Logger; @@ -31,9 +32,16 @@ import java.util.logging.Logger; */ public class IntellijProject { + public static final String FRAMEWORK_MODULE = "framework"; + public static final Charset CHARSET = Charset.forName("UTF-8"); + private static final Logger logger = Logger.getLogger(IntellijProject.class.getName()); + private static final String MODULES_TEMPLATE_FILE_NAME = "modules.xml"; + private static final String VCS_TEMPLATE_FILE_NAME = "vcs.xml"; + ModuleCache cache = ModuleCache.getInstance(); + File indexFile; File repoRoot; File projectIdeaDir; @@ -109,19 +117,27 @@ public class IntellijProject { /** * Framework module needs special handling due to one off resource path: - * frameworks/base/Android.mk + * frameworks/base/Android.mk */ private void buildFrameWorkModule() throws IOException { - String makeFile = cache.getMakeFile(Constants.FRAMEWORK_MODULE); - logger.info("makefile: " + makeFile); - StandardModule frameworkModule = new FrameworkModule(Constants.FRAMEWORK_MODULE, makeFile); - frameworkModule.build(); - cache.put(frameworkModule); + String makeFile = cache.getMakeFile(FRAMEWORK_MODULE); + if (makeFile == null) { + logger.warning("Unable to find framework module: " + FRAMEWORK_MODULE + + ". Skipping."); + } else { + logger.info("makefile: " + makeFile); + StandardModule frameworkModule = new FrameworkModule(FRAMEWORK_MODULE, + makeFile); + frameworkModule.build(); + cache.put(frameworkModule); + } } private void createModulesFile(Module module) throws IOException { - String modulesContent = Files.toString(new File(repoRoot, Constants.REL_MODULES_TEMPLATE), - Constants.CHARSET); + String modulesContent = Files.toString( + new File(DirectorySearch.findTemplateDir(), + "idea" + File.separator + MODULES_TEMPLATE_FILE_NAME), + CHARSET); StringBuilder sb = new StringBuilder(); File moduleIml = module.getImlFile(); sb.append(" allDependencies = Sets.newHashSet(); // direct + indirect + private Set allDependentImlFiles = Sets.newHashSet(); protected abstract void build() throws IOException; + protected abstract String getName(); + protected abstract File getDir(); + protected abstract boolean isAndroidModule(); + protected abstract List getIntermediatesDirs(); + public abstract Set getDirectDependencies(); + protected abstract ImmutableList getSourceDirs(); + protected abstract ImmutableList getExcludeDirs(); + public abstract File getRepoRoot(); public void buildImlFile() throws IOException { - String imlTemplate = Files.toString(new File(getRepoRoot(), Constants.REL_IML_TEMPLATE), - Constants.CHARSET); + String imlTemplate = Files.toString( + new File(DirectorySearch.findTemplateDir(), IML_TEMPLATE_FILE_NAME), + IntellijProject.CHARSET); String facetXml = ""; if (isAndroidModule()) { @@ -100,7 +114,7 @@ public abstract class Module { imlFile = new File(moduleDir, getName() + ".iml"); logger.info("Creating " + imlFile.getAbsolutePath()); - Files.write(imlTemplate, imlFile, Constants.CHARSET); + Files.write(imlTemplate, imlFile, IntellijProject.CHARSET); } protected String buildIntermediates() { diff --git a/tools/idegen/src/com/android/idegen/StandardModule.java b/tools/idegen/src/com/android/idegen/StandardModule.java index dffb95e01..f7b24b085 100644 --- a/tools/idegen/src/com/android/idegen/StandardModule.java +++ b/tools/idegen/src/com/android/idegen/StandardModule.java @@ -17,6 +17,7 @@ package com.android.idegen; import com.google.common.base.Objects; +import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -45,10 +46,18 @@ import java.util.regex.Pattern; */ public class StandardModule extends Module { + static final String REL_OUT_APP_DIR = "out/target/common/obj/APPS"; + private static final Logger logger = Logger.getLogger(StandardModule.class.getName()); private static final Pattern SRC_PATTERN = Pattern.compile( ".*\\(call all-java-files-under, (.*)\\)"); + private static final String[] AUTO_DEPENDENCIES = new String[]{ + IntellijProject.FRAMEWORK_MODULE, "libcore" + }; + private static final String[] DIRS_WITH_AUTO_DEPENDENCIES = new String[]{ + "packages", "vendor", "frameworks/ex", "frameworks/opt", "frameworks/support" + }; String moduleName; File makeFile; @@ -66,7 +75,8 @@ public class StandardModule extends Module { } public StandardModule(String moduleName, String makeFile, boolean searchForSrc) { - this(moduleName, new File(makeFile), searchForSrc); + this(Preconditions.checkNotNull(moduleName), new File(Preconditions.checkNotNull(makeFile)), + searchForSrc); } public StandardModule(String moduleName, File makeFile, boolean searchForSrc) { @@ -75,16 +85,16 @@ public class StandardModule extends Module { this.moduleRoot = makeFile.getParentFile(); this.repoRoot = DirectorySearch.findRepoRoot(makeFile); this.intermediatesDir = new File(repoRoot.getAbsolutePath() + File.separator + - Constants.REL_OUT_APP_DIR + File.separator + getName() + "_intermediates" + + REL_OUT_APP_DIR + File.separator + getName() + "_intermediates" + File.separator + "src"); this.searchForSrc = searchForSrc; // TODO: auto-detect when framework dependency is needed instead of using coded list. - for (String dir : Constants.DIRS_WITH_AUTO_DEPENDENCIES) { + for (String dir : DIRS_WITH_AUTO_DEPENDENCIES) { // length + 2 to account for slash boolean isDir = makeFile.getAbsolutePath().startsWith(repoRoot + "/" + dir); if (isDir) { - for (String dependency : Constants.AUTO_DEPENDENCIES) { + for (String dependency : AUTO_DEPENDENCIES) { this.directDependencies.add(dependency); } }