bodewig 2002/09/23 07:59:42
Modified: docs/manual/OptionalTasks xmlvalidate.html
src/etc/testcases/taskdefs/optional xmlvalidate.xml
src/main/org/apache/tools/ant/taskdefs/optional
XMLValidateTask.java
src/testcases/org/apache/tools/ant/taskdefs/optional
XmlValidateTest.java
Log:
Add ability to set parser features in <xmlvalidate>.
Submitted by: Nick Pellow <nick.pellow at mindmatics.de>
Revision Changes Path
1.10 +39 -4 jakarta-ant/docs/manual/OptionalTasks/xmlvalidate.html
Index: xmlvalidate.html
===================================================================
RCS file: /home/cvs/jakarta-ant/docs/manual/OptionalTasks/xmlvalidate.html,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- xmlvalidate.html 9 Sep 2002 16:49:23 -0000 1.9
+++ xmlvalidate.html 23 Sep 2002 14:59:42 -0000 1.10
@@ -14,9 +14,11 @@
(probably the one that is used by Ant itself), but one can specify any
SAX1/2 parser if needed.</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
entities.
+ <li/><tt><attribute></tt> elements which are used to set features on
the parser. 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>
or other features that your parser may support.
+</p>
<h3>Parameters</h3>
<table border="1" cellpadding="2" cellspacing="0">
@@ -84,6 +86,30 @@
<h4>xmlcatalog</h4>
<p>The <a href="../CoreTypes/xmlcatalog.html">xmlcatalog</a>
element is used to perform Entity resolution.</p>
+<h4>attribute</h4>
+<p>The attribute element is used to set SAX Parser features.
+There can an arbitrary amount of attribute 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>
+A feature essentialy changes the mode of the parser.
+<attribute> an attribute is used to set specific features on the
parser.
+<table border="1" cellpadding="2" cellspacing="0">
+<tr>
+ <td width="12%" valign="top"><b>Attribute</b></td>
+ <td width="78%" valign="top"><b>Description</b></td>
+ <td width="10%" valign="top"><b>Required</b></td>
+</tr>
+ <tr>
+ <td valign="top">name</td>
+ <td valign="top">The name of the feature</td>
+ <td align="center" valign="top">Yes</td>
+ </tr>
+ <tr>
+ <td valign="top">value</td>
+ <td valign="top">The boolean value of the feature</td>
+ <td align="center" valign="top">Yes</td>
+ </tr>
+</table>
+</p>
<h3>Examples</h3>
@@ -128,8 +154,17 @@
</xmlvalidate>
</pre>
Scan all XML files in the project, using the catalog defined inline.
-<hr>
+<pre>
+<xmlvalidate failonerror="yes" lenient="no" warn="yes">
+ <fileset dir="xml" includes="**/*.xml"/>
+ <attribute name="http://xml.org/sax/features/validation"
value="true"/>
+ <attribute name="http://apache.org/xml/features/validation/schema"
value="true"/>
+</xmlvalidate>
+</pre>
+Validate all .xml files in xml directory with the parser configured to
perform schema validation. Note: The parser must support the
<pre>http://apache.org/xml/features/validation/schema</pre> feature.
+<br>
+<hr>
<p align="center">Copyright © 2001-2002 Apache Software Foundation. All
rights
Reserved.</p>
1.6 +19 -15
jakarta-ant/src/etc/testcases/taskdefs/optional/xmlvalidate.xml
Index: xmlvalidate.xml
===================================================================
RCS file:
/home/cvs/jakarta-ant/src/etc/testcases/taskdefs/optional/xmlvalidate.xml,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- xmlvalidate.xml 10 Sep 2002 16:35:01 -0000 1.5
+++ xmlvalidate.xml 23 Sep 2002 14:59:42 -0000 1.6
@@ -38,25 +38,29 @@
</xmlcatalog>
</xmlvalidate>
</target>
+
-<!-- <target name="testSchemaGood">
- <xmlvalidate warn="false">
- <fileset dir="xml" includes="endpiece.xml"/>
- <feature name="http://xml.org/sax/features/validation" value="true"/>
- <feature name="http://apache.org/xml/features/validation/schema"
value="true"/>
- <xmlcatalog >
- <entity publicID = "nap:Massive+Attack+Mezzanine"
- location = "xml/doc.xsd"/>
- </xmlcatalog>
+ <target name="testSchemaGood">
+ <xmlvalidate warn="false" lenient="no" >
+ <fileset dir="xml" includes="endpiece.xml"/>
+
+ <attribute name="http://xml.org/sax/features/validation"
+ value="false"/>
+ <attribute name="http://apache.org/xml/features/validation/schema"
+ value="false"/>
+
</xmlvalidate>
</target>
- -->
-<!-- <target name="testSchGemaBad">
+
+ <target name="testSchemaBad">
<xmlvalidate warn="false">
- <fileset dir="xml" includes="endpiece2.xml"/>
- <feature name="http://xml.org/sax/features/validation" value="true"/>
- <feature name="http://apache.org/xml/features/validation/schema"
value="true"/>
+ <fileset dir="xml" includes="endpiece2.xml"/>
+
+ <attribute name="http://xml.org/sax/features/validation"
+ value="true"/>
+ <attribute name="http://apache.org/xml/features/validation/schema"
+ value="true"/>
</xmlvalidate>
- </target> -->
+ </target>
</project>
1.26 +96 -24
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/XMLValidateTask.java
Index: XMLValidateTask.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/XMLValidateTask.java,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -r1.25 -r1.26
--- XMLValidateTask.java 9 Sep 2002 16:44:28 -0000 1.25
+++ XMLValidateTask.java 23 Sep 2002 14:59:42 -0000 1.26
@@ -58,9 +58,8 @@
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
-import java.util.Enumeration;
-import java.util.Hashtable;
import java.util.Vector;
+
import org.apache.tools.ant.AntClassLoader;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
@@ -89,10 +88,11 @@
* (probably the one that is used by Ant itself), but one can specify any
* SAX1/2 parser if needed
* @author Raphael Pierquin <a href="mailto:[EMAIL PROTECTED]">[EMAIL
PROTECTED]</a>
+ * @author Nick Pellow <a href="mailto:[EMAIL PROTECTED]">[EMAIL
PROTECTED]</a>
*/
public class XMLValidateTask extends Task {
- protected static String INIT_FAILED_MSG =
+ protected static String INIT_FAILED_MSG =
"Could not start xml validation: ";
// ant task properties
@@ -116,15 +116,18 @@
protected XMLReader xmlReader = null; // XMLReader used to validation
process
protected ValidatorErrorHandler errorHandler
= new ValidatorErrorHandler(); // to report sax parsing errors
- protected Hashtable features = new Hashtable();
+
+ /** The vector to store all attributes (features) to be set on the
parser. **/
+ private Vector attributeList = new Vector();
+
private XMLCatalog xmlCatalog = new XMLCatalog();
/**
- * Specify how parser error are to be handled.
+ * Specify how parser error are to be handled.
* Optional, default is <code>true</code>.
* <p>
- * If set to <code>true</code> (default), throw a buildException if the
+ * If set to <code>true</code> (default), throw a buildException if the
* parser yields an error.
*/
public void setFailOnError(boolean fail) {
@@ -194,7 +197,7 @@
}
/**
- * Where to find the parser class; optional.
+ * Where to find the parser class; optional.
* @see #setClasspath
*/
public void setClasspathRef(Reference r) {
@@ -222,6 +225,19 @@
filesets.addElement(set);
}
+ /**
+ * Add an attribute nested element. This is used for setting arbitrary
+ * features of the SAX parser.
+ * Valid attributes
+ * <a
href=http://www.saxproject.org/apidoc/org/xml/sax/package-summary.html#package_description">include</a>
+ * @since ant1.6
+ */
+ public Attribute createAttribute() {
+ final Attribute feature = new Attribute();
+ attributeList.addElement(feature);
+ return feature;
+ }
+
public void init() throws BuildException {
super.init();
xmlCatalog.setProject(getProject());
@@ -294,7 +310,7 @@
reader = JAXPUtils.getParser();
}
} else {
-
+
Class readerClass = null;
try {
// load the parser class
@@ -318,15 +334,15 @@
// then check it implements XMLReader
if (reader instanceof XMLReader) {
- xmlReader = (XMLReader) reader;
- log("Using SAX2 reader " + reader.getClass().getName(),
+ xmlReader = (XMLReader) reader;
+ log("Using SAX2 reader " + reader.getClass().getName(),
Project.MSG_VERBOSE);
} else {
// see if it is a SAX1 Parser
if (reader instanceof Parser) {
xmlReader = new ParserAdapter((Parser) reader);
- log("Using SAX1 parser " + reader.getClass().getName(),
+ log("Using SAX1 parser " + reader.getClass().getName(),
Project.MSG_VERBOSE);
} else {
throw new BuildException(INIT_FAILED_MSG + readerClassName
@@ -347,18 +363,23 @@
+ " 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 attribute list
+ for (int i = 0; i < attributeList.size(); i++) {
+ Attribute feature = (Attribute) attributeList.elementAt(i);
+ setFeature(feature.getName(),
+ feature.getValue(),
+ true);
+
}
}
}
/**
- * set a feature on the parser.
- * @todo find a way to set any feature from build.xml
+ * Set a feature on the parser.
+ * @param feature the name of the feature to set
+ * @param value the value of the feature
+ * @param warn whether to war if the parser does not support the feature
+
*/
private boolean setFeature(String feature, boolean value, boolean warn) {
@@ -370,20 +391,22 @@
if (warn) {
log("Could not set feature '"
+ feature
- + "' because the parser doesn't recognize it",
+ + "' because the '" +
+ readerClassName + "' parser doesn't recognize it",
Project.MSG_WARN);
}
} catch (SAXNotSupportedException e) {
if (warn) {
log("Could not set feature '"
+ feature
- + "' because the parser doesn't support it",
+ + "' because the '" +
+ readerClassName + "' parser doesn't support it",
Project.MSG_WARN);
}
}
return toReturn;
}
-
+
/**
* parse the file
*/
@@ -395,18 +418,18 @@
String uri = "file:" + afile.getAbsolutePath().replace('\\',
'/');
for (int index = uri.indexOf('#'); index != -1;
index = uri.indexOf('#')) {
- uri = uri.substring(0, index) + "%23"
+ uri = uri.substring(0, index) + "%23"
+ uri.substring(index + 1);
}
is.setSystemId(uri);
xmlReader.parse(is);
} catch (SAXException ex) {
if (failOnError) {
- throw new BuildException("Could not validate document "
+ throw new BuildException("Could not validate document "
+ afile);
}
} catch (IOException ex) {
- throw new BuildException("Could not validate document " + afile,
+ throw new BuildException("Could not validate document " + afile,
ex);
}
@@ -480,6 +503,55 @@
}
}
return e.getMessage();
+ }
+ }
+
+ /**
+ * The class to create to set a feature of the parser.
+ * @since ant1.6
+ * @author <a href="mailto:[EMAIL PROTECTED]">Nick Pellow</a>
+ */
+ public class Attribute {
+ /** The name of the attribute to set.
+ *
+ * Valid attributes <a
href=http://www.saxproject.org/apidoc/org/xml/sax/package-summary.html#package_description">include.</a>
+ */
+ private String attributeName = null;
+
+ /**
+ * The value of the feature.
+ **/
+ private boolean attributeValue;
+
+ /**
+ * Set the feature name.
+ * @param name the name to set
+ */
+ public void setName(String name) {
+ attributeName = name;
+ }
+ /**
+ * Set the feature value to true or false.
+ * @param value
+ */
+ public void setValue(boolean value) {
+ attributeValue = value;
+ }
+
+ /**
+ * Gets the attribute name.
+ * @return the feature name
+ */
+ public String getName() {
+ return attributeName;
+ }
+
+ /**
+ * Gets the attribute value.
+ * @return the featuree value
+ */
+ public boolean getValue() {
+ return attributeValue;
}
}
}
1.4 +17 -0
jakarta-ant/src/testcases/org/apache/tools/ant/taskdefs/optional/XmlValidateTest.java
Index: XmlValidateTest.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/src/testcases/org/apache/tools/ant/taskdefs/optional/XmlValidateTest.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- XmlValidateTest.java 1 Jun 2002 12:26:43 -0000 1.3
+++ XmlValidateTest.java 23 Sep 2002 14:59:42 -0000 1.4
@@ -94,6 +94,7 @@
* The teardown method for JUnit
*/
public void tearDown() {
+
}
@@ -124,5 +125,21 @@
*/
public void testXmlCatalogNested() {
executeTarget("xmlcatalognested");
+ }
+
+ /**
+ * Test xml schema validation
+ */
+ public void testXmlSchemaGood() {
+ executeTarget("testSchemaGood");
+ }
+ /**
+ * Test xml schema validation
+ */
+ public void testXmlSchemaBad() {
+ expectBuildExceptionContaining(
+ "testSchemaBad",
+ "Bad Schema Validation", "not a valid XML document");
+
}
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>