Integrate base DNs
[lgpl/argeo-commons.git] / org.argeo.security.ui.admin / src / org / argeo / security / ui / admin / internal / commands / NewGroup.java
index b50f67f1eb4ea05701a8249f47b8649d79f15622..b52bf9955e8d63bbd29d42d72f418c55882a8541 100644 (file)
@@ -16,7 +16,9 @@
 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;
@@ -35,6 +37,7 @@ 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;
@@ -52,11 +55,6 @@ public class NewGroup extends AbstractHandler {
        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();
                WizardDialog dialog = new WizardDialog(
@@ -73,6 +71,7 @@ public class NewGroup extends AbstractHandler {
 
                // End user fields
                private Text dNameTxt, commonNameTxt, descriptionTxt;
+               private Combo baseDnCmb;
 
                public NewGroupWizard() {
                }
@@ -126,6 +125,19 @@ public class NewGroup extends AbstractHandler {
                                dNameTxt = EclipseUiUtils.createGridLT(bodyCmp,
                                                "Distinguished name", this);
                                dNameTxt.setEnabled(false);
+
+                               baseDnCmb = createGridLC(bodyCmp, "Base DN", this);
+                               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));
+                                       }
+                               });
+
                                commonNameTxt = EclipseUiUtils.createGridLT(bodyCmp,
                                                "Common name", this);
                                commonNameTxt.addModifyListener(new ModifyListener() {
@@ -190,6 +202,32 @@ public class NewGroup extends AbstractHandler {
                                        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]));
+                       // combo.select(0);
+               }
+
+       }
+
+       private Combo createGridLC(Composite parent, String label,
+                       ModifyListener modifyListener) {
+               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 */