Improve and simplify OSGi Boot
[lgpl/argeo-commons.git] / org.argeo.security.ui.admin / src / org / argeo / security / ui / admin / internal / commands / NewGroup.java
index b52bf9955e8d63bbd29d42d72f418c55882a8541..75b9b0b33e4e52e06d675014c644d096a42c0d2e 100644 (file)
 package org.argeo.security.ui.admin.internal.commands;
 
 import java.util.Dictionary;
-import java.util.List;
+import java.util.Map;
 
-import org.argeo.ArgeoException;
+import org.argeo.cms.CmsException;
 import org.argeo.eclipse.ui.EclipseUiUtils;
 import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
 import org.argeo.jcr.ArgeoNames;
+import org.argeo.osgi.useradmin.LdifName;
+import org.argeo.osgi.useradmin.UserAdminConf;
 import org.argeo.security.ui.admin.SecurityAdminPlugin;
-import org.argeo.security.ui.admin.internal.UiAdminUtils;
-import org.argeo.security.ui.admin.internal.UserAdminConstants;
 import org.argeo.security.ui.admin.internal.UserAdminWrapper;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
@@ -33,8 +33,8 @@ import org.eclipse.jface.wizard.Wizard;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Combo;
@@ -44,32 +44,30 @@ import org.eclipse.swt.widgets.Text;
 import org.eclipse.ui.handlers.HandlerUtil;
 import org.osgi.service.useradmin.Group;
 import org.osgi.service.useradmin.Role;
-import org.osgi.service.useradmin.UserAdmin;
 import org.osgi.service.useradmin.UserAdminEvent;
 
