Class MessageParserImpl

  • All Implemented Interfaces:
    MessageParser

    public class MessageParserImpl
    extends java.lang.Object
    implements MessageParser
    An implementation of a MessageParser that knows how to parse bytes into a GIOP protocol data unit.
    • Field Detail

      • orb

        private final ORB orb
      • expectingMoreData

        private boolean expectingMoreData
      • moreBytesToParse

        private boolean moreBytesToParse
      • nextMsgStartPos

        private int nextMsgStartPos
      • sizeNeeded

        private int sizeNeeded
      • fragmentList

        private java.util.List<RequestId> fragmentList
        A list of request ids awaiting final fragments. When the size of this list is larger than 0, we have received a fragmented message and expecting to receive more message fragments for that given request id on this list. Hence, if there are entries in this list we are expecting more data to arrive. We are using a List here rather than a Set since the size of the List is expected to be rather small, (i.e. less than size 10).
      • msgByteBuffer

        private java.nio.ByteBuffer msgByteBuffer
      • remainderBuffer

        private java.nio.ByteBuffer remainderBuffer
        The buffer which will be returned for additional input.
      • messageMediator

        private MessageMediator messageMediator
        wrapped message create by the last call to offerBuffer.
      • expectingFragments

        private boolean expectingFragments
    • Constructor Detail

      • MessageParserImpl

        public MessageParserImpl​(ORB orb)
        Creates a new instance of MessageParserImpl
        Parameters:
        orb - the ORB
      • MessageParserImpl

        public MessageParserImpl​(ORB orb,
                                 Connection connection)
    • Method Detail

      • getNewBufferAndCopyOld

        public java.nio.ByteBuffer getNewBufferAndCopyOld​(java.nio.ByteBuffer byteBuffer)
        Specified by:
        getNewBufferAndCopyOld in interface MessageParser
      • isExpectingMoreData

        public boolean isExpectingMoreData()
        Is this MessageParser expecting more data ?
        Specified by:
        isExpectingMoreData in interface MessageParser
        Returns:
        - True if more bytes are needed to construct at least one GIOP protocol data unit. False, if no additional bytes are remain to be parsed into a GIOP protocol data unit.
      • getMsgByteBuffer

        public java.nio.ByteBuffer getMsgByteBuffer()
        Description copied from interface: MessageParser
        Returns the byte buffer (if any) associated with the last message returned.
        Specified by:
        getMsgByteBuffer in interface MessageParser
        Returns:
        the associated byte buffer
      • offerBuffer

        public void offerBuffer​(java.nio.ByteBuffer buffer)
        Description copied from interface: MessageParser
        Offers an input buffer to the parser. Position must be set to 0, and the buffer must contain at least the start of a GIOP message. The parser will consume what it can and make the remainder available in MessageParser.getRemainderBuffer()
        Specified by:
        offerBuffer in interface MessageParser
        Parameters:
        buffer - a buffer containing at least the start of a GIOP message.
      • splitAndReturnRemainder

        private java.nio.ByteBuffer splitAndReturnRemainder​(java.nio.ByteBuffer buffer,
                                                            int splitPosition)
        Splits the specified buffer at the specified position, returning the first part and setting remainderBuffer to the second, or null if there is no data in the second. The split position must be no greater than the limit.
      • containsFullHeader

        private boolean containsFullHeader​(java.nio.ByteBuffer buffer)
      • containsFullMessage

        private boolean containsFullMessage​(java.nio.ByteBuffer buffer)
      • getTotalMessageLength

        private int getTotalMessageLength​(java.nio.ByteBuffer buffer)
      • getMessageBodyLength

        private int getMessageBodyLength​(java.nio.ByteBuffer buffer)
      • getByteOrder

        private java.nio.ByteOrder getByteOrder​(byte messageFlag)
      • getRemainderBuffer

        public java.nio.ByteBuffer getRemainderBuffer()
        Description copied from interface: MessageParser
        Returns a buffer containing whatever is left after processing the buffer provided in MessageParser.offerBuffer(ByteBuffer), which could be the same buffer. The buffer could also be null if all data has been consumed.
        Specified by:
        getRemainderBuffer in interface MessageParser
        Returns:
        a byte buffer representing data which still needs to be processed.
      • checkTimeout

        public void checkTimeout​(long timeSinceLastInput)
        Description copied from interface: MessageParser
        Checks for a stalled or rogue client. If in the middle of receiving a message and the time exceeds the limit, will throw a communications failure exception.
        Specified by:
        checkTimeout in interface MessageParser
        Parameters:
        timeSinceLastInput - the number of milliseconds since the last input was received.
      • timeLimitExceeded

        private boolean timeLimitExceeded​(long timeSinceLastInput)
      • isMidMessage

        private boolean isMidMessage()
      • parseBytes

        public Message parseBytes​(java.nio.ByteBuffer byteBuffer,
                                  Connection connection)
        Description copied from interface: MessageParser
        If there are sufficient bytes in the ByteBuffer to compose a Message, then return a newly initialized Message. Otherwise, return null. When this method is first called, it is assumed that ByteBuffer.position() points to the location in the ByteBuffer where the beginning of the first Message begins. If there is no partial Message remaining in the ByteBuffer when this method exits, this method will e this.expectingMoreData to false. Otherwise, it will be set to true. Callees of this method may check isExpectingMoreData() subsequently to determine if this MessageParser is expecting more data to complete a protocol data unit. Callees may also subsequently check hasMoreBytesToParse() to determine if this MessageParser has more data to parse in the given ByteBuffer.
        Specified by:
        parseBytes in interface MessageParser
        Parameters:
        byteBuffer - Buffer to parse
        connection - connection for message
        Returns:
        Message if one is found in the ByteBuffer. Otherwise, returns null.
      • stillLookingForFragments

        private boolean stillLookingForFragments()
      • isEndOfFragmentList

        private boolean isEndOfFragmentList​(Message message)
      • removeRequestIdFromFragmentList

        private void removeRequestIdFromFragmentList​(Message message,
                                                     java.nio.ByteBuffer byteBuffer)
      • addRequestIdToFragmentList

        private void addRequestIdToFragmentList​(Message message,
                                                java.nio.ByteBuffer byteBuffer)
      • hasMoreBytesToParse

        public boolean hasMoreBytesToParse()
        Are there more bytes to be parsed in the ByteBuffer given to this MessageParser's parseBytes ? This method is typically called after a call to parseBytes() to determine if the ByteBuffer has more bytes which need to parsed into a Message.
        Specified by:
        hasMoreBytesToParse in interface MessageParser
        Returns:
        true if there are more bytes to be parsed. Otherwise false.
      • setNextMessageStartPosition

        public void setNextMessageStartPosition​(int position)
        Set the starting position where the next message in the ByteBuffer given to parseBytes() begins.
        Specified by:
        setNextMessageStartPosition in interface MessageParser
        Parameters:
        position - the next starting position
      • getNextMessageStartPosition

        public int getNextMessageStartPosition()
        Get the starting position where the next message in the ByteBuffer given to parseBytes() begins.
        Specified by:
        getNextMessageStartPosition in interface MessageParser
        Returns:
        start position in the buffer of the next message
      • toString

        public java.lang.String toString()
        Return a string representing this MessageParser's state
        Overrides:
        toString in class java.lang.Object
      • toStringPrefix

        private java.lang.String toStringPrefix()
        Return a common String prefix representing this MessageParser's state
      • getSizeNeeded

        public int getSizeNeeded()
        Return the suggested number of bytes needed to hold the next message to be parsed.
        Specified by:
        getSizeNeeded in interface MessageParser
        Returns:
        bytes needed to hold message