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.api;
21
22
23 import org.apache.directory.api.asn1.DecoderException;
24 import org.apache.directory.api.asn1.ber.AbstractContainer;
25 import org.apache.directory.api.asn1.ber.tlv.TLV;
26 import org.apache.directory.api.ldap.codec.LdapMessageGrammar;
27 import org.apache.directory.api.ldap.codec.LdapStatesEnum;
28 import org.apache.directory.api.ldap.codec.search.ConnectorFilter;
29 import org.apache.directory.api.ldap.codec.search.Filter;
30 import org.apache.directory.api.ldap.codec.search.PresentFilter;
31 import org.apache.directory.api.ldap.model.entry.Attribute;
32 import org.apache.directory.api.ldap.model.entry.Modification;
33 import org.apache.directory.api.ldap.model.message.Control;
34 import org.apache.directory.api.ldap.model.message.ExtendedResponse;
35 import org.apache.directory.api.ldap.model.message.LdapResult;
36 import org.apache.directory.api.ldap.model.message.Message;
37 import org.apache.directory.api.ldap.model.message.ResultResponse;
38 import org.apache.directory.api.ldap.model.name.DnFactory;
39
40
41
42
43
44
45
46
47
48
49
50 public class LdapMessageContainer<E extends Message> extends AbstractContainer
51 {
52
53 private E message;
54
55
56 private BinaryAttributeDetector binaryAttributeDetector;
57
58
59 private int messageId;
60
61
62 private Control currentControl;
63
64
65 private ControlFactory<?> controlFactory;
66
67
68 private DnFactory dnFactory;
69
70
71 private IntermediateOperationFactory intermediateFactory;
72
73
74 private ExtendedOperationFactory extendedFactory;
75
76
77 private final LdapApiService codec;
78
79
80 private LdapResult ldapResult;
81
82
83 private Attribute currentAttribute;
84
85
86 private Modification currentModification;
87
88
89 private int tlvId;
90
91
92 private Filter terminalFilter;
93
94
95 private Filter currentFilter;
96
97
98 private Filter topFilter;
99
100
101
102
103
104
105
106
107 public LdapMessageContainer( LdapApiService codec )
108 {
109 this( codec, new DefaultConfigurableBinaryAttributeDetector() );
110 }
111
112
113
114
115
116
117
118
119 public LdapMessageContainer( LdapApiService codec, BinaryAttributeDetector binaryAttributeDetector )
120 {
121 super();
122 this.codec = codec;
123 setGrammar( LdapMessageGrammar.getInstance() );
124 this.binaryAttributeDetector = binaryAttributeDetector;
125 setTransition( LdapStatesEnum.START_STATE );
126 }
127
128
129
130
131
132
133
134 public LdapApiService getLdapCodecService()
135 {
136 return codec;
137 }
138
139
140
141
142
143 public E getMessage()
144 {
145 return message;
146 }
147
148
149
150
151
152
153
154
155 public void setMessage( E message )
156 {
157 this.message = message;
158 }
159
160
161
162
163
164 @Override
165 public void clean()
166 {
167 super.clean();
168
169 messageId = -1;
170 tlvId = -1;
171 message = null;
172 ldapResult = null;
173 currentControl = null;
174 currentAttribute = null;
175 currentFilter = null;
176 terminalFilter = null;
177 topFilter = null;
178 controlFactory = null;
179 intermediateFactory = null;
180 extendedFactory = null;
181 setDecodedBytes( 0 );
182 }
183
184
185
186
187
188
189 public boolean isBinary( String id )
190 {
191 return binaryAttributeDetector.isBinary( id );
192 }
193
194
195
196
197
198 public int getMessageId()
199 {
200 return messageId;
201 }
202
203
204
205
206
207
208 public void setMessageId( int messageId )
209 {
210 this.messageId = messageId;
211 }
212
213
214
215
216
217 public Control getCurrentControl()
218 {
219 return currentControl;
220 }
221
222
223
224
225
226
227 public void setCurrentControl( Control currentControl )
228 {
229 this.currentControl = currentControl;
230 }
231
232
233
234
235
236
237
238 public void setBinaryAttributeDetector( BinaryAttributeDetector binaryAttributeDetector )
239 {
240 this.binaryAttributeDetector = binaryAttributeDetector;
241 }
242
243
244
245
246
247 public BinaryAttributeDetector getBinaryAttributeDetector()
248 {
249 return binaryAttributeDetector;
250 }
251
252
253
254
255
256 public LdapResult getLdapResult()
257 {
258 return ldapResult;
259 }
260
261
262
263
264
265 public void setLdapResult( LdapResult ldapResult )
266 {
267 this.ldapResult = ldapResult;
268 }
269
270
271
272
273
274 public ControlFactory<?> getControlFactory()
275 {
276 return controlFactory;
277 }
278
279
280
281
282
283 public void setControlFactory( ControlFactory<?> controlFactory )
284 {
285 this.controlFactory = controlFactory;
286 }
287
288
289
290
291
292 public Attribute getCurrentAttribute()
293 {
294 return currentAttribute;
295 }
296
297
298
299
300
301 public void setCurrentAttribute( Attribute currentAttribute )
302 {
303 this.currentAttribute = currentAttribute;
304 }
305
306
307
308
309
310 public Modification getCurrentModification()
311 {
312 return currentModification;
313 }
314
315
316
317
318
319 public void setCurrentModification( Modification currentModification )
320 {
321 this.currentModification = currentModification;
322 }
323
324
325
326
327
328
329 public void setTlvId( int tlvId )
330 {
331 this.tlvId = tlvId;
332 }
333
334
335
336
337
338 public Filter getTerminalFilter()
339 {
340 return terminalFilter;
341 }
342
343
344
345
346
347 public void setTerminalFilter( Filter terminalFilter )
348 {
349 this.terminalFilter = terminalFilter;
350 }
351
352
353
354
355
356 public Filter getCurrentFilter()
357 {
358 return currentFilter;
359 }
360
361
362
363
364
365 public void setCurrentFilter( Filter currentFilter )
366 {
367 this.currentFilter = currentFilter;
368 }
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384 public void addCurrentFilter( Filter localFilter ) throws DecoderException
385 {
386 if ( currentFilter != null )
387 {
388
389
390 ( ( ConnectorFilter ) currentFilter ).addFilter( localFilter );
391 localFilter.setParent( currentFilter, currentFilter.getTlvId() );
392
393 if ( localFilter instanceof ConnectorFilter )
394 {
395 currentFilter = localFilter;
396 }
397 }
398 else
399 {
400
401 currentFilter = localFilter;
402 currentFilter.setParent( null, tlvId );
403 topFilter = localFilter;
404 }
405 }
406
407
408
409
410
411
412
413
414 public void unstackFilters()
415 {
416 TLV tlv = getCurrentTLV();
417 TLV localParent = tlv.getParent();
418 Filter localFilter = terminalFilter;
419
420
421 while ( ( localParent != null ) && ( localParent.getExpectedLength() == 0 ) )
422 {
423 int parentTlvId = localFilter.getParent() != null ? localFilter.getParent().getTlvId() : localFilter
424 .getParentTlvId();
425
426 if ( localParent.getId() != parentTlvId )
427 {
428 localParent = localParent.getParent();
429 }
430 else
431 {
432 Filter filterParent = localFilter.getParent();
433
434
435
436 if ( localFilter instanceof PresentFilter )
437 {
438 if ( filterParent == null )
439 {
440
441 break;
442 }
443
444 filterParent = filterParent.getParent();
445 }
446 else
447 {
448 filterParent = filterParent.getParent();
449 }
450
451 if ( filterParent != null )
452 {
453
454
455 localFilter = currentFilter;
456 currentFilter = filterParent;
457 localParent = localParent.getParent();
458 }
459 else
460 {
461
462 break;
463 }
464 }
465 }
466 }
467
468
469
470
471
472
473
474
475
476 public static void copyLdapResult( ResultResponse resultResponse, ExtendedResponse extendedResponse )
477 {
478 extendedResponse.getLdapResult().setDiagnosticMessage( resultResponse.getLdapResult().getDiagnosticMessage() );
479 extendedResponse.getLdapResult().setMatchedDn( resultResponse.getLdapResult().getMatchedDn() );
480 extendedResponse.getLdapResult().setReferral( resultResponse.getLdapResult().getReferral() );
481 extendedResponse.getLdapResult().setResultCode( resultResponse.getLdapResult().getResultCode() );
482 }
483
484
485
486
487
488 public Filter getTopFilter()
489 {
490 return topFilter;
491 }
492
493
494
495
496
497 public void setTopFilter( Filter topFilter )
498 {
499 this.topFilter = topFilter;
500 }
501
502
503
504
505
506 public int getTlvId()
507 {
508 return tlvId;
509 }
510
511
512
513
514
515 public IntermediateOperationFactory getIntermediateFactory()
516 {
517 return intermediateFactory;
518 }
519
520
521
522
523
524 public void setIntermediateFactory( IntermediateOperationFactory intermediateFactory )
525 {
526 this.intermediateFactory = intermediateFactory;
527 }
528
529
530
531
532
533 public ExtendedOperationFactory getExtendedFactory()
534 {
535 return extendedFactory;
536 }
537
538
539
540
541
542 public void setExtendedFactory( ExtendedOperationFactory extendedFactory )
543 {
544 this.extendedFactory = extendedFactory;
545 }
546
547
548
549
550
551 public DnFactory getDnFactory()
552 {
553 return dnFactory;
554 }
555
556
557
558
559
560 public void setDnFactory( DnFactory dnFactory )
561 {
562 this.dnFactory = dnFactory;
563 }
564 }