Skip to content

Commit 7424eeb

Browse files
committed
Refactor: Improve refresh action performance with parallel processing
Replaced WorkspaceModifyOperation with IRunnableWithProgress and direct Job usage in RefreshAction and ResourceMgmtActionProvider to enable parallel refreshing of resources and improve performance.
1 parent e15e9bf commit 7424eeb

File tree

2 files changed

+30
-38
lines changed

2 files changed

+30
-38
lines changed

bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/RefreshAction.java

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.lang.reflect.InvocationTargetException;
1919
import java.net.URI;
2020
import java.util.ArrayList;
21+
import java.util.Collections;
2122
import java.util.Iterator;
2223
import java.util.List;
2324

@@ -36,6 +37,7 @@
3637
import org.eclipse.core.runtime.Status;
3738
import org.eclipse.core.runtime.SubMonitor;
3839
import org.eclipse.core.runtime.jobs.ISchedulingRule;
40+
import org.eclipse.core.runtime.jobs.Job;
3941
import org.eclipse.core.runtime.jobs.MultiRule;
4042
import org.eclipse.jface.dialogs.IDialogConstants;
4143
import org.eclipse.jface.dialogs.MessageDialog;
@@ -217,36 +219,33 @@ final public void refreshAll() {
217219

218220
@Override
219221
final protected IRunnableWithProgress createOperation(final IStatus[] errorStatus) {
220-
ISchedulingRule rule = null;
221-
IResourceRuleFactory factory = ResourcesPlugin.getWorkspace().getRuleFactory();
222-
223222
List<? extends IResource> actionResources = new ArrayList<>(getActionResources());
224223
if (shouldPerformResourcePruning()) {
225224
actionResources = pruneResources(actionResources);
226225
}
227226
final List<? extends IResource> resources = actionResources;
228227

229-
Iterator<? extends IResource> res = resources.iterator();
230-
while (res.hasNext()) {
231-
rule = MultiRule.combine(rule, factory.refreshRule(res.next()));
232-
}
233-
return new WorkspaceModifyOperation(rule) {
228+
return new IRunnableWithProgress() {
234229
@Override
235-
public void execute(IProgressMonitor mon) {
236-
SubMonitor subMonitor = SubMonitor.convert(mon, resources.size());
237-
MultiStatus errors = null;
230+
public void run(IProgressMonitor mon) {
231+
SubMonitor subMonitor = SubMonitor.convert(mon);
238232
subMonitor.setTaskName(getOperationMessage());
239-
Iterator<? extends IResource> resourcesEnum = resources.iterator();
240-
while (resourcesEnum.hasNext()) {
233+
List<IStatus> errors = Collections.synchronizedList(new ArrayList<>());
234+
resources.parallelStream().forEach(resource -> {
241235
try {
242-
IResource resource = resourcesEnum.next();
243-
refreshResource(resource, subMonitor.split(1));
236+
refreshResource(resource, null);
244237
} catch (CoreException e) {
245-
errors = recordError(errors, e);
238+
errors.add(e.getStatus());
246239
}
247-
}
248-
if (errors != null) {
249-
errorStatus[0] = errors;
240+
});
241+
242+
if (!errors.isEmpty()) {
243+
MultiStatus multiStatus = new MultiStatus(IDEWorkbenchPlugin.IDE_WORKBENCH, IStatus.ERROR,
244+
getProblemsMessage(), null);
245+
for (IStatus s : errors) {
246+
multiStatus.merge(s);
247+
}
248+
errorStatus[0] = multiStatus;
250249
}
251250
}
252251
};
@@ -287,29 +286,24 @@ protected void refreshResource(IResource resource, IProgressMonitor monitor) thr
287286
public void run() {
288287
final IStatus[] errorStatus = new IStatus[1];
289288
errorStatus[0] = Status.OK_STATUS;
290-
final WorkspaceModifyOperation op = (WorkspaceModifyOperation) createOperation(errorStatus);
291-
WorkspaceJob job = new WorkspaceJob("refresh") { //$NON-NLS-1$
289+
final IRunnableWithProgress op = createOperation(errorStatus);
290+
Job job = new Job("refresh") { //$NON-NLS-1$
292291

293292
@Override
294-
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
293+
public IStatus run(IProgressMonitor monitor) {
295294
try {
296295
op.run(monitor);
297296
} catch (InvocationTargetException e) {
298-
String msg = NLS.bind(
299-
IDEWorkbenchMessages.WorkspaceAction_logTitle, getClass()
300-
.getName(), e.getTargetException());
301-
throw new CoreException(StatusUtil.newStatus(IStatus.ERROR, msg, e.getTargetException()));
297+
String msg = NLS.bind(IDEWorkbenchMessages.WorkspaceAction_logTitle, getClass().getName(),
298+
e.getTargetException());
299+
return StatusUtil.newStatus(IStatus.ERROR, msg, e.getTargetException());
302300
} catch (InterruptedException e) {
303301
return Status.CANCEL_STATUS;
304302
}
305303
return errorStatus[0];
306304
}
307305

308306
};
309-
ISchedulingRule rule = op.getRule();
310-
if (rule != null) {
311-
job.setRule(rule);
312-
}
313307
job.setUser(true);
314308
job.schedule();
315309
}

bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/ResourceMgmtActionProvider.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@
3131
import org.eclipse.core.runtime.IStatus;
3232
import org.eclipse.core.runtime.Status;
3333
import org.eclipse.core.runtime.jobs.ISchedulingRule;
34+
import org.eclipse.core.runtime.jobs.Job;
3435
import org.eclipse.jface.action.IMenuManager;
3536
import org.eclipse.jface.action.Separator;
37+
import org.eclipse.jface.operation.IRunnableWithProgress;
3638
import org.eclipse.jface.resource.ImageDescriptor;
3739
import org.eclipse.jface.viewers.IStructuredSelection;
3840
import org.eclipse.jface.viewers.StructuredViewer;
@@ -218,11 +220,11 @@ protected void makeActions() {
218220
public void run() {
219221
final IStatus[] errorStatus = new IStatus[1];
220222
errorStatus[0] = Status.OK_STATUS;
221-
final WorkspaceModifyOperation op = (WorkspaceModifyOperation) createOperation(errorStatus);
222-
WorkspaceJob job = new WorkspaceJob("refresh") { //$NON-NLS-1$
223+
final IRunnableWithProgress op = createOperation(errorStatus);
224+
Job job = new Job("refresh") { //$NON-NLS-1$
223225

224226
@Override
225-
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
227+
public IStatus run(IProgressMonitor monitor) {
226228
try {
227229
op.run(monitor);
228230
if (shell != null && !shell.isDisposed()) {
@@ -236,18 +238,14 @@ public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
236238
}
237239
} catch (InvocationTargetException e) {
238240
String msg = NLS.bind(WorkbenchNavigatorMessages.ResourceMgmtActionProvider_logTitle, getClass().getName(), e.getTargetException());
239-
throw new CoreException(new Status(IStatus.ERROR, NavigatorPlugin.PLUGIN_ID, IStatus.ERROR, msg, e.getTargetException()));
241+
return new Status(IStatus.ERROR, NavigatorPlugin.PLUGIN_ID, IStatus.ERROR, msg, e.getTargetException());
240242
} catch (InterruptedException e) {
241243
return Status.CANCEL_STATUS;
242244
}
243245
return errorStatus[0];
244246
}
245247

246248
};
247-
ISchedulingRule rule = op.getRule();
248-
if (rule != null) {
249-
job.setRule(rule);
250-
}
251249
job.setUser(true);
252250
job.schedule();
253251
}

0 commit comments

Comments
 (0)