X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.security.ui.admin%2Fsrc%2Forg%2Fargeo%2Fsecurity%2Fui%2Fadmin%2Fviews%2FUsersView.java;fp=org.argeo.security.ui.admin%2Fsrc%2Forg%2Fargeo%2Fsecurity%2Fui%2Fadmin%2Fviews%2FUsersView.java;h=73f6a19d6f1417315ef98da5fbc1105e4ae5fd9f;hb=dd3d0d60b62c99810eca8619a376b66dbca5e44d;hp=ac979240183a07825c56be5e7dd91b746cd5f5a5;hpb=40c3800ea57d5de136137e3fb0ff07cf54f2df48;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java index ac9792401..73f6a19d6 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java @@ -15,144 +15,315 @@ */ package org.argeo.security.ui.admin.views; -import javax.jcr.Node; -import javax.jcr.Repository; -import javax.jcr.RepositoryException; -import javax.jcr.Session; -import javax.jcr.observation.Event; -import javax.jcr.observation.EventIterator; -import javax.jcr.observation.EventListener; +import java.util.ArrayList; +import java.util.List; import org.argeo.ArgeoException; -import org.argeo.eclipse.ui.parts.UsersTable; -import org.argeo.eclipse.ui.workbench.CommandUtils; -import org.argeo.jcr.ArgeoJcrConstants; +import org.argeo.eclipse.ui.EclipseUiUtils; +import org.argeo.eclipse.ui.utils.ViewerUtils; import org.argeo.jcr.ArgeoNames; -import org.argeo.jcr.ArgeoTypes; -import org.argeo.jcr.JcrUtils; import org.argeo.security.ui.admin.SecurityAdminPlugin; -import org.argeo.security.ui.admin.commands.OpenArgeoUserEditor; +import org.argeo.security.ui.admin.editors.UserEditor; +import org.argeo.security.ui.admin.editors.UserEditorInput; +import org.eclipse.jface.layout.TableColumnLayout; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.ViewPart; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.service.useradmin.Role; +import org.osgi.service.useradmin.User; +import org.osgi.service.useradmin.UserAdmin; -/** List all users with filter. */ +/** List all users with filter - based on Ldif userAdmin */ public class UsersView extends ViewPart implements ArgeoNames { public final static String ID = SecurityAdminPlugin.PLUGIN_ID - + ".adminUsersView"; + + ".usersView"; /* DEPENDENCY INJECTION */ - private Session session; + private UserAdmin userAdmin; - private UsersTable userTableCmp; - private JcrUserListener userStructureListener; - private JcrUserListener userPropertiesListener; + // UI Objects + private TableViewer usersViewer; + private Text filterTxt; + private Font italic; + private Font bold; - @Override - public void createPartControl(Composite parent) { - parent.setLayout(new FillLayout()); - - // Create the composite that displays the list and a filter - userTableCmp = new UsersTable(parent, SWT.NO_FOCUS, session); - userTableCmp.populate(true, false); + // The displayed columns + /** Overwrite to display other columns */ + public List getColumnsDef() { + List columnDefs = new ArrayList(); - // Configure - userTableCmp.getTableViewer().addDoubleClickListener( - new ViewDoubleClickListener()); - getViewSite().setSelectionProvider(userTableCmp.getTableViewer()); - - // Add listener to refresh the list when something changes - userStructureListener = new JcrUserListener(getSite().getShell() - .getDisplay()); - JcrUtils.addListener(session, userStructureListener, Event.NODE_ADDED - | Event.NODE_REMOVED, ArgeoJcrConstants.PEOPLE_BASE_PATH, null); - userPropertiesListener = new JcrUserListener(getSite().getShell() - .getDisplay()); - JcrUtils.addListener(session, userStructureListener, - Event.PROPERTY_CHANGED | Event.PROPERTY_ADDED - | Event.PROPERTY_REMOVED, - ArgeoJcrConstants.PEOPLE_BASE_PATH, - ArgeoTypes.ARGEO_USER_PROFILE); + // User ID + columnDefs.add(new ColumnDefinition(new UserNameLP(), + "Distinguished Name", 200)); + // Displayed name + columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name", + 150)); + // E-mail + columnDefs.add(new ColumnDefinition(new MailLP(), "E-mail", 150)); + return columnDefs; } @Override public void setFocus() { - userTableCmp.setFocus(); + // TODO Auto-generated method stub } - @Override - public void dispose() { - JcrUtils.removeListenerQuietly(session, userStructureListener); - JcrUtils.removeListenerQuietly(session, userPropertiesListener); - JcrUtils.logoutQuietly(session); - super.dispose(); + protected Viewer getViewer() { + return usersViewer; } - // public void setSession(Session session) { - // this.session = session; - // } + @Override + public void createPartControl(Composite parent) { + // cache UI Objects + italic = EclipseUiUtils.getItalicFont(parent); + bold = EclipseUiUtils.getBoldFont(parent); + + // Main Layout + GridLayout layout = EclipseUiUtils.noSpaceGridLayout(); + layout.verticalSpacing = 5; + parent.setLayout(layout); + + usersViewer = createTableViewer(parent); + usersViewer.setContentProvider(new UsersContentProvider()); + + // Really? + refreshFilteredList(null); + + // Configure + usersViewer.addDoubleClickListener(new ViewDoubleClickListener()); + getViewSite().setSelectionProvider(usersViewer); + } public void refresh() { this.getSite().getShell().getDisplay().asyncExec(new Runnable() { @Override public void run() { - userTableCmp.refresh(); + refreshFilteredList(null); } }); } - private class JcrUserListener implements EventListener { - private final Display display; - - public JcrUserListener(Display display) { - super(); - this.display = display; - } - - @Override - public void onEvent(EventIterator events) { - display.asyncExec(new Runnable() { - @Override - public void run() { - userTableCmp.refresh(); - } - }); - } - } - class ViewDoubleClickListener implements IDoubleClickListener { public void doubleClick(DoubleClickEvent evt) { if (evt.getSelection().isEmpty()) return; - Object obj = ((IStructuredSelection) evt.getSelection()) .getFirstElement(); - if (obj instanceof Node) { - try { - String username = ((Node) obj).getProperty(ARGEO_USER_ID) - .getString(); - String commandId = OpenArgeoUserEditor.COMMAND_ID; - String paramName = OpenArgeoUserEditor.PARAM_USERNAME; - CommandUtils.callCommand(commandId, paramName, username); - } catch (RepositoryException e) { - throw new ArgeoException("Cannot open user editor", e); - } + User user = (User) obj; + IWorkbenchWindow iww = UsersView.this.getSite() + .getWorkbenchWindow(); + IWorkbenchPage iwp = iww.getActivePage(); + UserEditorInput uei = new UserEditorInput(user.getName()); + + try { + // IEditorPart editor = + iwp.openEditor(uei, UserEditor.ID); + } catch (PartInitException pie) { + throw new ArgeoException("Unable to open UserEditor for " + + user, pie); } } } - /* DEPENDENCY INJECTION */ - public void setRepository(Repository repository) { + private TableViewer createTableViewer(final Composite parent) { + int style = SWT.H_SCROLL | SWT.V_SCROLL; + + Composite tableCmp = new Composite(parent, SWT.NO_FOCUS); + tableCmp.setLayoutData(EclipseUiUtils.fillAll()); + + Table table = new Table(tableCmp, style); + TableViewer viewer = new TableViewer(table); + table.setLinesVisible(true); + table.setHeaderVisible(true); + + TableColumnLayout tableColumnLayout = new TableColumnLayout(); + TableViewerColumn column; + + // Create other columns + List colDefs = getColumnsDef(); + for (ColumnDefinition colDef : colDefs) { + column = ViewerUtils.createTableViewerColumn(viewer, colDef.label, + SWT.NONE, colDef.weight); + column.setLabelProvider(colDef.provider); + tableColumnLayout.setColumnData(column.getColumn(), + new ColumnWeightData(colDef.weight, colDef.minWidth, true)); + } + + tableCmp.setLayout(tableColumnLayout); + return viewer; + } + + @Override + public void dispose() { + super.dispose(); + } + + private class UsersContentProvider implements IStructuredContentProvider { + private static final long serialVersionUID = 1L; + + public Object[] getElements(Object inputElement) { + return (Object[]) inputElement; + } + + public void dispose() { + } + + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + } + + // /* MANAGE FILTER */ + // private void createFilterPart(Composite parent) { + // // Text Area for the filter + // filterTxt = new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH + // | SWT.ICON_CANCEL); + // filterTxt.setMessage(filterHelpMsg); + // filterTxt.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL + // | GridData.HORIZONTAL_ALIGN_FILL)); + // filterTxt.addModifyListener(new ModifyListener() { + // private static final long serialVersionUID = 1L; + // + // public void modifyText(ModifyEvent event) { + // refreshFilteredList(); + // } + // }); + // } + + /** + * Refresh the user list: caller might overwrite in order to display a + * subset of all users, typically to remove current user from the list + */ + protected void refreshFilteredList(String filter) { try { - session = repository.login(); - } catch (RepositoryException re) { - throw new ArgeoException("Unable to initialise local session", re); + Role[] roles = userAdmin.getRoles(filter); + List users = new ArrayList(); + for (Role role : roles) + if (role.getType() == Role.USER && role.getType() != Role.GROUP) + users.add((User) role); + usersViewer.setInput(users.toArray()); + } catch (InvalidSyntaxException e) { + throw new ArgeoException("Unable to get roles with filter: " + + filter, e); + } + } + + // Local helpers + + private abstract class UseradminAbstractLP extends ColumnLabelProvider { + private static final long serialVersionUID = 137336765024922368L; + + @Override + public Font getFont(Object element) { + // TODO manage fonts + // // self + // String username = getProperty(elem, ARGEO_USER_ID); + // if (username.equals(session.getUserID())) + // return bold; + // // disabled + // try { + // Node userProfile = (Node) elem; + // if (!userProfile.getProperty(ARGEO_ENABLED).getBoolean()) + // return italic; + // else + // return null; + // } catch (RepositoryException e) { + // throw new ArgeoException("Cannot get font for " + username, e); + // } + // } + + return super.getFont(element); + } + + @Override + public String getText(Object element) { + User user = (User) element; + return getText(user); + } + + public abstract String getText(User user); + } + + private class UserNameLP extends UseradminAbstractLP { + private static final long serialVersionUID = 6550449442061090388L; + + @Override + public String getText(User user) { + return user.getName(); } } + private class CommonNameLP extends UseradminAbstractLP { + private static final long serialVersionUID = 5256703081044911941L; + + @Override + public String getText(User user) { + Object obj = user.getProperties().get("cn"); + if (obj != null) + return (String) obj; + else + return ""; + } + } + + private class MailLP extends UseradminAbstractLP { + private static final long serialVersionUID = 8329764452141982707L; + + @Override + public String getText(User user) { + Object obj = user.getProperties().get("mail"); + if (obj != null) + return (String) obj; + else + return ""; + } + } + + protected class ColumnDefinition { + protected ColumnLabelProvider provider; + protected String label; + protected int weight; + protected int minWidth; + + // public ColumnDefinition(ColumnLabelProvider provider, String label, + // int weight, int minimumWidth) { + // this.provider = provider; + // this.label = label; + // this.weight = weight; + // this.minWidth = minimumWidth; + // } + + public ColumnDefinition(ColumnLabelProvider provider, String label, + int weight) { + this.provider = provider; + this.label = label; + this.weight = weight; + this.minWidth = weight; + } + } + + protected UserAdmin userAdmin() { + return userAdmin; + } + + /* DEPENDENCY INJECTION */ + public void setUserAdmin(UserAdmin userAdmin) { + this.userAdmin = userAdmin; + } } \ No newline at end of file