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.ByteBuffer;
24 import java.util.Iterator;
25 import java.util.Map;
26
27 import org.apache.directory.api.asn1.EncoderException;
28 import org.apache.directory.api.asn1.ber.tlv.BerValue;
29 import org.apache.directory.api.asn1.ber.tlv.UniversalTag;
30 import org.apache.directory.api.asn1.util.Asn1Buffer;
31 import org.apache.directory.api.i18n.I18n;
32 import org.apache.directory.api.ldap.codec.factory.AbandonRequestFactory;
33 import org.apache.directory.api.ldap.codec.factory.AddRequestFactory;
34 import org.apache.directory.api.ldap.codec.factory.AddResponseFactory;
35 import org.apache.directory.api.ldap.codec.factory.BindRequestFactory;
36 import org.apache.directory.api.ldap.codec.factory.BindResponseFactory;
37 import org.apache.directory.api.ldap.codec.factory.CompareRequestFactory;
38 import org.apache.directory.api.ldap.codec.factory.CompareResponseFactory;
39 import org.apache.directory.api.ldap.codec.factory.DeleteRequestFactory;
40 import org.apache.directory.api.ldap.codec.factory.DeleteResponseFactory;
41 import org.apache.directory.api.ldap.codec.factory.ExtendedRequestFactory;
42 import org.apache.directory.api.ldap.codec.factory.ExtendedResponseFactory;
43 import org.apache.directory.api.ldap.codec.factory.IntermediateResponseFactory;
44 import org.apache.directory.api.ldap.codec.factory.ModifyDnRequestFactory;
45 import org.apache.directory.api.ldap.codec.factory.ModifyDnResponseFactory;
46 import org.apache.directory.api.ldap.codec.factory.ModifyRequestFactory;
47 import org.apache.directory.api.ldap.codec.factory.ModifyResponseFactory;
48 import org.apache.directory.api.ldap.codec.factory.SearchRequestFactory;
49 import org.apache.directory.api.ldap.codec.factory.SearchResultDoneFactory;
50 import org.apache.directory.api.ldap.codec.factory.SearchResultEntryFactory;
51 import org.apache.directory.api.ldap.codec.factory.SearchResultReferenceFactory;
52 import org.apache.directory.api.ldap.codec.factory.UnbindRequestFactory;
53 import org.apache.directory.api.ldap.model.message.Control;
54 import org.apache.directory.api.ldap.model.message.Message;
55 import org.apache.directory.api.ldap.model.message.Request;
56
57
58
59
60
61
62
63 public final class LdapEncoder
64 {
65
66
67
68 private LdapEncoder()
69 {
70
71 }
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 private static void encodeControls( Asn1Buffer buffer, LdapApiService codec,
95 Map<String, Control> controls, Iterator<String> iterator, boolean isRequest ) throws EncoderException
96 {
97 if ( iterator.hasNext() )
98 {
99
100 Control control = controls.get( iterator.next() );
101
102
103 encodeControls( buffer, codec, controls, iterator, isRequest );
104
105
106 ControlFactory<?> controlFactory;
107
108 if ( isRequest )
109 {
110 controlFactory = codec.getRequestControlFactories().get( control.getOid() );
111 }
112 else
113 {
114 controlFactory = codec.getResponseControlFactories().get( control.getOid() );
115 }
116
117 if ( controlFactory == null )
118 {
119 throw new EncoderException( I18n.err( I18n.ERR_08002_CANNOT_FIND_CONTROL_FACTORY, control.getOid() ) );
120 }
121
122 int start = buffer.getPos();
123
124
125 controlFactory.encodeValue( buffer, control );
126
127 if ( buffer.getPos() != start )
128 {
129
130 BerValue.encodeSequence( buffer, ( byte ) UniversalTag.OCTET_STRING.getValue(), start );
131 }
132
133
134 if ( control.isCritical() )
135 {
136 BerValue.encodeBoolean( buffer, control.isCritical() );
137 }
138
139
140 BerValue.encodeOctetString( buffer, control.getOid() );
141
142
143 BerValue.encodeSequence( buffer, start );
144 }
145 }
146
147
148
149
150
151
152
153
154
155 private static void encodeProtocolOp( Asn1Buffer buffer, LdapApiService codec, Message message )
156 {
157 switch ( message.getType() )
158 {
159 case ABANDON_REQUEST :
160 AbandonRequestFactory.INSTANCE.encodeReverse( codec, buffer, message );
161 return;
162
163 case ADD_REQUEST :
164 AddRequestFactory.INSTANCE.encodeReverse( codec, buffer, message );
165 return;
166
167 case ADD_RESPONSE:
168 AddResponseFactory.INSTANCE.encodeReverse( codec, buffer, message );
169 return;
170
171 case BIND_REQUEST :
172 BindRequestFactory.INSTANCE.encodeReverse( codec, buffer, message );
173 return;
174
175 case BIND_RESPONSE :
176 BindResponseFactory.INSTANCE.encodeReverse( codec, buffer, message );
177 return;
178
179 case COMPARE_REQUEST :
180 CompareRequestFactory.INSTANCE.encodeReverse( codec, buffer, message );
181 return;
182
183 case COMPARE_RESPONSE :
184 CompareResponseFactory.INSTANCE.encodeReverse( codec, buffer, message );
185 return;
186
187 case DEL_REQUEST :
188 DeleteRequestFactory.INSTANCE.encodeReverse( codec, buffer, message );
189 return;
190
191 case DEL_RESPONSE :
192 DeleteResponseFactory.INSTANCE.encodeReverse( codec, buffer, message );
193 return;
194
195 case EXTENDED_REQUEST :
196 ExtendedRequestFactory.INSTANCE.encodeReverse( codec, buffer, message );
197 return;
198
199 case EXTENDED_RESPONSE :
200 ExtendedResponseFactory.INSTANCE.encodeReverse( codec, buffer, message );
201 return;
202
203 case INTERMEDIATE_RESPONSE :
204 IntermediateResponseFactory.INSTANCE.encodeReverse( codec, buffer, message );
205 return;
206
207 case MODIFY_REQUEST :
208 ModifyRequestFactory.INSTANCE.encodeReverse( codec, buffer, message );
209 return;
210
211 case MODIFY_RESPONSE :
212 ModifyResponseFactory.INSTANCE.encodeReverse( codec, buffer, message );
213 return;
214
215 case MODIFYDN_REQUEST :
216 ModifyDnRequestFactory.INSTANCE.encodeReverse( codec, buffer, message );
217 return;
218
219 case MODIFYDN_RESPONSE :
220 ModifyDnResponseFactory.INSTANCE.encodeReverse( codec, buffer, message );
221 return;
222
223 case SEARCH_REQUEST :
224 SearchRequestFactory.INSTANCE.encodeReverse( codec, buffer, message );
225 return;
226
227 case SEARCH_RESULT_DONE :
228 SearchResultDoneFactory.INSTANCE.encodeReverse( codec, buffer, message );
229 return;
230
231 case SEARCH_RESULT_ENTRY :
232 SearchResultEntryFactory.INSTANCE.encodeReverse( codec, buffer, message );
233 return;
234
235 case SEARCH_RESULT_REFERENCE :
236 SearchResultReferenceFactory.INSTANCE.encodeReverse( codec, buffer, message );
237 return;
238
239 case UNBIND_REQUEST :
240 UnbindRequestFactory.INSTANCE.encodeReverse( codec, buffer, message );
241 return;
242
243 default:
244
245 }
246 }
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275 public static ByteBuffer encodeMessage( Asn1Buffer buffer, LdapApiService codec, Message message ) throws EncoderException
276 {
277 int start = buffer.getPos();
278
279
280 Map<String, Control> controls = message.getControls();
281
282 if ( ( controls != null ) && ( controls.size() > 0 ) )
283 {
284 encodeControls( buffer, codec, controls, controls.keySet().iterator(), message instanceof Request );
285
286
287 BerValue.encodeSequence( buffer, ( byte ) LdapCodecConstants.CONTROLS_TAG, start );
288 }
289
290
291 encodeProtocolOp( buffer, codec, message );
292
293
294 BerValue.encodeInteger( buffer, message.getMessageId() );
295
296
297 BerValue.encodeSequence( buffer );
298
299 return buffer.getBytes();
300 }
301 }