]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/commands/NewGroup.java
Code cleaning and refactoring.
[lgpl/argeo-commons.git] / org.argeo.security.ui.admin / src / org / argeo / security / ui / admin / internal / commands / NewGroup.java
1 /*
2 * Copyright (C) 2007-2012 Argeo GmbH
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.argeo.security.ui.admin.internal.commands;
17
18 import java.util.Dictionary;
19 import java.util.List;
20
21 import org.argeo.ArgeoException;
22 import org.argeo.eclipse.ui.EclipseUiUtils;
23 import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
24 import org.argeo.jcr.ArgeoNames;
25 import org.argeo.security.ui.admin.SecurityAdminPlugin;
26 import org.argeo.security.ui.admin.internal.UiAdminUtils;
27 import org.argeo.security.ui.admin.internal.UserAdminConstants;
28 import org.argeo.security.ui.admin.internal.UserAdminWrapper;
29 import org.eclipse.core.commands.AbstractHandler;
30 import org.eclipse.core.commands.ExecutionEvent;
31 import org.eclipse.core.commands.ExecutionException;
32 import org.eclipse.jface.wizard.Wizard;
33 import org.eclipse.jface.wizard.WizardDialog;
34 import org.eclipse.jface.wizard.WizardPage;
35 import org.eclipse.swt.SWT;
36 import org.eclipse.swt.events.ModifyEvent;
37 import org.eclipse.swt.events.ModifyListener;
38 import org.eclipse.swt.layout.GridData;
39 import org.eclipse.swt.layout.GridLayout;
40 import org.eclipse.swt.widgets.Combo;
41 import org.eclipse.swt.widgets.Composite;
42 import org.eclipse.swt.widgets.Label;
43 import org.eclipse.swt.widgets.Text;
44 import org.eclipse.ui.handlers.HandlerUtil;
45 import org.osgi.service.useradmin.Group;
46 import org.osgi.service.useradmin.Role;
47 import org.osgi.service.useradmin.UserAdminEvent;
48
49 /** Create a new group. */
50 public class NewGroup extends AbstractHandler {
51 public final static String ID = SecurityAdminPlugin.PLUGIN_ID + ".newGroup";
52
53 /* DEPENDENCY INJECTION */
54 private UserAdminWrapper userAdminWrapper;
55
56 public Object execute(ExecutionEvent event) throws ExecutionException {
57 NewGroupWizard newGroupWizard = new NewGroupWizard();
58 WizardDialog dialog = new WizardDialog(
59 HandlerUtil.getActiveShell(event), newGroupWizard);
60 dialog.setTitle("Create a new group");
61 dialog.open();
62 return null;
63 }
64
65 private class NewGroupWizard extends Wizard {
66
67 // pages
68 private MainGroupInfoWizardPage mainGroupInfo;
69
70 // End user fields
71 private Text dNameTxt, commonNameTxt, descriptionTxt;
72 private Combo baseDnCmb;
73
74 public NewGroupWizard() {
75 }
76
77 @Override
78 public void addPages() {
79 mainGroupInfo = new MainGroupInfoWizardPage();
80 addPage(mainGroupInfo);
81
82 setWindowTitle("Create a new group");
83 // mainGroupInfo.setMessage(message, WizardPage.WARNING);
84 }
85
86 @SuppressWarnings({ "rawtypes", "unchecked" })
87 @Override
88 public boolean performFinish() {
89 if (!canFinish())
90 return false;
91 String commonName = commonNameTxt.getText();
92 try {
93 userAdminWrapper.beginTransactionIfNeeded();
94 Group group = (Group) userAdminWrapper.getUserAdmin()
95 .createRole(getDn(commonName), Role.GROUP);
96 Dictionary props = group.getProperties();
97 String descStr = descriptionTxt.getText();
98 if (UiAdminUtils.notNull(descStr))
99 props.put(UserAdminConstants.KEY_DESC, descStr);
100 userAdminWrapper.notifyListeners(new UserAdminEvent(null,
101 UserAdminEvent.ROLE_CREATED, group));
102 return true;
103 } catch (Exception e) {
104 ErrorFeedback.show("Cannot create new group " + commonName, e);
105 return false;
106 }
107 }
108
109 private class MainGroupInfoWizardPage extends WizardPage implements
110 ModifyListener, ArgeoNames {
111 private static final long serialVersionUID = -3150193365151601807L;
112
113 public MainGroupInfoWizardPage() {
114 super("Main");
115 setTitle("General information");
116 setMessage("Please provide a common name and a free description");
117 }
118
119 @Override
120 public void createControl(Composite parent) {
121 Composite bodyCmp = new Composite(parent, SWT.NONE);
122 bodyCmp.setLayout(new GridLayout(2, false));
123 dNameTxt = EclipseUiUtils.createGridLT(bodyCmp,
124 "Distinguished name", this);
125 dNameTxt.setEnabled(false);
126
127 baseDnCmb = createGridLC(bodyCmp, "Base DN", this);
128 initialiseDnCmb(baseDnCmb);
129 baseDnCmb.addModifyListener(new ModifyListener() {
130 private static final long serialVersionUID = -1435351236582736843L;
131
132 @Override
133 public void modifyText(ModifyEvent event) {
134 String name = commonNameTxt.getText();
135 dNameTxt.setText(getDn(name));
136 }
137 });
138
139 commonNameTxt = EclipseUiUtils.createGridLT(bodyCmp,
140 "Common name", this);
141 commonNameTxt.addModifyListener(new ModifyListener() {
142 private static final long serialVersionUID = -1435351236582736843L;
143
144 @Override
145 public void modifyText(ModifyEvent event) {
146 String name = commonNameTxt.getText();
147 if (name.trim().equals("")) {
148 dNameTxt.setText("");
149 } else {
150 dNameTxt.setText(getDn(name));
151 }
152 }
153 });
154
155 Label descLbl = new Label(bodyCmp, SWT.LEAD);
156 descLbl.setText("Description");
157 descLbl.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false,
158 false));
159 descriptionTxt = new Text(bodyCmp, SWT.LEAD | SWT.MULTI
160 | SWT.WRAP | SWT.BORDER);
161 descriptionTxt.setLayoutData(EclipseUiUtils.fillAll());
162 descriptionTxt.addModifyListener(this);
163
164 setControl(bodyCmp);
165
166 // Initialize buttons
167 setPageComplete(false);
168 getContainer().updateButtons();
169 }
170
171 @Override
172 public void modifyText(ModifyEvent event) {
173 String message = checkComplete();
174 if (message != null) {
175 setMessage(message, WizardPage.ERROR);
176 setPageComplete(false);
177 } else {
178 setMessage("Complete", WizardPage.INFORMATION);
179 setPageComplete(true);
180 }
181 getContainer().updateButtons();
182 }
183
184 /** @return error message or null if complete */
185 protected String checkComplete() {
186 String name = commonNameTxt.getText();
187
188 if (name.trim().equals(""))
189 return "Common name must not be empty";
190 Role role = userAdminWrapper.getUserAdmin()
191 .getRole(getDn(name));
192 if (role != null)
193 return "Group " + name + " already exists";
194 return null;
195 }
196
197 @Override
198 public void setVisible(boolean visible) {
199 super.setVisible(visible);
200 if (visible)
201 commonNameTxt.setFocus();
202 }
203 }
204
205 private String getDn(String cn) {
206 return "cn=" + cn + ",ou=groups," + baseDnCmb.getText();
207 }
208
209 private void initialiseDnCmb(Combo combo) {
210 List<String> dns = userAdminWrapper.getKnownBaseDns(true);
211 if (dns.isEmpty())
212 throw new ArgeoException(
213 "No writable base dn found. Cannot create user");
214 combo.setItems(dns.toArray(new String[0]));
215 // combo.select(0);
216 }
217
218 }
219
220 private Combo createGridLC(Composite parent, String label,
221 ModifyListener modifyListener) {
222 Label lbl = new Label(parent, SWT.LEAD);
223 lbl.setText(label);
224 lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
225 Combo combo = new Combo(parent, SWT.LEAD | SWT.BORDER | SWT.READ_ONLY);
226 combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
227 if (modifyListener != null)
228 combo.addModifyListener(modifyListener);
229 return combo;
230 }
231
232 /* DEPENDENCY INJECTION */
233 public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
234 this.userAdminWrapper = userAdminWrapper;
235 }
236 }