From 8f19e57f772ec9d8bd748652127db4cd19b2ea01 Mon Sep 17 00:00:00 2001 From: Igor Fedorenko Date: Sat, 27 Apr 2013 22:48:13 -0400 Subject: perf: consolidate registry.refresh invocations ProjectConfigurationManager refreshed facade for each project being updated separately. This resulted in unnecessary reloading of MavenProject instances for common case of multimodule project. The fix is to invoke registry.refresh for collection of all projects being updated. Signed-off-by: Igor Fedorenko --- .../project/ProjectConfigurationManager.java | 45 ++++++++++++++-------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/ProjectConfigurationManager.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/ProjectConfigurationManager.java index 2ee5e1ff..3d44b409 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/ProjectConfigurationManager.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/ProjectConfigurationManager.java @@ -340,31 +340,46 @@ public class ProjectConfigurationManager implements IProjectConfigurationManager //project names to the errors encountered when updating them Map updateStatus = new HashMap(); - // refresh projects and update all dependencies - // this will ensure that project registry is up-to-date on GAV of all projects being updated - // TODO this sends multiple update events, rework using low-level registry update methods - for(IFile pom : pomFiles) { - if(monitor.isCanceled()) { - throw new OperationCanceledException(); - } - - IProject project = pom.getProject(); + List pomsToRefresh = new ArrayList(); - monitor.subTask(project.getName()); + // refresh from local filesystem + if(refreshFromLocal) { + for(IFile pom : pomFiles) { + if(monitor.isCanceled()) { + throw new OperationCanceledException(); + } - try { - if(refreshFromLocal) { + IProject project = pom.getProject(); + try { project.refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor, 1, SubProgressMonitor.SUPPRESS_SUBTASK_LABEL)); + pomsToRefresh.add(pom); + } catch(CoreException ex) { + updateStatus.put(project.getName(), ex.getStatus()); } - projectManager.refresh(Collections.singleton(pom), new SubProgressMonitor(monitor, 1, - SubProgressMonitor.SUPPRESS_SUBTASK_LABEL)); + } + } else { + pomsToRefresh.addAll(pomFiles); + } + + // refresh projects and update all dependencies + // this will ensure that project registry is up-to-date on GAV of all projects being updated + // TODO this sends multiple update events, rework using low-level registry update methods + try { + projectManager.refresh(pomsToRefresh, new SubProgressMonitor(monitor, pomFiles.size())); + + for(IFile pom : pomsToRefresh) { + IProject project = pom.getProject(); IMavenProjectFacade facade = projectManager.getProject(project); if(facade != null) { // facade is null if pom.xml cannot be read projects.put(pom, facade); } updateStatus.put(project.getName(), Status.OK_STATUS); - } catch(CoreException ex) { + } + } catch(CoreException ex) { + // TODO per-project status + for(IFile pom : pomsToRefresh) { + IProject project = pom.getProject(); updateStatus.put(project.getName(), ex.getStatus()); } } -- cgit v1.2.3