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