-package org.argeo.cms.users;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.security.AccessControlManager;
-import javax.jcr.security.Privilege;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.ArgeoException;
-import org.argeo.cms.CmsUiProvider;
-import org.argeo.cms.maintenance.NonAdminPage;
-import org.argeo.cms.util.CmsUtils;
-import org.argeo.eclipse.ui.parts.UsersTable;
-import org.argeo.jcr.ArgeoNames;
-import org.argeo.jcr.JcrUtils;
-import org.argeo.security.UserAdminService;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.springframework.security.provisioning.UserDetailsManager;
-
-/**
- * Simple page to manage users of a given repository. We still rely on Argeo
- * model; with user stored in the main workspace
- */
-public class Users implements CmsUiProvider {
-
- private final static Log log = LogFactory.getLog(Users.class);
-
- // Enable user CRUD // INJECTED
- private UserAdminService userAdminService;
- // private UserDetailsManager userDetailsManager;
- private String userWkspName;
-
- // Local UI Providers
- NonAdminPage nap = new NonAdminPage();
- UserPage userPage = new UserPage();
-
- // Manage authorization
- @Override
- public Control createUi(Composite parent, Node context)
- throws RepositoryException {
- if (isAdmin(context)) {
- Session session = context.getSession().getRepository()
- .login(userWkspName);
- return createMainLayout(parent, session);
- } else
- nap.createUi(parent, context);
- return null;
- }
-
- // Main layout
- // Left: User Table - Right User Details Edition
- private Control createMainLayout(Composite parent, final Session session)
- throws RepositoryException {
-
- Composite layoutCmp = new Composite(parent, SWT.NO_FOCUS);
- layoutCmp.setLayoutData(CmsUtils.fillAll());
- layoutCmp
- .setLayout(CmsUtils.noSpaceGridLayout(new GridLayout(2, true)));
-
- Composite left = new Composite(layoutCmp, SWT.NO_FOCUS);
- left.setLayoutData(CmsUtils.fillAll());
- UsersTable table = createUsersTable(left, session);
-
- final Composite right = new Composite(layoutCmp, SWT.NO_FOCUS);
- right.setLayoutData(CmsUtils.fillAll());
- // Composite innerPage = createUserPage(right);
- // final UserViewerOld userViewer = new UserViewerOld(innerPage);
-
- final TableViewer viewer = table.getTableViewer();
- viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
- @Override
- public void selectionChanged(SelectionChangedEvent event) {
- IStructuredSelection selection = (IStructuredSelection) viewer
- .getSelection();
- if (selection.isEmpty()) {
- // Should we clean the right column?
- return;
- } else {
- Node context = (Node) selection.getFirstElement();
- try {
- CmsUtils.clear(right);
- userPage.createUi(right, context);
- right.layout();
- right.getParent().layout();
- } catch (RepositoryException e) {
- e.printStackTrace();
- throw new ArgeoException("unable to create "
- + "editor for user " + context, e);
- }
- }
- }
- });
- return left;
- }
-
- private UsersTable createUsersTable(Composite parent, final Session session)
- throws RepositoryException {
- parent.setLayout(CmsUtils.noSpaceGridLayout());
-
- // Add user CRUD buttons
- Composite buttonCmp = new Composite(parent, SWT.NO_FOCUS);
- buttonCmp.setLayoutData(CmsUtils.fillWidth());
- buttonCmp.setLayout(new GridLayout(2, false));
- // Delete
- final Button deleteBtn = new Button(buttonCmp, SWT.PUSH);
- deleteBtn.setText("Delete selected");
- deleteBtn
- .setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false));
-
- // Add
- final Button addBtn = new Button(buttonCmp, SWT.PUSH);
- addBtn.setText("Create");
-
- // Create the composite that displays the list and a filter
- final UsersTable userTableCmp = new UsersTable(parent, SWT.NO_FOCUS,
- session);
- userTableCmp.populate(true, false);
- userTableCmp.setLayoutData(CmsUtils.fillAll());
-
- // The various listeners
- userTableCmp.addDisposeListener(new DisposeListener() {
- private static final long serialVersionUID = -8854052549807709846L;
-
- @Override
- public void widgetDisposed(DisposeEvent event) {
- JcrUtils.logoutQuietly(session);
- }
- });
-
- deleteBtn.addSelectionListener(new SelectionAdapter() {
- private static final long serialVersionUID = -7340611909297995666L;
-
- @Override
- public void widgetSelected(SelectionEvent e) {
-
- TableViewer viewer = userTableCmp.getTableViewer();
- ISelection selection = viewer.getSelection();
- if (selection.isEmpty())
- return;
-
- Map<String, Node> toDelete = new TreeMap<String, Node>();
- @SuppressWarnings("unchecked")
- Iterator<Node> it = ((IStructuredSelection) selection)
- .iterator();
- nodes: while (it.hasNext()) {
- Node profileNode = it.next();
- try {
- String userName = profileNode.getProperty(
- ArgeoNames.ARGEO_USER_ID).getString();
- if (userName.equals(profileNode.getSession()
- .getUserID())) {
- log.warn("Cannot delete its own user: " + userName);
- continue nodes;
- }
- toDelete.put(userName, profileNode);
- } catch (RepositoryException re) {
- log.warn("Cannot interpred user " + profileNode);
- }
- }
-
- if (!MessageDialog.openQuestion(
- userTableCmp.getShell(),
- "Delete User",
- "Are you sure that you want to delete users "
- + toDelete.keySet()
- + "?\n"
- + "This may lead to inconsistencies in the application."))
- return;
-
- for (String username : toDelete.keySet()) {
- Session session = null;
- try {
- Node profileNode = toDelete.get(username);
- userAdminService.deleteUser(username);
- profileNode.getParent().remove();
- session = profileNode.getSession();
- session.save();
- } catch (RepositoryException re) {
- JcrUtils.discardQuietly(session);
- throw new ArgeoException("Cannot list users", re);
- }
- }
- userTableCmp.refresh();
- }
- });
-
- addBtn.addSelectionListener(new SelectionAdapter() {
- private static final long serialVersionUID = 9214984636836267786L;
-
- @Override
- public void widgetSelected(SelectionEvent e) {
- NewUserWizard newUserWizard = new NewUserWizard(session,
- userAdminService);
- WizardDialog dialog = new WizardDialog(addBtn.getShell(),
- newUserWizard);
- if (dialog.open() == Dialog.OK)
- userTableCmp.refresh();
- }
- });
-
- // 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);
-
- return userTableCmp;
- }
-
- // protected Composite createUserPage(Composite parent) {
- // parent.setLayout(CmsUtils.noSpaceGridLayout());
- // ScrolledPage scrolled = new ScrolledPage(parent, SWT.NONE);
- // scrolled.setLayoutData(CmsUtils.fillAll());
- // scrolled.setLayout(CmsUtils.noSpaceGridLayout());
- // // TODO manage style
- // // CmsUtils.style(scrolled, "maintenance_user_form");
- //
- // Composite page = new Composite(scrolled, SWT.NONE);
- // page.setLayout(CmsUtils.noSpaceGridLayout());
- // page.setBackgroundMode(SWT.INHERIT_NONE);
- //
- // return page;
- // }
-
- private boolean isAdmin(Node node) throws RepositoryException {
- // FIXME clean this once new user management policy has been
- // implemented.
- AccessControlManager acm = node.getSession().getAccessControlManager();
- Privilege[] privs = new Privilege[1];
- privs[0] = acm.privilegeFromName(Privilege.JCR_ALL);
- return acm.hasPrivileges("/", privs);
- }
-
- // @Override
- // public void dispose() {
- // JcrUtils.removeListenerQuietly(session, userStructureListener);
- // JcrUtils.removeListenerQuietly(session, userPropertiesListener);
- // JcrUtils.logoutQuietly(session);
- // super.dispose();
- // }
- //
- // // public void setSession(Session session) {
- // // this.session = session;
- // // }
- //
- // public void refresh() {
- // this.getSite().getShell().getDisplay().asyncExec(new Runnable() {
- // @Override
- // public void run() {
- // userTableCmp.refresh();
- // }
- // });
- // }
- //
- // 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);
- // }
- // }
- // }
-
- /* DEPENDENCY INJECTION */
- public void setWorkspaceName(String workspaceName) {
- this.userWkspName = workspaceName;
- }
-
- public void setUserAdminService(UserAdminService userAdminService) {
- this.userAdminService = userAdminService;
- userPage.setUserAdminService(userAdminService);
- }
-
- public void setUserDetailsManager(UserDetailsManager userDetailsManager) {
- // this.userDetailsManager = userDetailsManager;
- // userPage.setUserDetailsManager(userDetailsManager);
- }
-}
\ No newline at end of file