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