blob: 3ec1248813f6c3bf8e4157f14873d172d5f037b5 [file] [log] [blame]
/*
* Copyright (C) 2013 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.tools.idea.jps.builder;
import com.android.tools.idea.gradle.util.AndroidGradleSettings;
import com.android.tools.idea.gradle.util.BuildMode;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.intellij.util.SystemProperties;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.api.GlobalOptions;
import java.io.File;
import java.util.List;
import static com.android.tools.idea.gradle.compiler.BuildProcessJvmArgs.*;
/**
* Settings used to build a Gradle project.
*/
class BuilderExecutionSettings {
@Nullable private final File myGradleHomeDir;
@Nullable private final File myGradleServiceDir;
@Nullable private final File myJavaHomeDir;
@NotNull private final File myProjectDir;
@NotNull private final BuildMode myBuildMode;
@NotNull private final List<String> myGradleTasksToInvoke;
@NotNull private final List<String> myCommandLineOptions;
@NotNull private final List<String> myJvmOptions;
private final boolean myEmbeddedModeEnabled;
private final boolean myVerboseLoggingEnabled;
private final boolean myParallelBuild;
private final boolean myOfflineBuildMode;
private final boolean myConfigureOnDemand;
BuilderExecutionSettings() {
myEmbeddedModeEnabled = SystemProperties.getBooleanProperty(USE_EMBEDDED_GRADLE_DAEMON, false);
myGradleHomeDir = findDir(GRADLE_HOME_DIR_PATH, "Gradle home");
myGradleServiceDir = findDir(GRADLE_SERVICE_DIR_PATH, "Gradle service");
myJavaHomeDir = findDir(GRADLE_JAVA_HOME_DIR_PATH, "Java home");
myProjectDir = findProjectRootDir();
String buildActionName = System.getProperty(BUILD_MODE);
myBuildMode = Strings.isNullOrEmpty(buildActionName) ? BuildMode.DEFAULT_BUILD_MODE : BuildMode.valueOf(buildActionName);
myGradleTasksToInvoke = getJvmArgGroup(GRADLE_TASKS_TO_INVOKE_PROPERTY_PREFIX);
myCommandLineOptions = getJvmArgGroup(GRADLE_DAEMON_COMMAND_LINE_OPTION_PREFIX);
myJvmOptions = getJvmArgGroup(GRADLE_DAEMON_JVM_OPTION_PREFIX);
myVerboseLoggingEnabled = SystemProperties.getBooleanProperty(USE_GRADLE_VERBOSE_LOGGING, false);
myParallelBuild = SystemProperties.getBooleanProperty(GlobalOptions.COMPILE_PARALLEL_OPTION, false);
myOfflineBuildMode = SystemProperties.getBooleanProperty(GRADLE_OFFLINE_BUILD_MODE, false);
myConfigureOnDemand = SystemProperties.getBooleanProperty(GRADLE_CONFIGURATION_ON_DEMAND, false);
populateHttpProxyJvmOptions();
}
@Nullable
private static File findDir(@NotNull String jvmArgName, @NotNull String dirType) {
File gradleServiceDir = createFile(jvmArgName);
if (gradleServiceDir == null) {
return null;
}
ensureDirectoryExists(gradleServiceDir, dirType);
return gradleServiceDir;
}
@NotNull
private static File findProjectRootDir() {
File projectRootDir = createFile(PROJECT_DIR_PATH);
if (projectRootDir == null) {
throw new NullPointerException("Project directory not specified");
}
ensureDirectoryExists(projectRootDir, "project");
return projectRootDir;
}
private static void ensureDirectoryExists(@NotNull File dir, @NotNull String type) {
if (!dir.isDirectory()) {
String path = dir.getPath();
String msg = String.format("Unable to obtain %1$s directory: the file '%2$s' is not a directory", type, path);
throw new IllegalArgumentException(msg);
}
}
@Nullable
private static File createFile(@NotNull String jvmArgName) {
String path = System.getProperty(jvmArgName);
return path != null && !path.isEmpty() ? new File(path) : null;
}
@NotNull
private static List<String> getJvmArgGroup(@NotNull String argPrefix) {
List<String> args = Lists.newArrayList();
int counter = 0;
while (true) {
String arg = System.getProperty(argPrefix + counter++);
if (Strings.isNullOrEmpty(arg)) {
break;
}
args.add(arg);
}
return args;
}
private void populateHttpProxyJvmOptions() {
int counter = 0;
while (true) {
String jvmOption = System.getProperty(HTTP_PROXY_PROPERTY_PREFIX + counter++);
if (Strings.isNullOrEmpty(jvmOption)) {
break;
}
int indexOfSeparator = jvmOption.indexOf(HTTP_PROXY_PROPERTY_SEPARATOR);
if (indexOfSeparator < 0 || indexOfSeparator >= jvmOption.length() - 1) {
continue;
}
String arg =
AndroidGradleSettings.createJvmArg(jvmOption.substring(0, indexOfSeparator), jvmOption.substring(indexOfSeparator + 1));
myJvmOptions.add(arg);
}
}
boolean isEmbeddedModeEnabled() {
return myEmbeddedModeEnabled;
}
boolean isVerboseLoggingEnabled() {
return myVerboseLoggingEnabled;
}
@NotNull
List<String> getCommandLineOptions() {
return myCommandLineOptions;
}
@NotNull
List<String> getJvmOptions() {
return myJvmOptions;
}
@Nullable
File getGradleHomeDir() {
return myGradleHomeDir;
}
@Nullable
File getGradleServiceDir() {
return myGradleServiceDir;
}
@Nullable
File getJavaHomeDir() {
return myJavaHomeDir;
}
@NotNull
File getProjectDir() {
return myProjectDir;
}
@NotNull
BuildMode getBuildMode() {
return myBuildMode;
}
boolean isParallelBuild() {
return myParallelBuild;
}
boolean isOfflineBuild() {
return myOfflineBuildMode;
}
public boolean isConfigureOnDemand() {
return myConfigureOnDemand;
}
@NotNull
List<String> getGradleTasksToInvoke() {
return myGradleTasksToInvoke;
}
@Override
public String toString() {
return "BuilderExecutionSettings[" +
"buildMode=" + myBuildMode.name() +
", commandLineOptions=" + myCommandLineOptions +
", embeddedModeEnabled=" + myEmbeddedModeEnabled +
", gradleHomeDir=" + myGradleHomeDir +
", gradleServiceDir=" + myGradleServiceDir +
", javaHomeDir=" + myJavaHomeDir +
", jvmOptions=" + myJvmOptions +
", gradleTasksToInvoke=" + myGradleTasksToInvoke +
", offlineBuild=" + myOfflineBuildMode +
", parallelBuild=" + myParallelBuild +
", projectDir=" + myProjectDir +
", verboseLoggingEnabled=" + myVerboseLoggingEnabled +
']';
}
}