Author: krosenvold Date: Mon Dec 21 05:51:18 2015 New Revision: 1721094 URL: http://svn.apache.org/viewvc?rev=1721094&view=rev Log: Added detection of XML parser charset for IBM JDK
Modified: commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/BOMInputStreamTest.java Modified: commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/BOMInputStreamTest.java URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/BOMInputStreamTest.java?rev=1721094&r1=1721093&r2=1721094&view=diff ============================================================================== --- commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/BOMInputStreamTest.java (original) +++ commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/BOMInputStreamTest.java Mon Dec 21 05:51:18 2015 @@ -32,7 +32,9 @@ import org.junit.Test; import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -41,6 +43,7 @@ import javax.xml.parsers.ParserConfigura * * @version $Id$ */ +@SuppressWarnings("ResultOfMethodCallIgnored") public class BOMInputStreamTest { //---------------------------------------------------------------------------- // Support code @@ -180,7 +183,7 @@ public class BOMInputStreamTest { } private void readFile(final BOMInputStream bomInputStream) throws Exception { - int bytes = 0; + int bytes; final byte[] bytesFromStream = new byte[100]; do { bytes = bomInputStream.read(bytesFromStream); @@ -367,13 +370,13 @@ public class BOMInputStreamTest { public void testNoBoms() throws Exception { final byte[] data = new byte[] { 'A', 'B', 'C' }; try { - (new BOMInputStream(createUtf8DataStream(data, true), false, (ByteOrderMark[])null)).close();; + (new BOMInputStream(createUtf8DataStream(data, true), false, (ByteOrderMark[])null)).close(); fail("Null BOMs, expected IllegalArgumentException"); } catch (final IllegalArgumentException e) { // expected } try { - (new BOMInputStream(createUtf8DataStream(data, true), false, new ByteOrderMark[0])).close();; + (new BOMInputStream(createUtf8DataStream(data, true), false, new ByteOrderMark[0])).close(); fail("Null BOMs, expected IllegalArgumentException"); } catch (final IllegalArgumentException e) { // expected @@ -596,6 +599,8 @@ public class BOMInputStreamTest { @Test public void testReadXmlWithBOMUcs2() throws Exception { + Assume.assumeFalse("This test does not pass on some IBM VMs xml parsers", System.getProperty("java.vendor").contains("IBM")); + // UCS-2 is BE. Assume.assumeTrue(Charset.isSupported("ISO-10646-UCS-2")); final byte[] data = "<?xml version=\"1.0\" encoding=\"ISO-10646-UCS-2\"?><X/>".getBytes("ISO-10646-UCS-2"); @@ -612,6 +617,7 @@ public class BOMInputStreamTest { // XML parser does not know what to do with UTF-32 parseXml(new BOMInputStream(createUtf32BeDataStream(data, true), ByteOrderMark.UTF_32BE)); // XML parser does not know what to do with UTF-32 + Assume.assumeTrue("JVM and SAX need to support UTF_32LE for this", jvmAndSaxBothSupportCharset("UTF_32LE")); parseXml(createUtf32BeDataStream(data, true)); } @@ -633,7 +639,7 @@ public class BOMInputStreamTest { @Test public void testReadXmlWithBOMUtf32Be() throws Exception { - Assume.assumeTrue(Charset.isSupported("UTF_32BE")); + Assume.assumeTrue("JVM and SAX need to support UTF_32BE for this", jvmAndSaxBothSupportCharset("UTF_32BE")); final byte[] data = "<?xml version=\"1.0\" encoding=\"UTF-32BE\"?><X/>".getBytes("UTF_32BE"); parseXml(new BOMInputStream(createUtf32BeDataStream(data, true), ByteOrderMark.UTF_32BE)); // XML parser does not know what to do with UTF-32, so we warp the input stream with a XmlStreamReader @@ -642,7 +648,7 @@ public class BOMInputStreamTest { @Test public void testReadXmlWithBOMUtf32Le() throws Exception { - Assume.assumeTrue(Charset.isSupported("UTF_32LE")); + Assume.assumeTrue("JVM and SAX need to support UTF_32LE for this", jvmAndSaxBothSupportCharset("UTF_32LE")); final byte[] data = "<?xml version=\"1.0\" encoding=\"UTF-32LE\"?><X/>".getBytes("UTF_32LE"); parseXml(new BOMInputStream(createUtf32LeDataStream(data, true), ByteOrderMark.UTF_32LE)); // XML parser does not know what to do with UTF-32, so we warp the input stream with a XmlStreamReader @@ -659,15 +665,15 @@ public class BOMInputStreamTest { @Test public void testReadXmlWithoutBOMUtf32Be() throws Exception { - Assume.assumeTrue(Charset.isSupported("UTF_32BE")); - final byte[] data = "<?xml version=\"1.0\" encoding=\"UTF-32BE\"?><X/>".getBytes("UTF_32BE"); + Assume.assumeTrue("JVM and SAX need to support UTF_32BE for this", jvmAndSaxBothSupportCharset("UTF_32BE")); + final byte[] data = "<?xml version=\"1.0\" encoding=\"UTF_32BE\"?><X/>".getBytes("UTF_32BE"); parseXml(new BOMInputStream(createUtf32BeDataStream(data, false))); parseXml(createUtf32BeDataStream(data, false)); } @Test public void testReadXmlWithoutBOMUtf32Le() throws Exception { - Assume.assumeTrue(Charset.isSupported("UTF_32LE")); + Assume.assumeTrue("JVM and SAX need to support UTF_32LE for this", jvmAndSaxBothSupportCharset("UTF_32LE")); final byte[] data = "<?xml version=\"1.0\" encoding=\"UTF-32LE\"?><X/>".getBytes("UTF_32LE"); parseXml(new BOMInputStream(createUtf32LeDataStream(data, false))); parseXml(createUtf32BeDataStream(data, false)); @@ -747,4 +753,21 @@ public class BOMInputStreamTest { new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF, 'A', 'B' }, buf, len); } + + private boolean jvmAndSaxBothSupportCharset(String charSetName) throws ParserConfigurationException, SAXException, IOException { + return Charset.isSupported(charSetName) && doesSaxSupportCharacterSet(charSetName); + } + + private boolean doesSaxSupportCharacterSet(String charSetName) throws ParserConfigurationException, SAXException, IOException { + final byte[] data = ("<?xml version=\"1.0\" encoding=\"" + charSetName + "\"?><Z/>").getBytes(charSetName); + final DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + try { + final InputSource is = new InputSource(new ByteArrayInputStream(data)); + is.setEncoding(charSetName); + documentBuilder.parse(is); + } catch (SAXParseException e) { + if (e.getMessage().contains(charSetName)) return false; + } + return true; + } }