git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@273307 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -9,14 +9,17 @@ | |||||
| <h2><a name="xmlvalidate">XMLValidate</a></h2> | <h2><a name="xmlvalidate">XMLValidate</a></h2> | ||||
| <h3>Description</h3> | <h3>Description</h3> | ||||
| <p>This task checks xml files are valid (or only well formed). The | |||||
| <p>This task checks XML files are valid (or only well formed). The | |||||
| task uses the SAX2 parser implementation provided by JAXP by default | task uses the SAX2 parser implementation provided by JAXP by default | ||||
| (probably the one that is used by Ant itself), but one can specify any | |||||
| SAX1/2 parser if needed.</p> | |||||
| (usually the one that is used by Ant itself), but one can specify any | |||||
| SAX1/2 parser if needed. Ant ships with Xerces, which is also what is built in | |||||
| to Java 1.4: XML parsers built into the runtime override Ant's choice.</p> | |||||
| <p>This task supports the use of nested <a | |||||
| href="../CoreTypes/xmlcatalog.html">xmlcatalog</a> elements and/or nested | |||||
| <tt><dtd></tt> elements which are used to resolve DTDs and entities.</p> | |||||
| <p>This task supports the use of nested | |||||
| <li/><a href="../CoreTypes/xmlcatalog.html"><tt><xmlcatalog></tt></a> elements | |||||
| <li/><tt><dtd></tt> elements which are used to resolve DTDs and other entities. | |||||
| <li/><tt><feature></tt> elements which are used to set features. These can be any number of <a href="http://www.saxproject.org/apidoc/org/xml/sax/package-summary.html#package_description">http://xml.org/sax/features/</a> | |||||
| </p> | |||||
| <h3>Parameters</h3> | <h3>Parameters</h3> | ||||
| <table border="1" cellpadding="2" cellspacing="0"> | <table border="1" cellpadding="2" cellspacing="0"> | ||||
| @@ -62,7 +65,7 @@ href="../CoreTypes/xmlcatalog.html">xmlcatalog</a> elements and/or nested | |||||
| <h3><a name="nested">Nested Elements</a></h3> | <h3><a name="nested">Nested Elements</a></h3> | ||||
| <h4>dtd</h4> | <h4>dtd</h4> | ||||
| <dtd> is used to specify different locations for DTD resolution. | |||||
| <dtd> is used to specify different locations for DTD and entity resolution. | |||||
| <table border="1" cellpadding="2" cellspacing="0"> | <table border="1" cellpadding="2" cellspacing="0"> | ||||
| <tr> | <tr> | ||||
| <td width="12%" valign="top"><b>Attribute</b></td> | <td width="12%" valign="top"><b>Attribute</b></td> | ||||
| @@ -84,10 +87,17 @@ href="../CoreTypes/xmlcatalog.html">xmlcatalog</a> elements and/or nested | |||||
| <h4>xmlcatalog</h4> | <h4>xmlcatalog</h4> | ||||
| <p>The <a href="../CoreTypes/xmlcatalog.html">xmlcatalog</a> | <p>The <a href="../CoreTypes/xmlcatalog.html">xmlcatalog</a> | ||||
| element is used to perform Entity resolution.</p> | element is used to perform Entity resolution.</p> | ||||
| <h4>feature</h4> | |||||
| <p>The feature element is used to set SAX Parser features. | |||||
| A feature essentialy changes the mode of the parser. | |||||
| There can be an arbitrary amount of features set as defined here: | |||||
| <a href="http://www.saxproject.org/apidoc/org/xml/sax/package-summary.html#package_description">http://xml.org/sax/features/</a> | |||||
| </p> | |||||
| <h3>Examples</h3> | <h3>Examples</h3> | ||||
| <blockquote><pre> | |||||
| <pre> | |||||
| <xmlvalidate file="toto.xml"/> | <xmlvalidate file="toto.xml"/> | ||||
| <xmlvalidate failonerror="no" lenient="yes" warn="yes" | <xmlvalidate failonerror="no" lenient="yes" warn="yes" | ||||
| @@ -95,16 +105,28 @@ element is used to perform Entity resolution.</p> | |||||
| classpath="lib/xerces.jar"> | classpath="lib/xerces.jar"> | ||||
| <fileset dir="src" includes="style/*.xsl"/> | <fileset dir="src" includes="style/*.xsl"/> | ||||
| </xmlvalidate> | </xmlvalidate> | ||||
| </pre> | |||||
| Validate all .xsl files in src/style, but only warn if there is an error, rather than | |||||
| halt the build. | |||||
| <pre> | |||||
| <xmlvalidate file="struts-config.xml" warn="false"> | <xmlvalidate file="struts-config.xml" warn="false"> | ||||
| <dtd publicId="-//Apache Software Foundation//DTD Struts Configuration 1.0//EN" | <dtd publicId="-//Apache Software Foundation//DTD Struts Configuration 1.0//EN" | ||||
| location="struts-config_1_0.dtd"/> | location="struts-config_1_0.dtd"/> | ||||
| </xmlvalidate> | </xmlvalidate> | ||||
| </pre> | |||||
| Validate a struts configuration, using a local copy of the DTD. | |||||
| <pre> | |||||
| <xmlvalidate failonerror="no"> | <xmlvalidate failonerror="no"> | ||||
| <fileset dir="${project.dir}" includes="**/*.xml"/> | <fileset dir="${project.dir}" includes="**/*.xml"/> | ||||
| <xmlcatalog refid="mycatalog"/> | <xmlcatalog refid="mycatalog"/> | ||||
| </xmlvalidate> | </xmlvalidate> | ||||
| </pre> | |||||
| Scan all XML files in the project, using a predefined catalog to map URIs to local files. | |||||
| <pre> | |||||
| <xmlvalidate failonerror="no"> | <xmlvalidate failonerror="no"> | ||||
| <fileset dir="${project.dir}" includes="**/*.xml"/> | <fileset dir="${project.dir}" includes="**/*.xml"/> | ||||
| @@ -114,7 +136,23 @@ element is used to perform Entity resolution.</p> | |||||
| location="com/arielpartners/knowledgebase/dtd/article.dtd"/> | location="com/arielpartners/knowledgebase/dtd/article.dtd"/> | ||||
| </xmlcatalog> | </xmlcatalog> | ||||
| </xmlvalidate> | </xmlvalidate> | ||||
| </pre></blockquote> | |||||
| </pre> | |||||
| Scan all XML files in the project, using the catalog defined inline. | |||||
| <pre> | |||||
| <xmlvalidate failonerror="yes" lenient="no" warn="yes"> | |||||
| <fileset dir="xml" includes="**/*.xml"/> | |||||
| <feature name="http://xml.org/sax/features/validation" value="true"/> | |||||
| <feature name="http://apache.org/xml/features/validation/schema" value="true"/> | |||||
| </xmlvalidate> | |||||
| </pre> | |||||
| Validate the XML files using XML Schema validation. | |||||
| <hr> | <hr> | ||||
| <p align="center">Copyright © 2001-2002 Apache Software Foundation. All rights | <p align="center">Copyright © 2001-2002 Apache Software Foundation. All rights | ||||
| @@ -58,9 +58,10 @@ import java.io.FileReader; | |||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.net.MalformedURLException; | import java.net.MalformedURLException; | ||||
| import java.net.URL; | import java.net.URL; | ||||
| import java.util.Enumeration; | |||||
| import java.util.Hashtable; | |||||
| import java.util.Vector; | import java.util.Vector; | ||||
| import java.util.List; | |||||
| import java.util.LinkedList; | |||||
| import org.apache.tools.ant.AntClassLoader; | import org.apache.tools.ant.AntClassLoader; | ||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import org.apache.tools.ant.DirectoryScanner; | import org.apache.tools.ant.DirectoryScanner; | ||||
| @@ -89,6 +90,8 @@ import org.xml.sax.helpers.ParserAdapter; | |||||
| * (probably the one that is used by Ant itself), but one can specify any | * (probably the one that is used by Ant itself), but one can specify any | ||||
| * SAX1/2 parser if needed | * SAX1/2 parser if needed | ||||
| * @author Raphael Pierquin <a href="mailto:raphael.pierquin@agisphere.com">raphael.pierquin@agisphere.com</a> | * @author Raphael Pierquin <a href="mailto:raphael.pierquin@agisphere.com">raphael.pierquin@agisphere.com</a> | ||||
| * @author <a href="mailto:nick.pellow@mindmatics.de">Nick Pellow</a> | |||||
| * Added support for setting features. | |||||
| */ | */ | ||||
| public class XMLValidateTask extends Task { | public class XMLValidateTask extends Task { | ||||
| @@ -106,8 +109,7 @@ public class XMLValidateTask extends Task { | |||||
| protected Vector filesets = new Vector(); // sets of file to be validated | protected Vector filesets = new Vector(); // sets of file to be validated | ||||
| protected Path classpath; | protected Path classpath; | ||||
| /** | |||||
| /** | |||||
| * the parser is viewed as a SAX2 XMLReader. If a SAX1 parser is specified, | * the parser is viewed as a SAX2 XMLReader. If a SAX1 parser is specified, | ||||
| * it's wrapped in an adapter that make it behave as a XMLReader. | * it's wrapped in an adapter that make it behave as a XMLReader. | ||||
| * a more 'standard' way of doing this would be to use the JAXP1.1 SAXParser | * a more 'standard' way of doing this would be to use the JAXP1.1 SAXParser | ||||
| @@ -116,7 +118,8 @@ public class XMLValidateTask extends Task { | |||||
| protected XMLReader xmlReader = null; // XMLReader used to validation process | protected XMLReader xmlReader = null; // XMLReader used to validation process | ||||
| protected ValidatorErrorHandler errorHandler | protected ValidatorErrorHandler errorHandler | ||||
| = new ValidatorErrorHandler(); // to report sax parsing errors | = new ValidatorErrorHandler(); // to report sax parsing errors | ||||
| protected Hashtable features = new Hashtable(); | |||||
| private List featureList = new LinkedList(); | |||||
| private XMLCatalog xmlCatalog = new XMLCatalog(); | private XMLCatalog xmlCatalog = new XMLCatalog(); | ||||
| @@ -222,6 +225,17 @@ public class XMLValidateTask extends Task { | |||||
| filesets.addElement(set); | filesets.addElement(set); | ||||
| } | } | ||||
| /** | |||||
| * add a feature nested element | |||||
| * @since ant1.6 | |||||
| */ | |||||
| public Feature createFeature() { | |||||
| final Feature feature = new Feature(); | |||||
| featureList.add(feature); | |||||
| return feature; | |||||
| } | |||||
| public void init() throws BuildException { | public void init() throws BuildException { | ||||
| super.init(); | super.init(); | ||||
| xmlCatalog.setProject(getProject()); | xmlCatalog.setProject(getProject()); | ||||
| @@ -347,18 +361,18 @@ public class XMLValidateTask extends Task { | |||||
| + " doesn't provide validation"); | + " doesn't provide validation"); | ||||
| } | } | ||||
| } | } | ||||
| // set other features | |||||
| Enumeration enum = features.keys(); | |||||
| while (enum.hasMoreElements()) { | |||||
| String featureId = (String) enum.nextElement(); | |||||
| setFeature(featureId, ((Boolean) features.get(featureId)).booleanValue(), true); | |||||
| // set the feature from the feature list | |||||
| for (int i = 0; i < featureList.size(); i++) { | |||||
| Feature feature = (Feature) featureList.get(i); | |||||
| setFeature(feature.getFeatureName(), | |||||
| feature.getFeatureValue(), | |||||
| true); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * set a feature on the parser. | |||||
| * @todo find a way to set any feature from build.xml | |||||
| * Set a feature on the parser. | |||||
| */ | */ | ||||
| private boolean setFeature(String feature, boolean value, boolean warn) { | private boolean setFeature(String feature, boolean value, boolean warn) { | ||||
| @@ -482,4 +496,53 @@ public class XMLValidateTask extends Task { | |||||
| return e.getMessage(); | return e.getMessage(); | ||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * The class to create to set a feature of the parser. | |||||
| * @since ant1.6 | |||||
| * @author <a href="mailto:nick.pellow@mindmatics.de">Nick Pellow</a> | |||||
| */ | |||||
| public class Feature { | |||||
| /** The name of the feature to set. | |||||
| * | |||||
| * Valid features <a href=http://www.saxproject.org/apidoc/org/xml/sax/package-summary.html#package_description">include.</a> | |||||
| */ | |||||
| private String featureName = null; | |||||
| /** | |||||
| * The value of the feature. | |||||
| **/ | |||||
| private boolean featureValue; | |||||
| /** | |||||
| * Set the feature name. | |||||
| * @param name the name to set | |||||
| */ | |||||
| public void setName(String name) { | |||||
| featureName = name; | |||||
| } | |||||
| /** | |||||
| * Set the feature value to true or false. | |||||
| * @param value | |||||
| */ | |||||
| public void setValue(boolean value) { | |||||
| featureValue = value; | |||||
| } | |||||
| /** | |||||
| * Gets the feature name. | |||||
| * @return the feature name | |||||
| */ | |||||
| public String getFeatureName() { | |||||
| return featureName; | |||||
| } | |||||
| /** | |||||
| * Gets the feature value. | |||||
| * @return the featuree value | |||||
| */ | |||||
| public boolean getFeatureValue() { | |||||
| return featureValue; | |||||
| } | |||||
| } | |||||
| } | } | ||||