]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/commands/NewGroup.java
Work on security Admin UI, batch processing, specific admin abilities, some code...
[lgpl/argeo-commons.git] / org.argeo.security.ui.admin / src / org / argeo / security / ui / admin / internal / commands / NewGroup.java
index b50f67f1eb4ea05701a8249f47b8649d79f15622..bc90a46d7a9b77a6dc669046b782cfd5d038e4bc 100644 (file)
 package org.argeo.security.ui.admin.internal.commands;
 
 import java.util.Dictionary;
+import java.util.List;
 
+import org.argeo.ArgeoException;
 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.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;
@@ -35,13 +37,13 @@ import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Label;
 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. */
@@ -50,18 +52,12 @@ public class NewGroup extends AbstractHandler {
 
        /* DEPENDENCY INJECTION */
        private UserAdminWrapper userAdminWrapper;
-       private UserAdmin userAdmin;
-
-       // TODO implement a dynamic choice of the base dn
-       private String getDn(String cn) {
-               return "cn=" + cn + ",dc=example,dc=com";
-       }
 
        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;
        }
@@ -73,6 +69,7 @@ public class NewGroup extends AbstractHandler {
 
                // End user fields
                private Text dNameTxt, commonNameTxt, descriptionTxt;
+               private Combo baseDnCmb;
 
                public NewGroupWizard() {
                }
@@ -81,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" })
@@ -94,12 +88,12 @@ public class NewGroup extends AbstractHandler {
                        String commonName = commonNameTxt.getText();
                        try {
                                userAdminWrapper.beginTransactionIfNeeded();
-                               Group group = (Group) userAdmin.createRole(getDn(commonName),
-                                               Role.GROUP);
+                               Group group = (Group) userAdminWrapper.getUserAdmin()
+                                               .createRole(getDn(commonName), Role.GROUP);
                                Dictionary props = group.getProperties();
                                String descStr = descriptionTxt.getText();
                                if (UiAdminUtils.notNull(descStr))
-                                       props.put(UserAdminConstants.KEY_DESC, descStr);
+                                       props.put(LdifName.description.name(), descStr);
                                userAdminWrapper.notifyListeners(new UserAdminEvent(null,
                                                UserAdminEvent.ROLE_CREATED, group));
                                return true;
@@ -116,7 +110,8 @@ public class NewGroup extends AbstractHandler {
                        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
@@ -124,8 +119,23 @@ public class NewGroup extends AbstractHandler {
                                Composite bodyCmp = new Composite(parent, SWT.NONE);
                                bodyCmp.setLayout(new GridLayout(2, false));
                                dNameTxt = EclipseUiUtils.createGridLT(bodyCmp,
-                                               "Distinguished name", this);
+                                               "Distinguished name"); // Read-only -> no listener
                                dNameTxt.setEnabled(false);
+
+                               baseDnCmb = createGridLC(bodyCmp, "Base DN");
+                               // Initialise before adding the listener top 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));
+                                       }
+                               });
+
                                commonNameTxt = EclipseUiUtils.createGridLT(bodyCmp,
                                                "Common name", this);
                                commonNameTxt.addModifyListener(new ModifyListener() {
@@ -177,7 +187,8 @@ public class NewGroup extends AbstractHandler {
 
                                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;
@@ -187,14 +198,40 @@ 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 String getDn(String cn) {
+                       return "cn=" + cn + ",ou=groups," + baseDnCmb.getText();
+               }
+
+               private void initialiseDnCmb(Combo combo) {
+                       List<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]));
+                       if (dns.size() == 1)
+                               combo.select(0);
+               }
+
+       }
+
+       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));
+               return combo;
        }
 
        /* DEPENDENCY INJECTION */
        public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
                this.userAdminWrapper = userAdminWrapper;
-               this.userAdmin = userAdminWrapper.getUserAdmin();
        }
 }
\ No newline at end of file