提交 1ff85bc7 编写于 作者: S serge-rider

CB-348 Auth model refactoring (session context)


Former-commit-id: 77972348
上级 1ae04b08
......@@ -21,12 +21,19 @@ import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.DBPObject;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.auth.DBAAuthSpace;
/**
* Access session
*/
public interface DBASession extends DBPObject {
/**
* SEssion space
*/
@NotNull
DBAAuthSpace getSessionSpace();
/**
* Session unique ID
*/
......
......@@ -21,6 +21,8 @@ import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.model.DBPObject;
import org.jkiss.dbeaver.model.auth.DBAAuthSpace;
import org.jkiss.dbeaver.model.auth.DBASessionContext;
import org.jkiss.dbeaver.model.task.DBTTaskManager;
import java.io.File;
......@@ -28,9 +30,9 @@ import java.util.Map;
import java.util.UUID;
/**
* Project meta information
* Project meta information.
*/
public interface DBPProject extends DBPObject
public interface DBPProject extends DBPObject, DBAAuthSpace
{
String METADATA_FOLDER = ".dbeaver";
......@@ -76,6 +78,12 @@ public interface DBPProject extends DBPObject
@NotNull
DBASecureStorage getSecureStorage();
/**
* Project auth context
*/
@NotNull
DBASessionContext getSessionContext();
Object getProjectProperty(String propName);
void setProjectProperty(String propName, Object propValue);
......
......@@ -24,6 +24,8 @@ import org.eclipse.core.resources.IWorkspace;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.auth.DBAAuthSpace;
import org.jkiss.dbeaver.model.auth.DBASessionContext;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import java.io.File;
......@@ -32,7 +34,7 @@ import java.util.List;
/**
* DBPWorkspace
*/
public interface DBPWorkspace
public interface DBPWorkspace extends DBAAuthSpace
{
@NotNull
DBPPlatform getPlatform();
......@@ -51,11 +53,19 @@ public interface DBPWorkspace
@NotNull
IWorkspace getEclipseWorkspace();
@NotNull
List<DBPProject> getProjects();
DBPProject getActiveProject();
void setActiveProject(DBPProject project);
DBPProject getProject(IProject project);
DBPProject getProject(String projectName);
DBPProject getProject(@NotNull IProject project);
DBPProject getProject(@NotNull String projectName);
/**
* Workspace auth context
*/
@NotNull
DBASessionContext getAuthContext();
/**
* Reloads workspace contents. Creates missing projects, removes unexistent projects
......
......@@ -17,16 +17,23 @@
package org.jkiss.dbeaver.model.auth;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.access.DBASession;
/**
* Auth context of application.
* Holds auth tokens provided by app authentication.
* Session context.
* Holds various auth sessions.
*/
public interface DBAAuthContext {
public interface DBASessionContext {
@Nullable
DBASession getSpaceSession(DBAAuthSpace space);
DBAAuthToken[] getSavedTokens();
void addSession(@NotNull DBASession session);
boolean removeSession(@NotNull DBASession session);
}
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2020 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.model.impl.auth;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.access.DBASession;
import org.jkiss.dbeaver.model.auth.DBAAuthSpace;
import org.jkiss.dbeaver.model.auth.DBAAuthToken;
import org.jkiss.dbeaver.model.auth.DBASessionContext;
import org.jkiss.utils.CommonUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Session context implementation
*/
public class SessionContextImpl implements DBASessionContext {
private final DBASessionContext parentContext;
private final List<DBASession> sessions = new ArrayList<>();
public SessionContextImpl(DBASessionContext parentContext) {
this.parentContext = parentContext;
}
@Nullable
@Override
public DBASession getSpaceSession(DBAAuthSpace space) {
for (DBASession session : sessions) {
if (CommonUtils.equalObjects(session.getSessionSpace(), space)) {
return session;
}
}
return parentContext == null ? null : parentContext.getSpaceSession(space);
}
@Override
public DBAAuthToken[] getSavedTokens() {
return new DBAAuthToken[0];
}
public void addSession(@NotNull DBASession session) {
sessions.add(session);
}
@Override
public boolean removeSession(@NotNull DBASession session) {
return sessions.remove(session);
}
}
......@@ -28,9 +28,9 @@ import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBIconComposite;
import org.jkiss.dbeaver.model.DBPImage;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.access.DBASession;
import org.jkiss.dbeaver.model.app.DBPPlatform;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.auth.DBASessionContext;
import org.jkiss.dbeaver.model.navigator.meta.DBXTreeFolder;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSEntity;
......@@ -75,7 +75,7 @@ public class DBNModel implements IResourceChangeListener {
}
private final DBPPlatform platform;
private final DBASession modelContext;
private final DBPProject modelProject;
private DBNRoot root;
private final List<INavigatorListener> listeners = new ArrayList<>();
private transient INavigatorListener[] listenersCopy = null;
......@@ -85,23 +85,28 @@ public class DBNModel implements IResourceChangeListener {
/**
* Creates navigator model.
* @param modelContext Model context. If null then this is global navigator model. Otherwise it points to a session-like object.
* @param modelProject Model project. If null then this is global navigator model. Otherwise it points to a session-like object.
*/
public DBNModel(DBPPlatform platform, @NotNull DBASession modelContext) {
public DBNModel(DBPPlatform platform, @Nullable DBPProject modelProject) {
this.platform = platform;
this.modelContext = modelContext;
this.modelProject = modelProject;
}
public DBPPlatform getPlatform() {
return platform;
}
public boolean isGlobal() {
return modelContext.isApplicationSession();
@Nullable
public DBPProject getModelProject() {
return modelProject;
}
public DBASession getModelContext() {
return modelContext;
public DBASessionContext getModelAuthContext() {
return modelProject != null ? modelProject.getSessionContext() : platform.getWorkspace().getAuthContext();
}
public boolean isGlobal() {
return modelProject == null;
}
public void initialize()
......
......@@ -44,9 +44,9 @@ public class DBNRoot extends DBNNode implements DBNContainer, DBNNodeExtendable,
public DBNRoot(DBNModel model) {
super();
this.model = model;
DBPProject singletonProject = model.getModelContext().getSingletonProject();
if (singletonProject != null) {
addProject(singletonProject, false);
DBPProject globalProject = model.getModelProject();
if (globalProject != null) {
addProject(globalProject, false);
} else {
for (DBPProject project : DBWorkbench.getPlatform().getWorkspace().getProjects()) {
addProject(project, false);
......
......@@ -18,12 +18,10 @@ package org.jkiss.dbeaver.registry;
import org.eclipse.core.runtime.Platform;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.ModelPreferences;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.access.DBASession;
import org.jkiss.dbeaver.model.app.*;
import org.jkiss.dbeaver.model.connection.DBPDataSourceProviderRegistry;
import org.jkiss.dbeaver.model.data.DBDRegistry;
......@@ -91,7 +89,7 @@ public abstract class BasePlatformImpl implements DBPPlatform, DBPPlatformLangua
}
// Navigator model
this.navigatorModel = new DBNModel(this, new WorkspaceSession());
this.navigatorModel = new DBNModel(this, null);
this.navigatorModel.initialize();
// Activate plugin services
......@@ -249,22 +247,4 @@ public abstract class BasePlatformImpl implements DBPPlatform, DBPPlatformLangua
}
}
private class WorkspaceSession implements DBASession {
@NotNull
@Override
public String getSessionId() {
return getWorkspace().getWorkspaceId();
}
@Override
public boolean isApplicationSession() {
return true;
}
@Nullable
@Override
public DBPProject getSingletonProject() {
return null;
}
}
}
......@@ -19,11 +19,16 @@ package org.jkiss.dbeaver.registry;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBConstants;
import org.jkiss.dbeaver.model.DBPExternalFileManager;
import org.jkiss.dbeaver.model.access.DBASession;
import org.jkiss.dbeaver.model.app.*;
import org.jkiss.dbeaver.model.auth.DBAAuthSpace;
import org.jkiss.dbeaver.model.auth.DBASessionContext;
import org.jkiss.dbeaver.model.impl.auth.SessionContextImpl;
import org.jkiss.dbeaver.model.runtime.AbstractJob;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.LoggingProgressMonitor;
......@@ -56,6 +61,7 @@ public abstract class BaseWorkspaceImpl implements DBPWorkspace, DBPExternalFile
private final DBPPlatform platform;
private final IWorkspace eclipseWorkspace;
private final SessionContextImpl workspaceAuthContext;
private final Map<IProject, ProjectMetadata> projects = new LinkedHashMap<>();
private final ProjectListener projectListener;
......@@ -69,6 +75,8 @@ public abstract class BaseWorkspaceImpl implements DBPWorkspace, DBPExternalFile
protected BaseWorkspaceImpl(DBPPlatform platform, IWorkspace eclipseWorkspace) {
this.platform = platform;
this.eclipseWorkspace = eclipseWorkspace;
this.workspaceAuthContext = new SessionContextImpl(null);
this.workspaceAuthContext.addSession(new WorkspaceSession());
String activeProjectName = platform.getPreferenceStore().getString(PROP_PROJECT_ACTIVE);
......@@ -84,7 +92,7 @@ public abstract class BaseWorkspaceImpl implements DBPWorkspace, DBPExternalFile
}
for (IProject project : allProjects) {
if (project.exists() && !project.isHidden()) {
ProjectMetadata projectMetadata = new ProjectMetadata(this, project);
ProjectMetadata projectMetadata = new ProjectMetadata(this, project, this.workspaceAuthContext);
this.projects.put(project, projectMetadata);
if (activeProject == null || (!CommonUtils.isEmpty(activeProjectName) && project.getName().equals(activeProjectName))) {
......@@ -188,6 +196,7 @@ public abstract class BaseWorkspaceImpl implements DBPWorkspace, DBPExternalFile
return eclipseWorkspace;
}
@NotNull
@Override
public List<DBPProject> getProjects() {
return new ArrayList<>(projects.values());
......@@ -210,12 +219,12 @@ public abstract class BaseWorkspaceImpl implements DBPWorkspace, DBPExternalFile
}
@Override
public DBPProject getProject(IProject project) {
public DBPProject getProject(@NotNull IProject project) {
return projects.get(project);
}
@Override
public DBPProject getProject(String projectName) {
public DBPProject getProject(@NotNull String projectName) {
IProject eProject = eclipseWorkspace.getRoot().getProject(projectName);
if (!eProject.exists()) {
return null;
......@@ -223,6 +232,12 @@ public abstract class BaseWorkspaceImpl implements DBPWorkspace, DBPExternalFile
return getProject(eProject);
}
@NotNull
@Override
public DBASessionContext getAuthContext() {
return workspaceAuthContext;
}
@Override
public void refreshWorkspaceContents(DBRProgressMonitor monitor) throws DBException {
try {
......@@ -616,7 +631,7 @@ public abstract class BaseWorkspaceImpl implements DBPWorkspace, DBPExternalFile
IProject project = (IProject) childDelta.getResource();
if (!projects.containsKey(project)) {
if (childDelta.getKind() == IResourceDelta.ADDED) {
ProjectMetadata projectMetadata = new ProjectMetadata(BaseWorkspaceImpl.this, project);
ProjectMetadata projectMetadata = new ProjectMetadata(BaseWorkspaceImpl.this, project, BaseWorkspaceImpl.this.workspaceAuthContext);
projects.put(project, projectMetadata);
fireProjectAdd(projectMetadata);
if (activeProject == null) {
......@@ -704,4 +719,30 @@ public abstract class BaseWorkspaceImpl implements DBPWorkspace, DBPExternalFile
return Status.OK_STATUS;
}
}
private class WorkspaceSession implements DBASession {
@NotNull
@Override
public DBAAuthSpace getSessionSpace() {
return BaseWorkspaceImpl.this;
}
@NotNull
@Override
public String getSessionId() {
return getWorkspaceId();
}
@Override
public boolean isApplicationSession() {
return true;
}
@Nullable
@Override
public DBPProject getSingletonProject() {
return null;
}
}
}
......@@ -34,6 +34,7 @@ import org.jkiss.dbeaver.model.app.DBASecureStorage;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.app.DBPWorkspace;
import org.jkiss.dbeaver.model.auth.DBASessionContext;
import org.jkiss.dbeaver.model.data.json.JSONUtils;
import org.jkiss.dbeaver.model.runtime.AbstractJob;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
......@@ -69,6 +70,7 @@ public class ProjectMetadata implements DBPProject {
private final DBPWorkspace workspace;
private final IProject project;
private final DBASessionContext sessionContext;
private String projectName;
private File projectPath;
......@@ -83,14 +85,15 @@ public class ProjectMetadata implements DBPProject {
private final Object metadataSync = new Object();
private boolean inMemory;
public ProjectMetadata(DBPWorkspace workspace, IProject project) {
public ProjectMetadata(DBPWorkspace workspace, IProject project, DBASessionContext sessionContext) {
this.workspace = workspace;
this.project = project;
this.metadataSyncJob = new ProjectSyncJob();
this.sessionContext = sessionContext == null ? workspace.getAuthContext() : sessionContext;
}
public ProjectMetadata(DBPWorkspace workspace, String name, File path) {
this(workspace, workspace.getActiveProject().getEclipseProject());
public ProjectMetadata(DBPWorkspace workspace, String name, File path, DBASessionContext sessionContext) {
this(workspace, workspace.getActiveProject() == null ? null : workspace.getActiveProject().getEclipseProject(), sessionContext);
this.projectName = name;
this.projectPath = path;
}
......@@ -166,7 +169,7 @@ public class ProjectMetadata implements DBPProject {
@Override
public boolean isOpen() {
return project.isOpen();
return project == null || project.isOpen();
}
@Override
......@@ -252,6 +255,12 @@ public class ProjectMetadata implements DBPProject {
return secureStorage;
}
@NotNull
@Override
public DBASessionContext getSessionContext() {
return sessionContext;
}
////////////////////////////////////////////////////////
// Properties
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册