You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Aidan Skinner (JIRA)" <qp...@incubator.apache.org> on 2008/08/12 13:02:46 UTC

[jira] Resolved: (QPID-1092) JMSObjectMessage.toBodyString corrupts the ByteBuffer if the data is not a String

     [ https://issues.apache.org/jira/browse/QPID-1092?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Aidan Skinner resolved QPID-1092.
---------------------------------

    Resolution: Fixed

Merged this to trunk

> JMSObjectMessage.toBodyString corrupts the ByteBuffer if the data is not a String
> ---------------------------------------------------------------------------------
>
>                 Key: QPID-1092
>                 URL: https://issues.apache.org/jira/browse/QPID-1092
>             Project: Qpid
>          Issue Type: Bug
>          Components: Java Client
>    Affects Versions: M2, M2.1
>            Reporter: Martin Ritchie
>            Assignee: Martin Ritchie
>             Fix For: M3
>
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> Summary:
> The JMSObjectMessage toBodyString calls toString(ByteBuffer b). This method assumes that the Object Message can be converted to a string using:
>             return data.getString(Charset.forName("UTF8").newDecoder());
> However, if this fails then the byte buffer limit value is set to the last byte read by the decoder.
> Subsequent calls to getObject() will result in an EOFException as the full buffer is unable to be read due to the limit point change.
> Steps to Reproduce:
> Send a java object and print the message S.o.pln(message); before you call getObject().
> Defect Identification:
> The current position in the buffer is recorded but the limit is not. Recording and resetting the limit would be one possible approach.
> Proposed Changes:
> Remove the toString(ByteBuffer b) method and change the toBodyString to perform:
> String.valueOf(getObject());
> This will ensure that the toString will work as long as getObject() can be continually called.
> Test Strategy:
> To test we should create an additional test in ObjectMessageTest
> testToString()
> //Setup
> //Receive Message
> ObjectMessage message=client.receive();
> //Test
> String messageAsString = message.toString();
> Object objectAfterToString = message.getObject();
> // catch and fail all errors
> AssertNotNull("Error Object not received after toString",objectAfterToString );
> //Perform the toBodyString Explicitly
> String messageBodyAsString = message.toBodyString();
> Object objectAfterToBodyString = message.getObject();
> // catch and fail all errors
> AssertNotNull("Error Object not received after toBodyString",objectAfterToBodyString );

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.