java.nio.charset.Charset.decode(in) doesn't use the same cached decoder.
------------------------------------------------------------------------

         Key: HARMONY-150
         URL: http://issues.apache.org/jira/browse/HARMONY-150
     Project: Harmony
        Type: Bug
  Components: Classlib  
    Reporter: Richard Liang


java.nio.charset.Charset.decode(in) doesn't use the same cached decoder.
As spec says, "An invocation of this method upon a charset cs returns the same 
result as the expression  cs.newDecoder() 
.onMalformedInput(CodingErrorAction.REPLACE) 
.onUnmappableCharacter(CodingErrorAction.REPLACE)  .decode(bb); except that it 
is potentially more efficient because it can cache decoders between successive 
invocations. "
RI always uses the same cached decoder (the same reference) for the same name 
charset. For details, please refer to the test case below:
======== test case output =====
RI 5.0 passes the test case while Harmony fails.

======== test case===========
/*
         * test cached decoder
         */
        public void testCachedDecoder() throws Exception{
                MockCachedCharset cs1 = new 
MockCachedCharset("CachedCharset",null);
                MockCachedCharset cs2 = new 
MockCachedCharset("CachedCharset",null);
                ByteBuffer in = ByteBuffer.wrap(new byte[]{0x00});
                cs1.decode(in);
                in.flip();
                cs2.decode(in);
                in.flip();
        }
        /*
         * Mock Charset for cached decoder test
         */
        static class MockCachedCharset extends Charset{

                public MockCachedCharset(String canonicalName, String[] 
aliases){
                        super(canonicalName, aliases);
                }

                public boolean contains(Charset charset) {
                        return false;
                }

                public CharsetEncoder newEncoder() {
                        return null;
                }

                public CharsetDecoder newDecoder() {
                        return new MockCachedDecoder(this);
                }
                
                
        }
        /*
         * Mock decoder. Only one caller is permitted.
         */
        static class MockCachedDecoder extends CharsetDecoder {
                static MockCachedDecoder caller = null;
                
                public MockCachedDecoder(Charset cs) {
                        super(cs, 1, 10);
                }

                /*
                 * Only one caller is permitted.
                 * If there's another caller, throw RuntimeException.
                 */
                protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) 
{
                        if(null == caller){
                                caller = this;
                        }else{
                                if(caller != this){
                                        // Another instance 
                                        throw new RuntimeException();
                                }
                        }
                        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

Reply via email to