]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/internal/useradmin/JcrUserAdmin.java
For shutdown of some hanging Jackrabbit threads
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / useradmin / 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.Node;
9 import javax.jcr.Repository;
10 import javax.jcr.RepositoryException;
11 import javax.jcr.Session;
12
13 import org.argeo.ArgeoException;
14 import org.argeo.jcr.JcrUtils;
15 import org.argeo.security.UserAdminService;
16 import org.argeo.security.jcr.JcrSecurityModel;
17 import org.argeo.security.jcr.JcrUserDetails;
18 import org.argeo.security.jcr.SimpleJcrSecurityModel;
19 import org.osgi.framework.BundleContext;
20 import org.osgi.framework.InvalidSyntaxException;
21 import org.osgi.framework.ServiceReference;
22 import org.osgi.service.useradmin.Authorization;
23 import org.osgi.service.useradmin.Role;
24 import org.osgi.service.useradmin.User;
25 import org.osgi.service.useradmin.UserAdmin;
26 import org.osgi.service.useradmin.UserAdminEvent;
27 import org.osgi.service.useradmin.UserAdminListener;
28 import org.springframework.security.core.GrantedAuthority;
29 import org.springframework.security.core.userdetails.UsernameNotFoundException;
30
31 public class JcrUserAdmin implements UserAdmin {
32 private final BundleContext bundleContext;
33 private UserAdminService userAdminService;
34
35 private final JcrSecurityModel jcrSecurityModel = new SimpleJcrSecurityModel();
36 private final Session session;
37
38 public JcrUserAdmin(BundleContext bundleContext, Repository node) {
39 try {
40 this.bundleContext = bundleContext;
41 this.session = node.login();
42 } catch (Exception e) {
43 throw new ArgeoException("Cannot initialize user admin", e);
44 }
45 }
46
47 public void destroy() {
48 JcrUtils.logoutQuietly(session);
49 }
50
51 @Override
52 public Role createRole(String name, int type) {
53 try {
54 if (Role.USER == type) {
55 Node userProfile = jcrSecurityModel.sync(session, name, null);
56 session.getWorkspace().getVersionManager()
57 .checkout(userProfile.getPath());
58 String password = "";
59 // TODO add roles
60 JcrUserDetails userDetails = new JcrUserDetails(userProfile,
61 password, new ArrayList<GrantedAuthority>());
62 session.save();
63 session.getWorkspace().getVersionManager()
64 .checkin(userProfile.getPath());
65 userAdminService().createUser(userDetails);
66 return new JcrEndUser(userDetails);
67 } else if (Role.GROUP == type) {
68 userAdminService().newRole(name);
69 return new JcrGroup(name);
70 } else {
71 throw new ArgeoException("Unsupported role type " + type);
72 }
73 } catch (RepositoryException e) {
74 throw new ArgeoException("Cannot create role " + name);
75 }
76 }
77
78 @Override
79 public boolean removeRole(String name) {
80 Role role = getRole(name);
81 if (role == null)
82 return false;
83 if (role instanceof JcrEndUser)
84 userAdminService().deleteUser(role.getName());
85 else if (role instanceof JcrGroup)
86 userAdminService().deleteRole(role.getName());
87 else
88 return false;
89 return true;
90 }
91
92 @Override
93 public Role getRole(String name) {
94 try {
95 JcrUserDetails userDetails = (JcrUserDetails) userAdminService()
96 .loadUserByUsername(name);
97 return new JcrEndUser(userDetails);
98 } catch (UsernameNotFoundException e) {
99 if (userAdminService().listEditableRoles().contains(name))
100 return new JcrGroup(name);
101 else
102 return null;
103 }
104 }
105
106 @Override
107 public Role[] getRoles(String filter) throws InvalidSyntaxException {
108 if (filter != null)
109 throw new ArgeoException("Filtering not yet implemented");
110 List<String> roles = new ArrayList<String>(userAdminService()
111 .listEditableRoles());
112 List<String> users = new ArrayList<String>(userAdminService()
113 .listUsers());
114 Role[] res = new Role[users.size() + roles.size()];
115 for (int i = 0; i < roles.size(); i++)
116 res[i] = new JcrGroup(roles.get(i));
117 for (int i = 0; i < users.size(); i++)
118 res[roles.size() + i] = new JcrEndUser(
119 (JcrUserDetails) userAdminService().loadUserByUsername(
120 users.get(i)));
121 return res;
122 }
123
124 @Override
125 public User getUser(String key, String value) {
126 throw new ArgeoException("Property based search not yet implemented");
127 }
128
129 @Override
130 public Authorization getAuthorization(User user) {
131 return new JcrAuthorization(((JcrEndUser) user).getUserDetails());
132 }
133
134 private synchronized UserAdminService userAdminService() {
135 return userAdminService;
136 }
137
138 public void setUserAdminService(UserAdminService userAdminService) {
139 this.userAdminService = userAdminService;
140 }
141
142 protected synchronized void notifyEvent(UserAdminEvent event) {
143 try {
144 Collection<ServiceReference<UserAdminListener>> sr = bundleContext
145 .getServiceReferences(UserAdminListener.class, null);
146 for (Iterator<ServiceReference<UserAdminListener>> it = sr
147 .iterator(); it.hasNext();) {
148 UserAdminListener listener = bundleContext
149 .getService(it.next());
150 listener.roleChanged(event);
151 }
152 } catch (InvalidSyntaxException e) {
153 throw new ArgeoException("Cannot notify listeners", e);
154 }
155 }
156 }