1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.bremersee.ldaptive.reactive;
18
19 import java.util.Collection;
20 import java.util.Collections;
21 import java.util.Objects;
22 import java.util.Optional;
23 import org.bremersee.ldaptive.LdaptiveEntryMapper;
24 import org.bremersee.ldaptive.LdaptiveErrorHandler;
25 import org.ldaptive.AddRequest;
26 import org.ldaptive.BindRequest;
27 import org.ldaptive.CompareRequest;
28 import org.ldaptive.ConnectionFactory;
29 import org.ldaptive.DeleteRequest;
30 import org.ldaptive.LdapEntry;
31 import org.ldaptive.ModifyDnRequest;
32 import org.ldaptive.ModifyRequest;
33 import org.ldaptive.Result;
34 import org.ldaptive.SearchRequest;
35 import org.ldaptive.extended.ExtendedRequest;
36 import org.ldaptive.extended.ExtendedResponse;
37 import org.ldaptive.extended.PasswordModifyRequest;
38 import org.ldaptive.extended.PasswordModifyResponseParser;
39 import reactor.core.publisher.Flux;
40 import reactor.core.publisher.Mono;
41
42
43
44
45
46
47 public interface ReactiveLdaptiveOperations {
48
49
50
51
52
53
54
55 ReactiveLdaptiveOperations copy();
56
57
58
59
60
61
62
63
64 ReactiveLdaptiveOperations copy(LdaptiveErrorHandler errorHandler);
65
66
67
68
69
70
71
72 ConnectionFactory getConnectionFactory();
73
74
75
76
77
78
79
80 Mono<Result> add(AddRequest addRequest);
81
82
83
84
85
86
87
88 Mono<Boolean> bind(BindRequest bindRequest);
89
90
91
92
93
94
95
96 Mono<Boolean> compare(CompareRequest compareRequest);
97
98
99
100
101
102
103
104 Mono<Result> delete(DeleteRequest deleteRequest);
105
106
107
108
109
110
111
112 Mono<ExtendedResponse> executeExtension(ExtendedRequest request);
113
114
115
116
117
118
119
120 default Mono<String> generateUserPassword(String dn) {
121 return executeExtension(new PasswordModifyRequest(dn))
122 .map(PasswordModifyResponseParser::parse);
123 }
124
125
126
127
128
129
130
131 Mono<Result> modify(ModifyRequest modifyRequest);
132
133
134
135
136
137
138
139 Mono<Result> modifyDn(ModifyDnRequest modifyDnRequest);
140
141
142
143
144
145
146
147
148
149 default Mono<ExtendedResponse> modifyUserPassword(
150 String dn,
151 String oldPass,
152 String newPass) {
153 return executeExtension(new PasswordModifyRequest(dn, oldPass, newPass));
154 }
155
156
157
158
159
160
161
162 Mono<LdapEntry> findOne(SearchRequest searchRequest);
163
164
165
166
167
168
169
170
171
172 default <T> Mono<T> findOne(SearchRequest searchRequest,
173 LdaptiveEntryMapper<T> entryMapper) {
174 return findOne(searchRequest)
175 .map(ldapEntry -> Objects.requireNonNull(entryMapper.map(ldapEntry)));
176 }
177
178
179
180
181
182
183
184 Flux<LdapEntry> findAll(SearchRequest searchRequest);
185
186
187
188
189
190
191
192
193
194 default <T> Flux<T> findAll(SearchRequest searchRequest,
195 LdaptiveEntryMapper<T> entryMapper) {
196 return findAll(searchRequest)
197 .map(ldapEntry -> Objects.requireNonNull(entryMapper.map(ldapEntry)));
198 }
199
200
201
202
203
204
205
206 default Mono<Boolean> exists(String dn) {
207 int index = dn.indexOf('=');
208 if (index > 0) {
209 String attr = dn.substring(0, index).trim();
210 return findOne(SearchRequest.objectScopeSearchRequest(dn, new String[]{attr}))
211 .map(ldapEntry -> true)
212 .defaultIfEmpty(false);
213 }
214 return Mono.just(false);
215 }
216
217
218
219
220
221
222
223
224
225 default <T> Mono<Boolean> exists(T domainObject,
226 LdaptiveEntryMapper<T> entryMapper) {
227 return exists(entryMapper.mapDn(domainObject));
228 }
229
230
231
232
233
234
235
236
237
238 <T> Mono<T> save(T domainObject, LdaptiveEntryMapper<T> entryMapper);
239
240
241
242
243
244
245
246
247
248 default <T> Flux<T> saveAll(Collection<T> domainObjects,
249 LdaptiveEntryMapper<T> entryMapper) {
250 return Flux.fromIterable(Optional.ofNullable(domainObjects).orElseGet(Collections::emptyList))
251 .flatMap(domainObject -> save(domainObject, entryMapper));
252 }
253
254
255
256
257
258
259
260
261
262 default <T> Mono<Result> remove(
263 T domainObject,
264 LdaptiveEntryMapper<T> entryMapper) {
265 return delete(DeleteRequest.builder().dn(entryMapper.mapDn(domainObject)).build());
266 }
267
268
269
270
271
272
273
274
275
276 default <T> Mono<Long> removeAll(
277 Collection<T> domainObjects,
278 LdaptiveEntryMapper<T> entryMapper) {
279 return Flux.fromIterable(Optional.ofNullable(domainObjects).orElseGet(Collections::emptyList))
280 .flatMap(domainObject -> remove(domainObject, entryMapper))
281 .count();
282 }
283
284 }