mrglavas 2003/11/04 11:24:54 Modified: java/src/org/apache/xml/serialize EncodingInfo.java Log: Fixing Bug #20304: http://nagoya.apache.org/bugzilla/show_bug.cgi?id=20304 Static compile time and run time dependencies on sun.io.CharToByteConverter made it impossible to compile Xerces with JDKs which do not contain this class, and made the serializer unusable (assuming you already have a binary) for encodings which tried to access it. Users were probably getting a NoClassDefFoundError in this situation. For now, access the CharToByteConverter through reflection. This should hopefully resolve both of those problems, however on platforms where the converter is available we fall back to the old behaviour of printing character references which are expressable in the output encoding. This is something to revisit in the future. Revision Changes Path 1.5 +46 -11 xml-xerces/java/src/org/apache/xml/serialize/EncodingInfo.java Index: EncodingInfo.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xml/serialize/EncodingInfo.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- EncodingInfo.java 20 Jan 2003 22:43:14 -0000 1.4 +++ EncodingInfo.java 4 Nov 2003 19:24:54 -0000 1.5 @@ -62,7 +62,6 @@ import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.io.Writer; -import sun.io.CharToByteConverter; import org.apache.xerces.util.EncodingMap; /** @@ -72,15 +71,28 @@ */ public class EncodingInfo { + // Method: sun.io.CharToByteConverter.getConverter(java.lang.String) + private static java.lang.reflect.Method fgGetConverterMethod = null; + + // Method: sun.io.CharToByteConverter.canConvert(char) + private static java.lang.reflect.Method fgCanConvertMethod = null; + + // Flag indicating whether or not sun.io.CharToByteConverter is available. + private static boolean fgConvertersAvailable = false; + + // An array to hold the argument for a method of CharToByteConverter. + private Object [] fArgsForMethod = null; + // name of encoding as registered with IANA; // preferably a MIME name, but aliases are fine too. String ianaName; String javaName; int lastPrintable; - // the charToByteConverter we test unusual characters - // with - CharToByteConverter fCToB = null; - // is the converter null because it can't be instantiated + + // The charToByteConverter with which we test unusual characters. + Object fCharToByteConverter = null; + + // Is the converter null because it can't be instantiated // for some reason (perhaps we're running with insufficient authority as // an applet? boolean fHaveTriedCToB = false; @@ -130,14 +142,18 @@ if(ch <= this.lastPrintable) return true; - if(fCToB == null) { - if(fHaveTriedCToB) { + 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 { - fCToB = CharToByteConverter.getConverter(javaName); + fArgsForMethod[0] = javaName; + fCharToByteConverter = fgGetConverterMethod.invoke(null, fArgsForMethod); } catch(Exception e) { // don't try it again... fHaveTriedCToB = true; @@ -145,11 +161,12 @@ } } try { - return fCToB.canConvert(ch); + fArgsForMethod[0] = new Character(ch); + return ((Boolean) fgCanConvertMethod.invoke(fCharToByteConverter, fArgsForMethod)).booleanValue(); } catch (Exception e) { // obviously can't use this converter; probably some kind of // security restriction - fCToB = null; + fCharToByteConverter = null; fHaveTriedCToB = false; return false; } @@ -160,5 +177,23 @@ public static void testJavaEncodingName(String name) throws UnsupportedEncodingException { final byte [] bTest = {(byte)'v', (byte)'a', (byte)'l', (byte)'i', (byte)'d'}; String s = new String(bTest, name); + } + + // Attempt to get methods for char to byte + // converter on class initialization. + static { + try { + Class clazz = Class.forName("sun.io.CharToByteConverter"); + fgGetConverterMethod = clazz.getMethod("getConverter", new Class [] {String.class}); + fgCanConvertMethod = clazz.getMethod("canConvert", new Class [] {Character.TYPE}); + fgConvertersAvailable = true; + } + // ClassNotFoundException, NoSuchMethodException or SecurityException + // Whatever the case, we cannot use sun.io.CharToByteConverter. + catch (Exception exc) { + fgGetConverterMethod = null; + fgCanConvertMethod = null; + fgConvertersAvailable = false; + } } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]