]> git.argeo.org Git - lgpl/argeo-commons.git/blob - eclipse/org.argeo.cms.e4/src/org/argeo/cms/e4/users/handlers/NewGroup.java
Mini desktop graalvm packaging.
[lgpl/argeo-commons.git] / eclipse / org.argeo.cms.e4 / src / org / argeo / cms / e4 / users / handlers / NewGroup.java
1 package org.argeo.cms.e4.users.handlers;
2
3 import java.util.Dictionary;
4 import java.util.Map;
5
6 import javax.inject.Inject;
7
8 import org.argeo.cms.CmsException;
9 import org.argeo.cms.e4.users.UserAdminWrapper;
10 import org.argeo.eclipse.ui.EclipseUiUtils;
11 import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
12 import org.argeo.osgi.useradmin.UserAdminConf;
13 import org.argeo.util.naming.LdapAttrs;
14 import org.eclipse.e4.core.di.annotations.Execute;
15 import org.eclipse.jface.wizard.Wizard;
16 import org.eclipse.jface.wizard.WizardDialog;
17 import org.eclipse.jface.wizard.WizardPage;
18 import org.eclipse.swt.SWT;
19 import org.eclipse.swt.events.FocusEvent;
20 import org.eclipse.swt.events.FocusListener;
21 import org.eclipse.swt.layout.GridData;
22 import org.eclipse.swt.layout.GridLayout;
23 import org.eclipse.swt.widgets.Combo;
24 import org.eclipse.swt.widgets.Composite;
25 import org.eclipse.swt.widgets.Display;
26 import org.eclipse.swt.widgets.Label;
27 import org.eclipse.swt.widgets.Text;
28 import org.osgi.service.useradmin.Group;
29 import org.osgi.service.useradmin.Role;
30 import org.osgi.service.useradmin.UserAdminEvent;
31
32 /** Create a new group */
33 public class NewGroup {
34 // public final static String ID = WorkbenchUiPlugin.PLUGIN_ID + ".newGroup";
35
36 /* DEPENDENCY INJECTION */
37 @Inject
38 private UserAdminWrapper userAdminWrapper;
39
40 @Execute
41 public Object execute() {
42 NewGroupWizard newGroupWizard = new NewGroupWizard();
43 newGroupWizard.setWindowTitle("Group creation");
44 WizardDialog dialog = new WizardDialog(Display.getCurrent().getActiveShell(), newGroupWizard);
45 dialog.open();
46 return null;
47 }
48
49 private class NewGroupWizard extends Wizard {
50
51 // Pages
52 private MainGroupInfoWizardPage mainGroupInfo;
53
54 // UI fields
55 private Text dNameTxt, commonNameTxt, descriptionTxt;
56 private Combo baseDnCmb;
57
58 public NewGroupWizard() {
59 }
60
61 @Override
62 public void addPages() {
63 mainGroupInfo = new MainGroupInfoWizardPage();
64 addPage(mainGroupInfo);
65 }
66
67 @SuppressWarnings({ "rawtypes", "unchecked" })
68 @Override
69 public boolean performFinish() {
70 if (!canFinish())
71 return false;
72 String commonName = commonNameTxt.getText();
73 try {
74 userAdminWrapper.beginTransactionIfNeeded();
75 String dn = getDn(commonName);
76 Group group = (Group) userAdminWrapper.getUserAdmin().createRole(dn, Role.GROUP);
77 Dictionary props = group.getProperties();
78 String descStr = descriptionTxt.getText();
79 if (EclipseUiUtils.notEmpty(descStr))
80 props.put(LdapAttrs.description.name(), descStr);
81 userAdminWrapper.commitOrNotifyTransactionStateChange();
82 userAdminWrapper.notifyListeners(new UserAdminEvent(null, UserAdminEvent.ROLE_CREATED, group));
83 return true;
84 } catch (Exception e) {
85 ErrorFeedback.show("Cannot create new group " + commonName, e);
86 return false;
87 }
88 }
89
90 private class MainGroupInfoWizardPage extends WizardPage implements FocusListener {
91 private static final long serialVersionUID = -3150193365151601807L;
92
93 public MainGroupInfoWizardPage() {
94 super("Main");
95 setTitle("General information");
96 setMessage("Please choose a domain, provide a common name " + "and a free description");
97 }
98
99 @Override
100 public void createControl(Composite parent) {
101 Composite bodyCmp = new Composite(parent, SWT.NONE);
102 setControl(bodyCmp);
103 bodyCmp.setLayout(new GridLayout(2, false));
104
105 dNameTxt = EclipseUiUtils.createGridLT(bodyCmp, "Distinguished name");
106 dNameTxt.setEnabled(false);
107
108 baseDnCmb = createGridLC(bodyCmp, "Base DN");
109 // Initialise before adding the listener to avoid NPE
110 initialiseDnCmb(baseDnCmb);
111 baseDnCmb.addFocusListener(this);
112
113 commonNameTxt = EclipseUiUtils.createGridLT(bodyCmp, "Common name");
114 commonNameTxt.addFocusListener(this);
115
116 Label descLbl = new Label(bodyCmp, SWT.LEAD);
117 descLbl.setText("Description");
118 descLbl.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false));
119 descriptionTxt = new Text(bodyCmp, SWT.LEAD | SWT.MULTI | SWT.WRAP | SWT.BORDER);
120 descriptionTxt.setLayoutData(EclipseUiUtils.fillAll());
121 descriptionTxt.addFocusListener(this);
122
123 // Initialize buttons
124 setPageComplete(false);
125 getContainer().updateButtons();
126 }
127
128 @Override
129 public void focusLost(FocusEvent event) {
130 String name = commonNameTxt.getText();
131 if (EclipseUiUtils.isEmpty(name))
132 dNameTxt.setText("");
133 else
134 dNameTxt.setText(getDn(name));
135
136 String message = checkComplete();
137 if (message != null) {
138 setMessage(message, WizardPage.ERROR);
139 setPageComplete(false);
140 } else {
141 setMessage("Complete", WizardPage.INFORMATION);
142 setPageComplete(true);
143 }
144 getContainer().updateButtons();
145 }
146
147 @Override
148 public void focusGained(FocusEvent event) {
149 }
150
151 /** @return the error message or null if complete */
152 protected String checkComplete() {
153 String name = commonNameTxt.getText();
154
155 if (name.trim().equals(""))
156 return "Common name must not be empty";
157 Role role = userAdminWrapper.getUserAdmin().getRole(getDn(name));
158 if (role != null)
159 return "Group " + name + " already exists";
160 return null;
161 }
162
163 @Override
164 public void setVisible(boolean visible) {
165 super.setVisible(visible);
166 if (visible)
167 if (baseDnCmb.getSelectionIndex() == -1)
168 baseDnCmb.setFocus();
169 else
170 commonNameTxt.setFocus();
171 }
172 }
173
174 private Map<String, String> getDns() {
175 return userAdminWrapper.getKnownBaseDns(true);
176 }
177
178 private String getDn(String cn) {
179 Map<String, String> dns = getDns();
180 String bdn = baseDnCmb.getText();
181 if (EclipseUiUtils.notEmpty(bdn)) {
182 Dictionary<String, ?> props = UserAdminConf.uriAsProperties(dns.get(bdn));
183 String dn = LdapAttrs.cn.name() + "=" + cn + "," + UserAdminConf.groupBase.getValue(props) + "," + bdn;
184 return dn;
185 }
186 return null;
187 }
188
189 private void initialiseDnCmb(Combo combo) {
190 Map<String, String> dns = userAdminWrapper.getKnownBaseDns(true);
191 if (dns.isEmpty())
192 throw new CmsException("No writable base dn found. Cannot create group");
193 combo.setItems(dns.keySet().toArray(new String[0]));
194 if (dns.size() == 1)
195 combo.select(0);
196 }
197 }
198
199 private Combo createGridLC(Composite parent, String label) {
200 Label lbl = new Label(parent, SWT.LEAD);
201 lbl.setText(label);
202 lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
203 Combo combo = new Combo(parent, SWT.LEAD | SWT.BORDER | SWT.READ_ONLY);
204 combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
205 return combo;
206 }
207
208 /* DEPENDENCY INJECTION */
209 public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
210 this.userAdminWrapper = userAdminWrapper;
211 }
212 }