dbeaver/dbeaver-ee#1907 supports shared tasks configurations; (#1173)

* dbeaver/dbeaver-ee#1907 supports shared tasks configurations;

* dbeaver/dbeaver-ee#1907 typo fixed

* dbeaver/dbeaver-ee#1907 code style fix
This commit is contained in:
Anastasiya
2022-09-27 13:07:04 +03:00
committed by GitHub
parent 860b92e538
commit 27e2025013
6 changed files with 50 additions and 30 deletions
@@ -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<String> parseProjectPermissions(Set<String> 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;
}
@@ -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<RMProjectPermission> getProjectPermissions(@Nullable String projectId, RMProject.Type projectType) throws DBException {
private Set<RMProjectPermission> 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<RMProjectPermission> permissions, RMProject.Type type, boolean checkExistence) {
private RMProject makeProjectFromPath(Path path, Set<RMProjectPermission> 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);
}
@@ -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(
@@ -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;
}
}
@@ -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());
}
@@ -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<String> permissions) throws DBWebException {