Dear Jim,

Thank you very much for your reply. 

I have tried to replace the method with the fixed version from Connector/J 5.0 
as follows. The casting exception has disappeared. However, now I always 
encounter below. This encoding should be the most common, right? But why this 
happens. Thanks.

SQL Exception:  Unsupported character encoding 'ISO8859_1'.

Best regards,
King Tin


//J2.1-fix start: Partially sync fixed method from Connector/J 5.0
        SingleByteCharsetConverter getCharsetConverter(
                        String javaEncodingName) //throws SQLException {
        {
                if (javaEncodingName == null) {
                        return null;
                }

                /*if (this.usePlatformCharsetConverters) {
                        return null; // we'll use Java's built-in routines for 
this
                                     // they're finally fast enough
                }*/
                
                SingleByteCharsetConverter converter = null;
                
                synchronized (this.charsetConverterMap) {
                        Object asObject = this.charsetConverterMap
                        .get(javaEncodingName);

                        if (asObject == 
CHARSET_CONVERTER_NOT_AVAILABLE_MARKER) {
                                return null;
                        }
                        
                        converter = (SingleByteCharsetConverter)asObject;
                        
                        if (converter == null) {
                                try {
                                        converter = 
SingleByteCharsetConverter.getInstance(
                                                        javaEncodingName);
        //, this);

                                        if (converter == null) {
                                                this.charsetConverterMap.put
(javaEncodingName,
                                                        
        CHARSET_CONVERTER_NOT_AVAILABLE_MARKER);
                                        } else {
                                                this.charsetConverterMap.put
(javaEncodingName, converter);
                                        }
                                } catch (UnsupportedEncodingException 
unsupEncEx) {
                                        this.charsetConverterMap.put
(javaEncodingName,
                                                
        CHARSET_CONVERTER_NOT_AVAILABLE_MARKER);

                                        converter = null;
                                }
                        }
                }

                return converter;
        }
//J2.1-fix end: Sync fixed method from Connector/J 5.0
 





Quoting Jim White <[EMAIL PROTECTED]>:

> Lam King Tin wrote:
> 
> > ...
> > SingleByteCharsetConverter converter = (SingleByteCharsetConverter) 
> > this.charsetConverterMap.get(javaEncodingName);
> > 
> > Do you know what's the reason of the casting exception and any manageable 
> > solution? Thank you very much.
> > 
> > Best regards,
> > King Tin
> >  
> > SQL Exception:  Unable to connect to any hosts due to exception: 
> > java.lang.ClassCastException: can't cast `java/lang/Object' to 
> > `com/mysql/jdbc/SingleByteCharsetConverter'
> > 
> > ** BEGIN NESTED EXCEPTION ** 
> > 
> > java.lang.ClassCastException
> > MESSAGE: can't cast `java/lang/Object' to 
> > `com/mysql/jdbc/SingleByteCharsetConverter'
> > 
> > STACKTRACE:
> > 
> > java.lang.ClassCastException: can't cast `java/lang/Object' to 
> > `com/mysql/jdbc/SingleByteCharsetConverter'
> >         at
> com.mysql.jdbc.Connection.getCharsetConverter(Connection.java:2046)
> 
> I don't know much about Kaffe, but the message makes clear that 
> something odd has happened.  Someone has put a plain "java.lang.Object" 
> into the converter map under the encoding you're trying to use.  It 
> would seem to make a lot more sense that the encoding is missing than 
> there would be an illegal object.
> 
> It would probably be helpful to know which character encoding you're using.
> 
> http://dev.mysql.com/downloads/connector/j/3.0.html
> 
> mysql-connector-java-3.0.17-ga/com/mysql/jdbc/Connection.java
> 
> Okay, I did a little (okay, a lot) more digging.  Here's the relevant 
> source:
> 
>      /**
>       * Marker for character set converter not being available (not written,
>       * multibyte, etc)  Used to prevent multiple instantiation requests.
>       */
>      private final static Object CHARSET_CONVERTER_NOT_AVAILABLE_MARKER 
> = new Object();
> 
> ....
> 
>      synchronized SingleByteCharsetConverter getCharsetConverter(
>          String javaEncodingName) {
>          SingleByteCharsetConverter converter = 
> (SingleByteCharsetConverter) this.charsetConverterMap
>              .get(javaEncodingName);
> 
>          if (converter == CHARSET_CONVERTER_NOT_AVAILABLE_MARKER) {
>              return null;
>          }
> 
>          if (converter == null) {
>              try {
> 
> So they intended to detect missing encoding sets, but the logic is 
> broken (the cast will always throw an exception before the test can be 
> made).  You could fix this code so that it returns null as intended on 
> missing converters.  I looked in the source for that same file in 5.0, 
> and the above bug is fixed.  Copy-and-pasting just that method might do 
> the trick.
> 
> http://dev.mysql.com/downloads/connector/j/5.0.html
> 
>       /**
>        * Returns the locally mapped instance of a charset converter (to avoid
>        * overhead of static synchronization).
>        *
>        * @param javaEncodingName
>        *            the encoding name to retrieve
>        * @return a character converter, or null if one couldn't be mapped.
>        */
>       SingleByteCharsetConverter getCharsetConverter(
>                       String javaEncodingName) throws SQLException {
>               if (javaEncodingName == null) {
>                       return null;
>               }
> 
>               if (this.usePlatformCharsetConverters) {
>                       return null; // we'll use Java's built-in routines for 
this
>                                    // they're finally fast enough
>               }
>               
>               SingleByteCharsetConverter converter = null;
>               
>               synchronized (this.charsetConverterMap) {
>                       Object asObject = this.charsetConverterMap
>                       .get(javaEncodingName);
> 
>                       if (asObject == 
CHARSET_CONVERTER_NOT_AVAILABLE_MARKER) {
>                               return null;
>                       }
>                       
>                       converter = (SingleByteCharsetConverter)asObject;
>                       
>                       if (converter == null) {
>                               try {
>                                       converter = 
SingleByteCharsetConverter.getInstance(
>                                                       javaEncodingName, 
this);
> 
>                                       if (converter == null) {
>                                               this.charsetConverterMap.put
(javaEncodingName,
>                                                       
        CHARSET_CONVERTER_NOT_AVAILABLE_MARKER);
>                                       } else {
>                                               this.charsetConverterMap.put
(javaEncodingName, converter);
>                                       }
>                               } catch (UnsupportedEncodingException 
unsupEncEx) {
>                                       this.charsetConverterMap.put
(javaEncodingName,
>                                               
        CHARSET_CONVERTER_NOT_AVAILABLE_MARKER);
> 
>                                       converter = null;
>                               }
>                       }
>               }
> 
>               return converter;
>       }
> 
> 
> 
> Also setting the character encoding to be one that is supported could 
> help.  If you need an unsupported character encoding then it could be 
> added to Kaffe (probably the most difficult option).
> 
> Jim
> 
> 


-------------------------------------------------
This mail sent through IMP: http://horde.org/imp/

_______________________________________________
kaffe mailing list
[email protected]
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to