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 userManager = delegates.get(realmName);
109 users.addAll(userManager.getAllUsers());
110 }catch (UnsupportedOperationException e){
111
112 }
113 }
114 return users;
115 }
116
117 private <RT> RT delegateUntilSupported(Op<RT> op) {
118 for (String realmName : delegates.keySet()) {
119 final UserManager um = delegates.get(realmName);
120 try {
121 return op.delegate(um);
122 } catch (UnsupportedOperationException e) {
123
124 }
125 }
126 throw new UnsupportedOperationException("None of the delegate UserManager supports this operation.");
127 }
128
129 private <RT> RT delegateUntilNotNull(Op<RT> op) {
130 for (String realmName : delegates.keySet()) {
131 final UserManager um = delegates.get(realmName);
132 final RT result = op.delegate(um);
133 if (result != null) {
134 return result;
135 }
136 }
137 return null;
138 }
139
140 private interface Op<RT> {
141 RT delegate(UserManager um);
142 }
143
144 public long getLockTimePeriod() throws UnsupportedOperationException{
145 throw new UnsupportedOperationException("Not supported by this user manager.");
146 }
147
148 public int getMaxFailedLoginAttempts() throws UnsupportedOperationException {
149 throw new UnsupportedOperationException("Not supported by this user manager.");
150 }
151
152 public void setLockTimePeriod(long lockTimePeriod) throws UnsupportedOperationException {
153 throw new UnsupportedOperationException("Not supported by this user manager.");
154 }
155
156 public void setMaxFailedLoginAttempts(int maxFailedLoginAttempts) throws UnsupportedOperationException {
157 throw new UnsupportedOperationException("Not supported by this user manager.");
158 }
159 }