[227300] Validation needs better progress reporting
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValBuilderJob.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValBuilderJob.java
index 15c692e..80d875c 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValBuilderJob.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValBuilderJob.java
@@ -14,6 +14,8 @@
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.IResourceProxy;
+import org.eclipse.core.resources.IResourceProxyVisitor;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.resources.WorkspaceJob;
@@ -57,7 +59,9 @@
private int _buildKind;
/** The monitor to use while running the build. */
- private SubMonitor _monitor;
+ private IProgressMonitor _monitor;
+
+ private SubMonitor _subMonitor;
/** The types of changes we are interested in. */
private final static int InterestedFlags = IResourceDelta.CONTENT | IResourceDelta.ENCODING |
@@ -98,7 +102,7 @@
public IStatus runInWorkspace(IProgressMonitor monitor) {
Tracing.log("ValBuilderJob-01: Starting"); //$NON-NLS-1$
- _monitor = SubMonitor.convert(monitor);
+ _monitor = monitor;
try {
if (_delta == null)fullBuild();
@@ -120,10 +124,16 @@
}
private void deltaBuild() throws CoreException {
+ ResourceCounter counter = new ResourceCounter();
+ _delta.accept(counter);
+ _subMonitor = SubMonitor.convert(_monitor, counter.getCount());
_delta.accept(this);
}
private void fullBuild() throws CoreException {
+ ResourceCounter counter = new ResourceCounter();
+ _project.accept(counter, 0);
+ _subMonitor = SubMonitor.convert(_monitor, counter.getCount());
_project.accept(this);
}
@@ -138,9 +148,8 @@
if ((delta.getFlags() & InterestedFlags) == 0)return true;
if ((kind & (IResourceDelta.ADDED | IResourceDelta.CHANGED)) != 0){
- _monitor.setWorkRemaining(10000);
ValManager.getDefault().validate(_project, resource, delta.getKind(), ValType.Build, _buildKind,
- _operation, _monitor.newChild(1));
+ _operation, _subMonitor.newChild(1));
}
IDependencyIndex index = ValidationFramework.getDefault().getDependencyIndex();
@@ -165,9 +174,8 @@
MarkerManager.getDefault().deleteMarkers(resource, _operation.getStarted(), IResource.DEPTH_INFINITE);
return false;
}
- _monitor.setWorkRemaining(10000);
ValManager.getDefault().validate(_project, resource, IResourceDelta.NO_CHANGE, ValType.Build,
- _buildKind, _operation, _monitor.newChild(1));
+ _buildKind, _operation, _subMonitor.newChild(1));
}
catch (ResourceUnavailableError e){
if (Tracing.isLogging())Tracing.log("ValBuilderJob-02: " + e.toString()); //$NON-NLS-1$
@@ -175,5 +183,25 @@
}
return true;
}
+
+ static class ResourceCounter implements IResourceProxyVisitor, IResourceDeltaVisitor {
+
+ private int _count;
+
+ public int getCount() {
+ return _count;
+ }
+
+ public boolean visit(IResourceProxy proxy) throws CoreException {
+ _count++;
+ return true;
+ }
+
+ public boolean visit(IResourceDelta delta) throws CoreException {
+ _count++;
+ return true;
+ }
+
+ }
}
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValManager.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValManager.java
index 9f74296..fcc4857 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValManager.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValManager.java
@@ -512,13 +512,13 @@
if (vt == ValType.Build && v1 != null)return;
SubMonitor subMonitor = SubMonitor.convert(monitor);
- subMonitor.setWorkRemaining(10000);
String task = NLS.bind(ValMessages.LogValStart, validator.getName(), resource.getName());
subMonitor.beginTask(task, 1);
validate(validator, operation, resource, kind, subMonitor.newChild(1));
}
};
- accept(visitor, project, resource, valType, operation, monitor);
+ SubMonitor sm = SubMonitor.convert(monitor, getValidators(project).length);
+ accept(visitor, project, resource, valType, operation, sm);
}