java.nio.charset.Charset.encode(in) doesn't use the same cached encoder. ------------------------------------------------------------------------
Key: HARMONY-182 URL: http://issues.apache.org/jira/browse/HARMONY-182 Project: Harmony Type: Bug Reporter: Richard Liang As spec says, "An invocation of this method upon a charset cs returns the same result as the expression cs.newEncoder() .onMalformedInput(CodingErrorAction.REPLACE) .onUnmappableCharacter(CodingErrorAction.REPLACE) .decode(bb); except that it is potentially more efficient because it can cache encoders between successive invocations. " RI always uses the same cached encoder (the same reference) for the charsets with same name. The following test case pass on RI 5.0, but fail on Harmony. /* * test cached encoder */ public void testCachedEncoder() throws Exception { MockCachedCharset cs1 = new MockCachedCharset("CachedCharset", null); MockCachedCharset cs2 = new MockCachedCharset("CachedCharset", null); CharBuffer in = CharBuffer.wrap("A"); cs1.encode(in); in.flip(); cs2.encode(in); } /* * Mock Charset for cached encoder test */ static class MockCachedCharset extends Charset { public MockCachedCharset(String canonicalName, String[] aliases) { super(canonicalName, aliases); } public boolean contains(Charset charset) { return false; } public CharsetDecoder newDecoder() { return new MockCachedDecoder(this); } public CharsetEncoder newEncoder() { return new MockCachedEncoder(this); } } /* * Mock encoder. Only one caller is permitted. */ static class MockCachedEncoder extends CharsetEncoder { static MockCachedEncoder caller = null; public MockCachedEncoder(Charset cs) { super(cs, 1, 10); } /* * Only one caller is permitted. */ protected CoderResult encodeLoop(CharBuffer in, ByteBuffer out) { if (null == caller) { caller = this; } else { if (caller != this) { // Another instance fail("should use same instance"); } } return CoderResult.UNDERFLOW; } } /* * Mock decoder. */ static class MockCachedDecoder extends CharsetDecoder { static MockCachedEncoder caller = null; public MockCachedDecoder(Charset cs) { super(cs, 1, 10); } protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) { in.position(in.limit()); 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