/*
* Copyright (C) 2014 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.gradle.util;
import com.android.tools.idea.gradle.invoker.GradleInvocationResult;
import com.android.tools.idea.gradle.invoker.GradleInvoker;
import com.android.tools.idea.gradle.project.BuildSettings;
import com.intellij.openapi.compiler.CompileContext;
import com.intellij.openapi.compiler.CompileTask;
import com.intellij.openapi.compiler.CompilerManager;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
/**
* Builds a project, regardless of the compiler strategy being used (JPS or "direct Gradle invocation.")
*/
public class ProjectBuilder {
@NotNull private final Project myProject;
@NotNull
public static ProjectBuilder getInstance(@NotNull Project project) {
return ServiceManager.getService(project, ProjectBuilder.class);
}
public ProjectBuilder(@NotNull Project project) {
myProject = project;
}
public void assembleTranslate() {
if (Projects.isGradleProject(myProject)) {
if (Projects.isDirectGradleInvocationEnabled(myProject)) {
GradleInvoker.getInstance(myProject).assembleTranslate();
return;
}
buildProjectWithJps(BuildMode.ASSEMBLE_TRANSLATE);
}
}
public void compileJava() {
if (Projects.isGradleProject(myProject)) {
if (Projects.isDirectGradleInvocationEnabled(myProject)) {
Module[] modules = ModuleManager.getInstance(myProject).getModules();
GradleInvoker.getInstance(myProject).compileJava(modules);
return;
}
buildProjectWithJps(BuildMode.COMPILE_JAVA);
}
}
public void clean() {
if (Projects.isGradleProject(myProject)) {
if (Projects.isDirectGradleInvocationEnabled(myProject)) {
GradleInvoker.getInstance(myProject).cleanProject();
return;
}
buildProjectWithJps(BuildMode.CLEAN);
}
}
/**
* Generates source code instead of a full compilation. This method does nothing if the Gradle model does not specify the name of the
* Gradle task to invoke.
*/
public void generateSourcesOnly() {
if (Projects.isGradleProject(myProject)) {
if (Projects.isDirectGradleInvocationEnabled(myProject)) {
GradleInvoker.getInstance(myProject).generateSources();
return;
}
buildProjectWithJps(BuildMode.SOURCE_GEN);
}
}
private void buildProjectWithJps(@NotNull BuildMode buildMode) {
BuildSettings.getInstance(myProject).setBuildMode(buildMode);
CompilerManager.getInstance(myProject).make(null);
}
public void addAfterProjectBuildTask(@NotNull AfterProjectBuildTask task) {
CompilerManager.getInstance(myProject).addAfterTask(task);
GradleInvoker.getInstance(myProject).addAfterGradleInvocationTask(task);
}
/**
* Convenient implementation of {@link AfterProjectBuildTask} meant for listeners that do not care of the build result.
*/
public abstract static class AfterProjectBuildListener implements AfterProjectBuildTask {
@Override
public void execute(@NotNull GradleInvocationResult result) {
buildFinished();
}
@Override
public boolean execute(CompileContext context) {
buildFinished();
return true;
}
protected abstract void buildFinished();
}
public interface AfterProjectBuildTask extends CompileTask, GradleInvoker.AfterGradleInvocationTask {
}
}