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.decorators;
21
22
23 import java.nio.BufferOverflowException;
24 import java.nio.ByteBuffer;
25
26 import org.apache.directory.api.asn1.EncoderException;
27 import org.apache.directory.api.asn1.ber.tlv.BerValue;
28 import org.apache.directory.api.asn1.ber.tlv.TLV;
29 import org.apache.directory.api.i18n.I18n;
30 import org.apache.directory.api.ldap.codec.api.LdapApiService;
31 import org.apache.directory.api.ldap.codec.api.LdapCodecConstants;
32 import org.apache.directory.api.ldap.codec.api.LdapEncoder;
33 import org.apache.directory.api.ldap.codec.api.MessageDecorator;
34 import org.apache.directory.api.ldap.model.message.Referral;
35 import org.apache.directory.api.ldap.model.message.SearchResultReference;
36
37
38
39
40
41
42
43 public class SearchResultReferenceDecorator extends MessageDecorator<SearchResultReference>
44 implements SearchResultReference
45 {
46
47 private int searchResultReferenceLength;
48
49
50
51
52
53
54
55
56 public SearchResultReferenceDecorator( LdapApiService codec, SearchResultReference decoratedMessage )
57 {
58 super( codec, decoratedMessage );
59 }
60
61
62
63
64
65
66
67
68
69 @Override
70 public Referral getReferral()
71 {
72 return getDecorated().getReferral();
73 }
74
75
76
77
78
79 @Override
80 public void setReferral( Referral referral )
81 {
82 getDecorated().setReferral( referral );
83 }
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111 @Override
112 public int computeLength()
113 {
114 searchResultReferenceLength = 0;
115
116
117 Referral referral = getReferral();
118
119 int referralLength = LdapEncoder.computeReferralLength( referral );
120
121 if ( referralLength != 0 )
122 {
123 setReferral( referral );
124
125 searchResultReferenceLength = referralLength;
126 }
127
128 return 1 + TLV.getNbBytes( searchResultReferenceLength ) + searchResultReferenceLength;
129 }
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145 @Override
146 public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
147 {
148 SearchResultReference searchResultReference = getDecorated();
149 try
150 {
151
152 buffer.put( LdapCodecConstants.SEARCH_RESULT_REFERENCE_TAG );
153 buffer.put( TLV.getBytes( searchResultReferenceLength ) );
154
155
156 Referral referral = searchResultReference.getReferral();
157
158 if ( referral != null )
159 {
160
161 for ( byte[] ldapUrlBytes : referral.getLdapUrlsBytes() )
162 {
163
164 BerValue.encode( buffer, ldapUrlBytes );
165 }
166 }
167 }
168 catch ( BufferOverflowException boe )
169 {
170 throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
171 }
172
173 return buffer;
174 }
175 }