Class XByteBuffer

java.lang.Object
org.apache.catalina.tribes.io.XByteBuffer
All Implemented Interfaces:
Serializable

public class XByteBuffer extends Object implements 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:
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected byte[]
    Variable to hold the data
    protected int
    Current length of data in the buffer
    protected boolean
    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 with START_DATA it will be thrown away.
    protected static final StringManager
    String manager for this class.
  • Constructor Summary

    Constructors
    Constructor
    Description
    XByteBuffer(byte[] data, boolean discard)
    Constructs a new XByteBuffer from the given data.
    XByteBuffer(byte[] data, int size, boolean discard)
    Constructs a new XByteBuffer from the given data with a specific buffer size.
    XByteBuffer(int size, boolean discard)
    Constructs a new XByteBuffer.
    TODO use a pool of byte[] for performance
  • Method Summary

    Modifier and Type
    Method
    Description
    boolean
    append(boolean i)
    Appends a boolean value to the buffer.
    boolean
    append(byte i)
    Appends a single byte to the buffer.
    boolean
    append(byte[] b, int off, int len)
    Appends a portion of a byte array to the buffer.
    boolean
    append(int i)
    Appends an integer value to the buffer.
    boolean
    append(long i)
    Appends a long value to the buffer.
    boolean
    append(ByteBuffer b, int len)
    Appends the data to the buffer.
    void
    Resets the buffer
    int
    Internal mechanism to make a check if a complete package exists within the buffer
    int
    countPackages(boolean first)
    Counts the number of complete packages in the buffer.
    static byte[]
    createDataPackage(byte[] data)
    Creates a complete data package from the given data.
    static byte[]
    createDataPackage(byte[] data, int doff, int dlength, byte[] buffer, int bufoff)
    Creates a complete data package with header, size, data, and footer, writing to a provided buffer.
    static byte[]
    Creates a complete data package
    deserialize(byte[] data)
    Deserializes a Serializable object from the given byte array.
    deserialize(byte[] data, int offset, int length)
    Deserializes a Serializable object from a portion of the given byte array.
    deserialize(byte[] data, int offset, int length, ClassLoader[] cls)
    Deserializes a Serializable object from a portion of the given byte array using the specified class loaders.
    boolean
    Method to check if a package exists in this byte buffer.
    void
    expand(int newcount)
    Expands the internal buffer to accommodate the specified number of bytes.
    extractDataPackage(boolean clearFromBuffer)
    Extracts the message bytes from a package.
    extractPackage(boolean clearFromBuffer)
    Extracts a complete package from the buffer and deserializes it into a ChannelData object.
    static int
    firstIndexOf(byte[] src, int srcOff, byte[] find)
    Similar to a String.IndexOf, but uses pure bytes.
    byte[]
    Returns the bytes in the buffer, in its exact length.
    byte[]
    Returns the internal byte array directly, without copying.
    int
    Returns the current capacity of the internal buffer.
    static int
    getDataPackageLength(int datalength)
    Calculates the total length of a data package including header, size indicator, data, and footer.
    boolean
    Returns the discard flag for invalid packages.
    int
    Returns the current length of the data in the buffer.
    void
    Resets the buffer length to zero.
    static byte[]
    Serializes a message into cluster data
    void
    setDiscard(boolean discard)
    Sets the discard flag for invalid packages.
    void
    setLength(int size)
    Sets the current length of the data in the buffer.
    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 int
    static long
    toLong(byte[] b, int off)
    Convert eight bytes to a long
    void
    trim(int length)
    Trims the specified number of bytes from the end of the buffer.

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • sm

      protected static final StringManager sm
      String manager for this class.
    • 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 with START_DATA it will be thrown away.
  • Constructor Details

    • 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 buffer
      discard - Flag for discarding invalid packages
    • XByteBuffer

      public XByteBuffer(byte[] data, boolean discard)
      Constructs a new XByteBuffer from the given data.
      Parameters:
      data - the initial data
      discard - Flag for discarding invalid packages
    • XByteBuffer

      public XByteBuffer(byte[] data, int size, boolean discard)
      Constructs a new XByteBuffer from the given data with a specific buffer size.
      Parameters:
      data - the initial data
      size - the initial size of the byte buffer
      discard - Flag for discarding invalid packages
  • Method Details

    • getLength

      public int getLength()
      Returns the current length of the data in the buffer.
      Returns:
      the current length
    • setLength

      public void setLength(int size)
      Sets the current length of the data in the buffer.
      Parameters:
      size - the new length
    • trim

      public void trim(int length)
      Trims the specified number of bytes from the end of the buffer.
      Parameters:
      length - the number of bytes to trim
    • reset

      public void reset()
      Resets the buffer length to zero.
    • getBytesDirect

      public byte[] getBytesDirect()
      Returns the internal byte array directly, without copying.
      Returns:
      the internal byte array
    • getBytes

      public byte[] getBytes()
      Returns the bytes in the buffer, in its exact length.
      Returns:
      The bytes in the buffer
    • clear

      public void clear()
      Resets the buffer
    • append

      public boolean append(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 appended
      len - - 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)
      Appends a single byte to the buffer.
      Parameters:
      i - the byte to append
      Returns:
      always returns true
    • append

      public boolean append(boolean i)
      Appends a boolean value to the buffer.
      Parameters:
      i - the boolean to append
      Returns:
      always returns true
    • append

      public boolean append(long i)
      Appends a long value to the buffer.
      Parameters:
      i - the long to append
      Returns:
      always returns true
    • append

      public boolean append(int i)
      Appends an integer value to the buffer.
      Parameters:
      i - the integer to append
      Returns:
      always returns true
    • append

      public boolean append(byte[] b, int off, int len)
      Appends a portion of a byte array to the buffer.
      Parameters:
      b - the byte array
      off - the offset in the byte array
      len - the number of bytes to append
      Returns:
      true if data was appended, false if length is zero
    • expand

      public void expand(int newcount)
      Expands the internal buffer to accommodate the specified number of bytes.
      Parameters:
      newcount - the new minimum capacity required
    • getCapacity

      public int getCapacity()
      Returns the current capacity of the internal buffer.
      Returns:
      the buffer capacity
    • 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)
      Counts the number of complete packages in the buffer.
      Parameters:
      first - if true, only check for the first package
      Returns:
      the number of complete packages found
    • 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)
      Extracts a complete package from the buffer and deserializes it into a ChannelData object.
      Parameters:
      clearFromBuffer - if true, the extracted package will be removed from the buffer
      Returns:
      the deserialized ChannelData object
    • 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)
      Creates a complete data package with header, size, data, and footer, writing to a provided buffer.
      Parameters:
      data - the data to package
      doff - the offset in the data array
      dlength - the length of the data
      buffer - the output buffer
      bufoff - the offset in the output buffer
      Returns:
      the output buffer
    • getDataPackageLength

      public static int getDataPackageLength(int datalength)
      Calculates the total length of a data package including header, size indicator, data, and footer.
      Parameters:
      datalength - the length of the data portion
      Returns:
      the total package length
    • createDataPackage

      public static byte[] createDataPackage(byte[] data)
      Creates a complete data package from the given data.
      Parameters:
      data - the data to package
      Returns:
      a full package (header, size, data, footer)
    • toInt

      public static int toInt(byte[] b, int off)
      Convert four bytes to an int
      Parameters:
      b - - the byte array containing the four bytes
      off - - 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 bytes
      off - - 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 integer
      data - the byte buffer in which the boolean will be placed
      offset - 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 array
      offset - 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 integer
      b - the byte buffer in which the integer will be placed
      offset - 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 long
      b - the byte buffer in which the integer will be placed
      offset - 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 searched
      srcOff - - offset on the source buffer
      find - - 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 Serializable deserialize(byte[] data) throws IOException, ClassNotFoundException, ClassCastException
      Deserializes a Serializable object from the given byte array.
      Parameters:
      data - the byte array containing the serialized object
      Returns:
      the deserialized object
      Throws:
      IOException - if an I/O error occurs
      ClassNotFoundException - if the class of the serialized object cannot be found
      ClassCastException - if the deserialized object is not Serializable
    • deserialize

      public static Serializable deserialize(byte[] data, int offset, int length) throws IOException, ClassNotFoundException, ClassCastException
      Deserializes a Serializable object from a portion of the given byte array.
      Parameters:
      data - the byte array containing the serialized object
      offset - the offset in the byte array
      length - the length of the data to deserialize
      Returns:
      the deserialized object
      Throws:
      IOException - if an I/O error occurs
      ClassNotFoundException - if the class of the serialized object cannot be found
      ClassCastException - if the deserialized object is not Serializable
    • deserialize

      public static Serializable deserialize(byte[] data, int offset, int length, ClassLoader[] cls) throws IOException, ClassNotFoundException, ClassCastException
      Deserializes a Serializable object from a portion of the given byte array using the specified class loaders.
      Parameters:
      data - the byte array containing the serialized object
      offset - the offset in the byte array
      length - the length of the data to deserialize
      cls - the class loaders to use for deserialization
      Returns:
      the deserialized object
      Throws:
      IOException - if an I/O error occurs
      ClassNotFoundException - if the class of the serialized object cannot be found
      ClassCastException - if the deserialized object is not Serializable
    • serialize

      public static byte[] serialize(Serializable msg) throws IOException
      Serializes a message into cluster data
      Parameters:
      msg - ClusterMessage
      Returns:
      serialized content as byte[] array
      Throws:
      IOException - Serialization error
    • setDiscard

      public void setDiscard(boolean discard)
      Sets the discard flag for invalid packages.
      Parameters:
      discard - the new discard flag value
    • getDiscard

      public boolean getDiscard()
      Returns the discard flag for invalid packages.
      Returns:
      the discard flag value