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;
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;
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";
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;
public void addPages() {
mainGroupInfo = new MainGroupInfoWizardPage();
addPage(mainGroupInfo);
-
- setWindowTitle("Create a new group");
- // mainGroupInfo.setMessage(message, WizardPage.WARNING);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
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))
- 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;
}
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");
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);
}
@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);
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();
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;
}