Package org.apache.catalina.tribes.io
Class XByteBuffer
- java.lang.Object
-
- org.apache.catalina.tribes.io.XByteBuffer
-
- All Implemented Interfaces:
java.io.Serializable
public class XByteBuffer extends java.lang.Object implements java.io.Serializable
The XByteBuffer provides a dual functionality. One, it stores message bytes and automatically extends the byte buffer if needed.
Two, it can encode and decode packages so that they can be defined and identified as they come in on a socket.
THIS CLASS IS NOT THREAD SAFE
Transfer package:- START_DATA- 7 bytes - FLT2002
- SIZE - 4 bytes - size of the data package
- DATA - should be as many bytes as the prev SIZE
- END_DATA - 7 bytes - TLF2003
- See Also:
- Serialized Form
-
-
Field Summary
Fields Modifier and Type Field Description protected byte[]
buf
Variable to hold the dataprotected int
bufSize
Current length of data in the bufferprotected boolean
discard
Flag for discarding invalid packages If this flag is set to true, and append(byte[],...) is called, the data added will be inspected, and if it doesn't start withSTART_DATA
it will be thrown away.protected static StringManager
sm
-
Constructor Summary
Constructors Constructor Description XByteBuffer(byte[] data, boolean discard)
XByteBuffer(byte[] data, int size, boolean discard)
XByteBuffer(int size, boolean discard)
Constructs a new XByteBuffer.
TODO use a pool of byte[] for performance
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description boolean
append(boolean i)
boolean
append(byte i)
boolean
append(byte[] b, int off, int len)
boolean
append(int i)
boolean
append(long i)
boolean
append(java.nio.ByteBuffer b, int len)
Appends the data to the buffer.void
clear()
Resets the bufferint
countPackages()
Internal mechanism to make a check if a complete package exists within the bufferint
countPackages(boolean first)
static byte[]
createDataPackage(byte[] data)
static byte[]
createDataPackage(byte[] data, int doff, int dlength, byte[] buffer, int bufoff)
static byte[]
createDataPackage(ChannelData cdata)
Creates a complete data packagestatic java.io.Serializable
deserialize(byte[] data)
static java.io.Serializable
deserialize(byte[] data, int offset, int length)
static java.io.Serializable
deserialize(byte[] data, int offset, int length, java.lang.ClassLoader[] cls)
boolean
doesPackageExist()
Method to check if a package exists in this byte buffer.void
expand(int newcount)
XByteBuffer
extractDataPackage(boolean clearFromBuffer)
Extracts the message bytes from a package.ChannelData
extractPackage(boolean clearFromBuffer)
static int
firstIndexOf(byte[] src, int srcOff, byte[] find)
Similar to a String.IndexOf, but uses pure bytes.byte[]
getBytes()
byte[]
getBytesDirect()
int
getCapacity()
static int
getDataPackageLength(int datalength)
boolean
getDiscard()
int
getLength()
void
reset()
static byte[]
serialize(java.io.Serializable msg)
Serializes a message into cluster datavoid
setDiscard(boolean discard)
void
setLength(int size)
static boolean
toBoolean(byte[] b, int offset)
Converts a byte array entry to boolean.static byte[]
toBytes(boolean bool, byte[] data, int offset)
Converts a boolean and put it in a byte array.static byte[]
toBytes(int n, byte[] b, int offset)
Converts an integer to four bytes.static byte[]
toBytes(long n, byte[] b, int offset)
Converts a long to eight bytes.static int
toInt(byte[] b, int off)
Convert four bytes to an intstatic long
toLong(byte[] b, int off)
Convert eight bytes to a longvoid
trim(int length)
-
-
-
Field Detail
-
sm
protected static final StringManager sm
-
buf
protected byte[] buf
Variable to hold the data
-
bufSize
protected int bufSize
Current length of data in the buffer
-
discard
protected boolean discard
Flag for discarding invalid packages If this flag is set to true, and append(byte[],...) is called, the data added will be inspected, and if it doesn't start withSTART_DATA
it will be thrown away.
-
-
Constructor Detail
-
XByteBuffer
public XByteBuffer(int size, boolean discard)
Constructs a new XByteBuffer.
TODO use a pool of byte[] for performance- Parameters:
size
- the initial size of the byte bufferdiscard
- Flag for discarding invalid packages
-
XByteBuffer
public XByteBuffer(byte[] data, boolean discard)
-
XByteBuffer
public XByteBuffer(byte[] data, int size, boolean discard)
-
-
Method Detail
-
getLength
public int getLength()
-
setLength
public void setLength(int size)
-
trim
public void trim(int length)
-
reset
public void reset()
-
getBytesDirect
public byte[] getBytesDirect()
-
getBytes
public byte[] getBytes()
- Returns:
- the bytes in the buffer, in its exact length
-
clear
public void clear()
Resets the buffer
-
append
public boolean append(java.nio.ByteBuffer b, int len)
Appends the data to the buffer. If the data is incorrectly formatted, ie, the data should always start with the header, false will be returned and the data will be discarded.- Parameters:
b
- - bytes to be appendedlen
- - the number of bytes to append.- Returns:
- true if the data was appended correctly. Returns false if the package is incorrect, ie missing header or something, or the length of data is 0
-
append
public boolean append(byte i)
-
append
public boolean append(boolean i)
-
append
public boolean append(long i)
-
append
public boolean append(int i)
-
append
public boolean append(byte[] b, int off, int len)
-
expand
public void expand(int newcount)
-
getCapacity
public int getCapacity()
-
countPackages
public int countPackages()
Internal mechanism to make a check if a complete package exists within the buffer- Returns:
- - true if a complete package (header,compress,size,data,footer) exists within the buffer
-
countPackages
public int countPackages(boolean first)
-
doesPackageExist
public boolean doesPackageExist()
Method to check if a package exists in this byte buffer.- Returns:
- - true if a complete package (header,options,size,data,footer) exists within the buffer
-
extractDataPackage
public XByteBuffer extractDataPackage(boolean clearFromBuffer)
Extracts the message bytes from a package. If no package exists, a IllegalStateException will be thrown.- Parameters:
clearFromBuffer
- - if true, the package will be removed from the byte buffer- Returns:
- - returns the actual message bytes (header, compress,size and footer not included).
-
extractPackage
public ChannelData extractPackage(boolean clearFromBuffer)
-
createDataPackage
public static byte[] createDataPackage(ChannelData cdata)
Creates a complete data package- Parameters:
cdata
- - the message data to be contained within the package- Returns:
- - a full package (header,size,data,footer)
-
createDataPackage
public static byte[] createDataPackage(byte[] data, int doff, int dlength, byte[] buffer, int bufoff)
-
getDataPackageLength
public static int getDataPackageLength(int datalength)
-
createDataPackage
public static byte[] createDataPackage(byte[] data)
-
toInt
public static int toInt(byte[] b, int off)
Convert four bytes to an int- Parameters:
b
- - the byte array containing the four bytesoff
- - the offset- Returns:
- the integer value constructed from the four bytes
-
toLong
public static long toLong(byte[] b, int off)
Convert eight bytes to a long- Parameters:
b
- - the byte array containing the four bytesoff
- - the offset- Returns:
- the long value constructed from the eight bytes
-
toBytes
public static byte[] toBytes(boolean bool, byte[] data, int offset)
Converts a boolean and put it in a byte array.- Parameters:
bool
- the integerdata
- the byte buffer in which the boolean will be placedoffset
- the offset in the byte array- Returns:
- the byte array
-
toBoolean
public static boolean toBoolean(byte[] b, int offset)
Converts a byte array entry to boolean.- Parameters:
b
- byte arrayoffset
- within byte array- Returns:
- true if byte array entry is non-zero, false otherwise
-
toBytes
public static byte[] toBytes(int n, byte[] b, int offset)
Converts an integer to four bytes.- Parameters:
n
- the integerb
- the byte buffer in which the integer will be placedoffset
- the offset in the byte array- Returns:
- four bytes in an array
-
toBytes
public static byte[] toBytes(long n, byte[] b, int offset)
Converts a long to eight bytes.- Parameters:
n
- the longb
- the byte buffer in which the integer will be placedoffset
- the offset in the byte array- Returns:
- eight bytes in an array
-
firstIndexOf
public static int firstIndexOf(byte[] src, int srcOff, byte[] find)
Similar to a String.IndexOf, but uses pure bytes.- Parameters:
src
- - the source bytes to be searchedsrcOff
- - offset on the source bufferfind
- - the string to be found within src- Returns:
- - the index of the first matching byte. -1 if the find array is not found
-
deserialize
public static java.io.Serializable deserialize(byte[] data) throws java.io.IOException, java.lang.ClassNotFoundException, java.lang.ClassCastException
- Throws:
java.io.IOException
java.lang.ClassNotFoundException
java.lang.ClassCastException
-
deserialize
public static java.io.Serializable deserialize(byte[] data, int offset, int length) throws java.io.IOException, java.lang.ClassNotFoundException, java.lang.ClassCastException
- Throws:
java.io.IOException
java.lang.ClassNotFoundException
java.lang.ClassCastException
-
deserialize
public static java.io.Serializable deserialize(byte[] data, int offset, int length, java.lang.ClassLoader[] cls) throws java.io.IOException, java.lang.ClassNotFoundException, java.lang.ClassCastException
- Throws:
java.io.IOException
java.lang.ClassNotFoundException
java.lang.ClassCastException
-
serialize
public static byte[] serialize(java.io.Serializable msg) throws java.io.IOException
Serializes a message into cluster data- Parameters:
msg
- ClusterMessage- Returns:
- serialized content as byte[] array
- Throws:
java.io.IOException
- Serialization error
-
setDiscard
public void setDiscard(boolean discard)
-
getDiscard
public boolean getDiscard()
-
-