Author: scabanovich
Date: 2012-02-03 21:16:52 -0500 (Fri, 03 Feb 2012)
New Revision: 38428
Modified:
trunk/common/plugins/org.jboss.tools.common.model/src/org/jboss/tools/common/model/markers/XMarkerManager.java
Log:
JBIDE-10794
https://issues.jboss.org/browse/JBIDE-10794
Improved the logic of mapping markers to XModel objects.
Modified:
trunk/common/plugins/org.jboss.tools.common.model/src/org/jboss/tools/common/model/markers/XMarkerManager.java
===================================================================
---
trunk/common/plugins/org.jboss.tools.common.model/src/org/jboss/tools/common/model/markers/XMarkerManager.java 2012-02-04
02:04:15 UTC (rev 38427)
+++
trunk/common/plugins/org.jboss.tools.common.model/src/org/jboss/tools/common/model/markers/XMarkerManager.java 2012-02-04
02:16:52 UTC (rev 38428)
@@ -14,10 +14,12 @@
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
import org.jboss.tools.common.model.XJob;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.XJob.XRunnable;
+import org.jboss.tools.common.model.filesystems.FileSystemsHelper;
import org.jboss.tools.common.model.impl.XModelObjectImpl;
import org.jboss.tools.common.model.plugin.ModelPlugin;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
@@ -33,65 +35,166 @@
return instance;
}
- private Map<IProject, Set<XModelObject>> errorObjects = new
HashMap<IProject, Set<XModelObject>>();
- private Map<IProject, Set<XModelObject>> warningObjects = new
HashMap<IProject, Set<XModelObject>>();
+ private Map<IFile, Set<XModelObject>> errorObjects = new HashMap<IFile,
Set<XModelObject>>();
+ private Map<IFile, Set<XModelObject>> warningObjects = new HashMap<IFile,
Set<XModelObject>>();
+ private Set<IFile> uptodate = new HashSet<IFile>();
private XMarkerManager() {
- reload(null);
ModelPlugin.getWorkspace().addResourceChangeListener(this);
}
public void resourceChanged(IResourceChangeEvent event) {
- IProject project = null;
- Object o = event.getSource();
if(event.getType() == IResourceChangeEvent.PRE_DELETE && event.getResource()
instanceof IProject) {
- errorObjects.remove((IProject)event.getResource());
- warningObjects.remove((IProject)event.getResource());
+ IProject p = (IProject)event.getResource();
+ clear(p.getFullPath());
return;
}
- if(o instanceof IWorkspace) {
- IResourceDelta d = event.getDelta();
- if(d != null) {
- IResourceDelta[] cs = d.getAffectedChildren();
- for (int i = 0; i < cs.length && project == null; i++) {
- project = cs[i].getResource().getProject();
+ try {
+ event.getDelta().accept(visitor);
+ } catch (CoreException e) {
+ ModelPlugin.getDefault().logError(e);
+ }
+ }
+
+ private synchronized void clear(IFile f) {
+ uptodate.remove(f);
+ errorObjects.remove(f);
+ warningObjects.remove(f);
+ }
+
+ private synchronized void clear(IPath f) {
+ Iterator<IFile> it = uptodate.iterator();
+ while(it.hasNext()) {
+ if(f.isPrefixOf(it.next().getFullPath())) {
+ it.remove();
+ }
+ }
+ it = errorObjects.keySet().iterator();
+ while(it.hasNext()) {
+ if(f.isPrefixOf(it.next().getFullPath())) {
+ it.remove();
+ }
+ }
+ it = warningObjects.keySet().iterator();
+ while(it.hasNext()) {
+ if(f.isPrefixOf(it.next().getFullPath())) {
+ it.remove();
+ }
+ }
+ }
+
+
+ ResourceDeltaVisitor visitor = new ResourceDeltaVisitor();
+
+ class ResourceDeltaVisitor implements IResourceDeltaVisitor {
+ @Override
+ public boolean visit(IResourceDelta delta) throws CoreException {
+ IResource r = delta.getResource();
+ if(delta.getKind() == IResourceDelta.REMOVED) {
+ if(r instanceof IFile) {
+ clear((IFile)r);
+ } else {
+ clear(r.getFullPath());
}
+ return false;
+ } else if(delta.getKind() == IResourceDelta.ADDED) {
+ return false;
+ } else if(delta.getKind() == IResourceDelta.NO_CHANGE) {
+ return true;
+ } else {
+ if(r instanceof IFile) {
+ IFile f = (IFile)r;
+ if(uptodate.contains(f)) {
+ synchronized(this) {
+ uptodate.remove(f);
+ }
+ if(f.exists()) {
+ updateJob.add(f);
+ }
+ }
+ }
}
+ return true;
+ }
+ }
+
+
+ UpdateJob updateJob = new UpdateJob();
+
+ class UpdateJob implements XRunnable {
+ Set<IFile> fs = new HashSet<IFile>();
+ boolean running = false;
+
+ public String getId() {
+ return "XMarkerManager"; //$NON-NLS-1$
}
- final IProject p = project;
- if(ResourcesPlugin.getWorkspace().isTreeLocked()) {
- XJob.addRunnable(new XRunnable() {
- public String getId() {
- return "XMarkerManager"; //$NON-NLS-1$
+ public void run() {
+ synchronized (this) {
+ running = true;
+ }
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ return;
+ }
+ try {
+ IFile f = null;
+ while((f = next()) != null) {
+ reload(f);
}
- public void run() {
- reload(p);
+ } finally {
+ synchronized (this) {
+ running = false;
}
- });
- } else {
- reload(p);
+ }
}
+
+ synchronized IFile next() {
+ if(fs.isEmpty()) {
+ return null;
+ }
+ IFile f = fs.iterator().next();
+ fs.remove(f);
+ return f;
+ }
+
+ public synchronized void add(IFile f) {
+ if(fs.contains(f)) {
+ return;
+ }
+ fs.add(f);
+ if(!running) {
+ XJob.addRunnable(updateJob);
+ }
+ }
}
- public void reload(IProject project) {
+ public void reload(IFile file) {
+ synchronized (this) {
+ if(uptodate.contains(file)) {
+ return;
+ } else {
+ uptodate.add(file);
+ }
+ }
IMarker[] ms = new IMarker[0];
try {
- ms = (project == null || !project.isAccessible())
+ ms = (file == null || !file.isAccessible())
? ModelPlugin.getWorkspace().getRoot().findMarkers(IMarker.PROBLEM, true,
IResource.DEPTH_INFINITE)
- : project.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
+ : file.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
} catch (CoreException e) {
ModelPlugin.getPluginLog().logError(e);
}
- Set<XModelObject> os = errorObjects.get(project);
+ Set<XModelObject> os = errorObjects.get(file);
if(os == null) {
os = new HashSet<XModelObject>();
- errorObjects.put(project, os);
+ errorObjects.put(file, os);
}
reload(ms, os, IMarker.SEVERITY_ERROR);
- os = warningObjects.get(project);
+ os = warningObjects.get(file);
if(os == null) {
os = new HashSet<XModelObject>();
- warningObjects.put(project, os);
+ warningObjects.put(file, os);
}
reload(ms, os, IMarker.SEVERITY_WARNING);
}
@@ -144,24 +247,38 @@
}
}
}
- }
+ }
+
+ void update(XModelObject object) {
+ XModelObject fo = FileSystemsHelper.getFile(object);
+ if(fo != null) {
+ IFile f = (IFile)fo.getAdapter(IFile.class);
+ if(f != null && f.exists()) {
+ reload(f);
+ }
+ }
+ }
public int getErrorState(XModelObject object) {
if(object == null) return 0;
+ update(object);
if(object.getErrorState() == IMarker.SEVERITY_ERROR || object.getErrorChildCount() >
0) return IMarker.SEVERITY_ERROR;
if(object.getErrorState() == IMarker.SEVERITY_WARNING || object.getWarningChildCount()
> 0) return IMarker.SEVERITY_WARNING;
return 0;
}
public boolean hasErrors(XModelObject object) {
+ update(object);
return object != null && (object.getErrorState() == IMarker.SEVERITY_ERROR ||
object.getErrorChildCount() > 0);
}
public boolean hasWarnings(XModelObject object) {
+ update(object);
return object != null && (object.getErrorState() == IMarker.SEVERITY_WARNING ||
object.getWarningChildCount() > 0);
}
public boolean hasErrors(XModelObject object, String attribute) {
+ update(object);
if(attribute == null) return hasErrors(object);
if(object.getErrorState() == 0) return false;
return object.getAttributeErrorState(attribute);