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 referralLength;
48
49
50 private int searchResultReferenceLength;
51
52
53
54
55
56
57
58 public SearchResultReferenceDecorator( LdapApiService codec, SearchResultReference decoratedMessage )
59 {
60 super( codec, decoratedMessage );
61 }
62
63
64
65
66
67 public int getReferralLength()
68 {
69 return referralLength;
70 }
71
72
73
74
75
76
77 public void setReferralLength( int referralLength )
78 {
79 this.referralLength = referralLength;
80 }
81
82
83
84
85
86 public int getSearchResultReferenceLength()
87 {
88 return searchResultReferenceLength;
89 }
90
91
92
93
94
95
96 public void setSearchResultReferenceLength( int searchResultReferenceLength )
97 {
98 this.searchResultReferenceLength = searchResultReferenceLength;
99 }
100
101
102
103
104
105
106
107
108
109 public Referral getReferral()
110 {
111 return getDecorated().getReferral();
112 }
113
114
115
116
117
118 public void setReferral( Referral referral )
119 {
120 getDecorated().setReferral( referral );
121 }
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147 public int computeLength()
148 {
149 int searchResultReferenceLength = 0;
150
151
152 Referral referral = getReferral();
153
154 int referralLength = LdapEncoder.computeReferralLength( referral );
155
156 if ( referralLength != 0 )
157 {
158 setReferral( referral );
159
160 searchResultReferenceLength = referralLength;
161 }
162
163
164 setSearchResultReferenceLength( searchResultReferenceLength );
165
166 return 1 + TLV.getNbBytes( searchResultReferenceLength ) + searchResultReferenceLength;
167 }
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183 public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
184 {
185 SearchResultReference searchResultReference = getDecorated();
186 try
187 {
188
189 buffer.put( LdapCodecConstants.SEARCH_RESULT_REFERENCE_TAG );
190 buffer.put( TLV.getBytes( getSearchResultReferenceLength() ) );
191
192
193 Referral referral = searchResultReference.getReferral();
194
195 if ( referral != null )
196 {
197
198 for ( byte[] ldapUrlBytes : referral.getLdapUrlsBytes() )
199 {
200
201 BerValue.encode( buffer, ldapUrlBytes );
202 }
203 }
204 }
205 catch ( BufferOverflowException boe )
206 {
207 throw new EncoderException( I18n.err( I18n.ERR_04005 ) );
208 }
209
210 return buffer;
211 }
212 }