diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNResource.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNResource.java index 75d884a21be2e105c6c5dc17e2bdeec9b03cfbc0..41c77d1eae5d4da481edd06826455b57215e8720 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNResource.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNResource.java @@ -390,7 +390,11 @@ public class DBNResource extends DBNNode// implements IContributorResourceAdapte if (newHandler != handler) { handler = newHandler; } - handler.updateNavigatorNode(this, resource); + if (handler != null) { + handler.updateNavigatorNode(this, resource); + } else { + log.error("Can't find handler for resource " + resource.getFullPath()); + } getModel().fireNodeEvent(new DBNEvent(source, DBNEvent.Action.UPDATE, this)); } diff --git a/plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/BaseWorkspaceImpl.java b/plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/BaseWorkspaceImpl.java index b6d5910237ef565e1cf6b3abbf89822867721731..060ea46175fcead1c41bc591ff13ab6398d397cb 100644 --- a/plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/BaseWorkspaceImpl.java +++ b/plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/BaseWorkspaceImpl.java @@ -544,15 +544,33 @@ public abstract class BaseWorkspaceImpl implements DBPWorkspace, DBPExternalFile activeProject = null; fireActiveProjectChange(projectMetadata, null); } + } else { + // Some changes within project - reflect them in metadata cache + ProjectMetadata projectMetadata = projects.get(project); + if (projectMetadata != null) { + handleResourceChange(projectMetadata, childDelta); + } } } - } else { - // Some resource has been changed. - // Update project metadata } } } } } + private void handleResourceChange(ProjectMetadata projectMetadata, IResourceDelta delta) + { + if (delta.getKind() == IResourceDelta.REMOVED) { + projectMetadata.removeResourceFromCache(delta.getProjectRelativePath()); + } else if (delta.getKind() == IResourceDelta.MOVED_TO) { + IPath oldPath = delta.getMovedFromPath().makeRelativeTo(projectMetadata.getEclipseProject().getFullPath()); + IPath newPath = delta.getMovedFromPath().makeRelativeTo(projectMetadata.getEclipseProject().getFullPath()); + projectMetadata.updateResourceCache(oldPath, newPath); + } else { + for (IResourceDelta childDelta : delta.getAffectedChildren(IResourceDelta.ALL_WITH_PHANTOMS, IContainer.INCLUDE_HIDDEN)) { + handleResourceChange(projectMetadata, childDelta); + } + } + } + } diff --git a/plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/ProjectMetadata.java b/plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/ProjectMetadata.java index 50a38e48d75a9d946fe923cfa3c8457755c904bd..8c2e25eac50f9c4c7f898e328d2300985beac1f9 100644 --- a/plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/ProjectMetadata.java +++ b/plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/ProjectMetadata.java @@ -391,6 +391,21 @@ public class ProjectMetadata implements DBPProject { } } + void removeResourceFromCache(IPath path) { + synchronized (metadataSync) { + resourceProperties.remove(path.toString()); + } + } + + void updateResourceCache(IPath oldPath, IPath newPath) { + synchronized (metadataSync) { + Map props = resourceProperties.remove(oldPath.toString()); + if (props != null) { + resourceProperties.put(newPath.toString(), props); + } + } + } + @Override public String toString() { return getName();