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 5943c0c963a28fbb2d1cc6f53255db3b2f4b8d57..75b9b0b33e4e52e06d675014c644d096a42c0d2e 100644 (file)
@@ -18,14 +18,13 @@ package org.argeo.security.ui.admin.internal.commands;
 import java.util.Dictionary;
 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.UserAdminWrapper;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
@@ -34,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;
@@ -47,7 +46,7 @@ import org.osgi.service.useradmin.Group;
 import org.osgi.service.useradmin.Role;
 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";
 
@@ -65,10 +64,10 @@ public class NewGroup extends AbstractHandler {
 
        private class NewGroupWizard extends Wizard {
 
-               // pages
+               // Pages
                private MainGroupInfoWizardPage mainGroupInfo;
 
-               // End user fields
+               // UI fields
                private Text dNameTxt, commonNameTxt, descriptionTxt;
                private Combo baseDnCmb;
 
@@ -89,12 +88,14 @@ public class NewGroup extends AbstractHandler {
                        String commonName = commonNameTxt.getText();
                        try {
                                userAdminWrapper.beginTransactionIfNeeded();
+                               String dn = getDn(commonName);
                                Group group = (Group) userAdminWrapper.getUserAdmin()
-                                               .createRole(getDn(commonName), Role.GROUP);
+                                               .createRole(dn, Role.GROUP);
                                Dictionary props = group.getProperties();
                                String descStr = descriptionTxt.getText();
-                               if (UiAdminUtils.notNull(descStr))
+                               if (EclipseUiUtils.notEmpty(descStr))
                                        props.put(LdifName.description.name(), descStr);
+                               userAdminWrapper.commitOrNotifyTransactionStateChange();
                                userAdminWrapper.notifyListeners(new UserAdminEvent(null,
                                                UserAdminEvent.ROLE_CREATED, group));
                                return true;
@@ -105,7 +106,7 @@ public class NewGroup extends AbstractHandler {
                }
 
                private class MainGroupInfoWizardPage extends WizardPage implements
-                               ModifyListener, ArgeoNames {
+                               FocusListener, ArgeoNames {
                        private static final long serialVersionUID = -3150193365151601807L;
 
                        public MainGroupInfoWizardPage() {
@@ -118,40 +119,21 @@ public class NewGroup extends AbstractHandler {
                        @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"); // Read-only -> no listener
+                                               "Distinguished name");
                                dNameTxt.setEnabled(false);
 
                                baseDnCmb = createGridLC(bodyCmp, "Base DN");
-                               // Initialise before adding the listener top avoid NPE
+                               // Initialise before adding the listener to avoid NPE
                                initialiseDnCmb(baseDnCmb);
-                               baseDnCmb.addModifyListener(this);
-                               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");
@@ -160,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);
@@ -170,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);
@@ -182,7 +168,11 @@ 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();
 
@@ -216,7 +206,7 @@ public class NewGroup extends AbstractHandler {
                        if (EclipseUiUtils.notEmpty(bdn)) {
                                Dictionary<String, ?> props = UserAdminConf.uriAsProperties(dns
                                                .get(bdn));
-                               String dn = LdifName.cn.name()+"=" + cn + ","
+                               String dn = LdifName.cn.name() + "=" + cn + ","
                                                + UserAdminConf.groupBase.getValue(props) + "," + bdn;
                                return dn;
                        }
@@ -226,7 +216,7 @@ public class NewGroup extends AbstractHandler {
                private void initialiseDnCmb(Combo combo) {
                        Map<String, String> dns = userAdminWrapper.getKnownBaseDns(true);
                        if (dns.isEmpty())
-                               throw new ArgeoException(
+                               throw new CmsException(
                                                "No writable base dn found. Cannot create group");
                        combo.setItems(dns.keySet().toArray(new String[0]));
                        if (dns.size() == 1)