Introduce Makefile for Java build
[lgpl/argeo-commons.git] / org.argeo.cms.e4 / src / org / argeo / cms / e4 / users / GroupEditor.java
index 27af13684d0ba25243acada8d9a75cb10425759a..a011c5f62c19c45fcdeca8ce4644ed732fe539f6 100644 (file)
@@ -1,54 +1,39 @@
-/*
- * Copyright (C) 2007-2012 Argeo GmbH
- *
- * 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.argeo.cms.e4.users;
 
-import static org.argeo.cms.util.UserAdminUtils.setProperty;
-import static org.argeo.naming.LdapAttrs.businessCategory;
-import static org.argeo.naming.LdapAttrs.description;
-import static org.argeo.node.NodeInstance.WORKGROUP;
+import static org.argeo.api.cms.CmsContext.WORKGROUP;
+import static org.argeo.cms.auth.UserAdminUtils.setProperty;
+import static org.argeo.util.naming.LdapAttrs.businessCategory;
+import static org.argeo.util.naming.LdapAttrs.description;
 
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.jcr.Node;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
-import javax.naming.InvalidNameException;
-import javax.naming.ldap.LdapName;
-import javax.transaction.UserTransaction;
 
-import org.argeo.cms.ArgeoNames;
-import org.argeo.cms.CmsException;
+import org.argeo.api.cms.CmsConstants;
+import org.argeo.api.cms.CmsContext;
+import org.argeo.cms.auth.UserAdminUtils;
 import org.argeo.cms.e4.users.providers.CommonNameLP;
 import org.argeo.cms.e4.users.providers.MailLP;
 import org.argeo.cms.e4.users.providers.RoleIconLP;
 import org.argeo.cms.e4.users.providers.UserFilter;
+import org.argeo.cms.jcr.CmsJcrUtils;
+import org.argeo.cms.swt.CmsSwtUtils;
 import org.argeo.cms.ui.eclipse.forms.AbstractFormPart;
 import org.argeo.cms.ui.eclipse.forms.IManagedForm;
-import org.argeo.cms.util.UserAdminUtils;
 import org.argeo.eclipse.ui.ColumnDefinition;
 import org.argeo.eclipse.ui.EclipseUiUtils;
 import org.argeo.eclipse.ui.parts.LdifUsersTable;
+import org.argeo.jcr.JcrException;
 import org.argeo.jcr.JcrUtils;
-import org.argeo.naming.LdapAttrs;
-import org.argeo.node.NodeInstance;
-import org.argeo.node.NodeUtils;
+import org.argeo.osgi.transaction.WorkTransaction;
+import org.argeo.util.naming.LdapAttrs;
 import org.eclipse.e4.ui.workbench.modeling.EPartService;
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.ToolBarManager;
@@ -64,12 +49,9 @@ import org.eclipse.swt.dnd.DropTargetEvent;
 import org.eclipse.swt.dnd.TextTransfer;
 import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Cursor;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
@@ -93,7 +75,7 @@ import org.osgi.service.useradmin.UserAdmin;
 import org.osgi.service.useradmin.UserAdminEvent;
 
 /** Display/edit main properties of a given group */
