1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.cms.security;
35
36 import javax.security.auth.Subject;
37
38 import java.util.ArrayList;
39 import java.util.Collection;
40 import java.util.Map;
41
42
43
44
45
46
47
48
49 public class DelegatingUserManager implements UserManager {
50 private final Map<String, UserManager> delegates;
51
52
53
54
55 public DelegatingUserManager(Map<String, UserManager> delegates) {
56 this.delegates = delegates;
57 }
58
59 public User createUser(final String name, final String pw) throws UnsupportedOperationException {
60 final Op<User> op = new Op<User>() {
61 public User delegate(UserManager um) {
62 return um.createUser(name, pw);
63 }
64 };
65 return delegateUntilSupported(op);
66 }
67
68 public void changePassword(User user, String newPassword) throws UnsupportedOperationException {
69 throw new UnsupportedOperationException("Please use a specific instance of UserManager to do this.");
70 }
71
72 public User getAnonymousUser() {
73 return delegateUntilSupported(new Op<User>() {
74 public User delegate(UserManager um) {
75 return um.getAnonymousUser();
76 }
77 });
78 }
79
80 public User getSystemUser() {
81 return delegateUntilSupported(new Op<User>() {
82 public User delegate(UserManager um) {
83 return um.getSystemUser();
84 }
85 });
86 }
87
88 public User getUser(final String name) throws UnsupportedOperationException {
89 return delegateUntilNotNull(new Op<User>() {
90 public User delegate(UserManager um) {
91 return um.getUser(name);
92 }
93 });
94 }
95
96 public User getUser(final Subject subject) throws UnsupportedOperationException {
97 return delegateUntilNotNull(new Op<User>() {
98 public User delegate(UserManager um) {
99 return um.getUser(subject);
100 }
101 });
102 }
103
104 public Collection<User> getAllUsers() throws UnsupportedOperationException{
105 Collection<User> users = new ArrayList<User>();
106 for (String realmName : delegates.keySet()) {
107 try{
108 UserManager um = delegates.get(realmName);
109 users.addAll(um.getAllUsers());
110 }catch (UnsupportedOperationException e){}
111 }
112 return users;
113 }
114
115 private <RT> RT delegateUntilSupported(Op<RT> op) {
116 for (String realmName : delegates.keySet()) {
117 final UserManager um = delegates.get(realmName);
118 try {
119 return op.delegate(um);
120 } catch (UnsupportedOperationException e) {
121
122 }
123 }
124 throw new UnsupportedOperationException("None of the delegate UserManager supports this operation.");
125 }
126
127 private <RT> RT delegateUntilNotNull(Op<RT> op) {
128 for (String realmName : delegates.keySet()) {
129 final UserManager um = delegates.get(realmName);
130 final RT result = op.delegate(um);
131 if (result != null) {
132 return result;
133 }
134 }
135 return null;
136 }
137
138 private interface Op<RT> {
139 RT delegate(UserManager um);
140 }
141
142 public long getLockTimePeriod() throws UnsupportedOperationException{
143 throw new UnsupportedOperationException("Not supported by this user manager.");
144 }
145
146 public int getMaxFailedLoginAttempts() throws UnsupportedOperationException {
147 throw new UnsupportedOperationException("Not supported by this user manager.");
148 }
149
150 public void setLockTimePeriod(long lockTimePeriod) throws UnsupportedOperationException {
151 throw new UnsupportedOperationException("Not supported by this user manager.");
152 }
153
154 public void setMaxFailedLoginAttempts(int maxFailedLoginAttempts) throws UnsupportedOperationException {
155 throw new UnsupportedOperationException("Not supported by this user manager.");
156 }
157 }