[ http://issues.apache.org/jira/browse/XERCESJ-1024?page=history ]
Michael Glavassevich resolved XERCESJ-1024:
-------------------------------------------
Resolution: Cannot Reproduce
I am unable to reproduce this problem with either JDK 1.3.1 or 1.4.2 though this is on
Windows with IBM JDKs. It may very well be that there are bugs in some versions of
sun.io.CharToByteConverter, but I really don't like platform and version specific
workarounds.
The real problem is that we really shouldn't be using sun.io.CharToByteConverter. It's
an undocumented internal class which doesn't exist in many JDKs from other vendors. On
such JDKs isPrintable() will always return false in the place where it would have
checked with the CharToByteConverter. If you have suggestions on removing this
dependency please add them to XERCESJ-735.
> DOMSerializerImpl.writeToString() generates bugy XML due to implementation error in
> sun.io.CharToByteConverter
> --------------------------------------------------------------------------------------------------------------
>
> Key: XERCESJ-1024
> URL: http://issues.apache.org/jira/browse/XERCESJ-1024
> Project: Xerces2-J
> Type: Bug
> Components: DOM, Serialization
> Versions: 2.6.2
> Environment: Linux, Xerces 2.6.2 from CVS, JDK1.3.1 and JDK1.4.2
> Reporter: Juergen Birkle
> Priority: Critical
>
> There is a major bug in the class sun.io.CharToByteConverter !!!
> The following code can be used to reproduce this error:
> -----
> public class Test {
> public static void main(String[] args)
> {
> try {
> sun.io.CharToByteConverter ctbc =
> sun.io.CharToByteConverter.getConverter("UTF-16");
> boolean result = ctbc.canConvert('a');
> System.out.println("Result1 = " + result);
> result = ctbc.canConvert('a');
> System.out.println("Result2 = " + result);
> result = ctbc.canConvert('a');
> System.out.println("Result3 = " + result);
> }
> catch(Exception e) {
> System.err.println("Error\n" + e);
> }
> }
> }
> -----
> The output of this code is:
> -----
> Result1 = false
> Result2 = true
> Result3 = true
> -----
> As you can see, the first call to the method failed!
> Because of this Bug the method writeToString(Node) from class DOMSerializerImpl
> generates bugy XML code!
> The class "sun.io.CharToByteConverter" is used in the class "EncodingInfo". I fixed
> the bug by rewriting the method "isPrintable(char ch)":
> -----
> public boolean isPrintable(char ch) {
> if(ch <= this.lastPrintable)
> return true;
> if(fCharToByteConverter == null) {
> if(fHaveTriedCToB || !fgConvertersAvailable) {
> // forget it; nothing we can do...
> return false;
> }
> if (fArgsForMethod == null) {
> fArgsForMethod = new Object [1];
> }
> // try and create it:
> try {
> fArgsForMethod[0] = javaName;
> fCharToByteConverter = fgGetConverterMethod.invoke(null,
> fArgsForMethod);
> }
> catch(Exception e) {
> // don't try it again...
> fHaveTriedCToB = true;
> return false;
> }
> //
> ---------------------------------------------------------------------------------
> // NO FUNCTION - ONLY BUG WORKAROUND
> //
> // There is a bug in the implementation of sun.io.CharToByteConverter!!!
> // Because of this it is necessary to call the method once before
> // it can be used correct!
> try {
> fArgsForMethod[0] = new Character('a');
> fgCanConvertMethod.invoke(fCharToByteConverter, fArgsForMethod);
> }
> catch(Exception e) {
> // obviously can't use this converter; probably some kind of
> // security restriction
> fCharToByteConverter = null;
> fHaveTriedCToB = false;
> return false;
> }
> //
> ---------------------------------------------------------------------------------
> }
> try {
> fArgsForMethod[0] = new Character(ch);
> Boolean tmp = (Boolean)fgCanConvertMethod.invoke(fCharToByteConverter,
> fArgsForMethod);
> boolean result = tmp.booleanValue();
> System.out.println("Result = " + result);
> return result;
> }
> catch (Exception e) {
> // obviously can't use this converter; probably some kind of
> // security restriction
> fCharToByteConverter = null;
> fHaveTriedCToB = false;
> return false;
> }
> }
> -----
> I don't know where else in Xerces the class sun.io.CharToByteConverter is used, but
> all occurrences must be checked and fixed with a workaround!
> Best regards,
> Juergen Birkle
--
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
-
If you want more information on JIRA, or have a bug to report see:
http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]