-public class GroupEditor extends AbstractRoleEditor implements ArgeoNames {
+public class GroupEditor extends AbstractRoleEditor {
        // final static String ID = "GroupEditor.mainPage";
 
        @Inject
@@ -103,9 +85,9 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames {
        @Inject
        private Repository repository;
        @Inject
-       private NodeInstance nodeInstance;
+       private CmsContext nodeInstance;
        // private final UserAdminWrapper userAdminWrapper;
-       private Session session;
+       private Session groupsSession;
 
        // public GroupMainPage(FormEditor editor, UserAdminWrapper userAdminWrapper,
        // Repository repository,
@@ -135,9 +117,9 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames {
        @Override
        protected void createUi(Composite parent) {
                try {
-                       session = repository.login();
+                       groupsSession = repository.login(CmsConstants.SRV_WORKSPACE);
                } catch (RepositoryException e) {
-                       throw new CmsException("Cannot retrieve session", e);
+                       throw new JcrException("Cannot retrieve session", e);
                }
                // ScrolledForm form = mf.getForm();
                // Composite body = form.getBody();
@@ -150,22 +132,23 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames {
                appendMembersPart(body, group);
        }
 
-       @Override
+       @PreDestroy
        public void dispose() {
-               JcrUtils.logoutQuietly(session);
+               JcrUtils.logoutQuietly(groupsSession);
                super.dispose();
        }
 
        /** Creates the general section */
        protected void appendOverviewPart(final Composite parent, final Group group) {
-               Composite body = new Composite(parent, SWT.BORDER);
+               Composite body = new Composite(parent, SWT.NONE);
                // GridLayout layout = new GridLayout(5, false);
                GridLayout layout = new GridLayout(2, false);
                body.setLayout(layout);
+               body.setLayoutData(CmsSwtUtils.fillWidth());
 
                String cn = UserAdminUtils.getProperty(group, LdapAttrs.cn.name());
                createReadOnlyLT(body, "Name", cn);
-               // Text dnTxt = createReadOnlyLT(body, "DN", group.getName());
+               createReadOnlyLT(body, "DN", group.getName());
                createReadOnlyLT(body, "Domain", UserAdminUtils.getDomainName(group));
 
                // Description
@@ -212,7 +195,7 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames {
                                // dnTxt.setText(group.getName());
                                // cnTxt.setText(UserAdminUtils.getProperty(group, LdapAttrs.cn.name()));
                                descTxt.setText(UserAdminUtils.getProperty(group, LdapAttrs.description.name()));
-                               Node workgroupHome = NodeUtils.getGroupHome(session, cn);
+                               Node workgroupHome = CmsJcrUtils.getGroupHome(groupsSession, cn);
                                if (workgroupHome == null)
                                        markAsWorkgroupLk.setText("<a>Mark as workgroup</a>");
                                else
@@ -231,23 +214,18 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames {
                                boolean confirmed = MessageDialog.openConfirm(parent.getShell(), "Mark as workgroup",
                                                "Are you sure you want to mark " + cn + " as being a workgroup? ");
                                if (confirmed) {
-                                       Node workgroupHome = NodeUtils.getGroupHome(session, cn);
+                                       Node workgroupHome = CmsJcrUtils.getGroupHome(groupsSession, cn);
                                        if (workgroupHome != null)
                                                return; // already marked as workgroup, do nothing
-                                       else
-                                               try {
-                                                       // improve transaction management
-                                                       userAdminWrapper.beginTransactionIfNeeded();
-                                                       nodeInstance.createWorkgroup(new LdapName(group.getName()));
-                                                       setProperty(group, businessCategory, WORKGROUP);
-                                                       userAdminWrapper.commitOrNotifyTransactionStateChange();
-                                                       userAdminWrapper
-                                                                       .notifyListeners(new UserAdminEvent(null, UserAdminEvent.ROLE_CHANGED, group));
-                                                       part.refresh();
-                                               } catch (InvalidNameException e1) {
-                                                       throw new CmsException("Cannot create Workgroup for " + group.toString(), e1);
-                                               }
-
+                                       else {
+                                               // improve transaction management
+                                               userAdminWrapper.beginTransactionIfNeeded();
+                                               nodeInstance.createWorkgroup(group.getName());
+                                               setProperty(group, businessCategory, WORKGROUP);
+                                               userAdminWrapper.commitOrNotifyTransactionStateChange();
+                                               userAdminWrapper.notifyListeners(new UserAdminEvent(null, UserAdminEvent.ROLE_CHANGED, group));
+                                               part.refresh();
+                                       }
                                }
                        }
                });
@@ -263,20 +241,11 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames {
                // section.setText("Members");
                // section.setLayoutData(EclipseUiUtils.fillAll());
 
-               Composite body = new Composite(parent, SWT.NO_FOCUS);
-               body.setLayout(EclipseUiUtils.noSpaceGridLayout());
+               Composite body = new Composite(parent, SWT.BORDER);
+               body.setLayout(new GridLayout());
                // section.setClient(body);
                body.setLayoutData(EclipseUiUtils.fillAll());
 
-               LdifUsersTable userTableViewerCmp = createMemberPart(body, group);
-
-               AbstractFormPart part = new GroupMembersPart(userTableViewerCmp);
-               getManagedForm().addPart(part);
-               addRemoveAbitily(body, userTableViewerCmp.getTableViewer(), group);
-       }
-
-       private LdifUsersTable createMemberPart(Composite parent, Group group) {
-
                // Define the displayed columns
                List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
                columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 0, 24));
@@ -286,7 +255,7 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames {
                // 240));
 
                // Create and configure the table
-               LdifUsersTable userViewerCmp = new MyUserTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL,
+               LdifUsersTable userViewerCmp = new MyUserTableViewer(body, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL,
                                userAdminWrapper.getUserAdmin());
 
                userViewerCmp.setColumnDefinitions(columnDefs);
@@ -301,9 +270,57 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames {
                userViewer.addDropSupport(operations, tt,
                                new GroupDropListener(userAdminWrapper, userViewerCmp, (Group) getDisplayedUser()));
 
-               return userViewerCmp;
+               AbstractFormPart part = new GroupMembersPart(userViewerCmp);
+               getManagedForm().addPart(part);
+
+               // remove button
+               // addRemoveAbility(toolBarManager, userViewerCmp.getTableViewer(), group);
+               Action action = new RemoveMembershipAction(userViewer, group, "Remove selected items from this group",
+                               SecurityAdminImages.ICON_REMOVE_DESC);
+
+               ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
+               ToolBar toolBar = toolBarManager.createControl(body);
+               toolBar.setLayoutData(CmsSwtUtils.fillWidth());
+
+               toolBarManager.add(action);
+               toolBarManager.update(true);
+
        }
 
+       // private LdifUsersTable createMemberPart(Composite parent, Group group) {
+       //
+       // // Define the displayed columns
+       // List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
+       // columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 0, 24));
+       // columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Name", 150));
+       // columnDefs.add(new ColumnDefinition(new MailLP(), "Mail", 150));
+       // // columnDefs.add(new ColumnDefinition(new UserNameLP(), "Distinguished
+       // Name",
+       // // 240));
+       //
+       // // Create and configure the table
+       // LdifUsersTable userViewerCmp = new MyUserTableViewer(parent, SWT.MULTI |
+       // SWT.H_SCROLL | SWT.V_SCROLL,
+       // userAdminWrapper.getUserAdmin());
+       //
+       // userViewerCmp.setColumnDefinitions(columnDefs);
+       // userViewerCmp.populate(true, false);
+       // userViewerCmp.setLayoutData(EclipseUiUtils.fillAll());
+       //
+       // // Controllers
+       // TableViewer userViewer = userViewerCmp.getTableViewer();
+       // userViewer.addDoubleClickListener(new
+       // UserTableDefaultDClickListener(partService));
+       // int operations = DND.DROP_COPY | DND.DROP_MOVE;
+       // Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
+       // userViewer.addDropSupport(operations, tt,
+       // new GroupDropListener(userAdminWrapper, userViewerCmp, (Group)
+       // getDisplayedUser()));
+       //
+       // // userViewerCmp.refresh();
+       // return userViewerCmp;
+       // }
+
        // Local viewers
        private class MyUserTableViewer extends LdifUsersTable {
                private static final long serialVersionUID = 8467999509931900367L;
@@ -332,28 +349,32 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames {
                }
        }
 
-       private void addRemoveAbitily(Composite parent, TableViewer userViewer, Group group) {
-               // Section section = sectionPart.getSection();
-               ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
-               ToolBar toolbar = toolBarManager.createControl(parent);
-               final Cursor handCursor = new Cursor(parent.getDisplay(), SWT.CURSOR_HAND);
-               toolbar.setCursor(handCursor);
-               toolbar.addDisposeListener(new DisposeListener() {
-                       private static final long serialVersionUID = 3882131405820522925L;
-
-                       public void widgetDisposed(DisposeEvent e) {
-                               if ((handCursor != null) && (handCursor.isDisposed() == false)) {
-                                       handCursor.dispose();
-                               }
-                       }
-               });
-
-               Action action = new RemoveMembershipAction(userViewer, group, "Remove selected items from this group",
-                               SecurityAdminImages.ICON_REMOVE_DESC);
-               toolBarManager.add(action);
-               toolBarManager.update(true);
-               // section.setTextClient(toolbar);
-       }
+       // private void addRemoveAbility(ToolBarManager toolBarManager, TableViewer
+       // userViewer, Group group) {
+       // // Section section = sectionPart.getSection();
+       // // ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
+       // // ToolBar toolbar = toolBarManager.createControl(parent);
+       // // ToolBar toolbar = toolBarManager.getControl();
+       // // final Cursor handCursor = new Cursor(toolbar.getDisplay(),
+       // SWT.CURSOR_HAND);
+       // // toolbar.setCursor(handCursor);
+       // // toolbar.addDisposeListener(new DisposeListener() {
+       // // private static final long serialVersionUID = 3882131405820522925L;
+       // //
+       // // public void widgetDisposed(DisposeEvent e) {
+       // // if ((handCursor != null) && (handCursor.isDisposed() == false)) {
+       // // handCursor.dispose();
+       // // }
+       // // }
+       // // });
+       //
+       // Action action = new RemoveMembershipAction(userViewer, group, "Remove
+       // selected items from this group",
+       // SecurityAdminImages.ICON_REMOVE_DESC);
+       // toolBarManager.add(action);
+       // toolBarManager.update(true);
+       // // section.setTextClient(toolbar);
+       // }
 
        private class RemoveMembershipAction extends Action {
                private static final long serialVersionUID = -1337713097184522588L;
@@ -486,14 +507,15 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames {
                                userAdminWrapper.notifyListeners(new UserAdminEvent(null, UserAdminEvent.ROLE_CHANGED, myGroup));
                        } else if (role.getType() == Role.USER) {
                                // TODO check if the group is already member of this group
-                               UserTransaction transaction = userAdminWrapper.beginTransactionIfNeeded();
+                               WorkTransaction transaction = userAdminWrapper.beginTransactionIfNeeded();
                                User user = (User) role;
                                myGroup.addMember(user);
                                if (UserAdminWrapper.COMMIT_ON_SAVE)
                                        try {
                                                transaction.commit();
                                        } catch (Exception e) {
-                                               throw new CmsException("Cannot commit transaction " + "after user group membership update", e);
+                                               throw new IllegalStateException(
+                                                               "Cannot commit transaction " + "after user group membership update", e);
                                        }
                                userAdminWrapper.notifyListeners(new UserAdminEvent(null, UserAdminEvent.ROLE_CHANGED, myGroup));
                        }
@@ -525,7 +547,7 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames {
        // lbl.setFont(EclipseUiUtils.getBoldFont(parent));
        // Text text = toolkit.createText(parent, value, SWT.BORDER);
        // text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-       // CmsUtils.style(text, CmsWorkbenchStyles.WORKBENCH_FORM_TEXT);
+       // CmsUiUtils.style(text, CmsWorkbenchStyles.WORKBENCH_FORM_TEXT);
        // return text;
        // }
        //
@@ -537,7 +559,7 @@ public class GroupEditor extends AbstractRoleEditor implements ArgeoNames {
        // Text text = toolkit.createText(parent, value, SWT.NONE);
        // text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        // text.setEditable(false);
-       // CmsUtils.style(text, CmsWorkbenchStyles.WORKBENCH_FORM_TEXT);
+       // CmsUiUtils.style(text, CmsWorkbenchStyles.WORKBENCH_FORM_TEXT);
        // return text;
        // }