[ http://issues.apache.org/jira/browse/HARMONY-148?page=all ]
Tim Ellison reassigned HARMONY-148:
-----------------------------------
Assign To: Tim Ellison
> java.nio.charset.CharsetDecoder: decode(in,out,endOfInput) method doesn't
> preserve replace string for successive decode invocation while "out" doesn't
> have engouh space for replace string.
> --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: HARMONY-148
> URL: http://issues.apache.org/jira/browse/HARMONY-148
> Project: Harmony
> Type: Bug
> Components: Classlib
> Reporter: Richard Liang
> Assignee: Tim Ellison
> Priority: Minor
> Attachments: CharsetDecoder_patch_148.txt
>
> Consider following senario:
> During the invocation of method
> java.nio.charset.CharsetDecoder.decode(in,out,false), method "decodeLoop"
> returns malformed CoderResult, and the action is set as
> "CodingErrorAction.REPLACE". So replace action should be taken, but "out"
> doesn't hold enough space for the replace string. Therefore,
> CoderResult.OVERFLOW should be returned. Harmony does return OVERFLOW
> currently, but the replace string won't put into new allocated output any
> more. In other words, the replace string is missing from the view of "stream
> decoding". Therefore, replace string should be preserved for successive
> decode(in,out,endOfInput) invacation.
> Both RI5.0 and Harmony fails on the following test case. However, according
> to the spec, we think it is a defect of RI5.0.
> ================================== Test Case======================
> /*
> * Test the method decode(ByteBuffer) .
> */
> public void testDecode_ReplaceOverflow() throws Exception {
> String replaceString = "a";
> Charset cs = Charset.forName("UTF-8");
> MockMalformedDecoder decoder = new MockMalformedDecoder(cs);
> decoder.onMalformedInput(CodingErrorAction.REPLACE);
> decoder.replaceWith(replaceString);
> CharBuffer out = CharBuffer.allocate(1);
> // MockMalformedDecoder treats the second byte '0x38' as
> malformed,
> // but "out" doesn't have enough space for replace string.
> ByteBuffer in = ByteBuffer.wrap(new
> byte[]{0x45,0x38,0x45,0x45});
> CoderResult result = decoder.decode(in,out,false);
> assertTrue(result.isOverflow());
>
> // allocate enough space for "out"
> out = CharBuffer.allocate(10);
> // replace string should be put into "out" firstly,
> // and then decode "in".
> result =decoder.decode(in,out,true);
> out.flip();
> assertTrue(result.isUnderflow());
> assertEquals("abb",out.toString());
> }
> /*
> * Mock decoder. It treats byte whose value is less than "0x40" as
> malformed.
> */
> static class MockMalformedDecoder extends
> java.nio.charset.CharsetDecoder {
> public MockMalformedDecoder(Charset cs) {
> super(cs, 1, 10);
> }
> /*
> * It treats byte whose value is less than "0x40" as malformed.
> * Otherwise, it's decoded as 'b'.
> */
> protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out)
> {
> System.out.println("Using MockMalformedDecoder");
> while (in.hasRemaining()) {
> byte b = in.get();
> if(b < 0x40){
> return
> CoderResult.malformedForLength(1);
> }
> if(!out.hasRemaining()){
> return CoderResult.OVERFLOW;
> }
> out.put((char)'b');
> }
> return CoderResult.UNDERFLOW;
> }
> }
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira