antoine 2004/06/02 14:13:18
Modified: . Tag: ANT_16_BRANCH WHATSNEW CONTRIBUTORS
src/main/org/apache/tools/ant/taskdefs/optional Tag:
ANT_16_BRANCH XMLValidateTask.java
src/testcases/org/apache/tools/ant/taskdefs/optional Tag:
ANT_16_BRANCH XmlValidateTest.java
src/etc/testcases/taskdefs/optional Tag: ANT_16_BRANCH
xmlvalidate.xml
Added: src/etc/testcases/taskdefs/optional/xml Tag: ANT_16_BRANCH
endpiece-noSchema-invalid.xml endpiece-noSchema.xml
Log:
Merge from HEAD
Addition of properties for the parser as nested elements
PR: 23395
Submitted by: Matthew Hawthorne (mhawthorne at alumni dot pitt dot edu)
Revision Changes Path
No revision
No revision
1.1.2.1 +0 -0
ant/src/etc/testcases/taskdefs/optional/xml/endpiece-noSchema-invalid.xml
Index: endpiece-noSchema-invalid.xml
===================================================================
RCS file:
/home/cvs/ant/src/etc/testcases/taskdefs/optional/xml/endpiece-noSchema-invalid.xml,v
retrieving revision 1.1
retrieving revision 1.1.2.1
diff -u -r1.1 -r1.1.2.1
1.1.2.1 +0 -0
ant/src/etc/testcases/taskdefs/optional/xml/endpiece-noSchema.xml
Index: endpiece-noSchema.xml
===================================================================
RCS file:
/home/cvs/ant/src/etc/testcases/taskdefs/optional/xml/endpiece-noSchema.xml,v
retrieving revision 1.1
retrieving revision 1.1.2.1
diff -u -r1.1 -r1.1.2.1
No revision
No revision
1.503.2.95 +3 -0 ant/WHATSNEW
Index: WHATSNEW
===================================================================
RCS file: /home/cvs/ant/WHATSNEW,v
retrieving revision 1.503.2.94
retrieving revision 1.503.2.95
diff -u -r1.503.2.94 -r1.503.2.95
--- WHATSNEW 2 Jun 2004 12:10:58 -0000 1.503.2.94
+++ WHATSNEW 2 Jun 2004 21:13:17 -0000 1.503.2.95
@@ -98,6 +98,9 @@
Other changes:
--------------
+* <xmlvalidate> has now a property nested element,
+ allowing to set string properties for the parser
+ Bugzilla Report 23395.
* Docs fixes for xmlvalidate.html, javadoc.html, starteam.
Bugzilla Reports 27092, 27284, 27554.
1.1.2.11 +1 -1 ant/CONTRIBUTORS
Index: CONTRIBUTORS
===================================================================
RCS file: /home/cvs/ant/CONTRIBUTORS,v
retrieving revision 1.1.2.10
retrieving revision 1.1.2.11
diff -u -r1.1.2.10 -r1.1.2.11
--- CONTRIBUTORS 28 Apr 2004 06:18:40 -0000 1.1.2.10
+++ CONTRIBUTORS 2 Jun 2004 21:13:17 -0000 1.1.2.11
@@ -17,7 +17,6 @@
Brian Deitte
Brian Felder
Bruce Atherton
-chanezon
Charles Hudak
Charlie Hubbard
Chris Povirk
@@ -120,6 +119,7 @@
Matt Foemmel
Matt Humphrey
Matt Small
+Matthew Hawthorne
Matthew Inger
Matthew Kuperus Heun
Matthew Watson
No revision
No revision
1.36.2.5 +193 -44
ant/src/main/org/apache/tools/ant/taskdefs/optional/XMLValidateTask.java
Index: XMLValidateTask.java
===================================================================
RCS file:
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/XMLValidateTask.java,v
retrieving revision 1.36.2.4
retrieving revision 1.36.2.5
diff -u -r1.36.2.4 -r1.36.2.5
--- XMLValidateTask.java 9 Mar 2004 17:01:41 -0000 1.36.2.4
+++ XMLValidateTask.java 2 Jun 2004 21:13:18 -0000 1.36.2.5
@@ -35,6 +35,7 @@
import org.apache.tools.ant.types.XMLCatalog;
import org.apache.tools.ant.util.FileUtils;
import org.apache.tools.ant.util.JAXPUtils;
+
import org.xml.sax.EntityResolver;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
@@ -68,7 +69,7 @@
protected boolean failOnError = true;
protected boolean warn = true;
protected boolean lenient = false;
- protected String readerClassName = null;
+ protected String readerClassName = null;
/** file to be validated */
protected File file = null;
@@ -76,20 +77,24 @@
protected Vector filesets = new Vector();
protected Path classpath;
-
/**
* 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.
* a more 'standard' way of doing this would be to use the JAXP1.1
SAXParser
* interface.
*/
- protected XMLReader xmlReader = null; // XMLReader used to validation
process
- protected ValidatorErrorHandler errorHandler
- = new ValidatorErrorHandler(); // to report sax parsing errors
+ protected XMLReader xmlReader = null;
+ // XMLReader used to validation process
+ protected ValidatorErrorHandler errorHandler = new
ValidatorErrorHandler();
+ // to report sax parsing errors
/** The vector to store all attributes (features) to be set on the
parser. **/
private Vector attributeList = new Vector();
+ /**
+ * List of properties.
+ */
+ private final Vector propertyList = new Vector();
private XMLCatalog xmlCatalog = new XMLCatalog();
@@ -99,6 +104,7 @@
* <p>
* If set to <code>true</code> (default), throw a buildException if the
* parser yields an error.
+ * @param fail if set to <code>false</code> do not fail on error
*/
public void setFailOnError(boolean fail) {
failOnError = fail;
@@ -108,6 +114,7 @@
* Specify how parser error are to be handled.
* <p>
* If set to <code>true</true> (default), log a warn message for each
SAX warn event.
+ * @param bool if set to <code>false</code> do not send warnings
*/
public void setWarn(boolean bool) {
warn = bool;
@@ -122,6 +129,7 @@
* <p>
* this option is ignored if the specified class
* with [EMAIL PROTECTED] #setClassName(String)} is not a SAX2 XMLReader.
+ * @param bool if set to <code>false</code> only fail on malformed XML
*/
public void setLenient(boolean bool) {
lenient = bool;
@@ -142,9 +150,9 @@
readerClassName = className;
}
-
/**
* Specify the classpath to be searched to load the parser (optional)
+ * @param classpath the classpath to load the parser
*/
public void setClasspath(Path classpath) {
if (this.classpath == null) {
@@ -156,6 +164,7 @@
/**
* @see #setClasspath
+ * @return the classpath created
*/
public Path createClasspath() {
if (this.classpath == null) {
@@ -167,6 +176,7 @@
/**
* Where to find the parser class; optional.
* @see #setClasspath
+ * @param r reference to a classpath defined elsewhere
*/
public void setClasspathRef(Reference r) {
createClasspath().setRefid(r);
@@ -174,6 +184,7 @@
/**
* specify the file to be checked; optional.
+ * @param file the file to be checked
*/
public void setFile(File file) {
this.file = file;
@@ -181,6 +192,7 @@
/**
* add an XMLCatalog as a nested element; optional.
+ * @param catalog XMLCatalog to use
*/
public void addConfiguredXMLCatalog(XMLCatalog catalog) {
xmlCatalog.addConfiguredXMLCatalog(catalog);
@@ -188,6 +200,7 @@
/**
* specify a set of file to be checked
+ * @param set the fileset to check
*/
public void addFileset(FileSet set) {
filesets.addElement(set);
@@ -198,6 +211,7 @@
* features of the SAX parser.
* Valid attributes
* <a
href="http://www.saxproject.org/apidoc/org/xml/sax/package-summary.html#package_description">include</a>
+ * @return attribute created
* @since ant1.6
*/
public Attribute createAttribute() {
@@ -206,6 +220,23 @@
return feature;
}
+ /**
+ * Creates a property.
+ *
+ * @return a property.
+ * @since ant 1.6.2
+ */
+ public Property createProperty() {
+ final Property prop = new Property();
+ propertyList.addElement(prop);
+ return prop;
+ }
+
+ /**
+ * Called by the project to let the task initialize properly.
+ *
+ * @exception BuildException if something goes wrong with the build
+ */
public void init() throws BuildException {
super.init();
xmlCatalog.setProject(getProject());
@@ -215,29 +246,36 @@
* Create a DTD location record; optional.
* This stores the location of a DTD. The DTD is identified
* by its public Id.
+ * @return created DTD location
*/
public DTDLocation createDTD() {
DTDLocation dtdLocation = new DTDLocation();
xmlCatalog.addDTD(dtdLocation);
return dtdLocation;
}
-
+ /**
+ * accessor to the xmlCatalog used in the task
+ * @return xmlCatalog reference
+ */
protected EntityResolver getEntityResolver() {
return xmlCatalog;
}
-
+ /**
+ * execute the task
+ * @throws BuildException if <code>failonerror</code> is true and an
error happens
+ */
public void execute() throws BuildException {
int fileProcessed = 0;
if (file == null && (filesets.size() == 0)) {
- throw new BuildException("Specify at least one source - "
- + "a file or a fileset.");
+ throw new BuildException(
+ "Specify at least one source - " + "a file or a fileset.");
}
initValidator();
if (file != null) {
- if (file.exists() && file.canRead() && file.isFile()) {
+ if (file.exists() && file.canRead() && file.isFile()) {
doValidate(file);
fileProcessed++;
} else {
@@ -256,7 +294,7 @@
DirectoryScanner ds = fs.getDirectoryScanner(getProject());
String[] files = ds.getIncludedFiles();
- for (int j = 0; j < files.length; j++) {
+ for (int j = 0; j < files.length; j++) {
File srcFile = new File(fs.getDir(getProject()), files[j]);
doValidate(srcFile);
fileProcessed++;
@@ -284,8 +322,8 @@
try {
// load the parser class
if (classpath != null) {
- AntClassLoader loader
- = getProject().createClassLoader(classpath);
+ AntClassLoader loader =
+ getProject().createClassLoader(classpath);
readerClass = Class.forName(readerClassName, true,
loader);
} else {
readerClass = Class.forName(readerClassName);
@@ -304,19 +342,22 @@
// then check it implements XMLReader
if (reader instanceof XMLReader) {
xmlReader = (XMLReader) reader;
- log("Using SAX2 reader " + reader.getClass().getName(),
+ 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
- + reader.getClass().getName()
- + " implements nor SAX1 Parser nor SAX2 XMLReader.");
+ } else {
+ throw new BuildException(
+ INIT_FAILED_MSG
+ + reader.getClass().getName()
+ + " implements nor SAX1 Parser nor SAX2 XMLReader.");
}
}
@@ -334,6 +375,12 @@
setFeature(feature.getName(), feature.getValue());
}
+
+ // Sets properties
+ for (int i = 0; i < propertyList.size(); i++) {
+ final Property prop = (Property) propertyList.elementAt(i);
+ setProperty(prop.getName(), prop.getValue());
+ }
}
}
@@ -341,8 +388,6 @@
* 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 void setFeature(String feature, boolean value)
throws BuildException {
@@ -350,13 +395,55 @@
try {
xmlReader.setFeature(feature, value);
} catch (SAXNotRecognizedException e) {
- throw new BuildException("Parser " +
xmlReader.getClass().getName()
- + " doesn't recognize feature "
- + feature, e, getLocation());
- } catch (SAXNotSupportedException e) {
- throw new BuildException("Parser " +
xmlReader.getClass().getName()
- + " doesn't support feature "
- + feature, e, getLocation());
+ throw new BuildException(
+ "Parser "
+ + xmlReader.getClass().getName()
+ + " doesn't recognize feature "
+ + feature,
+ e,
+ getLocation());
+ } catch (SAXNotSupportedException e) {
+ throw new BuildException(
+ "Parser "
+ + xmlReader.getClass().getName()
+ + " doesn't support feature "
+ + feature,
+ e,
+ getLocation());
+ }
+ }
+
+ /**
+ * Sets a property.
+ *
+ * @param name a property name
+ * @param value a property value.
+ * @throws BuildException if an error occurs.
+ */
+ private void setProperty(String name, String value) throws
BuildException {
+ // Validates property
+ if (name == null || value == null) {
+ throw new BuildException("Property name and value must be
specified.");
+ }
+
+ try {
+ xmlReader.setProperty(name, value);
+ } catch (SAXNotRecognizedException e) {
+ throw new BuildException(
+ "Parser "
+ + xmlReader.getClass().getName()
+ + " doesn't recognize property "
+ + name,
+ e,
+ getLocation());
+ } catch (SAXNotSupportedException e) {
+ throw new BuildException(
+ "Parser "
+ + xmlReader.getClass().getName()
+ + " doesn't support property "
+ + name,
+ e,
+ getLocation());
}
}
@@ -373,18 +460,21 @@
xmlReader.parse(is);
} catch (SAXException ex) {
if (failOnError) {
- throw new BuildException("Could not validate document "
- + afile);
+ throw new BuildException(
+ "Could not validate document " + afile);
+ } else {
+ log("Could not validate document " + afile + ": " +
ex.toString());
}
} catch (IOException ex) {
- throw new BuildException("Could not validate document " + afile,
+ throw new BuildException(
+ "Could not validate document " + afile,
ex);
}
if (errorHandler.getFailure()) {
if (failOnError) {
- throw new BuildException(afile
- + " is not a valid XML document.");
+ throw new BuildException(
+ afile + " is not a valid XML document.");
} else {
log(afile + " is not a valid XML document", Project.MSG_ERR);
}
@@ -403,28 +493,42 @@
protected File currentFile = null;
protected String lastErrorMessage = null;
protected boolean failed = false;
-
+ /**
+ * initialises the class
+ * @param file file used
+ */
public void init(File file) {
currentFile = file;
failed = false;
}
-
- // did an error happen during last parsing ?
+ /**
+ * did an error happen during last parsing ?
+ * @return did an error happen during last parsing ?
+ */
public boolean getFailure() {
-
return failed;
}
+ /**
+ * record a fatal error
+ * @param exception the fatal error
+ */
public void fatalError(SAXParseException exception) {
failed = true;
doLog(exception, Project.MSG_ERR);
}
-
+ /**
+ * receive notification of a recoverable error
+ * @param exception the error
+ */
public void error(SAXParseException exception) {
failed = true;
doLog(exception, Project.MSG_ERR);
}
-
+ /**
+ * receive notification of a warning
+ * @param exception the warning
+ */
public void warning(SAXParseException exception) {
// depending on implementation, XMLReader can yield hips of
warning,
// only output then if user explicitly asked for it
@@ -445,9 +549,11 @@
int line = e.getLineNumber();
int col = e.getColumnNumber();
return new URL(sysID).getFile()
- + (line == -1 ? "" : (":" + line
- + (col == -1 ? "" : (":" + col))))
- + ": " + e.getMessage();
+ + (line == -1
+ ? ""
+ : (":" + line + (col == -1 ? "" : (":" + col))))
+ + ": "
+ + e.getMessage();
} catch (MalformedURLException mfue) {
// ignore and just return exception message
}
@@ -481,7 +587,7 @@
}
/**
* Set the feature value to true or false.
- * @param value
+ * @param value feature value
*/
public void setValue(boolean value) {
attributeValue = value;
@@ -503,4 +609,47 @@
return attributeValue;
}
}
+
+ /**
+ * A Parser property.
+ * See <a href="http://xml.apache.org/xerces-j/properties.html">
+ * XML parser properties</a> for usable properties
+ * @since ant 1.6.2
+ */
+ public final class Property {
+
+ private String name;
+ private String value;
+ /**
+ * accessor to the name of the property
+ * @return name of the property
+ */
+ public String getName() {
+ return name;
+ }
+ /**
+ * setter for the name of the property
+ * @param name name of the property
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * getter for the value of the property
+ * @return value of the property
+ */
+ public String getValue() {
+ return value;
+ }
+ /**
+ * sets the value of the property
+ * @param value value of the property
+ */
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ } // Property
+
}
No revision
No revision
1.11.2.6 +33 -27
ant/src/testcases/org/apache/tools/ant/taskdefs/optional/XmlValidateTest.java
Index: XmlValidateTest.java
===================================================================
RCS file:
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/optional/XmlValidateTest.java,v
retrieving revision 1.11.2.5
retrieving revision 1.11.2.6
diff -u -r1.11.2.5 -r1.11.2.6
--- XmlValidateTest.java 9 Mar 2004 17:02:05 -0000 1.11.2.5
+++ XmlValidateTest.java 2 Jun 2004 21:13:18 -0000 1.11.2.6
@@ -16,9 +16,6 @@
*/
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;
@@ -35,8 +32,8 @@
/**
* where tasks run
*/
- private final static String TASKDEFS_DIR =
"src/etc/testcases/taskdefs/optional/";
-
+ private final static String TASKDEFS_DIR =
+ "src/etc/testcases/taskdefs/optional/";
/**
* Constructor
@@ -47,7 +44,6 @@
super(name);
}
-
/**
* The JUnit setup method
*/
@@ -55,28 +51,23 @@
configureProject(TASKDEFS_DIR + "xmlvalidate.xml");
}
-
/**
* The teardown method for JUnit
*/
- public void tearDown() {
-
- }
-
+ public void tearDown() {}
/**
* Basic inline 'dtd' element test.
*/
public void testValidate() throws Exception {
- executeTarget("testValidate");
+ executeTarget("testValidate");
}
-
/**
* Test indirect validation.
*/
public void testDeepValidate() throws Exception {
- executeTarget("testDeepValidate");
+ executeTarget("testDeepValidate");
}
/**
@@ -124,10 +115,11 @@
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")) {
+ 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;
@@ -142,18 +134,20 @@
executeTarget("testSchemaBad");
fail("Should throw BuildException because 'Bad Schema
Validation'");
- expectBuildExceptionContaining("testSchemaBad",
- "Bad Schema Validation",
- "not a valid XML document");
+ 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")) {
+ 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);
+ assertTrue(
+ e.getMessage().indexOf("not a valid XML document") > -1);
}
}
}
@@ -177,6 +171,18 @@
*/
public void testUtf8() {
expectBuildException("testUtf8", "invalid characters in file");
+ }
+
+ // Tests property element, using XML schema properties as an example.
+
+ public void testPropertySchemaForValidXML() {
+ executeTarget("testProperty.validXML");
+ }
+
+ public void testPropertySchemaForInvalidXML() {
+ expectBuildException(
+ "testProperty.invalidXML",
+ "XML file does not satisfy schema.");
}
}
No revision
No revision
1.11.2.2 +47 -0 ant/src/etc/testcases/taskdefs/optional/xmlvalidate.xml
Index: xmlvalidate.xml
===================================================================
RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/optional/xmlvalidate.xml,v
retrieving revision 1.11.2.1
retrieving revision 1.11.2.2
diff -u -r1.11.2.1 -r1.11.2.2
--- xmlvalidate.xml 23 Sep 2003 15:03:36 -0000 1.11.2.1
+++ xmlvalidate.xml 2 Jun 2004 21:13:18 -0000 1.11.2.2
@@ -129,4 +129,51 @@
<xmlvalidate warn="false" file="xml/utf-8.xml"/>
</target>
+
+ <!-- Tests property element with XML file that satisfies schema -->
+ <target name="testProperty.validXML">
+
+ <!-- Converts path to URL format -->
+ <pathconvert dirsep="/" property="xsd.file">
+ <path>
+ <pathelement location="xml/doc.xsd"/>
+ </path>
+ </pathconvert>
+
+ <xmlvalidate file="xml/endpiece-noSchema.xml" lenient="false"
+ failonerror="true" warn="true">
+
+ <attribute name="http://apache.org/xml/features/validation/schema"
+ value="true"/>
+
+ <property
+
name="http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation"
+ value="${xsd.file}"/>
+ </xmlvalidate>
+ </target>
+
+
+ <!-- Tests property element with XML file that fails schema validation -->
+ <target name="testProperty.invalidXML">
+
+ <!-- Converts path to URL format -->
+ <pathconvert dirsep="/" property="xsd.file">
+ <path>
+ <pathelement location="xml/doc.xsd"/>
+ </path>
+ </pathconvert>
+
+ <xmlvalidate file="xml/endpiece-noSchema-invalid.xml" lenient="false"
+ failonerror="true" warn="true">
+
+ <attribute name="http://apache.org/xml/features/validation/schema"
+ value="true"/>
+
+ <property
+
name="http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation"
+ value="${xsd.file}"/>
+ </xmlvalidate>
+ </target>
+
</project>
+
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]