1 package org
.argeo
.cms
.users
;
3 import java
.util
.ArrayList
;
7 import javax
.jcr
.RepositoryException
;
9 import org
.argeo
.ArgeoException
;
10 import org
.argeo
.cms
.internal
.auth
.JcrSecurityModel
;
11 import org
.argeo
.cms
.util
.CmsUtils
;
12 import org
.argeo
.cms
.viewers
.EditablePart
;
13 import org
.argeo
.cms
.viewers
.NodePart
;
14 import org
.argeo
.cms
.widgets
.StyledControl
;
15 import org
.argeo
.jcr
.ArgeoNames
;
16 import org
.argeo
.security
.UserAdminService
;
17 import org
.argeo
.security
.jcr
.JcrUserDetails
;
18 import org
.eclipse
.jface
.viewers
.CheckStateChangedEvent
;
19 import org
.eclipse
.jface
.viewers
.CheckboxTableViewer
;
20 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
21 import org
.eclipse
.jface
.viewers
.ICheckStateListener
;
22 import org
.eclipse
.jface
.viewers
.IStructuredContentProvider
;
23 import org
.eclipse
.jface
.viewers
.TableViewer
;
24 import org
.eclipse
.jface
.viewers
.TableViewerColumn
;
25 import org
.eclipse
.jface
.viewers
.Viewer
;
26 import org
.eclipse
.swt
.SWT
;
27 import org
.eclipse
.swt
.events
.FocusEvent
;
28 import org
.eclipse
.swt
.events
.FocusListener
;
29 import org
.eclipse
.swt
.events
.MouseListener
;
30 import org
.eclipse
.swt
.layout
.GridLayout
;
31 import org
.eclipse
.swt
.widgets
.Composite
;
32 import org
.eclipse
.swt
.widgets
.Control
;
33 import org
.eclipse
.swt
.widgets
.Label
;
34 import org
.eclipse
.swt
.widgets
.Table
;
35 import org
.eclipse
.swt
.widgets
.TableColumn
;
36 import org
.springframework
.security
.core
.GrantedAuthority
;
38 /** Display a single user main info once it has been created. */
39 public class UserRolesPart
extends StyledControl
implements EditablePart
,
40 NodePart
, FocusListener
{
41 private static final long serialVersionUID
= -6013980335975055846L;
43 private CheckboxTableViewer rolesViewer
;
46 private JcrUserDetails userDetails
;
47 private UserAdminService userAdminService
;
48 private List
<String
> roles
;
51 // private final Image checked;
53 // TODO implement to provide user creation ability for anonymous user?
54 // public UserPart(Composite parent, int swtStyle) {
55 // super(parent, swtStyle);
58 public UserRolesPart(Composite parent
, int style
, Item item
,
59 UserAdminService userAdminService
, JcrSecurityModel jcrSecurityModel
)
60 throws RepositoryException
{
61 this(parent
, style
, item
, true);
64 public UserRolesPart(Composite parent
, int style
, Item item
,
65 boolean cacheImmediately
) throws RepositoryException
{
66 super(parent
, style
, item
, cacheImmediately
);
67 // checked = new Image(parent, imageData);
71 public Item
getItem() throws RepositoryException
{
75 public void setMouseListener(MouseListener mouseListener
) {
76 super.setMouseListener(mouseListener
);
77 table
.addMouseListener(mouseListener
);
81 protected Control
createControl(Composite box
, String style
) {
82 // box.setLayout(CmsUtils.noSpaceGridLayout());
83 box
.setLayout(new GridLayout());
85 Label header
= new Label(box
, SWT
.NONE
);
86 header
.setText(" Groups");
87 CmsUtils
.style(header
, UserStyles
.USER_FORM_TITLE
);
88 header
.setLayoutData(CmsUtils
.fillWidth());
90 int swtStyle
= SWT
.CHECK
| SWT
.MULTI
| SWT
.H_SCROLL
| SWT
.V_SCROLL
;
92 swtStyle
|= SWT
.READ_ONLY
;
94 table
= new Table(box
, swtStyle
);
95 table
.setLinesVisible(true);
96 table
.setHeaderVisible(false);
97 CmsUtils
.style(table
, style
);
99 rolesViewer
= new CheckboxTableViewer(table
);
101 TableViewerColumn column
;
104 // TableViewerColumn column = createTableViewerColumn(rolesViewer,
106 // column.setLabelProvider(new ColumnLabelProvider() {
107 // public String getText(Object element) {
111 // public Image getImage(Object element) {
112 // String role = element.toString();
113 // if (roles.contains(role)) {
115 // return ROLE_CHECKED;
122 // column.setEditingSupport(new RoleEditingSupport(rolesViewer, part));
125 column
= createTableViewerColumn(rolesViewer
, "Role", 400);
126 column
.setLabelProvider(new ColumnLabelProvider() {
127 private static final long serialVersionUID
= -7334412925967366255L;
129 public String
getText(Object element
) {
130 return element
.toString();
133 rolesViewer
.setContentProvider(new RolesContentProvider());
134 rolesViewer
.setInput(userAdminService
.listEditableRoles().toArray());
136 // try to prevent edition on read only nodes. Does not work.
137 // rolesViewer.setAllGrayed(!isEditing());
139 rolesViewer
.addCheckStateListener(new ICheckStateListener() {
142 public void checkStateChanged(CheckStateChangedEvent event
) {
143 String name
= (String
) event
.getElement();
144 boolean contained
= roles
.contains(name
);
145 boolean checked
= event
.getChecked();
146 if (checked
!= contained
) {
151 userDetails
= userDetails
.cloneWithNewRoles(roles
);
152 userAdminService
.updateUser(userDetails
);
161 public void focusGained(FocusEvent e
) {
166 public void focusLost(FocusEvent e
) {
167 // Save change if needed
168 // Text text = (Text) e.getSource();
171 // private final static Image ROLE_CHECKED = SecurityAdminPlugin
172 // .getImageDescriptor("icons/security.gif").createImage();
174 public void setUserAdminService(UserAdminService userAdminService
) {
175 this.userAdminService
= userAdminService
;
177 String username
= getNode().getProperty(ArgeoNames
.ARGEO_USER_ID
)
179 if (userAdminService
.userExists(username
)) {
180 JcrUserDetails userDetails
= (JcrUserDetails
) userAdminService
181 .loadUserByUsername(username
);
182 setUserDetails(userDetails
);
184 } catch (Exception e
) {
185 throw new ArgeoException("Cannot retrieve userDetails for "
191 public void setUserDetails(JcrUserDetails userDetails
) {
192 this.userDetails
= userDetails
;
193 this.roles
= new ArrayList
<String
>();
194 for (GrantedAuthority ga
: userDetails
.getAuthorities())
195 roles
.add(ga
.getAuthority());
196 if (rolesViewer
!= null)
197 rolesViewer
.refresh();
200 protected TableViewerColumn
createTableViewerColumn(TableViewer viewer
,
201 String title
, int bound
) {
202 final TableViewerColumn viewerColumn
= new TableViewerColumn(viewer
,
204 final TableColumn column
= viewerColumn
.getColumn();
205 column
.setText(title
);
206 column
.setWidth(bound
);
207 column
.setResizable(true);
208 column
.setMoveable(true);
213 public List
<String
> getRoles() {
217 public void refresh() {
219 // return roles.toArray();
220 rolesViewer
.setCheckedElements(roles
.toArray()); // setSelection(1);
221 // rolesViewer.setInput(roles);
222 rolesViewer
.refresh();
225 private class RolesContentProvider
implements IStructuredContentProvider
{
226 private static final long serialVersionUID
= 4119915828862214310L;
228 public Object
[] getElements(Object inputElement
) {
229 return userAdminService
.listEditableRoles().toArray();
232 public void dispose() {
235 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
240 // /** Select the columns by editing the checkbox in the first column */
241 // class RoleEditingSupport extends EditingSupport {
243 // private final TableViewer viewer;
245 // public RoleEditingSupport(TableViewer viewer) {
247 // this.viewer = viewer;
251 // protected CellEditor getCellEditor(Object element) {
252 // return new CheckboxCellEditor(null, SWT.CHECK | SWT.READ_ONLY);
257 // protected boolean canEdit(Object element) {
262 // protected Object getValue(Object element) {
263 // String role = element.toString();
264 // return roles.contains(role);
269 // protected void setValue(Object element, Object value) {
270 // Boolean inRole = (Boolean) value;
271 // String role = element.toString();
272 // if (inRole && !roles.contains(role)) {
274 // } else if (!inRole && roles.contains(role)) {
275 // roles.remove(role);