2 * Copyright (C) 2007-2012 Argeo GmbH
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package org
.argeo
.security
.ui
.admin
.internal
.commands
;
18 import java
.util
.Dictionary
;
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
.osgi
.useradmin
.LdifName
;
26 import org
.argeo
.osgi
.useradmin
.UserAdminConf
;
27 import org
.argeo
.security
.ui
.admin
.SecurityAdminPlugin
;
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
;
49 /** Create a new group. */
50 public class NewGroup
extends AbstractHandler
{
51 public final static String ID
= SecurityAdminPlugin
.PLUGIN_ID
+ ".newGroup";
53 /* DEPENDENCY INJECTION */
54 private UserAdminWrapper userAdminWrapper
;
56 public Object
execute(ExecutionEvent event
) throws ExecutionException
{
57 NewGroupWizard newGroupWizard
= new NewGroupWizard();
58 newGroupWizard
.setWindowTitle("Group creation");
59 WizardDialog dialog
= new WizardDialog(
60 HandlerUtil
.getActiveShell(event
), newGroupWizard
);
65 private class NewGroupWizard
extends Wizard
{
68 private MainGroupInfoWizardPage mainGroupInfo
;
71 private Text dNameTxt
, commonNameTxt
, descriptionTxt
;
72 private Combo baseDnCmb
;
74 public NewGroupWizard() {
78 public void addPages() {
79 mainGroupInfo
= new MainGroupInfoWizardPage();
80 addPage(mainGroupInfo
);
83 @SuppressWarnings({ "rawtypes", "unchecked" })
85 public boolean performFinish() {
88 String commonName
= commonNameTxt
.getText();
90 userAdminWrapper
.beginTransactionIfNeeded();
91 Group group
= (Group
) userAdminWrapper
.getUserAdmin()
92 .createRole(getDn(commonName
), Role
.GROUP
);
93 Dictionary props
= group
.getProperties();
94 String descStr
= descriptionTxt
.getText();
95 if (EclipseUiUtils
.notEmpty(descStr
))
96 props
.put(LdifName
.description
.name(), descStr
);
97 userAdminWrapper
.notifyListeners(new UserAdminEvent(null,
98 UserAdminEvent
.ROLE_CREATED
, group
));
100 } catch (Exception e
) {
101 ErrorFeedback
.show("Cannot create new group " + commonName
, e
);
106 private class MainGroupInfoWizardPage
extends WizardPage
implements
107 ModifyListener
, ArgeoNames
{
108 private static final long serialVersionUID
= -3150193365151601807L;
110 public MainGroupInfoWizardPage() {
112 setTitle("General information");
113 setMessage("Please choose a domain, provide a common name "
114 + "and a free description");
118 public void createControl(Composite parent
) {
119 Composite bodyCmp
= new Composite(parent
, SWT
.NONE
);
120 bodyCmp
.setLayout(new GridLayout(2, false));
121 dNameTxt
= EclipseUiUtils
.createGridLT(bodyCmp
,
122 "Distinguished name"); // Read-only -> no listener
123 dNameTxt
.setEnabled(false);
125 baseDnCmb
= createGridLC(bodyCmp
, "Base DN");
126 // Initialise before adding the listener top avoid NPE
127 initialiseDnCmb(baseDnCmb
);
128 baseDnCmb
.addModifyListener(this);
129 baseDnCmb
.addModifyListener(new ModifyListener() {
130 private static final long serialVersionUID
= -1435351236582736843L;
133 public void modifyText(ModifyEvent event
) {
134 String name
= commonNameTxt
.getText();
135 dNameTxt
.setText(getDn(name
));
139 commonNameTxt
= EclipseUiUtils
.createGridLT(bodyCmp
,
140 "Common name", this);
141 commonNameTxt
.addModifyListener(new ModifyListener() {
142 private static final long serialVersionUID
= -1435351236582736843L;
145 public void modifyText(ModifyEvent event
) {
146 String name
= commonNameTxt
.getText();
147 if (name
.trim().equals("")) {
148 dNameTxt
.setText("");
150 dNameTxt
.setText(getDn(name
));
155 Label descLbl
= new Label(bodyCmp
, SWT
.LEAD
);
156 descLbl
.setText("Description");
157 descLbl
.setLayoutData(new GridData(SWT
.RIGHT
, SWT
.TOP
, false,
159 descriptionTxt
= new Text(bodyCmp
, SWT
.LEAD
| SWT
.MULTI
160 | SWT
.WRAP
| SWT
.BORDER
);
161 descriptionTxt
.setLayoutData(EclipseUiUtils
.fillAll());
162 descriptionTxt
.addModifyListener(this);
166 // Initialize buttons
167 setPageComplete(false);
168 getContainer().updateButtons();
172 public void modifyText(ModifyEvent event
) {
173 String message
= checkComplete();
174 if (message
!= null) {
175 setMessage(message
, WizardPage
.ERROR
);
176 setPageComplete(false);
178 setMessage("Complete", WizardPage
.INFORMATION
);
179 setPageComplete(true);
181 getContainer().updateButtons();
184 /** @return error message or null if complete */
185 protected String
checkComplete() {
186 String name
= commonNameTxt
.getText();
188 if (name
.trim().equals(""))
189 return "Common name must not be empty";
190 Role role
= userAdminWrapper
.getUserAdmin()
191 .getRole(getDn(name
));
193 return "Group " + name
+ " already exists";
198 public void setVisible(boolean visible
) {
199 super.setVisible(visible
);
201 if (baseDnCmb
.getSelectionIndex() == -1)
202 baseDnCmb
.setFocus();
204 commonNameTxt
.setFocus();
208 private Map
<String
, String
> getDns() {
209 return userAdminWrapper
.getKnownBaseDns(true);
212 private String
getDn(String cn
) {
213 Map
<String
, String
> dns
= getDns();
214 String bdn
= baseDnCmb
.getText();
215 if (EclipseUiUtils
.notEmpty(bdn
)) {
216 Dictionary
<String
, ?
> props
= UserAdminConf
.uriAsProperties(dns
218 String dn
= LdifName
.cn
.name() + "=" + cn
+ ","
219 + UserAdminConf
.groupBase
.getValue(props
) + "," + bdn
;
225 private void initialiseDnCmb(Combo combo
) {
226 Map
<String
, String
> dns
= userAdminWrapper
.getKnownBaseDns(true);
228 throw new ArgeoException(
229 "No writable base dn found. Cannot create group");
230 combo
.setItems(dns
.keySet().toArray(new String
[0]));
236 private Combo
createGridLC(Composite parent
, String label
) {
237 Label lbl
= new Label(parent
, SWT
.LEAD
);
239 lbl
.setLayoutData(new GridData(SWT
.RIGHT
, SWT
.CENTER
, false, false));
240 Combo combo
= new Combo(parent
, SWT
.LEAD
| SWT
.BORDER
| SWT
.READ_ONLY
);
241 combo
.setLayoutData(new GridData(SWT
.FILL
, SWT
.CENTER
, true, false));
245 /* DEPENDENCY INJECTION */
246 public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper
) {
247 this.userAdminWrapper
= userAdminWrapper
;