supported. Make <xmlvalidate>'s unit tests handle parsers without knowledge about XML Schema gracefully, passes with Crimson and Xerces on my box now. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@273384 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -42,7 +42,7 @@ Fixed bugs: | |||
| * <property environment=... /> now works on OS/400. | |||
| * <filterset> nested into <filterset>s didn't work. | |||
| * <filterset>s nested into <filterset>s didn't work. | |||
| Other changes: | |||
| -------------- | |||
| @@ -345,7 +345,8 @@ public class XMLValidateTask extends Task { | |||
| log("Using SAX1 parser " + reader.getClass().getName(), | |||
| Project.MSG_VERBOSE); | |||
| } else { | |||
| throw new BuildException(INIT_FAILED_MSG + readerClassName | |||
| throw new BuildException(INIT_FAILED_MSG | |||
| + reader.getClass().getName() | |||
| + " implements nor SAX1 Parser nor SAX2 XMLReader."); | |||
| } | |||
| } | |||
| @@ -356,19 +357,12 @@ public class XMLValidateTask extends Task { | |||
| if (!(xmlReader instanceof ParserAdapter)) { | |||
| // turn validation on | |||
| if (!lenient) { | |||
| boolean ok = setFeature("http://xml.org/sax/features/validation", true, true); | |||
| if (!ok) { | |||
| throw new BuildException(INIT_FAILED_MSG | |||
| + readerClassName | |||
| + " doesn't provide validation"); | |||
| } | |||
| setFeature("http://xml.org/sax/features/validation", true); | |||
| } | |||
| // set the feature from the attribute list | |||
| for (int i = 0; i < attributeList.size(); i++) { | |||
| Attribute feature = (Attribute) attributeList.elementAt(i); | |||
| setFeature(feature.getName(), | |||
| feature.getValue(), | |||
| true); | |||
| setFeature(feature.getName(), feature.getValue()); | |||
| } | |||
| } | |||
| @@ -381,30 +375,20 @@ public class XMLValidateTask extends Task { | |||
| * @param warn whether to war if the parser does not support the feature | |||
| */ | |||
| private boolean setFeature(String feature, boolean value, boolean warn) { | |||
| private void setFeature(String feature, boolean value) | |||
| throws BuildException { | |||
| boolean toReturn = false; | |||
| try { | |||
| xmlReader.setFeature(feature, value); | |||
| toReturn = true; | |||
| } catch (SAXNotRecognizedException e) { | |||
| if (warn) { | |||
| log("Could not set feature '" | |||
| + feature | |||
| + "' because the '" + | |||
| readerClassName + "' parser doesn't recognize it", | |||
| Project.MSG_WARN); | |||
| } | |||
| throw new BuildException("Parser " + xmlReader.getClass().getName() | |||
| + " doesn't recognize feature " | |||
| + feature, e, getLocation()); | |||
| } catch (SAXNotSupportedException e) { | |||
| if (warn) { | |||
| log("Could not set feature '" | |||
| + feature | |||
| + "' because the '" + | |||
| readerClassName + "' parser doesn't support it", | |||
| Project.MSG_WARN); | |||
| } | |||
| throw new BuildException("Parser " + xmlReader.getClass().getName() | |||
| + " doesn't support feature " | |||
| + feature, e, getLocation()); | |||
| } | |||
| return toReturn; | |||
| } | |||
| /** | |||
| @@ -56,6 +56,7 @@ package org.apache.tools.ant.taskdefs.optional; | |||
| import java.io.*; | |||
| import java.util.Properties; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.BuildFileTest; | |||
| /** | |||
| @@ -130,16 +131,41 @@ public class XmlValidateTest extends BuildFileTest { | |||
| /** | |||
| * Test xml schema validation | |||
| */ | |||
| public void testXmlSchemaGood() { | |||
| executeTarget("testSchemaGood"); | |||
| public void testXmlSchemaGood() throws BuildException { | |||
| try { | |||
| executeTarget("testSchemaGood"); | |||
| } catch (BuildException e) { | |||
| if (e.getMessage() | |||
| .endsWith(" doesn't recognize feature http://apache.org/xml/features/validation/schema") || | |||
| e.getMessage() | |||
| .endsWith(" doesn't support feature http://apache.org/xml/features/validation/schema")) { | |||
| System.err.println(" skipped, parser doesn't support schema"); | |||
| } else { | |||
| throw e; | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Test xml schema validation | |||
| */ | |||
| public void testXmlSchemaBad() { | |||
| expectBuildExceptionContaining( | |||
| "testSchemaBad", | |||
| "Bad Schema Validation", "not a valid XML document"); | |||
| try { | |||
| executeTarget("testSchemaBad"); | |||
| fail("Should throw BuildException because 'Bad Schema Validation'"); | |||
| expectBuildExceptionContaining("testSchemaBad", | |||
| "Bad Schema Validation", | |||
| "not a valid XML document"); | |||
| } catch (BuildException e) { | |||
| if (e.getMessage() | |||
| .endsWith(" doesn't recognize feature http://apache.org/xml/features/validation/schema") || | |||
| e.getMessage() | |||
| .endsWith(" doesn't support feature http://apache.org/xml/features/validation/schema")) { | |||
| System.err.println(" skipped, parser doesn't support schema"); | |||
| } else { | |||
| assertTrue(e.getMessage() | |||
| .indexOf("not a valid XML document") > -1); | |||
| } | |||
| } | |||
| } | |||
| } | |||