diff options
author | Igor Fedorenko | 2011-07-06 07:13:03 +0000 |
---|---|---|
committer | Igor Fedorenko | 2011-07-06 07:13:03 +0000 |
commit | 883bfbc812ffce68a7587c00627ec417e43815a8 (patch) | |
tree | 7ceb1ad7b95fd8f500f7286212d3c9f77e6ef4c5 | |
parent | 4c44e30b2e2955b69ed5b0f745774d14b046d8b9 (diff) | |
download | m2e-core-883bfbc812ffce68a7587c00627ec417e43815a8.tar.gz m2e-core-883bfbc812ffce68a7587c00627ec417e43815a8.tar.xz m2e-core-883bfbc812ffce68a7587c00627ec417e43815a8.zip |
350956 Workspace resolution doesn't find newly opened projects
This is a regression introduced by performance optimizations done
for 342903. MavenBuilder was expected to synchronously update
project registry as part of a build when workspace was autobuilding,
but workspace does not build project after open events without other
changes.
Solution is to force background registry refresh for open project
events. This degrades performance and/or concurrency in the case
when workspace does run build after project open event, but project
close/open are relatively rare and overall performance import is
not expected to be noticeable.
Signed-off-by: Igor Fedorenko <igor@ifedorenko.com>
-rw-r--r-- | org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistryRefreshJob.java | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistryRefreshJob.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistryRefreshJob.java index d8c6a6ec..fff94db3 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistryRefreshJob.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistryRefreshJob.java @@ -128,17 +128,24 @@ public class ProjectRegistryRefreshJob extends Job implements IResourceChangeLis if(IResourceChangeEvent.PRE_CLOSE == type || IResourceChangeEvent.PRE_DELETE == type) { queue(new MavenUpdateRequest((IProject) event.getResource(), offline, forceDependencyUpdate)); } else { - IWorkspace workspace = ResourcesPlugin.getWorkspace(); - if(workspace != null && workspace.isAutoBuilding()) { - return; - } // if (IResourceChangeEvent.POST_CHANGE == type) + IWorkspace workspace = ResourcesPlugin.getWorkspace(); + boolean autobuilding = workspace != null && workspace.isAutoBuilding(); + + // MavenBuilder will synchronously read/refresh workspace Maven project state. + // To avoid double-work and/or locking between MavenBuilder and background registry refresh job, we skip project + // refresh when workspace is autobuilding. + // We still refresh opened projects because workspace does not run build after project open event. + IResourceDelta delta = event.getDelta(); // workspace delta IResourceDelta[] projectDeltas = delta.getAffectedChildren(); Set<IProject> refreshProjects = new LinkedHashSet<IProject>(); for(int i = 0; i < projectDeltas.length; i++ ) { - if(projectChanged(projectDeltas[i])) { - IProject project = (IProject) projectDeltas[i].getResource(); + IResourceDelta projectDelta = projectDeltas[i]; + if((projectDelta.getFlags() & IResourceDelta.OPEN) != 0) { + queue(new MavenUpdateRequest((IProject) projectDelta.getResource(), offline, forceDependencyUpdate)); + } else if(!autobuilding && projectChanged(projectDelta)) { + IProject project = (IProject) projectDelta.getResource(); IMavenProjectFacade facade = manager.getProject(project); if(facade == null || facade.isStale()) { // facade is up-to-date for resource change events fired right after project import |