]> git.argeo.org Git - lgpl/argeo-commons.git/blob - JcrUserAdmin.java
f36a0714f0cfdf52b7df5f72959c36016a62075c
[lgpl/argeo-commons.git] / JcrUserAdmin.java
1 package org.argeo.cms.internal.useradmin;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.Iterator;
6 import java.util.List;
7
8 import javax.jcr.Repository;
9 import javax.jcr.Session;
10
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;
28
29 /**
30 * Incomplete implementation of {@link UserAdmin} wrapping the supported
31 * {@link UserAdminService} for the time being.
32 */
33 public class JcrUserAdmin implements UserAdmin {
34 private final BundleContext bundleContext;
35 private JackrabbitUserAdminService userAdminService;
36
37 private final Session session;
38
39 public JcrUserAdmin(BundleContext bundleContext, Repository node) {
40 try {
41 this.bundleContext = bundleContext;
42 this.session = node.login();
43 } catch (Exception e) {
44 throw new ArgeoException("Cannot initialize user admin", e);
45 }
46 }
47
48 public void destroy() {
49 JcrUtils.logoutQuietly(session);
50 }
51
52 @Override
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);
62 } else {
63 throw new ArgeoException("Unsupported role type " + type);
64 }
65 }
66
67 @Override
68 public boolean removeRole(String name) {
69 Role role = getRole(name);
70 if (role == null)
71 return false;
72 if (role instanceof JcrEndUser)
73 userAdminService().deleteUser(role.getName());
74 else if (role instanceof JcrGroup)
75 userAdminService().deleteRole(role.getName());
76 else
77 return false;
78 return true;
79 }
80
81 @Override
82 public Role getRole(String name) {
83 try {
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);
90 else
91 return null;
92 }
93 }
94
95 @Override
96 public Role[] getRoles(String filter) throws InvalidSyntaxException {
97 if (filter != null)
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()
102 .listUsers());
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(
109 users.get(i)));
110 return res;
111 }
112
113 @Override
114 public User getUser(String key, String value) {
115 throw new CmsException("Property based search not yet implemented");
116 }
117
118 @Override
119 public Authorization getAuthorization(User user) {
120 return new JcrAuthorization(((JcrEndUser) user).getUserDetails());
121 }
122
123 private synchronized UserAdminService userAdminService() {
124 return userAdminService;
125 }
126
127 public void setUserAdminService(JackrabbitUserAdminService userAdminService) {
128 this.userAdminService = userAdminService;
129 }
130
131 protected synchronized void notifyEvent(UserAdminEvent event) {
132 try {
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);
140 }
141 } catch (InvalidSyntaxException e) {
142 throw new ArgeoException("Cannot notify listeners", e);
143 }
144 }
145 }