1 package org
.argeo
.cms
.internal
.useradmin
;
3 import java
.util
.ArrayList
;
4 import java
.util
.Collection
;
5 import java
.util
.Iterator
;
8 import javax
.jcr
.Repository
;
9 import javax
.jcr
.Session
;
11 import org
.argeo
.ArgeoException
;
12 import org
.argeo
.cms
.CmsException
;
13 import org
.argeo
.cms
.internal
.useradmin
.jackrabbit
.JackrabbitUserAdminService
;
14 import org
.argeo
.jcr
.JcrUtils
;
15 import org
.argeo
.security
.UserAdminService
;
16 import org
.argeo
.security
.jcr
.JcrUserDetails
;
17 import org
.argeo
.security
.jcr
.NewUserDetails
;
18 import org
.osgi
.framework
.BundleContext
;
19 import org
.osgi
.framework
.InvalidSyntaxException
;
20 import org
.osgi
.framework
.ServiceReference
;
21 import org
.osgi
.service
.useradmin
.Authorization
;
22 import org
.osgi
.service
.useradmin
.Role
;
23 import org
.osgi
.service
.useradmin
.User
;
24 import org
.osgi
.service
.useradmin
.UserAdmin
;
25 import org
.osgi
.service
.useradmin
.UserAdminEvent
;
26 import org
.osgi
.service
.useradmin
.UserAdminListener
;
27 import org
.springframework
.security
.core
.userdetails
.UsernameNotFoundException
;
30 * Incomplete implementation of {@link UserAdmin} wrapping the supported
31 * {@link UserAdminService} for the time being.
33 public class JcrUserAdmin
implements UserAdmin
{
34 private final BundleContext bundleContext
;
35 private JackrabbitUserAdminService userAdminService
;
37 private final Session session
;
39 public JcrUserAdmin(BundleContext bundleContext
, Repository node
) {
41 this.bundleContext
= bundleContext
;
42 this.session
= node
.login();
43 } catch (Exception e
) {
44 throw new ArgeoException("Cannot initialize user admin", e
);
48 public void destroy() {
49 JcrUtils
.logoutQuietly(session
);
53 public Role
createRole(String name
, int type
) {
54 if (Role
.USER
== type
) {
55 NewUserDetails userDetails
= new NewUserDetails(name
, null);
56 userAdminService().createUser(userDetails
);
57 return new JcrEndUser((JcrUserDetails
) userAdminService()
58 .loadUserByUsername(name
));
59 } else if (Role
.GROUP
== type
) {
60 userAdminService().newRole(name
);
61 return new JcrGroup(name
);
63 throw new ArgeoException("Unsupported role type " + type
);
68 public boolean removeRole(String name
) {
69 Role role
= getRole(name
);
72 if (role
instanceof JcrEndUser
)
73 userAdminService().deleteUser(role
.getName());
74 else if (role
instanceof JcrGroup
)
75 userAdminService().deleteRole(role
.getName());
82 public Role
getRole(String name
) {
84 JcrUserDetails userDetails
= (JcrUserDetails
) userAdminService()
85 .loadUserByUsername(name
);
86 return new JcrEndUser(userDetails
);
87 } catch (UsernameNotFoundException e
) {
88 if (userAdminService().listEditableRoles().contains(name
))
89 return new JcrGroup(name
);
96 public Role
[] getRoles(String filter
) throws InvalidSyntaxException
{
98 throw new ArgeoException("Filtering not yet implemented");
99 List
<String
> roles
= new ArrayList
<String
>(userAdminService()
100 .listEditableRoles());
101 List
<String
> users
= new ArrayList
<String
>(userAdminService()
103 Role
[] res
= new Role
[users
.size() + roles
.size()];
104 for (int i
= 0; i
< roles
.size(); i
++)
105 res
[i
] = new JcrGroup(roles
.get(i
));
106 for (int i
= 0; i
< users
.size(); i
++)
107 res
[roles
.size() + i
] = new JcrEndUser(
108 (JcrUserDetails
) userAdminService().loadUserByUsername(
114 public User
getUser(String key
, String value
) {
115 throw new CmsException("Property based search not yet implemented");
119 public Authorization
getAuthorization(User user
) {
120 return new JcrAuthorization(((JcrEndUser
) user
).getUserDetails());
123 private synchronized UserAdminService
userAdminService() {
124 return userAdminService
;
127 public void setUserAdminService(JackrabbitUserAdminService userAdminService
) {
128 this.userAdminService
= userAdminService
;
131 protected synchronized void notifyEvent(UserAdminEvent event
) {
133 Collection
<ServiceReference
<UserAdminListener
>> sr
= bundleContext
134 .getServiceReferences(UserAdminListener
.class, null);
135 for (Iterator
<ServiceReference
<UserAdminListener
>> it
= sr
136 .iterator(); it
.hasNext();) {
137 UserAdminListener listener
= bundleContext
138 .getService(it
.next());
139 listener
.roleChanged(event
);
141 } catch (InvalidSyntaxException e
) {
142 throw new ArgeoException("Cannot notify listeners", e
);