diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/ProjectRegistry.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/ProjectRegistry.java index 1d23e21c8e9330847320574aeef44cfa17d5f80b..95839309ac5266c04575705facedaf75ceed49aa 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/ProjectRegistry.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/ProjectRegistry.java @@ -231,11 +231,17 @@ public class ProjectRegistry implements DBPProjectManager, DBPExternalFileManage return handler; } - public Collection getResourceHandlers() + @Override + public DBPResourceHandler[] getAllResourceHandlers() { - return handlerDescriptors; + DBPResourceHandler[] handlers = new DBPResourceHandler[handlerDescriptors.size()]; + for (int i = 0; i < handlerDescriptors.size(); i++) { + handlers[i] = handlerDescriptors.get(i).getHandler(); + } + return handlers; } + @Override public IFolder getResourceDefaultRoot(IProject project, Class handlerType, boolean forceCreate) { if (project == null) { @@ -244,9 +250,14 @@ public class ProjectRegistry implements DBPProjectManager, DBPExternalFileManage for (ResourceHandlerDescriptor rhd : handlerDescriptors) { DBPResourceHandler handler = rhd.getHandler(); if (handler != null && handler.getClass() == handlerType) { - final IFolder realFolder = project.getFolder(rhd.getDefaultRoot(project)); + String defaultRoot = rhd.getDefaultRoot(project); + if (defaultRoot == null) { + // No root + return null; + } + final IFolder realFolder = project.getFolder(defaultRoot); - if (!realFolder.exists() && forceCreate) { + if (forceCreate && !realFolder.exists()) { try { realFolder.create(true, true, new NullProgressMonitor()); } catch (CoreException e) { @@ -277,6 +288,11 @@ public class ProjectRegistry implements DBPProjectManager, DBPExternalFileManage return dataSourceRegistry; } + public ResourceHandlerDescriptor[] getResourceHandlerDescriptors() + { + return handlerDescriptors.toArray(new ResourceHandlerDescriptor[handlerDescriptors.size()]); + } + public DataSourceRegistry getActiveDataSourceRegistry() { if (activeProject == null) { diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/preferences/PrefPageProjectSettings.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/preferences/PrefPageProjectSettings.java index 8a01720d2e4a5bddfc8f5b9aa9520b3990cb99e3..5d52a8dce9a6a691dc43f07737e7aa826018665c 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/preferences/PrefPageProjectSettings.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/preferences/PrefPageProjectSettings.java @@ -171,7 +171,7 @@ public class PrefPageProjectSettings extends AbstractPrefPage implements IWorkbe protected void performDefaults() { resourceTable.removeAll(); - for (ResourceHandlerDescriptor descriptor : DBeaverCore.getInstance().getProjectRegistry().getResourceHandlers()) { + for (ResourceHandlerDescriptor descriptor : DBeaverCore.getInstance().getProjectRegistry().getResourceHandlerDescriptors()) { if (!descriptor.isManagable()) { continue; } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/resources/ResourceUtils.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/resources/ResourceUtils.java index 4bea0e4da2c4e9462f80880a647d12fe971960ae..70eefcac292121b01ae76dd9dfeeb6a07efd5fdf 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/resources/ResourceUtils.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/resources/ResourceUtils.java @@ -22,11 +22,14 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.*; import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.DBeaverPreferences; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.core.DBeaverCore; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.DBPDataSourceFolder; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; import org.jkiss.dbeaver.model.sql.SQLUtils; import org.jkiss.dbeaver.ui.editors.EditorUtils; import org.jkiss.dbeaver.utils.ContentUtils; @@ -250,6 +253,10 @@ public class ResourceUtils { if (scriptsFolder == null) { scriptsFolder = scriptsRootFolder; } + if (!scriptsFolder.exists()) { + scriptsFolder.create(true, true, new NullProgressMonitor()); + } + if (CommonUtils.equalObjects(scriptsRootFolder, scriptsFolder)) { // We are in the root folder if (dataSourceContainer != null) { @@ -298,4 +305,22 @@ public class ResourceUtils { return tempFile; } + public static void checkFolderExists(IFolder folder) + throws DBException + { + checkFolderExists(folder, new VoidProgressMonitor()); + } + + public static void checkFolderExists(IFolder folder, DBRProgressMonitor monitor) + throws DBException + { + if (!folder.exists()) { + try { + folder.create(true, true, monitor.getNestedMonitor()); + } catch (CoreException e) { + throw new DBException("Can't create folder '" + folder.getFullPath() + "'", e); + } + } + } + } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/resources/bookmarks/BookmarksHandlerImpl.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/resources/bookmarks/BookmarksHandlerImpl.java index e3a0c3cdd4983b93d0c16e1f3796baf1cb863a0e..fe666cbfee7f788e48ca6e9df630810108f53d6a 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/resources/bookmarks/BookmarksHandlerImpl.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/resources/bookmarks/BookmarksHandlerImpl.java @@ -36,6 +36,7 @@ import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress; import org.jkiss.dbeaver.runtime.ui.DBUserInterface; import org.jkiss.dbeaver.ui.actions.navigator.NavigatorHandlerObjectOpen; import org.jkiss.dbeaver.ui.resources.AbstractResourceHandler; +import org.jkiss.dbeaver.ui.resources.ResourceUtils; import org.jkiss.dbeaver.utils.ContentUtils; import org.jkiss.dbeaver.utils.RuntimeUtils; import org.jkiss.utils.ArrayUtils; @@ -212,6 +213,7 @@ public class BookmarksHandlerImpl extends AbstractResourceHandler { if (folder == null) { throw new DBException("Can't detect folder for bookmark"); } + ResourceUtils.checkFolderExists(folder); IFile file = ContentUtils.getUniqueFile( folder, diff --git a/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/navigator/ERDResourceHandler.java b/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/navigator/ERDResourceHandler.java index 18755cca4636f7d3f0117b704b02f917e0ada1f5..177e448cdaa73968a5ef58691eaffbc8ab2895ce 100644 --- a/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/navigator/ERDResourceHandler.java +++ b/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/navigator/ERDResourceHandler.java @@ -34,6 +34,7 @@ import org.jkiss.dbeaver.model.navigator.DBNResource; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress; import org.jkiss.dbeaver.ui.resources.AbstractResourceHandler; +import org.jkiss.dbeaver.ui.resources.ResourceUtils; import org.jkiss.dbeaver.utils.ContentUtils; import org.jkiss.dbeaver.utils.RuntimeUtils; import org.jkiss.utils.CommonUtils; @@ -130,6 +131,7 @@ public class ERDResourceHandler extends AbstractResourceHandler { if (folder == null) { throw new DBException("Can't detect folder for diagram"); } + ResourceUtils.checkFolderExists(folder, monitor); final IFile file = ContentUtils.getUniqueFile(folder, CommonUtils.escapeFileName(title), ERD_EXT); diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/app/DBPProjectManager.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/app/DBPProjectManager.java index ea58d48f99ba43142cd94ffb12995aeb048f33c2..4fa4f4829732cdb936b6041cd9b61409da4466fb 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/app/DBPProjectManager.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/app/DBPProjectManager.java @@ -17,15 +17,21 @@ package org.jkiss.dbeaver.model.app; +import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; +import org.jkiss.code.Nullable; /** * ProjectManager */ public interface DBPProjectManager { + DBPResourceHandler[] getAllResourceHandlers(); + @Nullable DBPResourceHandler getResourceHandler(IResource resource); + @Nullable + IFolder getResourceDefaultRoot(IProject project, Class handlerType, boolean forceCreate); IProject getActiveProject(); void setActiveProject(IProject project); @@ -35,4 +41,5 @@ public interface DBPProjectManager void removeProjectListener(DBPProjectListener listener); DBPDataSourceRegistry getDataSourceRegistry(IProject project); + } 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 8018fcf3933c2713c1c837f146786bd23a00a1b3..8c6f6f95bf891433efe065c172ef5be497208a3e 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 @@ -142,6 +142,18 @@ public class DBNProject extends DBNResource return children; } + @Override + protected IResource[] addImplicitMembers(IResource[] members) { + for (DBPResourceHandler rh : getModel().getPlatform().getProjectManager().getAllResourceHandlers()) { + IFolder rhDefaultRoot = getModel().getPlatform().getProjectManager().getResourceDefaultRoot(getProject(), rh.getClass(), false); + if (rhDefaultRoot != null && !rhDefaultRoot.exists()) { + // Add as explicit member + members = ArrayUtils.add(IResource.class, members, rhDefaultRoot); + } + } + return super.addImplicitMembers(members); + } + public DBNResource findResource(IResource resource) { List path = new ArrayList<>(); 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 3346407a3d584def8b828dc51577f12a52bff502..d378d07ae9c4b50f86e754e7b9f7834cc595e4bc 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 @@ -150,11 +150,14 @@ public class DBNResource extends DBNNode// implements IContributorResourceAdapte { List result = new ArrayList<>(); try { - IResource[] members = ((IContainer) resource).members(false); - for (IResource member : members) { - DBNNode newChild = makeNode(member); - if (newChild != null) { - result.add(newChild); + if (resource.exists()) { + IResource[] members = ((IContainer) resource).members(false); + members = addImplicitMembers(members); + for (IResource member : members) { + DBNNode newChild = makeNode(member); + if (newChild != null) { + result.add(newChild); + } } } } catch (CoreException e) { @@ -170,6 +173,10 @@ public class DBNResource extends DBNNode// implements IContributorResourceAdapte } } + protected IResource[] addImplicitMembers(IResource[] members) { + return members; + } + DBNResource getChild(IResource resource) { if (children == null) {