From 1cd8bbe69348e7edeaf54e074033576f65762105 Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Sun, 15 Jan 2017 14:49:37 +0300 Subject: [PATCH] #1067 PG: role permissions panel --- .../postgresql/model/PostgrePermission.java | 46 ++++- .../model/PostgrePermissionsOwner.java | 3 +- .../ext/postgresql/model/PostgreRole.java | 12 +- .../model/PostgreRolePermission.java | 18 ++ .../editors/PostgresRolePrivilegesEditor.java | 160 ++++++++---------- 5 files changed, 128 insertions(+), 111 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgrePermission.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgrePermission.java index 91ced8d89e..59f1aedd6c 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgrePermission.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgrePermission.java @@ -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 { 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; + } + } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgrePermissionsOwner.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgrePermissionsOwner.java index 4253439c70..616ed325db 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgrePermissionsOwner.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgrePermissionsOwner.java @@ -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 getPermissions(DBRProgressMonitor monitor) throws DBException; + Collection getPermissions(DBRProgressMonitor monitor) throws DBException; } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRole.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRole.java index f1c1771d9f..c342ef4581 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRole.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRole.java @@ -213,7 +213,7 @@ public class PostgreRole implements PostgreObject, PostgrePermissionsOwner { } @Override - public List getPermissions(DBRProgressMonitor monitor) throws DBException { + public Collection 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 result = new ArrayList<>(privs.size()); + List result = new ArrayList<>(privs.size()); for (List priv : privs.values()) { result.add(new PostgreRolePermission(this, priv.get(0).getTableSchema(), priv.get(0).getTableName(), priv)); } - Collections.sort(result, new Comparator() { - @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) { diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRolePermission.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRolePermission.java index b267fe1e53..ce24d2c9f6 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRolePermission.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRolePermission.java @@ -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; + } + } diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/ui/editors/PostgresRolePrivilegesEditor.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/ui/editors/PostgresRolePrivilegesEditor.java index df07807537..d16aee2b81 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/ui/editors/PostgresRolePrivilegesEditor.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/ui/editors/PostgresRolePrivilegesEditor.java @@ -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

>("Load privileges", getExecutionContext()) { - @Override - public List 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 { public PageControl(Composite parent) { - super(parent, SWT.SHEET, PostgresRolePrivilegesEditor.this); + super(parent, SWT.SHEET, getSite(), new PermissionsContentProvider()); } - public ProgressPageControl.ProgressVisualizer> createPrivilegesLoadVisualizer() { - return new ProgressPageControl.ProgressVisualizer>() { - @Override - public void completeLoading(List privs) { - super.completeLoading(privs); - permissionTable.setInput(privs); - } - }; + @NotNull + @Override + protected String getListConfigId(List> 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> createLoadService() { + return LoadingJob.createService( + new PermissionLoadService(), + new PermissionLoadVisualizer()); + } + + public class PermissionLoadVisualizer extends ObjectsLoadVisualizer { + @Override + public void completeLoading(Collection items) + { + super.completeLoading(items); + } } + private class PermissionLoadService extends DatabaseLoadService> { + public PermissionLoadService() { + super("Load privileges", getExecutionContext()); + } + + @Override + public Collection evaluate(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + try { + return getDatabaseObject().getPermissions(monitor); + } catch (DBException e) { + throw new InvocationTargetException(e); + } + } + } } -- GitLab