]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/NewGroup.java
Enable user and group deletion. Remove dynamic Editor icon that triggered NPE on...
[lgpl/argeo-commons.git] / org.argeo.security.ui.admin / src / org / argeo / security / ui / admin / 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.commands;
17
18 import java.util.Dictionary;
19
20 import javax.transaction.UserTransaction;
21
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.views.GroupsView;
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.window.Window;
33 import org.eclipse.jface.wizard.Wizard;
34 import org.eclipse.jface.wizard.WizardDialog;
35 import org.eclipse.jface.wizard.WizardPage;
36 import org.eclipse.swt.SWT;
37 import org.eclipse.swt.events.ModifyEvent;
38 import org.eclipse.swt.events.ModifyListener;
39 import org.eclipse.swt.layout.GridData;
40 import org.eclipse.swt.layout.GridLayout;
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.IWorkbenchPage;
45 import org.eclipse.ui.IWorkbenchPart;
46 import org.eclipse.ui.IWorkbenchWindow;
47 import org.eclipse.ui.handlers.HandlerUtil;
48 import org.osgi.service.useradmin.Group;
49 import org.osgi.service.useradmin.Role;
50 import org.osgi.service.useradmin.UserAdmin;
51
52 /** Create a new group. */
53 public class NewGroup extends AbstractHandler {
54 public final static String ID = SecurityAdminPlugin.PLUGIN_ID + ".newGroup";
55
56 private UserAdmin userAdmin;
57 private UserTransaction userTransaction;
58
59 // TODO implement a dynamic choice of the base dn
60 private String getDn(String cn) {
61 return "cn=" + cn + ",dc=example,dc=com";
62 }
63
64 public Object execute(ExecutionEvent event) throws ExecutionException {
65 NewGroupWizard newGroupWizard = new NewGroupWizard();
66 WizardDialog dialog = new WizardDialog(
67 HandlerUtil.getActiveShell(event), newGroupWizard);
68 dialog.setTitle("Create a new group");
69
70 // Force refresh until the listener are implemented
71 if (Window.OK == dialog.open())
72 forceRefresh(event);
73 return null;
74 }
75
76 private void forceRefresh(ExecutionEvent event) {
77 IWorkbenchWindow iww = HandlerUtil.getActiveWorkbenchWindow(event);
78 if (iww == null)
79 return;
80 IWorkbenchPage activePage = iww.getActivePage();
81 IWorkbenchPart part = activePage.getActivePart();
82 if (part instanceof GroupsView)
83 ((GroupsView) part).refresh();
84 }
85
86 private class NewGroupWizard extends Wizard {
87
88 // pages
89 private MainGroupInfoWizardPage mainGroupInfo;
90
91 // End user fields
92 private Text dNameTxt, commonNameTxt, descriptionTxt;
93
94 public NewGroupWizard() {
95 }
96
97 @Override
98 public void addPages() {
99 mainGroupInfo = new MainGroupInfoWizardPage();
100 addPage(mainGroupInfo);
101
102 setWindowTitle("Create a new group");
103 // mainGroupInfo.setMessage(message, WizardPage.WARNING);
104 }
105
106 @SuppressWarnings({ "rawtypes", "unchecked" })
107 @Override
108 public boolean performFinish() {
109 if (!canFinish())
110 return false;
111 String commonName = commonNameTxt.getText();
112 try {
113 UiAdminUtils.beginTransactionIfNeeded(userTransaction);
114 Group user = (Group) userAdmin.createRole(getDn(commonName),
115 Role.GROUP);
116 Dictionary props = user.getProperties();
117 String descStr = descriptionTxt.getText();
118 if (UiAdminUtils.notNull(descStr))
119 props.put(UserAdminConstants.KEY_DESC, descStr);
120 return true;
121 } catch (Exception e) {
122 ErrorFeedback.show("Cannot create new group " + commonName, e);
123 return false;
124 }
125 }
126
127 private class MainGroupInfoWizardPage extends WizardPage implements
128 ModifyListener, ArgeoNames {
129 private static final long serialVersionUID = -3150193365151601807L;
130
131 public MainGroupInfoWizardPage() {
132 super("Main");
133 setTitle("General information");
134 setMessage("Please provide a common name and a free description");
135 }
136
137 @Override
138 public void createControl(Composite parent) {
139 Composite bodyCmp = new Composite(parent, SWT.NONE);
140 bodyCmp.setLayout(new GridLayout(2, false));
141 dNameTxt = EclipseUiUtils.createGridLT(bodyCmp,
142 "Distinguished name", this);
143 dNameTxt.setEnabled(false);
144 commonNameTxt = EclipseUiUtils.createGridLT(bodyCmp,
145 "Common name", this);
146 commonNameTxt.addModifyListener(new ModifyListener() {
147 private static final long serialVersionUID = -1435351236582736843L;
148
149 @Override
150 public void modifyText(ModifyEvent event) {
151 String name = commonNameTxt.getText();
152 if (name.trim().equals("")) {
153 dNameTxt.setText("");
154 } else {
155 dNameTxt.setText(getDn(name));
156 }
157 }
158 });
159
160 Label descLbl = new Label(bodyCmp, SWT.LEAD);
161 descLbl.setText("Description");
162 descLbl.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false,
163 false));
164 descriptionTxt = new Text(bodyCmp, SWT.LEAD | SWT.MULTI
165 | SWT.WRAP | SWT.BORDER);
166 descriptionTxt.setLayoutData(EclipseUiUtils.fillAll());
167 descriptionTxt.addModifyListener(this);
168
169 setControl(bodyCmp);
170
171 // Initialize buttons
172 setPageComplete(false);
173 getContainer().updateButtons();
174 }
175
176 @Override
177 public void modifyText(ModifyEvent event) {
178 String message = checkComplete();
179 if (message != null) {
180 setMessage(message, WizardPage.ERROR);
181 setPageComplete(false);
182 } else {
183 setMessage("Complete", WizardPage.INFORMATION);
184 setPageComplete(true);
185 }
186 getContainer().updateButtons();
187 }
188
189 /** @return error message or null if complete */
190 protected String checkComplete() {
191 String name = commonNameTxt.getText();
192
193 if (name.trim().equals(""))
194 return "Common name must not be empty";
195 Role role = userAdmin.getRole(getDn(name));
196 if (role != null)
197 return "Group " + name + " already exists";
198 return null;
199 }
200
201 @Override
202 public void setVisible(boolean visible) {
203 super.setVisible(visible);
204 if (visible)
205 commonNameTxt.setFocus();
206 }
207 }
208 }
209
210 /* DEPENDENCY INJECTION */
211 public void setUserAdmin(UserAdmin userAdmin) {
212 this.userAdmin = userAdmin;
213 }
214
215 public void setUserTransaction(UserTransaction userTransaction) {
216 this.userTransaction = userTransaction;
217 }
218 }