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 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.TLV;
28 import org.apache.directory.api.i18n.I18n;
29 import org.apache.directory.api.ldap.codec.decorators.SingleReplyRequestDecorator;
30 import org.apache.directory.api.ldap.model.message.Control;
31 import org.apache.directory.api.ldap.model.message.ExtendedRequest;
32 import org.apache.directory.api.util.Strings;
33
34
35
36
37
38
39
40
41
42 public class ExtendedRequestDecorator<Q extends ExtendedRequest>
43 extends SingleReplyRequestDecorator<Q> implements ExtendedRequest
44 {
45
46 private int extendedRequestLength;
47
48
49 private byte[] requestNameBytes;
50
51
52 protected byte[] requestValue;
53
54
55
56
57
58
59
60
61 public ExtendedRequestDecorator( LdapApiService codec, Q decoratedMessage )
62 {
63 super( codec, decoratedMessage );
64 }
65
66
67
68
69
70
71
72
73
74 @Override
75 public String getRequestName()
76 {
77 return getDecorated().getRequestName();
78 }
79
80
81
82
83
84 @Override
85 public ExtendedRequest setRequestName( String oid )
86 {
87 getDecorated().setRequestName( oid );
88
89 return this;
90 }
91
92
93
94
95
96
97
98 public byte[] getRequestValue()
99 {
100 return requestValue;
101 }
102
103
104
105
106
107
108
109 public void setRequestValue( byte[] requestValue )
110 {
111 this.requestValue = requestValue;
112 }
113
114
115
116
117
118 @Override
119 public ExtendedRequest setMessageId( int messageId )
120 {
121 super.setMessageId( messageId );
122
123 return this;
124 }
125
126
127
128
129
130 @Override
131 public ExtendedRequest addControl( Control control )
132 {
133 return ( ExtendedRequest ) super.addControl( control );
134 }
135
136
137
138
139
140 @Override
141 public ExtendedRequest addAllControls( Control[] controls )
142 {
143 return ( ExtendedRequest ) super.addAllControls( controls );
144 }
145
146
147
148
149
150 @Override
151 public ExtendedRequest removeControl( Control control )
152 {
153 return ( ExtendedRequest ) super.removeControl( control );
154 }
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177 @Override
178 public int computeLength()
179 {
180 requestNameBytes = Strings.getBytesUtf8( getRequestName() );
181
182 extendedRequestLength = 1 + TLV.getNbBytes( requestNameBytes.length ) + requestNameBytes.length;
183
184 if ( getRequestValue() != null )
185 {
186 extendedRequestLength += 1 + TLV.getNbBytes( getRequestValue().length )
187 + getRequestValue().length;
188 }
189
190 return 1 + TLV.getNbBytes( extendedRequestLength ) + extendedRequestLength;
191 }
192
193
194
195
196
197
198
199
200
201
202
203
204
205 @Override
206 public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
207 {
208 try
209 {
210
211 buffer.put( LdapCodecConstants.EXTENDED_REQUEST_TAG );
212 buffer.put( TLV.getBytes( extendedRequestLength ) );
213
214
215 if ( requestNameBytes == null )
216 {
217 throw new EncoderException( I18n.err( I18n.ERR_04043 ) );
218 }
219
220 buffer.put( ( byte ) LdapCodecConstants.EXTENDED_REQUEST_NAME_TAG );
221 buffer.put( TLV.getBytes( requestNameBytes.length ) );
222
223 if ( requestNameBytes.length != 0 )
224 {
225 buffer.put( requestNameBytes );
226 }
227
228
229 if ( getRequestValue() != null )
230 {
231 buffer.put( ( byte ) LdapCodecConstants.EXTENDED_REQUEST_VALUE_TAG );
232
233 buffer.put( TLV.getBytes( getRequestValue().length ) );
234
235 if ( getRequestValue().length != 0 )
236 {
237 buffer.put( getRequestValue() );
238 }
239 }
240 }
241 catch ( BufferOverflowException boe )
242 {
243 throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
244 }
245
246 return buffer;
247 }
248 }