001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 *
019 */
020 package org.apache.directory.shared.ldap.codec;
021
022
023 import org.apache.directory.shared.asn1.ber.AbstractContainer;
024 import org.apache.directory.shared.ldap.codec.abandon.AbandonRequestCodec;
025 import org.apache.directory.shared.ldap.codec.add.AddRequestCodec;
026 import org.apache.directory.shared.ldap.codec.add.AddResponseCodec;
027 import org.apache.directory.shared.ldap.codec.bind.BindRequestCodec;
028 import org.apache.directory.shared.ldap.codec.bind.BindResponseCodec;
029 import org.apache.directory.shared.ldap.codec.compare.CompareRequestCodec;
030 import org.apache.directory.shared.ldap.codec.compare.CompareResponseCodec;
031 import org.apache.directory.shared.ldap.codec.controls.AbstractControl;
032 import org.apache.directory.shared.ldap.codec.del.DelRequestCodec;
033 import org.apache.directory.shared.ldap.codec.del.DelResponseCodec;
034 import org.apache.directory.shared.ldap.codec.extended.ExtendedRequestCodec;
035 import org.apache.directory.shared.ldap.codec.extended.ExtendedResponseCodec;
036 import org.apache.directory.shared.ldap.codec.intermediate.IntermediateResponseCodec;
037 import org.apache.directory.shared.ldap.codec.modify.ModifyRequestCodec;
038 import org.apache.directory.shared.ldap.codec.modify.ModifyResponseCodec;
039 import org.apache.directory.shared.ldap.codec.modifyDn.ModifyDNRequestCodec;
040 import org.apache.directory.shared.ldap.codec.modifyDn.ModifyDNResponseCodec;
041 import org.apache.directory.shared.ldap.codec.search.SearchRequestCodec;
042 import org.apache.directory.shared.ldap.codec.search.SearchResultDoneCodec;
043 import org.apache.directory.shared.ldap.codec.search.SearchResultEntryCodec;
044 import org.apache.directory.shared.ldap.codec.search.SearchResultReferenceCodec;
045 import org.apache.directory.shared.ldap.codec.unbind.UnBindRequestCodec;
046 import org.apache.directory.shared.ldap.message.spi.BinaryAttributeDetector;
047
048
049 /**
050 * The LdapMessage container stores all the messages decoded by the Asn1Decoder.
051 * When dealing whith an incoding PDU, we will obtain a LdapMessage in the
052 * ILdapContainer.
053 *
054 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
055 * @version $Rev: 910150 $, $Date: 2010-02-15 02:37:34 +0100 (Lun, 15 fév 2010) $,
056 */
057 public class LdapMessageContainer extends AbstractContainer
058 {
059 // ~ Instance fields
060 // ----------------------------------------------------------------------------
061
062 /** The ldap message */
063 private LdapMessageCodec ldapMessage;
064
065 /** checks if attribute is binary */
066 private final BinaryAttributeDetector binaryAttributeDetector;
067
068 /** The message ID */
069 private int messageId;
070
071 /** The current control */
072 private AbstractControl currentControl;
073
074 // ~ Constructors
075 // -------------------------------------------------------------------------------
076
077 /**
078 * Creates a new LdapMessageContainer object. We will store ten grammars,
079 * it's enough ...
080 */
081 public LdapMessageContainer()
082 {
083 this( new BinaryAttributeDetector()
084 {
085 public boolean isBinary( String attributeId )
086 {
087 return false;
088 }
089 });
090 }
091
092
093 /**
094 * Creates a new LdapMessageContainer object. We will store ten grammars,
095 * it's enough ...
096 *
097 * @param binaryAttributeDetector checks if an attribute is binary
098 */
099 public LdapMessageContainer( BinaryAttributeDetector binaryAttributeDetector )
100 {
101 super();
102 this.stateStack = new int[10];
103 this.grammar = LdapMessageGrammar.getInstance();
104 this.states = LdapStatesEnum.getInstance();
105 this.binaryAttributeDetector = binaryAttributeDetector;
106 }
107
108
109 // ~ Methods
110 // ------------------------------------------------------------------------------------
111 /**
112 * @return Returns the ldapMessage.
113 */
114 public LdapMessageCodec getLdapMessage()
115 {
116 return ldapMessage;
117 }
118
119
120 /**
121 * @return Returns the LdapResponse.
122 */
123 public LdapResponseCodec getLdapResponse()
124 {
125 return (LdapResponseCodec)ldapMessage;
126 }
127
128
129 /**
130 * @return Returns the AbandonRequest stored in the container
131 */
132 public AbandonRequestCodec getAbandonRequest()
133 {
134 return (AbandonRequestCodec)ldapMessage;
135 }
136
137
138 /**
139 * @return Returns the AddRequest stored in the container
140 */
141 public AddRequestCodec getAddRequest()
142 {
143 return (AddRequestCodec)ldapMessage;
144 }
145
146
147 /**
148 * @return Returns the AddResponse stored in the container
149 */
150 public AddResponseCodec getAddResponse()
151 {
152 return (AddResponseCodec)ldapMessage;
153 }
154
155
156 /**
157 * @return Returns the BindRequest stored in the container
158 */
159 public BindRequestCodec getBindRequest()
160 {
161 return (BindRequestCodec)ldapMessage;
162 }
163
164
165 /**
166 * @return Returns the BindResponse stored in the container
167 */
168 public BindResponseCodec getBindResponse()
169 {
170 return (BindResponseCodec)ldapMessage;
171 }
172
173
174 /**
175 * @return Returns the CompareRequest stored in the container
176 */
177 public CompareRequestCodec getCompareRequest()
178 {
179 return (CompareRequestCodec)ldapMessage;
180 }
181
182
183 /**
184 * @return Returns the CompareResponse stored in the container
185 */
186 public CompareResponseCodec getCompareResponse()
187 {
188 return (CompareResponseCodec)ldapMessage;
189 }
190
191
192 /**
193 * @return Returns the DelRequest stored in the container
194 */
195 public DelRequestCodec getDelRequest()
196 {
197 return (DelRequestCodec)ldapMessage;
198 }
199
200
201 /**
202 * @return Returns the DelResponse stored in the container
203 */
204 public DelResponseCodec getDelResponse()
205 {
206 return (DelResponseCodec)ldapMessage;
207 }
208
209
210 /**
211 * @return Returns the ExtendedRequest stored in the container
212 */
213 public ExtendedRequestCodec getExtendedRequest()
214 {
215 return (ExtendedRequestCodec)ldapMessage;
216 }
217
218
219 /**
220 * @return Returns the ExtendedResponse stored in the container
221 */
222 public ExtendedResponseCodec getExtendedResponse()
223 {
224 return (ExtendedResponseCodec)ldapMessage;
225 }
226
227
228 /**
229 * @return Returns the IntermediateResponse stored in the container
230 */
231 public IntermediateResponseCodec getIntermediateResponse()
232 {
233 return (IntermediateResponseCodec)ldapMessage;
234 }
235
236
237 /**
238 * @return Returns the ModifyRequest stored in the container
239 */
240 public ModifyRequestCodec getModifyRequest()
241 {
242 return (ModifyRequestCodec)ldapMessage;
243 }
244
245
246 /**
247 * @return Returns the ModifyResponse stored in the container
248 */
249 public ModifyResponseCodec getModifyResponse()
250 {
251 return (ModifyResponseCodec)ldapMessage;
252 }
253
254
255 /**
256 * @return Returns the ModifyDnRequest stored in the container
257 */
258 public ModifyDNRequestCodec getModifyDnRequest()
259 {
260 return (ModifyDNRequestCodec)ldapMessage;
261 }
262
263
264 /**
265 * @return Returns the ModifyDnResponse stored in the container
266 */
267 public ModifyDNResponseCodec getModifyDnResponse()
268 {
269 return (ModifyDNResponseCodec)ldapMessage;
270 }
271
272
273 /**
274 * @return Returns the SearchRequest stored in the container
275 */
276 public SearchRequestCodec getSearchRequest()
277 {
278 return (SearchRequestCodec)ldapMessage;
279 }
280
281
282 /**
283 * @return Returns the SearchResultEntryCodec stored in the container
284 */
285 public SearchResultEntryCodec getSearchResultEntry()
286 {
287 return (SearchResultEntryCodec)ldapMessage;
288 }
289
290
291 /**
292 * @return Returns the SearchResultReferenceCodec stored in the container
293 */
294 public SearchResultReferenceCodec getSearchResultReference()
295 {
296 return (SearchResultReferenceCodec)ldapMessage;
297 }
298
299
300 /**
301 * @return Returns the SearchResultDone stored in the container
302 */
303 public SearchResultDoneCodec getSearchResultDone()
304 {
305 return (SearchResultDoneCodec)ldapMessage;
306 }
307
308
309 /**
310 * @return Returns the UnbindRequest stored in the container
311 */
312 public UnBindRequestCodec getUnbindRequest()
313 {
314 return (UnBindRequestCodec)ldapMessage;
315 }
316
317
318 /**
319 * Set a ldapMessage Object into the container. It will be completed by the
320 * ldapDecoder .
321 *
322 * @param ldapMessage The message to set.
323 */
324 public void setLdapMessage( LdapMessageCodec ldapMessage )
325 {
326 this.ldapMessage = ldapMessage;
327 }
328
329
330 public void clean()
331 {
332 super.clean();
333
334 ldapMessage = null;
335 messageId = 0;
336 currentControl = null;
337 decodeBytes = 0;
338 }
339
340
341 /**
342 * @return Returns true if the attribute is binary.
343 * @param id checks if an attribute id is binary
344 */
345 public boolean isBinary( String id )
346 {
347 return binaryAttributeDetector.isBinary( id );
348 }
349
350 /**
351 * @return The message ID
352 */
353 public int getMessageId()
354 {
355 return messageId;
356 }
357
358 /**
359 * Set the message ID
360 * @param messageId the id of the message
361 */
362 public void setMessageId( int messageId )
363 {
364 this.messageId = messageId;
365 }
366
367 /**
368 * @return the current control being created
369 */
370 public AbstractControl getCurrentControl()
371 {
372 return currentControl;
373 }
374
375 /**
376 * Store a newly created control
377 * @param currentControl The control to store
378 */
379 public void setCurrentControl( AbstractControl currentControl )
380 {
381 this.currentControl = currentControl;
382 }
383 }