-/** Create a new group. */
+/** Create a new group */
 public class NewGroup extends AbstractHandler {
        public final static String ID = SecurityAdminPlugin.PLUGIN_ID + ".newGroup";
 
        /* DEPENDENCY INJECTION */
        private UserAdminWrapper userAdminWrapper;
-       private UserAdmin userAdmin;
 
        public Object execute(ExecutionEvent event) throws ExecutionException {
                NewGroupWizard newGroupWizard = new NewGroupWizard();
+               newGroupWizard.setWindowTitle("Group creation");
                WizardDialog dialog = new WizardDialog(
                                HandlerUtil.getActiveShell(event), newGroupWizard);
-               dialog.setTitle("Create a new group");
                dialog.open();
                return null;
        }
 
        private class NewGroupWizard extends Wizard {
 
-               // pages
+               // Pages
                private MainGroupInfoWizardPage mainGroupInfo;
 
-               // End user fields
+               // UI fields
                private Text dNameTxt, commonNameTxt, descriptionTxt;
                private Combo baseDnCmb;
 
@@ -80,9 +78,6 @@ public class NewGroup extends AbstractHandler {
                public void addPages() {
                        mainGroupInfo = new MainGroupInfoWizardPage();
                        addPage(mainGroupInfo);
-
-                       setWindowTitle("Create a new group");
-                       // mainGroupInfo.setMessage(message, WizardPage.WARNING);
                }
 
                @SuppressWarnings({ "rawtypes", "unchecked" })
@@ -93,12 +88,14 @@ public class NewGroup extends AbstractHandler {
                        String commonName = commonNameTxt.getText();
                        try {
                                userAdminWrapper.beginTransactionIfNeeded();
-                               Group group = (Group) userAdmin.createRole(getDn(commonName),
-                                               Role.GROUP);
+                               String dn = getDn(commonName);
+                               Group group = (Group) userAdminWrapper.getUserAdmin()
+                                               .createRole(dn, Role.GROUP);
                                Dictionary props = group.getProperties();
                                String descStr = descriptionTxt.getText();
-                               if (UiAdminUtils.notNull(descStr))
-                                       props.put(UserAdminConstants.KEY_DESC, descStr);
+                               if (EclipseUiUtils.notEmpty(descStr))
+                                       props.put(LdifName.description.name(), descStr);
+                               userAdminWrapper.commitOrNotifyTransactionStateChange();
                                userAdminWrapper.notifyListeners(new UserAdminEvent(null,
                                                UserAdminEvent.ROLE_CREATED, group));
                                return true;
@@ -109,50 +106,34 @@ public class NewGroup extends AbstractHandler {
                }
 
                private class MainGroupInfoWizardPage extends WizardPage implements
-                               ModifyListener, ArgeoNames {
+                               FocusListener, ArgeoNames {
                        private static final long serialVersionUID = -3150193365151601807L;
 
                        public MainGroupInfoWizardPage() {
                                super("Main");
                                setTitle("General information");
-                               setMessage("Please provide a common name and a free description");
+                               setMessage("Please choose a domain, provide a common name "
+                                               + "and a free description");
                        }
 
                        @Override
                        public void createControl(Composite parent) {
                                Composite bodyCmp = new Composite(parent, SWT.NONE);
+                               setControl(bodyCmp);
                                bodyCmp.setLayout(new GridLayout(2, false));
+
                                dNameTxt = EclipseUiUtils.createGridLT(bodyCmp,
-                                               "Distinguished name", this);
+                                               "Distinguished name");
                                dNameTxt.setEnabled(false);
 
-                               baseDnCmb = createGridLC(bodyCmp, "Base DN", this);
+                               baseDnCmb = createGridLC(bodyCmp, "Base DN");
+                               // Initialise before adding the listener to avoid NPE
                                initialiseDnCmb(baseDnCmb);
-                               baseDnCmb.addModifyListener(new ModifyListener() {
-                                       private static final long serialVersionUID = -1435351236582736843L;
-
-                                       @Override
-                                       public void modifyText(ModifyEvent event) {
-                                               String name = commonNameTxt.getText();
-                                               dNameTxt.setText(getDn(name));
-                                       }
-                               });
+                               baseDnCmb.addFocusListener(this);
 
                                commonNameTxt = EclipseUiUtils.createGridLT(bodyCmp,
-                                               "Common name", this);
-                               commonNameTxt.addModifyListener(new ModifyListener() {
-                                       private static final long serialVersionUID = -1435351236582736843L;
-
-                                       @Override
-                                       public void modifyText(ModifyEvent event) {
-                                               String name = commonNameTxt.getText();
-                                               if (name.trim().equals("")) {
-                                                       dNameTxt.setText("");
-                                               } else {
-                                                       dNameTxt.setText(getDn(name));
-                                               }
-                                       }
-                               });
+                                               "Common name");
+                               commonNameTxt.addFocusListener(this);
 
                                Label descLbl = new Label(bodyCmp, SWT.LEAD);
                                descLbl.setText("Description");
@@ -161,9 +142,7 @@ public class NewGroup extends AbstractHandler {
                                descriptionTxt = new Text(bodyCmp, SWT.LEAD | SWT.MULTI
                                                | SWT.WRAP | SWT.BORDER);
                                descriptionTxt.setLayoutData(EclipseUiUtils.fillAll());
-                               descriptionTxt.addModifyListener(this);
-
-                               setControl(bodyCmp);
+                               descriptionTxt.addFocusListener(this);
 
                                // Initialize buttons
                                setPageComplete(false);
@@ -171,7 +150,13 @@ public class NewGroup extends AbstractHandler {
                        }
 
                        @Override
-                       public void modifyText(ModifyEvent event) {
+                       public void focusLost(FocusEvent event) {
+                               String name = commonNameTxt.getText();
+                               if (EclipseUiUtils.isEmpty(name))
+                                       dNameTxt.setText("");
+                               else
+                                       dNameTxt.setText(getDn(name));
+
                                String message = checkComplete();
                                if (message != null) {
                                        setMessage(message, WizardPage.ERROR);
@@ -183,13 +168,18 @@ public class NewGroup extends AbstractHandler {
                                getContainer().updateButtons();
                        }
 
-                       /** @return error message or null if complete */
+                       @Override
+                       public void focusGained(FocusEvent event) {
+                       }
+
+                       /** @return the error message or null if complete */
                        protected String checkComplete() {
                                String name = commonNameTxt.getText();
 
                                if (name.trim().equals(""))
                                        return "Common name must not be empty";
-                               Role role = userAdmin.getRole(getDn(name));
+                               Role role = userAdminWrapper.getUserAdmin()
+                                               .getRole(getDn(name));
                                if (role != null)
                                        return "Group " + name + " already exists";
                                return null;
@@ -199,40 +189,52 @@ public class NewGroup extends AbstractHandler {
                        public void setVisible(boolean visible) {
                                super.setVisible(visible);
                                if (visible)
-                                       commonNameTxt.setFocus();
+                                       if (baseDnCmb.getSelectionIndex() == -1)
+                                               baseDnCmb.setFocus();
+                                       else
+                                               commonNameTxt.setFocus();
                        }
                }
 
+               private Map<String, String> getDns() {
+                       return userAdminWrapper.getKnownBaseDns(true);
+               }
+
                private String getDn(String cn) {
-                       return "cn=" + cn + ",ou=groups," + baseDnCmb.getText();
+                       Map<String, String> dns = getDns();
+                       String bdn = baseDnCmb.getText();
+                       if (EclipseUiUtils.notEmpty(bdn)) {
+                               Dictionary<String, ?> props = UserAdminConf.uriAsProperties(dns
+                                               .get(bdn));
+                               String dn = LdifName.cn.name() + "=" + cn + ","
+                                               + UserAdminConf.groupBase.getValue(props) + "," + bdn;
+                               return dn;
+                       }
+                       return null;
                }
 
                private void initialiseDnCmb(Combo combo) {
-                       List<String> dns = userAdminWrapper.getKnownBaseDns(true);
+                       Map<String, String> dns = userAdminWrapper.getKnownBaseDns(true);
                        if (dns.isEmpty())
-                               throw new ArgeoException(
-                                               "No writable base dn found. Cannot create user");
-                       combo.setItems(dns.toArray(new String[0]));
-                       // combo.select(0);
+                               throw new CmsException(
+                                               "No writable base dn found. Cannot create group");
+                       combo.setItems(dns.keySet().toArray(new String[0]));
+                       if (dns.size() == 1)
+                               combo.select(0);
                }
-
        }
 
-       private Combo createGridLC(Composite parent, String label,
-                       ModifyListener modifyListener) {
+       private Combo createGridLC(Composite parent, String label) {
                Label lbl = new Label(parent, SWT.LEAD);
                lbl.setText(label);
                lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
                Combo combo = new Combo(parent, SWT.LEAD | SWT.BORDER | SWT.READ_ONLY);
                combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-               if (modifyListener != null)
-                       combo.addModifyListener(modifyListener);
                return combo;
        }
 
        /* DEPENDENCY INJECTION */
        public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
                this.userAdminWrapper = userAdminWrapper;
-               this.userAdmin = userAdminWrapper.getUserAdmin();
        }
 }
\ No newline at end of file