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