View Javadoc
1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  You may obtain a copy of the License at
9    *  
10   *    http://www.apache.org/licenses/LICENSE-2.0
11   *  
12   *  Unless required by applicable law or agreed to in writing,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License. 
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.TLV;
28  import org.apache.directory.api.i18n.I18n;
29  import org.apache.directory.api.ldap.codec.api.LdapApiService;
30  import org.apache.directory.api.ldap.codec.api.LdapCodecConstants;
31  import org.apache.directory.api.ldap.model.message.CompareResponse;
32  
33  
34  /**
35   * A decorator for the CompareResponse message
36   *
37   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
38   */
39  public class CompareResponseDecorator extends ResponseDecorator<CompareResponse>
40      implements CompareResponse
41  {
42      /** The encoded compareResponse length */
43      private int compareResponseLength;
44  
45  
46      /**
47       * Makes a CompareResponse a MessageDecorator.
48       *
49       * @param codec The LDAP service instance
50       * @param decoratedMessage the decorated CompareResponse
51       */
52      public CompareResponseDecorator( LdapApiService codec, CompareResponse decoratedMessage )
53      {
54          super( codec, decoratedMessage );
55      }
56  
57  
58      //-------------------------------------------------------------------------
59      // The CompareResponse methods
60      //-------------------------------------------------------------------------
61  
62      /**
63       * {@inheritDoc}
64       */
65      @Override
66      public boolean isTrue()
67      {
68          return getDecorated().isTrue();
69      }
70  
71  
72      //-------------------------------------------------------------------------
73      // The Decorator methods
74      //-------------------------------------------------------------------------
75  
76      /**
77       * Compute the CompareResponse length 
78       * <br>
79       * CompareResponse :
80       * <pre>
81       * 0x6F L1
82       *  |
83       *  +--&gt; LdapResult
84       * 
85       * L1 = Length(LdapResult)
86       * 
87       * Length(CompareResponse) = Length(0x6F) + Length(L1) + L1
88       * </pre>
89       */
90      @Override
91      public int computeLength()
92      {
93          compareResponseLength = ( ( LdapResultDecorator ) getLdapResult() ).computeLength();
94  
95          return 1 + TLV.getNbBytes( compareResponseLength ) + compareResponseLength;
96      }
97  
98  
99      /**
100      * Encode the CompareResponse message to a PDU.
101      * 
102      * @param buffer The buffer where to put the PDU
103      */
104     @Override
105     public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
106     {
107         try
108         {
109             // The CompareResponse Tag
110             buffer.put( LdapCodecConstants.COMPARE_RESPONSE_TAG );
111             buffer.put( TLV.getBytes( compareResponseLength ) );
112 
113             // The LdapResult
114             ( ( LdapResultDecorator ) getLdapResult() ).encode( buffer );
115         }
116         catch ( BufferOverflowException boe )
117         {
118             throw new EncoderException( I18n.err( I18n.ERR_04005 ), boe );
119         }
120 
121         return buffer;
122     }
123 }