提交 4a733d81 编写于 作者: S Serge Rider

#1067 PG: role permissions panel


Former-commit-id: 1cd8bbe6
上级 796acd9e
......@@ -20,6 +20,7 @@ package org.jkiss.dbeaver.ext.postgresql.model;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.dbeaver.model.struct.DBSObject;
import java.util.List;
......@@ -27,7 +28,7 @@ import java.util.List;
/**
* PostgrePermission
*/
public abstract class PostgrePermission implements DBSObject {
public abstract class PostgrePermission implements DBSObject, Comparable<PostgrePermission> {
public static final short NONE = 0;
public static final short GRANTED = 1;
......@@ -83,12 +84,6 @@ public abstract class PostgrePermission implements DBSObject {
}
@NotNull
@Override
public String getName() {
return toString();
}
@Override
public boolean isPersisted() {
return true;
......@@ -125,5 +120,42 @@ public abstract class PostgrePermission implements DBSObject {
return NONE;
}
// Properties for permissions viewer
@Property(viewable = true, order = 100, name = "SELECT")
public boolean hasPermissionSelect() {
return getPermission(PostgrePrivilegeType.SELECT) != 0;
}
@Property(viewable = true, order = 101, name = "INSERT")
public boolean hasPermissionInsert() {
return getPermission(PostgrePrivilegeType.INSERT) != 0;
}
@Property(viewable = true, order = 102, name = "UPDATE")
public boolean hasPermissionUpdate() {
return getPermission(PostgrePrivilegeType.UPDATE) != 0;
}
@Property(viewable = true, order = 103, name = "DELETE")
public boolean hasPermissionDelete() {
return getPermission(PostgrePrivilegeType.DELETE) != 0;
}
@Property(viewable = true, order = 104, name = "TRUNCATE")
public boolean hasPermissionTruncate() {
return getPermission(PostgrePrivilegeType.TRUNCATE) != 0;
}
@Property(viewable = true, order = 105, name = "REFERENCES")
public boolean hasPermissionReferences() {
return getPermission(PostgrePrivilegeType.REFERENCES) != 0;
}
@Property(viewable = true, order = 106, name = "TRIGGER")
public boolean hasPermissionTrigger() {
return getPermission(PostgrePrivilegeType.TRIGGER) != 0;
}
}
......@@ -21,6 +21,7 @@ package org.jkiss.dbeaver.ext.postgresql.model;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import java.util.Collection;
import java.util.List;
/**
......@@ -28,6 +29,6 @@ import java.util.List;
*/
public interface PostgrePermissionsOwner extends PostgreObject {
List<? extends PostgrePermission> getPermissions(DBRProgressMonitor monitor) throws DBException;
Collection<PostgrePermission> getPermissions(DBRProgressMonitor monitor) throws DBException;
}
......@@ -213,7 +213,7 @@ public class PostgreRole implements PostgreObject, PostgrePermissionsOwner {
}
@Override
public List<PostgreRolePermission> getPermissions(DBRProgressMonitor monitor) throws DBException {
public Collection<PostgrePermission> getPermissions(DBRProgressMonitor monitor) throws DBException {
try (JDBCSession session = DBUtils.openMetaSession(monitor, getDataSource(), "Read role privileges")) {
try (JDBCPreparedStatement dbStat = session.prepareStatement(
"SELECT * FROM information_schema.table_privileges WHERE table_catalog=? AND grantee=?"))
......@@ -233,17 +233,11 @@ public class PostgreRole implements PostgreObject, PostgrePermissionsOwner {
privList.add(privilege);
}
// Pack to permission list
List<PostgreRolePermission> result = new ArrayList<>(privs.size());
List<PostgrePermission> result = new ArrayList<>(privs.size());
for (List<PostgrePrivilege> priv : privs.values()) {
result.add(new PostgreRolePermission(this, priv.get(0).getTableSchema(), priv.get(0).getTableName(), priv));
}
Collections.sort(result, new Comparator<PostgreRolePermission>() {
@Override
public int compare(PostgreRolePermission o1, PostgreRolePermission o2) {
final int res = o1.getSchemaName().compareTo(o2.getSchemaName());
return res != 0 ? res : o1.getTableName().compareTo(o2.getTableName());
}
});
Collections.sort(result);
return result;
}
} catch (SQLException e) {
......
......@@ -17,8 +17,10 @@
*/
package org.jkiss.dbeaver.ext.postgresql.model;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import java.util.List;
......@@ -37,6 +39,12 @@ public class PostgreRolePermission extends PostgrePermission {
this.tableName = tableName;
}
@Property(viewable = true, order = 1)
@NotNull
public String getName() {
return getFullTableName();
}
public String getSchemaName() {
return schemaName;
}
......@@ -58,5 +66,15 @@ public class PostgreRolePermission extends PostgrePermission {
public String toString() {
return getFullTableName();
}
@Override
public int compareTo(@NotNull PostgrePermission o) {
if (o instanceof PostgreRolePermission) {
final int res = schemaName.compareTo(((PostgreRolePermission)o).schemaName);
return res != 0 ? res : tableName.compareTo(((PostgreRolePermission)o).tableName);
}
return 0;
}
}
......@@ -17,30 +17,32 @@
*/
package org.jkiss.dbeaver.ext.postgresql.ui.editors;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.ext.postgresql.model.*;
import org.jkiss.dbeaver.ext.postgresql.model.PostgrePermission;
import org.jkiss.dbeaver.ext.postgresql.model.PostgrePermissionsOwner;
import org.jkiss.dbeaver.ext.postgresql.model.PostgreRole;
import org.jkiss.dbeaver.model.DBIcon;
import org.jkiss.dbeaver.model.DBPImage;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.load.DatabaseLoadService;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.LoadingJob;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.controls.ObjectEditorPageControl;
import org.jkiss.dbeaver.ui.controls.ProgressPageControl;
import org.jkiss.dbeaver.ui.controls.TreeContentProvider;
import org.jkiss.dbeaver.ui.controls.ViewerColumnController;
import org.jkiss.dbeaver.ui.controls.itemlist.DatabaseObjectListControl;
import org.jkiss.dbeaver.ui.editors.AbstractDatabaseObjectEditor;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.List;
/**
......@@ -54,70 +56,11 @@ public class PostgresRolePrivilegesEditor extends AbstractDatabaseObjectEditor<P
private Font boldFont;
private boolean isLoaded;
private TreeViewer permissionTable;
private ViewerColumnController columnController;
@Override
public void createPartControl(Composite parent)
{
boldFont = UIUtils.makeBoldFont(parent.getFont());
pageControl = new PageControl(parent);
final Composite contentContainer = pageControl.createContentContainer();
{
this.permissionTable = new TreeViewer(contentContainer, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
this.permissionTable.getTree().setHeaderVisible(true);
this.permissionTable.setContentProvider(new TreeContentProvider() {
@Override
public Object[] getChildren(Object parentElement) {
return null;
}
@Override
public boolean hasChildren(Object element) {
return false;
}
});
final boolean roleEditor = isRoleEditor();
columnController = new ViewerColumnController("PostgreSQL/Permissions/" + (roleEditor ? "Role" : "Object"), permissionTable);
if (roleEditor) {
columnController.addColumn("Object", "Granted object", SWT.LEFT, true, true, new ColumnLabelProvider() {
@Override
public Image getImage(Object element) {
return DBeaverIcons.getImage(DBIcon.TREE_TABLE);
}
@Override
public String getText(Object element) {
return ((PostgreRolePermission) element).getFullTableName();
}
});
} else {
columnController.addColumn("Role", "Granted role", SWT.LEFT, true, true, new ColumnLabelProvider() {
@Override
public Image getImage(Object element) {
return DBeaverIcons.getImage(DBIcon.TREE_USER);
}
@Override
public String getText(Object element) {
return ((PostgrePermission) element).toString();
}
});
}
columnController.addColumn("SELECT", "SELECT permissions", SWT.LEFT, true, true, new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return "NO";
}
});
}
columnController.createColumns(true);
pageControl.createOrSubstituteProgressPanel(getSite());
this.boldFont = UIUtils.makeBoldFont(parent.getFont());
parent.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e)
......@@ -126,6 +69,8 @@ public class PostgresRolePrivilegesEditor extends AbstractDatabaseObjectEditor<P
}
});
this.pageControl = new PageControl(parent);
this.pageControl.createOrSubstituteProgressPanel(getSite());
}
private boolean isRoleEditor() {
......@@ -143,46 +88,73 @@ public class PostgresRolePrivilegesEditor extends AbstractDatabaseObjectEditor<P
return;
}
isLoaded = true;
loadPrivileges();
}
private void loadPrivileges() {
LoadingJob.createService(
new DatabaseLoadService<List<? extends PostgrePermission>>("Load privileges", getExecutionContext()) {
@Override
public List<? extends PostgrePermission> evaluate(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
return getDatabaseObject().getPermissions(monitor);
} catch (DBException e) {
throw new InvocationTargetException(e);
}
}
},
pageControl.createPrivilegesLoadVisualizer())
.schedule();
pageControl.loadData();
}
@Override
public void refreshPart(Object source, boolean force)
{
loadPrivileges();
pageControl.loadData();
}
private class PermissionsContentProvider extends TreeContentProvider {
@Override
public Object[] getChildren(Object parentElement) {
return null;
}
@Override
public boolean hasChildren(Object element) {
return false;
}
}
private class PageControl extends ObjectEditorPageControl {
private class PageControl extends DatabaseObjectListControl<PostgrePermission> {
public PageControl(Composite parent) {
super(parent, SWT.SHEET, PostgresRolePrivilegesEditor.this);
super(parent, SWT.SHEET, getSite(), new PermissionsContentProvider());
}
public ProgressPageControl.ProgressVisualizer<List<? extends PostgrePermission>> createPrivilegesLoadVisualizer() {
return new ProgressPageControl.ProgressVisualizer<List<? extends PostgrePermission>>() {
@Override
public void completeLoading(List<? extends PostgrePermission> privs) {
super.completeLoading(privs);
permissionTable.setInput(privs);
}
};
@NotNull
@Override
protected String getListConfigId(List<Class<?>> classList) {
return "PostgreSQL/Permissions/" + (isRoleEditor() ? "Role" : "Object");
}
@Nullable
@Override
protected DBPImage getObjectImage(PostgrePermission item) {
return isRoleEditor() ? DBIcon.TREE_TABLE : DBIcon.TREE_USER;
}
@Override
protected LoadingJob<Collection<PostgrePermission>> createLoadService() {
return LoadingJob.createService(
new PermissionLoadService(),
new PermissionLoadVisualizer());
}
public class PermissionLoadVisualizer extends ObjectsLoadVisualizer {
@Override
public void completeLoading(Collection<PostgrePermission> items)
{
super.completeLoading(items);
}
}
private class PermissionLoadService extends DatabaseLoadService<Collection<PostgrePermission>> {
public PermissionLoadService() {
super("Load privileges", getExecutionContext());
}
@Override
public Collection<PostgrePermission> evaluate(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
return getDatabaseObject().getPermissions(monitor);
} catch (DBException e) {
throw new InvocationTargetException(e);
}
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册