Package io.protostuff
Class ByteBufferInput
- java.lang.Object
-
- io.protostuff.ByteBufferInput
-
- All Implemented Interfaces:
Input
public final class ByteBufferInput extends java.lang.Object implements Input
Reads and decodes protocol buffer message fields from an internal byte array buffer. This object is re-usable via doing a reset on the byte array position and length. This is used internally byIOUtil
where it catchesArrayIndexOutOfBoundsException
when a message is truncated.
-
-
Field Summary
Fields Modifier and Type Field Description private java.nio.ByteBuffer
buffer
boolean
decodeNestedMessageAsGroup
If true, the nested messages are group-encodedprivate int
lastTag
private int
packedLimit
-
Constructor Summary
Constructors Constructor Description ByteBufferInput(java.nio.ByteBuffer buffer, boolean protostuffMessage)
An input for a ByteBuffer
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private void
checkIfPackedField()
Check if this field have been packed into a length-delimited field.void
checkLastTagWas(int value)
Verifies that the last call to readTag() returned the given tag value.int
currentLimit()
Returns the current limit (the end index).int
currentOffset()
Returns the current offset (the position).int
getLastTag()
Returns the last tag.<T> void
handleUnknownField(int fieldNumber, Schema<T> schema)
The underlying implementation should handle the unknown field.boolean
isCurrentFieldPacked()
Return true if currently reading packed field<T> T
mergeObject(T value, Schema<T> schema)
Merges an object(with schema) field value.private <T> T
mergeObjectEncodedAsGroup(T value, Schema<T> schema)
boolean
readBool()
Read abool
field value from the internal buffer.byte[]
readByteArray()
Reads a byte array field value.java.nio.ByteBuffer
readByteBuffer()
Reads a byte array/ByteBuffer value.ByteString
readBytes()
Reads aByteString
field value.void
readBytes(java.nio.ByteBuffer bb)
Reads a field value into aByteBuffer
.double
readDouble()
Read adouble
field value from the internal buffer.int
readEnum()
Read an enum field value from the internal buffer.<T> int
readFieldNumber(Schema<T> schema)
Reads the field number of a message/object tied to the givenschema
.int
readFixed32()
Read afixed32
field value from the internal buffer.long
readFixed64()
Read afixed64
field value from the internal buffer.float
readFloat()
Read afloat
field value from the internal buffer.int
readInt32()
Read anint32
field value from the internal buffer.long
readInt64()
Read anint64
field value from the internal buffer.int
readRawLittleEndian32()
Read a 32-bit little-endian integer from the internal buffer.long
readRawLittleEndian64()
Read a 64-bit little-endian integer from the internal byte buffer.int
readRawVarint32()
Reads a var int 32 from the internal byte buffer.long
readRawVarint64()
Reads a var int 64 from the internal byte buffer.int
readSFixed32()
Read ansfixed32
field value from the internal buffer.long
readSFixed64()
Read ansfixed64
field value from the internal buffer.int
readSInt32()
Read ansint32
field value from the internal buffer.long
readSInt64()
Read ansint64
field value from the internal buffer.java.lang.String
readString()
Reads aString
field value.int
readTag()
Attempt to read a field tag, returning zero if we have reached EOF.int
readUInt32()
Read auint32
field value from the internal buffer.long
readUInt64()
Read auint64
field value from the internal buffer.ByteBufferInput
reset(int offset, int len)
Resets the offset and the limit of the internal buffer.boolean
skipField(int tag)
Reads and discards a single field, given its tag value.void
skipMessage()
Reads and discards an entire message.void
transferByteRangeTo(Output output, boolean utf8String, int fieldNumber, boolean repeated)
Transfer the byte range to the output.
-
-
-
Method Detail
-
reset
public ByteBufferInput reset(int offset, int len)
Resets the offset and the limit of the internal buffer.
-
currentOffset
public int currentOffset()
Returns the current offset (the position).
-
currentLimit
public int currentLimit()
Returns the current limit (the end index).
-
isCurrentFieldPacked
public boolean isCurrentFieldPacked()
Return true if currently reading packed field
-
getLastTag
public int getLastTag()
Returns the last tag.
-
readTag
public int readTag() throws java.io.IOException
Attempt to read a field tag, returning zero if we have reached EOF. Protocol message parsers use this to read tags, since a protocol message may legally end wherever a tag occurs, and zero is not a valid tag number.- Throws:
java.io.IOException
-
checkLastTagWas
public void checkLastTagWas(int value) throws ProtobufException
Verifies that the last call to readTag() returned the given tag value. This is used to verify that a nested group ended with the correct end tag.- Throws:
ProtobufException
-value
does not match the last tag.
-
skipField
public boolean skipField(int tag) throws java.io.IOException
Reads and discards a single field, given its tag value.- Returns:
false
if the tag is an endgroup tag, in which case nothing is skipped. Otherwise, returnstrue
.- Throws:
java.io.IOException
-
skipMessage
public void skipMessage() throws java.io.IOException
Reads and discards an entire message. This will read either until EOF or until an endgroup tag, whichever comes first.- Throws:
java.io.IOException
-
handleUnknownField
public <T> void handleUnknownField(int fieldNumber, Schema<T> schema) throws java.io.IOException
Description copied from interface:Input
The underlying implementation should handle the unknown field.- Specified by:
handleUnknownField
in interfaceInput
- Throws:
java.io.IOException
-
readFieldNumber
public <T> int readFieldNumber(Schema<T> schema) throws java.io.IOException
Description copied from interface:Input
Reads the field number of a message/object tied to the givenschema
.- Specified by:
readFieldNumber
in interfaceInput
- Throws:
java.io.IOException
-
checkIfPackedField
private void checkIfPackedField() throws java.io.IOException
Check if this field have been packed into a length-delimited field. If so, update internal state to reflect that packed fields are being read.- Throws:
java.io.IOException
-
readDouble
public double readDouble() throws java.io.IOException
Read adouble
field value from the internal buffer.- Specified by:
readDouble
in interfaceInput
- Throws:
java.io.IOException
-
readFloat
public float readFloat() throws java.io.IOException
Read afloat
field value from the internal buffer.
-
readUInt64
public long readUInt64() throws java.io.IOException
Read auint64
field value from the internal buffer.- Specified by:
readUInt64
in interfaceInput
- Throws:
java.io.IOException
-
readInt64
public long readInt64() throws java.io.IOException
Read anint64
field value from the internal buffer.
-
readInt32
public int readInt32() throws java.io.IOException
Read anint32
field value from the internal buffer.
-
readFixed64
public long readFixed64() throws java.io.IOException
Read afixed64
field value from the internal buffer.- Specified by:
readFixed64
in interfaceInput
- Throws:
java.io.IOException
-
readFixed32
public int readFixed32() throws java.io.IOException
Read afixed32
field value from the internal buffer.- Specified by:
readFixed32
in interfaceInput
- Throws:
java.io.IOException
-
readBool
public boolean readBool() throws java.io.IOException
Read abool
field value from the internal buffer.
-
readUInt32
public int readUInt32() throws java.io.IOException
Read auint32
field value from the internal buffer.- Specified by:
readUInt32
in interfaceInput
- Throws:
java.io.IOException
-
readEnum
public int readEnum() throws java.io.IOException
Read an enum field value from the internal buffer. Caller is responsible for converting the numeric value to an actual enum.
-
readSFixed32
public int readSFixed32() throws java.io.IOException
Read ansfixed32
field value from the internal buffer.- Specified by:
readSFixed32
in interfaceInput
- Throws:
java.io.IOException
-
readSFixed64
public long readSFixed64() throws java.io.IOException
Read ansfixed64
field value from the internal buffer.- Specified by:
readSFixed64
in interfaceInput
- Throws:
java.io.IOException
-
readSInt32
public int readSInt32() throws java.io.IOException
Read ansint32
field value from the internal buffer.- Specified by:
readSInt32
in interfaceInput
- Throws:
java.io.IOException
-
readSInt64
public long readSInt64() throws java.io.IOException
Read ansint64
field value from the internal buffer.- Specified by:
readSInt64
in interfaceInput
- Throws:
java.io.IOException
-
readString
public java.lang.String readString() throws java.io.IOException
Description copied from interface:Input
Reads aString
field value.- Specified by:
readString
in interfaceInput
- Throws:
java.io.IOException
-
readBytes
public ByteString readBytes() throws java.io.IOException
Description copied from interface:Input
Reads aByteString
field value.
-
readBytes
public void readBytes(java.nio.ByteBuffer bb) throws java.io.IOException
Description copied from interface:Input
Reads a field value into aByteBuffer
.
-
readByteArray
public byte[] readByteArray() throws java.io.IOException
Description copied from interface:Input
Reads a byte array field value.- Specified by:
readByteArray
in interfaceInput
- Throws:
java.io.IOException
-
mergeObject
public <T> T mergeObject(T value, Schema<T> schema) throws java.io.IOException
Description copied from interface:Input
Merges an object(with schema) field value. The providedschema
handles the deserialization for the object.- Specified by:
mergeObject
in interfaceInput
- Throws:
java.io.IOException
-
mergeObjectEncodedAsGroup
private <T> T mergeObjectEncodedAsGroup(T value, Schema<T> schema) throws java.io.IOException
- Throws:
java.io.IOException
-
readRawVarint32
public int readRawVarint32() throws java.io.IOException
Reads a var int 32 from the internal byte buffer.- Throws:
java.io.IOException
-
readRawVarint64
public long readRawVarint64() throws java.io.IOException
Reads a var int 64 from the internal byte buffer.- Throws:
java.io.IOException
-
readRawLittleEndian32
public int readRawLittleEndian32() throws java.io.IOException
Read a 32-bit little-endian integer from the internal buffer.- Throws:
java.io.IOException
-
readRawLittleEndian64
public long readRawLittleEndian64() throws java.io.IOException
Read a 64-bit little-endian integer from the internal byte buffer.- Throws:
java.io.IOException
-
transferByteRangeTo
public void transferByteRangeTo(Output output, boolean utf8String, int fieldNumber, boolean repeated) throws java.io.IOException
Description copied from interface:Input
Transfer the byte range to the output. Capable of zero-copy transfer depending on the type of input.- Specified by:
transferByteRangeTo
in interfaceInput
- Throws:
java.io.IOException
-
readByteBuffer
public java.nio.ByteBuffer readByteBuffer() throws java.io.IOException
Reads a byte array/ByteBuffer value.- Specified by:
readByteBuffer
in interfaceInput
- Throws:
java.io.IOException
-
-