diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMUtils.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMUtils.java index 4cc972a770..4060ef878b 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMUtils.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMUtils.java @@ -5,6 +5,7 @@ import io.cloudbeaver.model.app.BaseWebApplication; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.model.rm.RMProject; import org.jkiss.dbeaver.model.rm.RMProjectPermission; +import org.jkiss.dbeaver.model.rm.RMProjectType; import org.jkiss.dbeaver.runtime.DBWorkbench; import java.nio.file.Path; @@ -38,6 +39,28 @@ public class RMUtils { } } + /** + * Different types of project have different location on the workspace. Method returns path to the project. + * + * @param projectId project name or other identifier + * @return path to the project based on the name of projects and prefixes that it contains + */ + @NotNull + public static Path getProjectPathByName(@NotNull String projectId) { + if (!projectId.contains("_") || projectId.startsWith("_")) { + return getRootPath().resolve(BaseWebApplication.getInstance().getDefaultProjectName()); + } + String prefix = projectId.substring(0, projectId.indexOf("_")); + switch (RMProjectType.getByPrefix(prefix)) { + case GLOBAL: + return getRootPath().resolve(BaseWebApplication.getInstance().getDefaultProjectName()); + case SHARED: + return getSharedProjectsPath().resolve(projectId); + default: + return getUserProjectsPath().resolve(projectId); + } + } + public static Set parseProjectPermissions(Set permissions) { return permissions.stream() .map(RMProjectPermission::fromPermission).filter(Objects::nonNull) @@ -48,7 +71,7 @@ public class RMUtils { public static RMProject createAnonymousProject() { RMProject project = new RMProject("anonymous"); project.setId("anonymous"); - project.setType(RMProject.Type.USER); + project.setType(RMProjectType.USER); project.setProjectPermissions(RMProjectPermission.DATA_SOURCES_EDIT.getAllPermissions()); return project; } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java index 3f551bfee1..715621f815 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java @@ -133,16 +133,16 @@ public class LocalResourceController implements RMController { //FIXME: remove legacy global project support //admin has all edit access //user has only read access - var globalProjectPermissions = getProjectPermissions(globalProjectName, RMProject.Type.GLOBAL); + var globalProjectPermissions = getProjectPermissions(globalProjectName, RMProjectType.GLOBAL); - RMProject globalProject = makeProjectFromPath(getGlobalProjectPath(), globalProjectPermissions, RMProject.Type.GLOBAL, true); + RMProject globalProject = makeProjectFromPath(getGlobalProjectPath(), globalProjectPermissions, RMProjectType.GLOBAL, true); if (globalProject != null) { projects.add(globalProject); } //user has full access to his private project - var userProjectPermission = getProjectPermissions(null, RMProject.Type.USER); - RMProject userProject = makeProjectFromPath(getPrivateProjectPath(), userProjectPermission, RMProject.Type.USER, false); + var userProjectPermission = getProjectPermissions(null, RMProjectType.USER); + RMProject userProject = makeProjectFromPath(getPrivateProjectPath(), userProjectPermission, RMProjectType.USER, false); if (userProject != null) { projects.add(0, userProject); } @@ -163,13 +163,13 @@ public class LocalResourceController implements RMController { .map(projectPermission -> makeProjectFromPath( sharedProjectsPath.resolve(parseProjectName(projectPermission.getObjectId()).getName()), projectPermission.getPermissions().stream().map(RMProjectPermission::fromPermission).collect(Collectors.toSet()), - RMProject.Type.SHARED, true) + RMProjectType.SHARED, true) ) .filter(Objects::nonNull) .collect(Collectors.toList()); } - private Set getProjectPermissions(@Nullable String projectId, RMProject.Type projectType) throws DBException { + private Set getProjectPermissions(@Nullable String projectId, RMProjectType projectType) throws DBException { var activeUserCreds = credentialsProvider.getActiveUserCredentials(); switch (projectType) { @@ -209,10 +209,10 @@ public class LocalResourceController implements RMController { var allPaths = Files.list(sharedProjectsPath).collect(Collectors.toList()); for (Path path : allPaths) { var projectPerms = getProjectPermissions( - makeProjectIdFromPath(path, RMProject.Type.SHARED), - RMProject.Type.SHARED + makeProjectIdFromPath(path, RMProjectType.SHARED), + RMProjectType.SHARED ); - var rmProject = makeProjectFromPath(path, projectPerms, RMProject.Type.SHARED, false); + var rmProject = makeProjectFromPath(path, projectPerms, RMProjectType.SHARED, false); projects.add(rmProject); } return projects.stream() @@ -238,7 +238,7 @@ public class LocalResourceController implements RMController { if (Files.exists(projectPath)) { throw new DBException("Project '" + name + "' already exists"); } - project = makeProjectFromPath(projectPath, Set.of(), RMProject.Type.SHARED, false); + project = makeProjectFromPath(projectPath, Set.of(), RMProjectType.SHARED, false); if (project == null) { throw new DBException("Project '" + name + "' not created"); } @@ -546,7 +546,7 @@ public class LocalResourceController implements RMController { } - private String makeProjectIdFromPath(Path path, RMProject.Type type) { + private String makeProjectIdFromPath(Path path, RMProjectType type) { String projectName = path.getFileName().toString(); return type.getPrefix() + "_" + projectName; } @@ -561,7 +561,7 @@ public class LocalResourceController implements RMController { return makeProjectFromPath(projectPath, permissions, projectName.getType(), false); } - private RMProject makeProjectFromPath(Path path, Set permissions, RMProject.Type type, boolean checkExistence) { + private RMProject makeProjectFromPath(Path path, Set permissions, RMProjectType type, boolean checkExistence) { if (path == null) { return null; } @@ -599,7 +599,7 @@ public class LocalResourceController implements RMController { private Path getProjectPath(String projectId) throws DBException { RMProjectName project = parseProjectName(projectId); - RMProject.Type type = project.getType(); + RMProjectType type = project.getType(); String projectName = project.getName(); switch (type) { case GLOBAL: @@ -754,12 +754,8 @@ public class LocalResourceController implements RMController { return name; } - public RMProject.Type getType() { - switch (prefix) { - case RMProject.PREFIX_GLOBAL: return RMProject.Type.GLOBAL; - case RMProject.PREFIX_SHARED: return RMProject.Type.SHARED; - default: return RMProject.Type.USER; - } + public RMProjectType getType() { + return RMProjectType.getByPrefix(prefix); } } public static RMProjectName parseProjectName(String projectId) { @@ -767,7 +763,7 @@ public class LocalResourceController implements RMController { String name; int divPos = projectId.indexOf("_"); if (divPos < 0) { - prefix = RMProject.Type.USER.getPrefix(); + prefix = RMProjectType.USER.getPrefix(); name = projectId; } else { prefix = projectId.substring(0, divPos); @@ -778,12 +774,12 @@ public class LocalResourceController implements RMController { public static boolean isGlobalProject(String projectId) { RMProjectName rmProjectName = parseProjectName(projectId); - return RMProject.Type.GLOBAL.getPrefix().equals(rmProjectName.getPrefix()); + return RMProjectType.GLOBAL.getPrefix().equals(rmProjectName.getPrefix()); } public static boolean isPrivateProject(String projectId, String userId) { RMProjectName rmProjectName = parseProjectName(projectId); - return RMProject.Type.USER.getPrefix().equals(rmProjectName.getPrefix()) && + return RMProjectType.USER.getPrefix().equals(rmProjectName.getPrefix()) && rmProjectName.name.equals(userId); } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java index 91853864cf..4cf51b3044 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java @@ -54,6 +54,7 @@ import org.jkiss.dbeaver.model.navigator.DBNModel; import org.jkiss.dbeaver.model.rm.RMController; import org.jkiss.dbeaver.model.rm.RMProject; import org.jkiss.dbeaver.model.rm.RMProjectPermission; +import org.jkiss.dbeaver.model.rm.RMProjectType; import org.jkiss.dbeaver.model.runtime.AbstractJob; import org.jkiss.dbeaver.model.runtime.BaseProgressMonitor; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; @@ -348,7 +349,7 @@ public class WebSession extends AbstractSessionPersistent implements SMSession, public VirtualProjectImpl createVirtualProject(RMProject project) { // Do not filter data sources from user project - DataSourceFilter filter = project.getType() == RMProject.Type.GLOBAL + DataSourceFilter filter = project.getType() == RMProjectType.GLOBAL ? this::isDataSourceAccessible : x -> true; VirtualProjectImpl sessionProject = application.createProjectImpl( diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebAppUtils.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebAppUtils.java index 4e81e3ca73..8f1ecf3442 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebAppUtils.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebAppUtils.java @@ -25,7 +25,7 @@ import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.app.DBPProject; import org.jkiss.dbeaver.model.auth.SMAuthenticationManager; -import org.jkiss.dbeaver.model.rm.RMProject; +import org.jkiss.dbeaver.model.rm.RMProjectType; import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.utils.CommonUtils; @@ -161,6 +161,6 @@ public class WebAppUtils { public static String getGlobalProjectId() { String globalConfigurationName = getWebApplication().getDefaultProjectName(); - return RMProject.Type.GLOBAL.getPrefix() + "_" + globalConfigurationName; + return RMProjectType.GLOBAL.getPrefix() + "_" + globalConfigurationName; } } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java index 1a24d70a9a..4145216faf 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java @@ -45,6 +45,7 @@ import org.jkiss.dbeaver.model.navigator.DBNProject; import org.jkiss.dbeaver.model.net.DBWHandlerConfiguration; import org.jkiss.dbeaver.model.net.ssh.SSHConstants; import org.jkiss.dbeaver.model.rm.RMProject; +import org.jkiss.dbeaver.model.rm.RMProjectType; import org.jkiss.dbeaver.registry.DataSourceDescriptor; import org.jkiss.dbeaver.registry.DataSourceNavigatorSettings; import org.jkiss.dbeaver.registry.DataSourceProviderDescriptor; @@ -335,7 +336,7 @@ public class WebServiceUtils extends WebCommonUtils { } public static boolean isGlobalProject(DBPProject project) { - return project.getId().equals(RMProject.PREFIX_GLOBAL + "_" + CBApplication.getInstance().getDefaultProjectName()); + return project.getId().equals(RMProjectType.GLOBAL.getPrefix() + "_" + CBApplication.getInstance().getDefaultProjectName()); } diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/WebServiceAdmin.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/WebServiceAdmin.java index 002b0fa820..932e05d1b8 100644 --- a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/WebServiceAdmin.java +++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/WebServiceAdmin.java @@ -29,7 +29,6 @@ import io.cloudbeaver.model.user.WebAuthProviderConfiguration; import io.cloudbeaver.model.user.WebUser; import io.cloudbeaver.registry.WebFeatureRegistry; import io.cloudbeaver.registry.WebPermissionDescriptor; -import io.cloudbeaver.registry.WebServiceDescriptor; import io.cloudbeaver.registry.WebServiceRegistry; import io.cloudbeaver.server.CBAppConfig; import io.cloudbeaver.server.CBApplication; @@ -49,7 +48,7 @@ import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings; import org.jkiss.dbeaver.model.navigator.DBNDataSource; import org.jkiss.dbeaver.model.navigator.DBNModel; import org.jkiss.dbeaver.model.navigator.DBNNode; -import org.jkiss.dbeaver.model.rm.RMProject; +import org.jkiss.dbeaver.model.rm.RMProjectType; import org.jkiss.dbeaver.model.security.SMAuthProviderCustomConfiguration; import org.jkiss.dbeaver.model.security.SMConstants; import org.jkiss.dbeaver.model.security.SMDataSourceGrant; @@ -767,7 +766,7 @@ public class WebServiceAdmin implements DBWServiceAdmin { private DBPDataSourceRegistry getGlobalRegistry(WebSession session) { String globalConfigurationName = CBApplication.getInstance().getDefaultProjectName(); - return session.getProjectById(RMProject.Type.GLOBAL.getPrefix() + "_" + globalConfigurationName).getDataSourceRegistry(); + return session.getProjectById(RMProjectType.GLOBAL.getPrefix() + "_" + globalConfigurationName).getDataSourceRegistry(); } private void validatePermissions(@NotNull String expectedScope, @NotNull Collection permissions) throws DBWebException {