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 import java.util.Collection;
38 import java.util.Map;
39
40
41
42
43
44
45 public class DelegatingUserManager implements UserManager {
46 private final Map<String, UserManager> delegates;
47
48
49
50
51 public DelegatingUserManager(Map<String, UserManager> delegates) {
52 this.delegates = delegates;
53 }
54
55 public User createUser(final String name, final String pw) throws UnsupportedOperationException {
56 final Op<User> op = new Op<User>() {
57 public User delegate(UserManager um) {
58 return um.createUser(name, pw);
59 }
60 };
61 return delegateUntilSupported(op);
62 }
63
64 public void changePassword(User user, String newPassword) throws UnsupportedOperationException {
65 throw new UnsupportedOperationException("Please use a specific instance of UserManager to do this.");
66 }
67
68 public User getAnonymousUser() {
69 return delegateUntilSupported(new Op<User>() {
70 public User delegate(UserManager um) {
71 return um.getAnonymousUser();
72 }
73 });
74 }
75
76 public User getSystemUser() {
77 return delegateUntilSupported(new Op<User>() {
78 public User delegate(UserManager um) {
79 return um.getSystemUser();
80 }
81 });
82 }
83
84 public User getUser(final String name) throws UnsupportedOperationException {
85 return delegateUntilNotNull(new Op<User>() {
86 public User delegate(UserManager um) {
87 return um.getUser(name);
88 }
89 });
90 }
91
92 public User getUser(final Subject subject) throws UnsupportedOperationException {
93 return delegateUntilNotNull(new Op<User>() {
94 public User delegate(UserManager um) {
95 return um.getUser(subject);
96 }
97 });
98 }
99
100
101
102 public Collection<User> getAllUsers() throws UnsupportedOperationException {
103 return delegateUntilSupported(new Op<Collection<User>>() {
104 public Collection<User> delegate(UserManager um) {
105 return um.getAllUsers();
106 }
107 });
108 }
109
110 private <RT> RT delegateUntilSupported(Op<RT> op) {
111 for (String realmName : delegates.keySet()) {
112 final UserManager um = delegates.get(realmName);
113 try {
114 return op.delegate(um);
115 } catch (UnsupportedOperationException e) {
116
117 }
118 }
119 throw new UnsupportedOperationException("None of the delegate UserManager supports this operation.");
120 }
121
122 private <RT> RT delegateUntilNotNull(Op<RT> op) {
123 for (String realmName : delegates.keySet()) {
124 final UserManager um = delegates.get(realmName);
125 final RT result = op.delegate(um);
126 if (result != null) {
127 return result;
128 }
129 }
130 return null;
131 }
132
133 private interface Op<RT> {
134 RT delegate(UserManager um);
135 }
136 }