1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.api.ldap.codec.factory;
21
22 import java.util.Iterator;
23 import java.util.List;
24
25 import org.apache.directory.api.asn1.ber.tlv.BerValue;
26 import org.apache.directory.api.asn1.util.Asn1Buffer;
27 import org.apache.directory.api.ldap.codec.api.LdapApiService;
28 import org.apache.directory.api.ldap.codec.api.LdapCodecConstants;
29 import org.apache.directory.api.ldap.model.filter.AndNode;
30 import org.apache.directory.api.ldap.model.filter.ApproximateNode;
31 import org.apache.directory.api.ldap.model.filter.BranchNode;
32 import org.apache.directory.api.ldap.model.filter.EqualityNode;
33 import org.apache.directory.api.ldap.model.filter.ExprNode;
34 import org.apache.directory.api.ldap.model.filter.ExtensibleNode;
35 import org.apache.directory.api.ldap.model.filter.GreaterEqNode;
36 import org.apache.directory.api.ldap.model.filter.LessEqNode;
37 import org.apache.directory.api.ldap.model.filter.NotNode;
38 import org.apache.directory.api.ldap.model.filter.OrNode;
39 import org.apache.directory.api.ldap.model.filter.PresenceNode;
40 import org.apache.directory.api.ldap.model.filter.SimpleNode;
41 import org.apache.directory.api.ldap.model.filter.SubstringNode;
42 import org.apache.directory.api.ldap.model.message.Message;
43 import org.apache.directory.api.ldap.model.message.SearchRequest;
44 import org.apache.directory.api.util.Strings;
45
46
47
48
49
50
51 public final class SearchRequestFactory implements Messagefactory
52 {
53
54 public static final SearchRequestFactory INSTANCE = new SearchRequestFactory();
55
56 private SearchRequestFactory()
57 {
58
59 }
60
61
62
63
64
65
66
67 private void encodeFilters( Asn1Buffer buffer, Iterator<ExprNode> children )
68 {
69 if ( children.hasNext() )
70 {
71 ExprNode child = children.next();
72
73
74 encodeFilters( buffer, children );
75
76
77 encodeFilter( buffer, child );
78 }
79 }
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95 private void encodeFilter( Asn1Buffer buffer, BranchNode node, byte tag )
96 {
97 int start = buffer.getPos();
98
99
100 List<ExprNode> children = node.getChildren();
101
102 if ( ( children != null ) && ( !children.isEmpty() ) )
103 {
104 encodeFilters( buffer, children.iterator() );
105 }
106
107
108 BerValue.encodeSequence( buffer, tag, start );
109 }
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126 private void encodeFilter( Asn1Buffer buffer, SimpleNode<?> node, byte tag )
127 {
128 int start = buffer.getPos();
129
130
131 BerValue.encodeOctetString( buffer, node.getValue().getBytes() );
132
133
134 BerValue.encodeOctetString( buffer, node.getAttribute() );
135
136
137 BerValue.encodeSequence( buffer, tag, start );
138 }
139
140
141
142
143
144
145
146
147
148
149
150
151
152 private void encodeFilter( Asn1Buffer buffer, PresenceNode node )
153 {
154
155 BerValue.encodeOctetString( buffer, ( byte ) LdapCodecConstants.PRESENT_FILTER_TAG,
156 Strings.getBytesUtf8( node.getAttribute() ) );
157 }
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180 private void encodeFilter( Asn1Buffer buffer, SubstringNode node )
181 {
182 int start = buffer.getPos();
183
184
185 if ( node.getFinal() != null )
186 {
187 BerValue.encodeOctetString( buffer, ( byte ) LdapCodecConstants.SUBSTRINGS_FILTER_FINAL_TAG,
188 Strings.getBytesUtf8( node.getFinal() ) );
189 }
190
191
192 List<String> any = node.getAny();
193
194 if ( any != null )
195 {
196 for ( int i = any.size(); i > 0; i-- )
197 {
198 BerValue.encodeOctetString( buffer, ( byte ) LdapCodecConstants.SUBSTRINGS_FILTER_ANY_TAG,
199 Strings.getBytesUtf8( any.get( i - 1 ) ) );
200 }
201 }
202
203
204 if ( node.getInitial() != null )
205 {
206 BerValue.encodeOctetString( buffer, ( byte ) LdapCodecConstants.SUBSTRINGS_FILTER_INITIAL_TAG,
207 Strings.getBytesUtf8( node.getInitial() ) );
208 }
209
210
211 BerValue.encodeSequence( buffer, start );
212
213
214 BerValue.encodeOctetString( buffer, node.getAttribute() );
215
216
217 BerValue.encodeSequence( buffer, ( byte ) LdapCodecConstants.SUBSTRINGS_FILTER_TAG, start );
218 }
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237 private void encodeFilter( Asn1Buffer buffer, ExtensibleNode node )
238 {
239 int start = buffer.getPos();
240
241
242 if ( node.hasDnAttributes() )
243 {
244 BerValue.encodeBoolean( buffer, ( byte ) LdapCodecConstants.DN_ATTRIBUTES_FILTER_TAG, true );
245 }
246
247
248 if ( node.getValue() != null )
249 {
250 BerValue.encodeOctetString( buffer, ( byte ) LdapCodecConstants.MATCH_VALUE_TAG,
251 node.getValue().getBytes() );
252 }
253
254
255 if ( node.getAttribute() != null )
256 {
257 BerValue.encodeOctetString( buffer, ( byte ) LdapCodecConstants.MATCHING_RULE_TYPE_TAG,
258 Strings.getBytesUtf8( node.getAttribute() ) );
259 }
260
261
262 if ( node.getMatchingRuleId() != null )
263 {
264 BerValue.encodeOctetString( buffer, ( byte ) LdapCodecConstants.MATCHING_RULE_ID_TAG,
265 Strings.getBytesUtf8( node.getMatchingRuleId() ) );
266 }
267
268
269 BerValue.encodeSequence( buffer, ( byte ) LdapCodecConstants.EXTENSIBLE_MATCH_FILTER_TAG, start );
270 }
271
272
273
274
275
276
277
278
279 private void encodeFilter( Asn1Buffer buffer, ExprNode node )
280 {
281 switch ( node.getClass().getSimpleName() )
282 {
283 case "AndNode" :
284 encodeFilter( buffer, ( AndNode ) node, ( byte ) LdapCodecConstants.AND_FILTER_TAG );
285 break;
286
287 case "ApproximateNode" :
288 encodeFilter( buffer, ( ApproximateNode<?> ) node, ( byte ) LdapCodecConstants.APPROX_MATCH_FILTER_TAG );
289 break;
290
291 case "EqualityNode" :
292 encodeFilter( buffer, ( EqualityNode<?> ) node, ( byte ) LdapCodecConstants.EQUALITY_MATCH_FILTER_TAG );
293 break;
294
295 case "ExtensibleNode" :
296 encodeFilter( buffer, ( ExtensibleNode ) node );
297 break;
298
299 case "GreaterEqNode" :
300 encodeFilter( buffer, ( GreaterEqNode<?> ) node, ( byte ) LdapCodecConstants.GREATER_OR_EQUAL_FILTER_TAG );
301 break;
302
303 case "LessEqNode" :
304 encodeFilter( buffer, ( LessEqNode<?> ) node, ( byte ) LdapCodecConstants.LESS_OR_EQUAL_FILTER_TAG );
305 break;
306
307 case "NotNode" :
308 encodeFilter( buffer, ( NotNode ) node, ( byte ) LdapCodecConstants.NOT_FILTER_TAG );
309 break;
310
311 case "OrNode" :
312 encodeFilter( buffer, ( OrNode ) node, ( byte ) LdapCodecConstants.OR_FILTER_TAG );
313 break;
314
315 case "PresenceNode" :
316 encodeFilter( buffer, ( PresenceNode ) node );
317 break;
318
319 case "SubstringNode" :
320 encodeFilter( buffer, ( SubstringNode ) node );
321 break;
322
323 default:
324 break;
325 }
326 }
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351 @Override
352 public void encodeReverse( LdapApiService codec, Asn1Buffer buffer, Message message )
353 {
354 int start = buffer.getPos();
355 SearchRequest searchRequest = ( SearchRequest ) message;
356
357
358 List<String> attributes = searchRequest.getAttributes();
359
360 if ( ( attributes != null ) && ( !attributes.isEmpty() ) )
361 {
362 for ( int i = attributes.size(); i > 0; i-- )
363 {
364 BerValue.encodeOctetString( buffer, attributes.get( i - 1 ) );
365 }
366 }
367
368
369 BerValue.encodeSequence( buffer, start );
370
371
372 encodeFilter( buffer, searchRequest.getFilter() );
373
374
375 BerValue.encodeBoolean( buffer, searchRequest.getTypesOnly() );
376
377
378 BerValue.encodeInteger( buffer, searchRequest.getTimeLimit() );
379
380
381 BerValue.encodeInteger( buffer, searchRequest.getSizeLimit() );
382
383
384 BerValue.encodeEnumerated( buffer, searchRequest.getDerefAliases().getValue() );
385
386
387 BerValue.encodeEnumerated( buffer, searchRequest.getScope().getScope() );
388
389
390 BerValue.encodeOctetString( buffer, Strings.getBytesUtf8( searchRequest.getBase().getName() ) );
391
392
393 BerValue.encodeSequence( buffer, LdapCodecConstants.SEARCH_REQUEST_TAG, start );
394 }
395 }