Skip to content

Commit 02f095d

Browse files
committed
Use WorkspaceModifyOperation with a rule which blocks per project in RefreshAction
1 parent ecab24c commit 02f095d

File tree

2 files changed

+29
-17
lines changed

2 files changed

+29
-17
lines changed

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

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,12 @@
1818
import java.lang.reflect.InvocationTargetException;
1919
import java.net.URI;
2020
import java.util.ArrayList;
21-
import java.util.Collections;
22-
import java.util.Iterator;
2321
import java.util.List;
2422

2523
import org.eclipse.core.filesystem.IFileInfo;
2624
import org.eclipse.core.filesystem.IFileStore;
2725
import org.eclipse.core.resources.IProject;
2826
import org.eclipse.core.resources.IResource;
29-
import org.eclipse.core.resources.IResourceRuleFactory;
3027
import org.eclipse.core.resources.IWorkspaceRoot;
3128
import org.eclipse.core.resources.ResourcesPlugin;
3229
import org.eclipse.core.resources.WorkspaceJob;
@@ -37,7 +34,6 @@
3734
import org.eclipse.core.runtime.Status;
3835
import org.eclipse.core.runtime.SubMonitor;
3936
import org.eclipse.core.runtime.jobs.ISchedulingRule;
40-
import org.eclipse.core.runtime.jobs.Job;
4137
import org.eclipse.core.runtime.jobs.MultiRule;
4238
import org.eclipse.jface.dialogs.IDialogConstants;
4339
import org.eclipse.jface.dialogs.MessageDialog;
@@ -51,6 +47,7 @@
5147
import org.eclipse.swt.widgets.Shell;
5248
import org.eclipse.ui.PlatformUI;
5349
import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
50+
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
5451
import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
5552
import org.eclipse.ui.internal.ide.StatusUtil;
5653
import org.eclipse.ui.internal.ide.dialogs.IDEResourceInfoUtils;
@@ -225,19 +222,30 @@ final protected IRunnableWithProgress createOperation(final IStatus[] errorStatu
225222
}
226223
final List<? extends IResource> resources = actionResources;
227224

228-
return new IRunnableWithProgress() {
225+
ISchedulingRule rule = null;
226+
for (IResource resource : resources) {
227+
ISchedulingRule newRule = null;
228+
if (resource.getType() == IResource.ROOT) {
229+
newRule = resource;
230+
} else {
231+
newRule = resource.getProject();
232+
}
233+
rule = MultiRule.combine(rule, newRule);
234+
}
235+
236+
return new WorkspaceModifyOperation(rule) {
229237
@Override
230-
public void run(IProgressMonitor mon) {
231-
SubMonitor subMonitor = SubMonitor.convert(mon);
238+
public void execute(IProgressMonitor mon) {
239+
SubMonitor subMonitor = SubMonitor.convert(mon, resources.size());
232240
subMonitor.setTaskName(getOperationMessage());
233-
List<IStatus> errors = Collections.synchronizedList(new ArrayList<>());
234-
resources.parallelStream().forEach(resource -> {
241+
List<IStatus> errors = new ArrayList<>();
242+
for (IResource resource : resources) {
235243
try {
236-
refreshResource(resource, null);
244+
refreshResource(resource, subMonitor.split(1));
237245
} catch (CoreException e) {
238246
errors.add(e.getStatus());
239247
}
240-
});
248+
}
241249

242250
if (!errors.isEmpty()) {
243251
MultiStatus multiStatus = new MultiStatus(IDEWorkbenchPlugin.IDE_WORKBENCH, IStatus.ERROR,
@@ -287,10 +295,10 @@ public void run() {
287295
final IStatus[] errorStatus = new IStatus[1];
288296
errorStatus[0] = Status.OK_STATUS;
289297
final IRunnableWithProgress op = createOperation(errorStatus);
290-
Job job = new Job("refresh") { //$NON-NLS-1$
298+
WorkspaceJob job = new WorkspaceJob("refresh") { //$NON-NLS-1$
291299

292300
@Override
293-
public IStatus run(IProgressMonitor monitor) {
301+
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
294302
try {
295303
op.run(monitor);
296304
} catch (InvocationTargetException e) {
@@ -304,6 +312,9 @@ public IStatus run(IProgressMonitor monitor) {
304312
}
305313

306314
};
315+
if (op instanceof WorkspaceModifyOperation) {
316+
job.setRule(((WorkspaceModifyOperation) op).getRule());
317+
}
307318
job.setUser(true);
308319
job.schedule();
309320
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030
import org.eclipse.core.runtime.IProgressMonitor;
3131
import org.eclipse.core.runtime.IStatus;
3232
import org.eclipse.core.runtime.Status;
33-
import org.eclipse.core.runtime.jobs.ISchedulingRule;
34-
import org.eclipse.core.runtime.jobs.Job;
3533
import org.eclipse.jface.action.IMenuManager;
3634
import org.eclipse.jface.action.Separator;
3735
import org.eclipse.jface.operation.IRunnableWithProgress;
@@ -221,10 +219,10 @@ public void run() {
221219
final IStatus[] errorStatus = new IStatus[1];
222220
errorStatus[0] = Status.OK_STATUS;
223221
final IRunnableWithProgress op = createOperation(errorStatus);
224-
Job job = new Job("refresh") { //$NON-NLS-1$
222+
WorkspaceJob job = new WorkspaceJob("refresh") { //$NON-NLS-1$
225223

226224
@Override
227-
public IStatus run(IProgressMonitor monitor) {
225+
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
228226
try {
229227
op.run(monitor);
230228
if (shell != null && !shell.isDisposed()) {
@@ -246,6 +244,9 @@ public IStatus run(IProgressMonitor monitor) {
246244
}
247245

248246
};
247+
if (op instanceof WorkspaceModifyOperation) {
248+
job.setRule(((WorkspaceModifyOperation) op).getRule());
249+
}
249250
job.setUser(true);
250251
job.schedule();
251252
}

0 commit comments

Comments
 (0)