+package org.argeo.app.ui.people;
+
+import static org.argeo.eclipse.ui.EclipseUiUtils.isEmpty;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+import org.argeo.api.acr.Content;
+import org.argeo.app.core.SuiteUtils;
+import org.argeo.app.ui.SuiteMsg;
+import org.argeo.app.ui.SuiteUiUtils;
+import org.argeo.cms.CmsUserManager;
+import org.argeo.cms.acr.ContentUtils;
+import org.argeo.cms.swt.dialogs.CmsFeedback;
+import org.argeo.cms.swt.widgets.SwtGuidedFormPage;
+import org.argeo.cms.ux.widgets.AbstractGuidedForm;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.argeo.util.directory.HierarchyUnit;
+import org.argeo.util.naming.LdapAttrs;
+import org.argeo.util.naming.LdapObjs;
+import org.eclipse.swt.SWT;
+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.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.osgi.service.useradmin.User;
+
+/** Ask first & last name. Update the passed node on finish */
+public class NewUserForm extends AbstractGuidedForm {
+ private Content hierarchyUnit;
+ private CmsUserManager cmsUserManager;
+
+ protected Text lastNameT;
+ protected Text firstNameT;
+ protected Text emailT;
+
+ public NewUserForm(CmsUserManager cmsUserManager, Content hierarchyUnit) {
+ this.hierarchyUnit = hierarchyUnit;
+ if (!hierarchyUnit.hasContentClass(LdapObjs.posixGroup.qName()))
+ throw new IllegalArgumentException(hierarchyUnit + " is not a POSIX group");
+ this.cmsUserManager = cmsUserManager;
+ }
+
+ @Override
+ public void addPages() {
+ try {
+ MainInfoPage page = new MainInfoPage("Main page");
+ addPage(page);
+ } catch (Exception e) {
+ throw new RuntimeException("Cannot add page to wizard", e);
+ }
+ setFormTitle(SuiteMsg.personWizardWindowTitle.lead());
+ }
+
+ /**
+ * Called when the user click on 'Finish' in the wizard. The task is then
+ * created and the corresponding session saved.
+ */
+ @Override
+ public boolean performFinish() {
+ String lastName = lastNameT.getText();
+ String firstName = firstNameT.getText();
+ String email = emailT.getText();
+ if (EclipseUiUtils.isEmpty(lastName) || EclipseUiUtils.isEmpty(firstName) || EclipseUiUtils.isEmpty(email)) {
+ CmsFeedback.show(SuiteMsg.allFieldsMustBeSet.lead());
+ return false;
+ } else {
+ UUID uuid = UUID.randomUUID();
+ String shortId = uuid.toString().split("-")[0];
+ String uid = "u" + shortId;
+ HierarchyUnit hu = hierarchyUnit.adapt(HierarchyUnit.class);
+ String username = "uid=" + uid + ",ou=People," + hu.getBase();
+
+ Map<String, Object> properties = new HashMap<>();
+ properties.put(LdapAttrs.givenName.name(), firstName);
+ properties.put(LdapAttrs.sn.name(), lastName);
+ properties.put(LdapAttrs.mail.name(), email);
+ properties.put(LdapAttrs.cn.name(), firstName + " " + lastName);
+ properties.put(LdapAttrs.employeeNumber.name(), uuid.toString());
+
+ Map<String, Object> credentials = new HashMap<>();
+ User user = cmsUserManager.createUser(username, properties, credentials);
+
+ Long huGidNumber = hierarchyUnit.get(LdapAttrs.gidNumber.qName(), Long.class).orElseThrow();
+ Long nextUserId = SuiteUtils.findNextId(hierarchyUnit, LdapObjs.posixAccount.qName());
+ String homeDirectory = "/home/" + uid;
+ Map<String, Object> additionalProperties = new HashMap<>();
+ additionalProperties.put(LdapAttrs.uidNumber.name(), nextUserId.toString());
+ additionalProperties.put(LdapAttrs.gidNumber.name(), huGidNumber.toString());
+ additionalProperties.put(LdapAttrs.homeDirectory.name(), homeDirectory);
+
+ Set<String> objectClasses = new HashSet<>();
+ objectClasses.add(LdapObjs.posixAccount.name());
+ cmsUserManager.addObjectClasses(user, objectClasses, additionalProperties);
+ return true;
+ }
+ }
+
+ @Override
+ public boolean performCancel() {
+ return true;
+ }
+
+ @Override
+ public boolean canFinish() {
+ String lastName = lastNameT.getText();
+ String firstName = firstNameT.getText();
+ String email = emailT.getText();
+ if (isEmpty(lastName) || isEmpty(firstName) || isEmpty(email)) {
+ return false;
+ } else
+ return true;
+ }
+
+ protected class MainInfoPage extends SwtGuidedFormPage {
+
+ public MainInfoPage(String pageName) {
+ super(pageName);
+ setTitle(SuiteMsg.personWizardPageTitle.lead());
+ }
+
+ public void createControl(Composite parent) {
+ parent.setLayout(new GridLayout(2, false));
+
+ // FirstName
+ SuiteUiUtils.createBoldLabel(parent, SuiteMsg.firstName);
+ firstNameT = new Text(parent, SWT.BORDER);
+ // firstNameTxt.setMessage("a first name");
+ firstNameT.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+ // LastName
+ SuiteUiUtils.createBoldLabel(parent, SuiteMsg.lastName);
+ lastNameT = new Text(parent, SWT.BORDER);
+ // lastNameTxt.setMessage("a last name");
+ lastNameT.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+ SuiteUiUtils.createBoldLabel(parent, SuiteMsg.email);
+ emailT = new Text(parent, SWT.BORDER);
+ emailT.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+ ModifyListener ml = new ModifyListener() {
+ private static final long serialVersionUID = 1939491923843870844L;
+
+ @Override
+ public void modifyText(ModifyEvent event) {
+ getView().updateButtons();
+ }
+ };
+
+ firstNameT.addModifyListener(ml);
+ lastNameT.addModifyListener(ml);
+ emailT.addModifyListener(ml);
+
+ firstNameT.setFocus();
+ }
+ }
+}