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.asn1;
021
022
023 import java.nio.ByteBuffer;
024
025 import org.apache.directory.shared.asn1.codec.DecoderException;
026 import org.apache.directory.shared.asn1.codec.EncoderException;
027 import org.apache.directory.shared.i18n.I18n;
028
029
030 /**
031 * An abstract class which implements basic TLV operations.
032 *
033 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
034 * @version $Rev$, $Date$
035 */
036 public abstract class AbstractAsn1Object implements Asn1Object
037 {
038 // ~ Instance fields
039 // ----------------------------------------------------------------------------
040
041 /** The object's current length. It is used while decoding PDUs */
042 private int currentLength;
043
044 /** The object's expected length. It is used while decoding PDUs */
045 private int expectedLength;
046
047 /** The encapsulating Object */
048 protected AbstractAsn1Object parent;
049
050
051 /** The identifier of the associated TLV */
052 private int tlvId;
053
054 // ~ Methods
055 // ------------------------------------------------------------------------------------
056
057 /**
058 * Constructor associated with a TLV indentifier. Used when
059 * decoded a TLV, we create an association between the decode
060 * Asn1Object and the TLV which is the encoded form.
061 *
062 * @param tlvId The TLV Id.
063 */
064 protected AbstractAsn1Object( int tlvId )
065 {
066 this.tlvId = tlvId;
067 }
068
069
070 /**
071 * Default constructor. The TLV Id is set to -1. This constructor
072 * is called when an Asn1Object is created to be encoded, not decoded.
073 */
074 protected AbstractAsn1Object()
075 {
076 this.tlvId = -1;
077 }
078
079 /**
080 * Get the current object length, which is the sum of all inner length
081 * already decoded.
082 *
083 * @return The current object's length
084 */
085 public int getCurrentLength()
086 {
087 return currentLength;
088 }
089
090
091 /**
092 * Compute the object length, which is the sum of all inner length.
093 *
094 * @return The object's computed length
095 */
096 public abstract int computeLength();
097
098
099 /**
100 * Encode the object to a PDU.
101 *
102 * @param buffer The buffer where to put the PDU
103 * @return The PDU.
104 * @throws EncoderException if the buffer can't be encoded
105 */
106 public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
107 {
108 return null;
109 }
110
111
112 /**
113 * Get the expected object length.
114 *
115 * @return The expected object's length
116 */
117 public int getExpectedLength()
118 {
119 return expectedLength;
120 }
121
122
123 /**
124 * Add a length to the object
125 *
126 * @param length
127 * The length to add.
128 * @throws DecoderException
129 * Thrown if the current length exceed the expected length
130 */
131 public void addLength( int length ) throws DecoderException
132 {
133 currentLength += length;
134
135 if ( currentLength > expectedLength )
136 {
137 throw new DecoderException( I18n.err( I18n.ERR_00041 ) );
138 }
139 }
140
141
142 /**
143 * Set the expected length
144 *
145 * @param expectedLength
146 * The expectedLength to set.
147 */
148 public void setExpectedLength( int expectedLength )
149 {
150 this.expectedLength = expectedLength;
151 }
152
153
154 /**
155 * Set the current length
156 *
157 * @param currentLength
158 * The currentLength to set.
159 */
160 public void setCurrentLength( int currentLength )
161 {
162 this.currentLength = currentLength;
163 }
164
165
166 /**
167 * Get the parent
168 *
169 * @return Returns the parent.
170 */
171 public AbstractAsn1Object getParent()
172 {
173 return parent;
174 }
175
176
177 /**
178 * Set the parent
179 *
180 * @param parent
181 * The parent to set.
182 */
183 public void setParent( AbstractAsn1Object parent )
184 {
185 this.parent = parent;
186 }
187
188 /**
189 * @return The TLV identifier associated with this object
190 */
191 public int getTlvId()
192 {
193 return tlvId;
194 }
195 }