1 package org
.argeo
.cms
.ui
.workbench
.internal
.useradmin
.commands
;
3 import java
.util
.Dictionary
;
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
;
34 /** Create a new group */
35 public class NewGroup
extends AbstractHandler
{
36 public final static String ID
= WorkbenchUiPlugin
.PLUGIN_ID
+ ".newGroup";
38 /* DEPENDENCY INJECTION */
39 private UserAdminWrapper userAdminWrapper
;
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
);
50 private class NewGroupWizard
extends Wizard
{
53 private MainGroupInfoWizardPage mainGroupInfo
;
56 private Text dNameTxt
, commonNameTxt
, descriptionTxt
;
57 private Combo baseDnCmb
;
59 public NewGroupWizard() {
63 public void addPages() {
64 mainGroupInfo
= new MainGroupInfoWizardPage();
65 addPage(mainGroupInfo
);
68 @SuppressWarnings({ "rawtypes", "unchecked" })
70 public boolean performFinish() {
73 String commonName
= commonNameTxt
.getText();
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
));
87 } catch (Exception e
) {
88 ErrorFeedback
.show("Cannot create new group " + commonName
, e
);
93 private class MainGroupInfoWizardPage
extends WizardPage
implements
94 FocusListener
, ArgeoNames
{
95 private static final long serialVersionUID
= -3150193365151601807L;
97 public MainGroupInfoWizardPage() {
99 setTitle("General information");
100 setMessage("Please choose a domain, provide a common name "
101 + "and a free description");
105 public void createControl(Composite parent
) {
106 Composite bodyCmp
= new Composite(parent
, SWT
.NONE
);
108 bodyCmp
.setLayout(new GridLayout(2, false));
110 dNameTxt
= EclipseUiUtils
.createGridLT(bodyCmp
,
111 "Distinguished name");
112 dNameTxt
.setEnabled(false);
114 baseDnCmb
= createGridLC(bodyCmp
, "Base DN");
115 // Initialise before adding the listener to avoid NPE
116 initialiseDnCmb(baseDnCmb
);
117 baseDnCmb
.addFocusListener(this);
119 commonNameTxt
= EclipseUiUtils
.createGridLT(bodyCmp
,
121 commonNameTxt
.addFocusListener(this);
123 Label descLbl
= new Label(bodyCmp
, SWT
.LEAD
);
124 descLbl
.setText("Description");
125 descLbl
.setLayoutData(new GridData(SWT
.RIGHT
, SWT
.TOP
, false,
127 descriptionTxt
= new Text(bodyCmp
, SWT
.LEAD
| SWT
.MULTI
128 | SWT
.WRAP
| SWT
.BORDER
);
129 descriptionTxt
.setLayoutData(EclipseUiUtils
.fillAll());
130 descriptionTxt
.addFocusListener(this);
132 // Initialize buttons
133 setPageComplete(false);
134 getContainer().updateButtons();
138 public void focusLost(FocusEvent event
) {
139 String name
= commonNameTxt
.getText();
140 if (EclipseUiUtils
.isEmpty(name
))
141 dNameTxt
.setText("");
143 dNameTxt
.setText(getDn(name
));
145 String message
= checkComplete();
146 if (message
!= null) {
147 setMessage(message
, WizardPage
.ERROR
);
148 setPageComplete(false);
150 setMessage("Complete", WizardPage
.INFORMATION
);
151 setPageComplete(true);
153 getContainer().updateButtons();
157 public void focusGained(FocusEvent event
) {
160 /** @return the error message or null if complete */
161 protected String
checkComplete() {
162 String name
= commonNameTxt
.getText();
164 if (name
.trim().equals(""))
165 return "Common name must not be empty";
166 Role role
= userAdminWrapper
.getUserAdmin()
167 .getRole(getDn(name
));
169 return "Group " + name
+ " already exists";
174 public void setVisible(boolean visible
) {
175 super.setVisible(visible
);
177 if (baseDnCmb
.getSelectionIndex() == -1)
178 baseDnCmb
.setFocus();
180 commonNameTxt
.setFocus();
184 private Map
<String
, String
> getDns() {
185 return userAdminWrapper
.getKnownBaseDns(true);
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
194 String dn
= LdapAttrs
.cn
.name() + "=" + cn
+ ","
195 + UserAdminConf
.groupBase
.getValue(props
) + "," + bdn
;
201 private void initialiseDnCmb(Combo combo
) {
202 Map
<String
, String
> dns
= userAdminWrapper
.getKnownBaseDns(true);
204 throw new CmsException(
205 "No writable base dn found. Cannot create group");
206 combo
.setItems(dns
.keySet().toArray(new String
[0]));
212 private Combo
createGridLC(Composite parent
, String label
) {
213 Label lbl
= new Label(parent
, SWT
.LEAD
);
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));
221 /* DEPENDENCY INJECTION */
222 public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper
) {
223 this.userAdminWrapper
= userAdminWrapper
;