Bug 573355 - Avoid double refresh after IDE crash

This change requires resources bundle patch
https://git.eclipse.org/r/c/platform/eclipse.platform.resources/+/180203

Change-Id: Id48c7e785676fbbbdf03e271c1e3cb37722c1e06
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.ui/+/180204
Tested-by: Platform Bot <platform-bot@eclipse.org>
diff --git a/bundles/org.eclipse.ui.ide.application/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.ide.application/META-INF/MANIFEST.MF
index 29033fe..5f20224 100644
--- a/bundles/org.eclipse.ui.ide.application/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.ui.ide.application/META-INF/MANIFEST.MF
@@ -8,7 +8,7 @@
 Bundle-ClassPath: .
 Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.16.0,4.0.0)",
  org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.15.0,4.0.0)",
  org.eclipse.ui;bundle-version="[3.114.0,4.0.0)",
  org.eclipse.ui.navigator.resources;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.core.net;bundle-version="[1.0.0,2.0.0)",
diff --git a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEWorkbenchAdvisor.java b/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEWorkbenchAdvisor.java
index ef88df5..e5e5d05 100644
--- a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEWorkbenchAdvisor.java
+++ b/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEWorkbenchAdvisor.java
@@ -438,17 +438,29 @@
 			}
 		}
 
-		final IContainer root = ResourcesPlugin.getWorkspace().getRoot();
-		Job job = new WorkspaceJob(IDEWorkbenchMessages.Workspace_refreshing) {
-			@Override
-			public IStatus runInWorkspace(IProgressMonitor monitor)
-					throws CoreException {
-				root.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-				return Status.OK_STATUS;
+		IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		final IContainer root = workspace.getRoot();
+
+		// We should try to use RefreshManager which avoids multiple refresh requests
+		// for same objects
+		if (workspace instanceof Workspace) {
+			Workspace wsp = (Workspace) workspace;
+			if (!wsp.isCrashed()) {
+				// Only refresh if no crash happened before: the workspace itself
+				// triggers refresh in that case, see Workspace.open()
+				wsp.getRefreshManager().refresh(root);
 			}
-		};
-		job.setRule(root);
-		job.schedule();
+		} else {
+			Job job = new WorkspaceJob(IDEWorkbenchMessages.Workspace_refreshing) {
+				@Override
+				public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
+					root.refreshLocal(IResource.DEPTH_INFINITE, monitor);
+					return Status.OK_STATUS;
+				}
+			};
+			job.setRule(root);
+			job.schedule();
+		}
 	}
 
 	protected static class CancelableProgressMonitorWrapper extends