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