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; | |||||
} | |||||
} | |||||
} | } |