diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/app/DBPDataSourceRegistry.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/app/DBPDataSourceRegistry.java index a99c052f6bb036e74b5b2576fcc991f2a021914e..72ec4f6f591d3856944d46051127ccc90a442ed1 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/app/DBPDataSourceRegistry.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/app/DBPDataSourceRegistry.java @@ -80,6 +80,8 @@ public interface DBPDataSourceRegistry extends DBPObject { void removeFolder(DBPDataSourceFolder folder, boolean dropContents); + DBPDataSourceRegistry createCopy(IProject project); + @Nullable DBSObjectFilter getSavedFilter(String name); @@ -99,4 +101,5 @@ public interface DBPDataSourceRegistry extends DBPObject { @NotNull ISecurePreferences getSecurePreferences(); + void dispose(); } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNProject.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNProject.java index e70be2560fe272c281983f0e84a771b009308f80..deca7ed19ca3e1a6b84e4f483849c13572d7abdb 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNProject.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNProject.java @@ -33,19 +33,16 @@ import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.utils.ArrayUtils; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.List; /** * DBNProject */ -public class DBNProject extends DBNResource -{ +public class DBNProject extends DBNResource { private static final Log log = Log.getLog(DBNProject.class); - public DBNProject(DBNNode parentNode, IProject project, DBPResourceHandler handler) - { + public DBNProject(DBNNode parentNode, IProject project, DBPResourceHandler handler) { super(parentNode, project, handler); if (getModel().isGlobal()) { getModel().getPlatform().getProjectManager().addProject(project); @@ -53,21 +50,18 @@ public class DBNProject extends DBNResource } @Override - protected void dispose(boolean reflect) - { + protected void dispose(boolean reflect) { super.dispose(reflect); if (getModel().isGlobal()) { getModel().getPlatform().getProjectManager().removeProject(getProject()); } } - public IProject getProject() - { - return (IProject)getResource(); + public IProject getProject() { + return (IProject) getResource(); } - public DBNProjectDatabases getDatabases() - { + public DBNProjectDatabases getDatabases() { try { for (DBNNode db : getChildren(new VoidProgressMonitor())) { if (db instanceof DBNProjectDatabases) { @@ -81,8 +75,7 @@ public class DBNProject extends DBNResource } @Override - public String getNodeDescription() - { + public String getNodeDescription() { try { final IProject project = getProject(); return project == null ? null : project.getDescription().getComment(); @@ -93,14 +86,12 @@ public class DBNProject extends DBNResource } @Override - public DBPImage getNodeIcon() - { + public DBPImage getNodeIcon() { return DBIcon.PROJECT; } @Override - public boolean allowsOpen() - { + public boolean allowsOpen() { return true; } @@ -113,15 +104,13 @@ public class DBNProject extends DBNResource } @Override - public boolean supportsRename() - { + public boolean supportsRename() { // Do not rename active projects return getModel().getPlatform().getProjectManager().getActiveProject() != getProject(); } @Override - public void rename(DBRProgressMonitor monitor, String newName) throws DBException - { + public void rename(DBRProgressMonitor monitor, String newName) throws DBException { try { final IProjectDescription description = getProject().getDescription(); description.setName(newName); @@ -138,7 +127,7 @@ public class DBNProject extends DBNResource List children = new ArrayList<>(); Collections.addAll(children, super.getChildren(monitor)); children.removeIf(node -> - node instanceof DBNResource && !((DBNResource) node).getResource().exists()); + node instanceof DBNResource && !((DBNResource) node).getResource().exists()); return children.toArray(new DBNNode[0]); } @@ -146,10 +135,10 @@ public class DBNProject extends DBNResource } @Override - protected DBNNode[] readChildNodes(DBRProgressMonitor monitor) throws DBException - { + protected DBNNode[] readChildNodes(DBRProgressMonitor monitor) throws DBException { IProject project = getProject(); - if (!project.isOpen()) { + DBNModel model = getModel(); + if (model.isGlobal() && !project.isOpen()) { try { project.open(monitor.getNestedMonitor()); project.refreshLocal(IFile.DEPTH_ONE, monitor.getNestedMonitor()); @@ -157,11 +146,19 @@ public class DBNProject extends DBNResource throw new DBException("Can't open project '" + project.getName() + "'", e); } } - DBPDataSourceRegistry dataSourceRegistry = getModel().getPlatform().getProjectManager().getDataSourceRegistry(project); DBNNode[] children = super.readChildNodes(monitor); + + DBPDataSourceRegistry dataSourceRegistry; + if (model.isGlobal()) { + dataSourceRegistry = model.getPlatform().getProjectManager().getDataSourceRegistry(project); + } else { + dataSourceRegistry = model.getPlatform().getProjectManager().getDefaultDataSourceRegistry(); + } if (dataSourceRegistry != null) { - children = ArrayUtils.insertArea(DBNNode.class, children, 0, new Object[] {new DBNProjectDatabases(this, dataSourceRegistry)}); + children = ArrayUtils.insertArea(DBNNode.class, children, 0, new Object[]{ + new DBNProjectDatabases(this, dataSourceRegistry)}); } + return children; } @@ -178,8 +175,7 @@ public class DBNProject extends DBNResource return super.addImplicitMembers(members); } - public DBNResource findResource(IResource resource) - { + public DBNResource findResource(IResource resource) { List path = new ArrayList<>(); for (IResource parent = resource; !(parent instanceof IProject); parent = parent.getParent()) { path.add(0, parent); diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNProjectDatabases.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNProjectDatabases.java index df0612eb19f24450247531a3b8c2749bd756611d..51bc31eb5128abf00729d7d9448056664719c329 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNProjectDatabases.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNProjectDatabases.java @@ -45,7 +45,9 @@ public class DBNProjectDatabases extends DBNNode implements DBNContainer, DBPEve public DBNProjectDatabases(DBNProject parentNode, DBPDataSourceRegistry dataSourceRegistry) { super(parentNode); - this.dataSourceRegistry = dataSourceRegistry; + this.dataSourceRegistry = getModel().isGlobal() ? + dataSourceRegistry : + dataSourceRegistry.createCopy(parentNode.getProject()); this.dataSourceRegistry.addDataSourceListener(this); List projectDataSources = this.dataSourceRegistry.getDataSources(); @@ -65,6 +67,10 @@ public class DBNProjectDatabases extends DBNNode implements DBNContainer, DBPEve children = null; if (dataSourceRegistry != null) { dataSourceRegistry.removeDataSourceListener(this); + if (!getModel().isGlobal()) { + // For local models registry si + dataSourceRegistry.dispose(); + } dataSourceRegistry = null; } super.dispose(reflect); diff --git a/plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/DataSourceDescriptor.java b/plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/DataSourceDescriptor.java index 806deb8f38289a81120046e9f6c38f4d74e33be0..f72a4367d672fd2fd09115c39a00c2d756b9de68 100644 --- a/plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/DataSourceDescriptor.java +++ b/plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/DataSourceDescriptor.java @@ -190,9 +190,13 @@ public class DataSourceDescriptor } // Copy constructor - public DataSourceDescriptor(@NotNull DataSourceDescriptor source) + public DataSourceDescriptor(@NotNull DataSourceDescriptor source) { + this(source, source.registry); + } + + public DataSourceDescriptor(@NotNull DataSourceDescriptor source, DBPDataSourceRegistry registry) { - this.registry = source.registry; + this.registry = registry; this.origin = source.origin; this.id = source.id; this.name = source.name; diff --git a/plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/DataSourceRegistry.java b/plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/DataSourceRegistry.java index 9d5b365df69ea05e54b1e0dbbefab29a50c78734..d2bb403cc4cc8df23a89b54d9f0a3791fdc7177c 100644 --- a/plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/DataSourceRegistry.java +++ b/plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/DataSourceRegistry.java @@ -99,6 +99,18 @@ public class DataSourceRegistry implements DBPDataSourceRegistry DataSourceProviderRegistry.getInstance().fireRegistryChange(this, true); } + /** + * Create copy + */ + public DataSourceRegistry(DataSourceRegistry source, IProject project) { + this.platform = source.platform; + this.project = project; + for (DataSourceDescriptor ds : source.dataSources) { + dataSources.add(new DataSourceDescriptor(ds, this)); + } + } + + @Override public void dispose() { DataSourceProviderRegistry.getInstance().fireRegistryChange(this, false); @@ -279,6 +291,11 @@ public class DataSourceRegistry implements DBPDataSourceRegistry dataSourceFolders.remove(folderImpl); } + @Override + public DBPDataSourceRegistry createCopy(IProject project) { + return new DataSourceRegistry(this, project); + } + private DataSourceFolder findRootFolder(String name) { for (DataSourceFolder root : getRootFolders()) { if (root.getName().equals(name)) {