es aware run/make slight refactoring

This commit is contained in:
Vladislav.Soroka
2016-09-21 12:30:57 +03:00
parent 9dd021c5cc
commit 1636d06ce2
21 changed files with 132 additions and 116 deletions
@@ -45,4 +45,9 @@ public abstract class AbstractActivity implements Activity {
public void setDependsOn(@NotNull Collection<Activity> dependencies) {
myDependencies = dependencies;
}
@Override
public String toString() {
return getPresentableName();
}
}
@@ -29,4 +29,10 @@ public class ActivityList extends ArrayList<Activity> implements Activity {
public ActivityList(@NotNull Collection<? extends Activity> c) {
super(c);
}
@NotNull
@Override
public String getPresentableName() {
return toString();
}
}
@@ -49,7 +49,7 @@ public class ActivityManagerImpl extends ActivityManager {
}
@Override
public void buildDirty(@NotNull Module[] modules, @Nullable ActivityStatusNotification callback) {
public void build(@NotNull Module[] modules, @Nullable ActivityStatusNotification callback) {
run(createModulesBuildActivity(true, modules), callback);
}
@@ -80,17 +80,17 @@ public class ActivityManagerImpl extends ActivityManager {
}
@Override
public void buildProjectDirty(@Nullable ActivityStatusNotification callback) {
run(createProjectBuildActivity(true, myProject), callback);
public void buildAllModules(@Nullable ActivityStatusNotification callback) {
run(createAllModulesBuildActivity(true, myProject), callback);
}
@Override
public void rebuildProject(@Nullable ActivityStatusNotification callback) {
run(createProjectBuildActivity(false, myProject), callback);
public void rebuildAllModules(@Nullable ActivityStatusNotification callback) {
run(createAllModulesBuildActivity(false, myProject), callback);
}
@Override
public Activity createProjectBuildActivity(boolean isIncrementalBuild, Project project) {
public Activity createAllModulesBuildActivity(boolean isIncrementalBuild, Project project) {
return createModulesBuildActivity(isIncrementalBuild, ModuleManager.getInstance(project).getModules());
}
@@ -135,18 +135,17 @@ public class ActivityManagerImpl extends ActivityManager {
AtomicInteger errorsCounter = new AtomicInteger();
AtomicInteger warningsCounter = new AtomicInteger();
AtomicBoolean abortedFlag = new AtomicBoolean(false);
ActivityChunkStatusNotification chunkStatusNotification = callback == null ? null : new ActivityChunkStatusNotification() {
ActivityStatusNotification chunkStatusNotification = callback == null ? null : new ActivityStatusNotification() {
@Override
public void finished(boolean aborted, int errors, int warnings) {
public void finished(@NotNull ActivityExecutionResult executionResult) {
int inProgress = inProgressCounter.decrementAndGet();
int allErrors = errorsCounter.addAndGet(errors);
int allWarnings = warningsCounter.addAndGet(warnings);
if (aborted) {
int allErrors = errorsCounter.addAndGet(executionResult.getErrors());
int allWarnings = warningsCounter.addAndGet(executionResult.getWarnings());
if (executionResult.isAborted()) {
abortedFlag.set(true);
}
callback.chunkFinished(aborted, errors, warnings, inProgress);
if (inProgress == 0) {
callback.finished(abortedFlag.get(), allErrors, allWarnings);
callback.finished(new ActivityExecutionResult(abortedFlag.get(), allErrors, allWarnings));
}
}
};
@@ -17,6 +17,7 @@ package com.intellij.activity.impl;
import com.intellij.activity.ArtifactBuildActivity;
import com.intellij.packaging.artifacts.Artifact;
import org.jetbrains.annotations.NotNull;
/**
* @author Vladislav.Soroka
@@ -34,4 +35,10 @@ public class ArtifactBuildActivityImpl extends AbstractBuildActivity implements
public Artifact getArtifact() {
return myArtifact;
}
@NotNull
@Override
public String getPresentableName() {
return "Artifact '" + myArtifact.getName() + "' build activity";
}
}
@@ -47,10 +47,11 @@ public class InternalActivityRunner extends ActivityRunner {
@Override
public void run(@NotNull Project project,
@NotNull ActivityContext context,
@Nullable ActivityChunkStatusNotification callback,
@Nullable ActivityStatusNotification callback,
@NotNull Collection<? extends Activity> activities) {
CompileStatusNotification compileNotification =
callback == null ? null : (aborted, errors, warnings, compileContext) -> callback.finished(aborted, errors, warnings);
callback == null ? null : (aborted, errors, warnings, compileContext) ->
callback.finished(new ActivityExecutionResult(aborted, errors, warnings));
Map<Class<? extends Activity>, List<Activity>> activityMap = groupBy(activities);
runModulesBuildActivities(project, context, compileNotification, activityMap);
@@ -37,4 +37,10 @@ public class ModuleBuildActivityImpl extends AbstractBuildActivity implements Mo
public Module getModule() {
return myModule;
}
@NotNull
@Override
public String getPresentableName() {
return "Module '" + myModule.getName() + "' build activity";
}
}
@@ -19,7 +19,9 @@ import com.intellij.activity.ModuleFilesBuildActivity;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Collection;
/**
@@ -42,4 +44,10 @@ public class ModuleFilesBuildActivityImpl extends ModuleBuildActivityImpl implem
public VirtualFile[] getFiles() {
return myFiles;
}
@NotNull
@Override
public String getPresentableName() {
return "Files build activity '" + Arrays.toString(myFiles) + "'";
}
}
@@ -90,4 +90,10 @@ public class RunActivityImpl extends AbstractActivity implements RunActivity {
public RunnerAndConfigurationSettings getSettings() {
return mySettings;
}
@NotNull
@Override
public String getPresentableName() {
return "Run activity '" + myRunProfile.getName() + "'";
}
}
@@ -15,16 +15,16 @@
*/
package com.intellij.compiler.actions;
import com.intellij.activity.ActivityManager;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.activity.ActivityManager;
import com.intellij.openapi.project.Project;
public class CompileDirtyAction extends CompileActionBase {
protected void doAction(DataContext dataContext, Project project) {
ActivityManager.getInstance(project).buildProjectDirty();
ActivityManager.getInstance(project).buildAllModules();
}
public void update(AnActionEvent e){
@@ -15,27 +15,30 @@
*/
package com.intellij.compiler.actions;
import com.intellij.activity.ActivityExecutionResult;
import com.intellij.activity.ActivityManager;
import com.intellij.activity.ActivityStatusNotification;
import com.intellij.history.LocalHistory;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.activity.ActivityStatusNotificationAdapter;
import com.intellij.activity.ActivityManager;
import com.intellij.openapi.compiler.CompilerBundle;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
public class CompileProjectAction extends CompileActionBase {
protected void doAction(DataContext dataContext, final Project project) {
ActivityManager.getInstance(project).rebuildProject(new ActivityStatusNotificationAdapter() {
ActivityManager.getInstance(project).rebuildAllModules(new ActivityStatusNotification() {
@Override
public void finished(boolean aborted, int errors, int warnings) {
if (aborted || project.isDisposed()) {
public void finished(@NotNull ActivityExecutionResult executionResult) {
if (executionResult.isAborted() || project.isDisposed()) {
return;
}
String text = getTemplatePresentation().getText();
LocalHistory.getInstance().putSystemLabel(
project, CompilerBundle.message(errors == 0 ? "rebuild.lvcs.label.no.errors" : "rebuild.lvcs.label.with.errors", text));
project, CompilerBundle
.message(executionResult.getErrors() == 0 ? "rebuild.lvcs.label.no.errors" : "rebuild.lvcs.label.with.errors", text));
}
});
}
@@ -15,8 +15,8 @@
*/
package com.intellij.compiler.actions;
import com.intellij.openapi.actionSystem.*;
import com.intellij.activity.ActivityManager;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.compiler.CompilerBundle;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
@@ -36,7 +36,7 @@ public class MakeModuleAction extends CompileActionBase {
modules = new Module[]{module};
}
try {
ActivityManager.getInstance(project).buildDirty(modules);
ActivityManager.getInstance(project).build(modules);
}
catch (Exception e) {
LOG.error(e);
@@ -176,10 +176,10 @@ public class BuildArtifactsBeforeRunTaskProvider extends BeforeRunTaskProvider<B
}
}.execute();
final ActivityStatusNotification callback = new ActivityStatusNotificationAdapter() {
final ActivityStatusNotification callback = new ActivityStatusNotification() {
@Override
public void finished(boolean aborted, int errors, int warnings) {
result.set(!aborted && errors == 0);
public void finished(@NotNull ActivityExecutionResult executionResult) {
result.set(!executionResult.isAborted() && executionResult.getErrors() == 0);
finished.up();
}
};
@@ -15,6 +15,8 @@
*/
package com.intellij.activity;
import org.jetbrains.annotations.NotNull;
/**
* An {@link Activity} represents a single atomic piece of work for IDE workflow, such as 'Make Project' or run configurations.
*
@@ -22,4 +24,6 @@ package com.intellij.activity;
* @since 7/13/2016
*/
public interface Activity {
@NotNull
String getPresentableName();
}
@@ -1,31 +0,0 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
*
* 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.intellij.activity;
/**
* @author Vladislav.Soroka
* @since 4/29/2016
*/
public interface ActivityChunkStatusNotification {
/**
*
* @param aborted true if the build chunk has been cancelled.
* @param errors error count
* @param warnings warning count
*/
void finished(boolean aborted, int errors, int warnings);
}
@@ -45,16 +45,8 @@ public class ActivityContext {
return mySessionId;
}
public void setSessionId(@Nullable Object sessionId) {
mySessionId = sessionId;
}
@Nullable
public RunConfiguration getRunConfiguration() {
return myRunConfiguration;
}
public void setRunConfiguration(@Nullable RunConfiguration runConfiguration) {
myRunConfiguration = runConfiguration;
}
}
@@ -17,14 +17,28 @@ package com.intellij.activity;
/**
* @author Vladislav.Soroka
* @since 7/12/2016
* @since 8/5/2016
*/
public class ActivityStatusNotificationAdapter implements ActivityStatusNotification {
@Override
public void finished(boolean aborted, int errors, int warnings) {
public class ActivityExecutionResult {
private final boolean aborted;
private final int errors;
private final int warnings;
public ActivityExecutionResult(boolean aborted, int errors, int warnings) {
this.aborted = aborted;
this.errors = errors;
this.warnings = warnings;
}
@Override
public void chunkFinished(boolean aborted, int errors, int warnings, int inProgress) {
public boolean isAborted() {
return aborted;
}
public int getErrors() {
return errors;
}
public int getWarnings() {
return warnings;
}
}
@@ -45,22 +45,22 @@ public abstract class ActivityManager {
public abstract void run(@NotNull ActivityContext context, @NotNull Activity activity, @Nullable ActivityStatusNotification callback);
public abstract void buildProjectDirty(@Nullable ActivityStatusNotification callback);
public abstract void buildAllModules(@Nullable ActivityStatusNotification callback);
public void buildProjectDirty() {
buildProjectDirty(null);
public void buildAllModules() {
buildAllModules(null);
}
public abstract void rebuildProject(@Nullable ActivityStatusNotification callback);
public abstract void rebuildAllModules(@Nullable ActivityStatusNotification callback);
public void rebuildProject() {
rebuildProject(null);
public void rebuildAllModules() {
rebuildAllModules(null);
}
public abstract void buildDirty(@NotNull Module[] modules, @Nullable ActivityStatusNotification callback);
public abstract void build(@NotNull Module[] modules, @Nullable ActivityStatusNotification callback);
public void buildDirty(@NotNull Module... modules) {
buildDirty(modules, null);
public void build(@NotNull Module... modules) {
build(modules, null);
}
public abstract void rebuild(@NotNull Module[] modules, @Nullable ActivityStatusNotification callback);
@@ -87,7 +87,7 @@ public abstract class ActivityManager {
rebuild(artifacts, null);
}
public abstract Activity createProjectBuildActivity(boolean isIncrementalBuild, Project project);
public abstract Activity createAllModulesBuildActivity(boolean isIncrementalBuild, Project project);
public abstract Activity createModulesBuildActivity(boolean isIncrementalBuild, Module... modules);
@@ -37,12 +37,12 @@ public abstract class ActivityRunner {
public abstract void run(@NotNull Project project,
@NotNull ActivityContext context,
@Nullable ActivityChunkStatusNotification callback,
@Nullable ActivityStatusNotification callback,
@NotNull Collection<? extends Activity> activities);
public void run(@NotNull Project project,
@NotNull ActivityContext context,
@Nullable ActivityChunkStatusNotification callback,
@Nullable ActivityStatusNotification callback,
@NotNull Activity... activities) {
run(project, context, callback, Arrays.asList(activities));
}
@@ -15,25 +15,15 @@
*/
package com.intellij.activity;
import org.jetbrains.annotations.NotNull;
/**
* @author Vladislav.Soroka
* @since 4/29/2016
*/
public interface ActivityStatusNotification {
/**
* @param aborted true if the at least one activity chunk has been cancelled.
* @param errors error count
* @param warnings warning count
* @param executionResult provides aggregated information about activity execution
*/
void finished(boolean aborted, int errors, int warnings);
/**
*
* @param aborted true if the activity chunk has been cancelled.
* @param errors error count
* @param warnings warning count
* @param inProgress not finished activity chunks count
*/
void chunkFinished(boolean aborted, int errors, int warnings, int inProgress);
void finished(@NotNull ActivityExecutionResult executionResult);
}
@@ -138,9 +138,9 @@ public class CompileStepBeforeRun extends BeforeRunTaskProvider<CompileStepBefor
final Semaphore done = new Semaphore();
done.down();
final ActivityStatusNotification callback = new ActivityStatusNotificationAdapter() {
public void finished(boolean aborted, int errors, int warnings) {
if ((errors == 0 || ignoreErrors) && !aborted) {
final ActivityStatusNotification callback = new ActivityStatusNotification() {
public void finished(@NotNull ActivityExecutionResult executionResult) {
if ((executionResult.getErrors() == 0 || ignoreErrors) && !executionResult.isAborted()) {
result.set(Boolean.TRUE);
}
done.up();
@@ -153,7 +153,7 @@ public class CompileStepBeforeRun extends BeforeRunTaskProvider<CompileStepBefor
final ActivityManager activityManager = ActivityManager.getInstance(myProject);
if (forceMakeProject) {
// user explicitly requested whole-project make
activity = activityManager.createProjectBuildActivity(true, myProject);
activity = activityManager.createAllModulesBuildActivity(true, myProject);
}
else {
final Module[] modules = runConfiguration.getModules();
@@ -167,7 +167,7 @@ public class CompileStepBeforeRun extends BeforeRunTaskProvider<CompileStepBefor
activity = activityManager.createModulesBuildActivity(true, modules);
}
else {
activity = activityManager.createProjectBuildActivity(true, myProject);
activity = activityManager.createAllModulesBuildActivity(true, myProject);
}
}
@@ -62,7 +62,7 @@ public class GradleActivityRunner extends ActivityRunner {
@Override
public void run(@NotNull Project project,
@NotNull ActivityContext context,
@Nullable ActivityChunkStatusNotification callback,
@Nullable ActivityStatusNotification callback,
@NotNull Collection<? extends Activity> activities) {
String executionName = "Gradle build";
@@ -96,7 +96,7 @@ public class GradleActivityRunner extends ActivityRunner {
int successes = success ? successCounter.incrementAndGet() : successCounter.get();
int errors = success ? errorCounter.get() : errorCounter.incrementAndGet();
if (successes + errors == rootPaths.size()) {
callback.finished(false, errors, 0);
callback.finished(new ActivityExecutionResult(false, errors, 0));
}
}
};
@@ -179,8 +179,8 @@ public class GradleActivityRunner extends ActivityRunner {
List<String> tasks = ContainerUtil.mapNotNull(ExternalSystemApiUtil.findAll(moduleDataNode, ProjectKeys.TASK),
node -> node.getData().isInherited() ? null : node.getData().getName());
Collection<String> cleanTasks = cleanTasksMap.getModifiable(rootProjectPath);
Collection<String> buildTasks = buildTasksMap.getModifiable(rootProjectPath);
Collection<String> cleanRootTasks = cleanTasksMap.getModifiable(rootProjectPath);
Collection<String> buildRootTasks = buildTasksMap.getModifiable(rootProjectPath);
final String moduleType = ExternalSystemApiUtil.getExternalModuleType(module);
final String gradlePath;
@@ -194,32 +194,38 @@ public class GradleActivityRunner extends ActivityRunner {
String task = StringUtil.isEmpty(sourceSetName) || "main".equals(sourceSetName) ? "classes" : sourceSetName + "Classes";
if (tasks.contains(task)) {
if (!moduleBuildActivity.isIncrementalBuild()) {
cleanTasks.add(gradlePath + ":clean" + StringUtil.capitalize(task));
cleanRootTasks.add(gradlePath + ":clean" + StringUtil.capitalize(task));
}
buildTasks.add(gradlePath + ":" + task);
buildRootTasks.add(gradlePath + ":" + task);
}
else if ("main".equals(sourceSetName) || "test".equals(sourceSetName)) {
if (!moduleBuildActivity.isIncrementalBuild()) {
cleanTasks.add(gradlePath + ":clean");
cleanRootTasks.add(gradlePath + ":clean");
}
buildTasks.add(gradlePath + ":build");
buildRootTasks.add(gradlePath + ":build");
}
}
else {
gradlePath = projectId.charAt(0) == ':' ? projectId : "";
if (!moduleBuildActivity.isIncrementalBuild()) {
if (tasks.contains("classes")) {
cleanTasks.add((StringUtil.equals(rootProjectPath, externalProjectPath) ? ":cleanClasses" : gradlePath + ":cleanClasses"));
cleanRootTasks.add((StringUtil.equals(rootProjectPath, externalProjectPath) ? ":cleanClasses" : gradlePath + ":cleanClasses"));
}
else if(tasks.contains("clean")){
cleanTasks.add((StringUtil.equals(rootProjectPath, externalProjectPath) ? "clean" : gradlePath + ":clean"));
cleanRootTasks.add((StringUtil.equals(rootProjectPath, externalProjectPath) ? "clean" : gradlePath + ":clean"));
}
else {
cleanTasksMap.getModifiable(externalProjectPath).add("clean");
}
}
if (tasks.contains("classes")) {
buildTasks.add((StringUtil.equals(rootProjectPath, externalProjectPath) ? ":classes" : gradlePath + ":classes"));
buildRootTasks.add((StringUtil.equals(rootProjectPath, externalProjectPath) ? ":classes" : gradlePath + ":classes"));
}
else if (tasks.contains("build")) {
buildRootTasks.add((StringUtil.equals(rootProjectPath, externalProjectPath) ? "build" : gradlePath + ":build"));
}
else {
buildTasks.add((StringUtil.equals(rootProjectPath, externalProjectPath) ? "build" : gradlePath + ":build"));
buildTasksMap.getModifiable(externalProjectPath).add("build");
}
}
}