1 package org
.argeo
.cms
.e4
.users
.handlers
;
3 import java
.util
.Dictionary
;
6 import javax
.inject
.Inject
;
8 import org
.argeo
.api
.acr
.ldap
.LdapAttrs
;
9 import org
.argeo
.cms
.e4
.users
.UserAdminWrapper
;
10 import org
.argeo
.cms
.runtime
.DirectoryConf
;
11 import org
.argeo
.cms
.swt
.CmsException
;
12 import org
.argeo
.eclipse
.ui
.EclipseUiUtils
;
13 import org
.argeo
.eclipse
.ui
.dialogs
.ErrorFeedback
;
14 import org
.eclipse
.e4
.core
.di
.annotations
.Execute
;
15 import org
.eclipse
.jface
.wizard
.Wizard
;
16 import org
.eclipse
.jface
.wizard
.WizardDialog
;
17 import org
.eclipse
.jface
.wizard
.WizardPage
;
18 import org
.eclipse
.swt
.SWT
;
19 import org
.eclipse
.swt
.events
.FocusEvent
;
20 import org
.eclipse
.swt
.events
.FocusListener
;
21 import org
.eclipse
.swt
.layout
.GridData
;
22 import org
.eclipse
.swt
.layout
.GridLayout
;
23 import org
.eclipse
.swt
.widgets
.Combo
;
24 import org
.eclipse
.swt
.widgets
.Composite
;
25 import org
.eclipse
.swt
.widgets
.Display
;
26 import org
.eclipse
.swt
.widgets
.Label
;
27 import org
.eclipse
.swt
.widgets
.Text
;
28 import org
.osgi
.service
.useradmin
.Group
;
29 import org
.osgi
.service
.useradmin
.Role
;
30 import org
.osgi
.service
.useradmin
.UserAdminEvent
;
32 /** Create a new group */
33 public class NewGroup
{
34 // public final static String ID = WorkbenchUiPlugin.PLUGIN_ID + ".newGroup";
36 /* DEPENDENCY INJECTION */
38 private UserAdminWrapper userAdminWrapper
;
41 public Object
execute() {
42 NewGroupWizard newGroupWizard
= new NewGroupWizard();
43 newGroupWizard
.setWindowTitle("Group creation");
44 WizardDialog dialog
= new WizardDialog(Display
.getCurrent().getActiveShell(), newGroupWizard
);
49 private class NewGroupWizard
extends Wizard
{
52 private MainGroupInfoWizardPage mainGroupInfo
;
55 private Text dNameTxt
, commonNameTxt
, descriptionTxt
;
56 private Combo baseDnCmb
;
58 public NewGroupWizard() {
62 public void addPages() {
63 mainGroupInfo
= new MainGroupInfoWizardPage();
64 addPage(mainGroupInfo
);
67 @SuppressWarnings({ "rawtypes", "unchecked" })
69 public boolean performFinish() {
72 String commonName
= commonNameTxt
.getText();
74 userAdminWrapper
.beginTransactionIfNeeded();
75 String dn
= getDn(commonName
);
76 Group group
= (Group
) userAdminWrapper
.getUserAdmin().createRole(dn
, Role
.GROUP
);
77 Dictionary props
= group
.getProperties();
78 String descStr
= descriptionTxt
.getText();
79 if (EclipseUiUtils
.notEmpty(descStr
))
80 props
.put(LdapAttrs
.description
.name(), descStr
);
81 userAdminWrapper
.commitOrNotifyTransactionStateChange();
82 userAdminWrapper
.notifyListeners(new UserAdminEvent(null, UserAdminEvent
.ROLE_CREATED
, group
));
84 } catch (Exception e
) {
85 ErrorFeedback
.show("Cannot create new group " + commonName
, e
);
90 private class MainGroupInfoWizardPage
extends WizardPage
implements FocusListener
{
91 private static final long serialVersionUID
= -3150193365151601807L;
93 public MainGroupInfoWizardPage() {
95 setTitle("General information");
96 setMessage("Please choose a domain, provide a common name " + "and a free description");
100 public void createControl(Composite parent
) {
101 Composite bodyCmp
= new Composite(parent
, SWT
.NONE
);
103 bodyCmp
.setLayout(new GridLayout(2, false));
105 dNameTxt
= EclipseUiUtils
.createGridLT(bodyCmp
, "Distinguished name");
106 dNameTxt
.setEnabled(false);
108 baseDnCmb
= createGridLC(bodyCmp
, "Base DN");
109 // Initialise before adding the listener to avoid NPE
110 initialiseDnCmb(baseDnCmb
);
111 baseDnCmb
.addFocusListener(this);
113 commonNameTxt
= EclipseUiUtils
.createGridLT(bodyCmp
, "Common name");
114 commonNameTxt
.addFocusListener(this);
116 Label descLbl
= new Label(bodyCmp
, SWT
.LEAD
);
117 descLbl
.setText("Description");
118 descLbl
.setLayoutData(new GridData(SWT
.RIGHT
, SWT
.TOP
, false, false));
119 descriptionTxt
= new Text(bodyCmp
, SWT
.LEAD
| SWT
.MULTI
| SWT
.WRAP
| SWT
.BORDER
);
120 descriptionTxt
.setLayoutData(EclipseUiUtils
.fillAll());
121 descriptionTxt
.addFocusListener(this);
123 // Initialize buttons
124 setPageComplete(false);
125 getContainer().updateButtons();
129 public void focusLost(FocusEvent event
) {
130 String name
= commonNameTxt
.getText();
131 if (EclipseUiUtils
.isEmpty(name
))
132 dNameTxt
.setText("");
134 dNameTxt
.setText(getDn(name
));
136 String message
= checkComplete();
137 if (message
!= null) {
138 setMessage(message
, WizardPage
.ERROR
);
139 setPageComplete(false);
141 setMessage("Complete", WizardPage
.INFORMATION
);
142 setPageComplete(true);
144 getContainer().updateButtons();
148 public void focusGained(FocusEvent event
) {
151 /** @return the error message or null if complete */
152 protected String
checkComplete() {
153 String name
= commonNameTxt
.getText();
155 if (name
.trim().equals(""))
156 return "Common name must not be empty";
157 Role role
= userAdminWrapper
.getUserAdmin().getRole(getDn(name
));
159 return "Group " + name
+ " already exists";
164 public void setVisible(boolean visible
) {
165 super.setVisible(visible
);
167 if (baseDnCmb
.getSelectionIndex() == -1)
168 baseDnCmb
.setFocus();
170 commonNameTxt
.setFocus();
174 private Map
<String
, String
> getDns() {
175 return userAdminWrapper
.getKnownBaseDns(true);
178 private String
getDn(String cn
) {
179 Map
<String
, String
> dns
= getDns();
180 String bdn
= baseDnCmb
.getText();
181 if (EclipseUiUtils
.notEmpty(bdn
)) {
182 Dictionary
<String
, ?
> props
= DirectoryConf
.uriAsProperties(dns
.get(bdn
));
183 String dn
= LdapAttrs
.cn
.name() + "=" + cn
+ "," + DirectoryConf
.groupBase
.getValue(props
) + "," + bdn
;
189 private void initialiseDnCmb(Combo combo
) {
190 Map
<String
, String
> dns
= userAdminWrapper
.getKnownBaseDns(true);
192 throw new CmsException("No writable base dn found. Cannot create group");
193 combo
.setItems(dns
.keySet().toArray(new String
[0]));
199 private Combo
createGridLC(Composite parent
, String label
) {
200 Label lbl
= new Label(parent
, SWT
.LEAD
);
202 lbl
.setLayoutData(new GridData(SWT
.RIGHT
, SWT
.CENTER
, false, false));
203 Combo combo
= new Combo(parent
, SWT
.LEAD
| SWT
.BORDER
| SWT
.READ_ONLY
);
204 combo
.setLayoutData(new GridData(SWT
.FILL
, SWT
.CENTER
, true, false));
208 /* DEPENDENCY INJECTION */
209 public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper
) {
210 this.userAdminWrapper
= userAdminWrapper
;