From a6ee64254c32cf11baaa2ac486067cece3b52fea Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Mon, 15 Jul 2019 09:56:43 +0200 Subject: [PATCH] Update resoure cache in project metadata Former-commit-id: 000402cfbf00ebe7dd01846c45981c316f25bbb5 --- .../dbeaver/model/navigator/DBNResource.java | 6 ++++- .../dbeaver/registry/BaseWorkspaceImpl.java | 24 ++++++++++++++++--- .../dbeaver/registry/ProjectMetadata.java | 15 ++++++++++++ 3 files changed, 41 insertions(+), 4 deletions(-) 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 75d884a21b..41c77d1eae 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 b6d5910237..060ea46175 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 50a38e48d7..8c2e25eac5 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(); -- GitLab