diff --git a/docs/manual/CoreTasks/conditions.html b/docs/manual/CoreTasks/conditions.html index 436de5457..b465dbf9a 100644 --- a/docs/manual/CoreTasks/conditions.html +++ b/docs/manual/CoreTasks/conditions.html @@ -475,6 +475,62 @@ Example: Sets the default value of the condition to true, then in the script, sets the value to false. This condition always evaluates to "false" + +

parsersupports

+ +

Tests whether Ant's XML parser supports a given +feature or property, as per the SAX/JAXP specifications, by +attempting to set the appropriate property/feature/

+ +

This condition was added in Apache Ant 1.7.

+ + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionRequired
propertyproperty to setone of property or feature
featurefeature to setone of property or feature
valuestring (property) or boolean (feature)For property tests, but not for feature tests
+ +
+<parsersupports feature="http://xml.org/sax/features/namespaces"/>
+
+Check for namespace support. All SAX2 parsers should have this. +
+<or>
+  <parsersupports
+    feature="http://apache.org/xml/features/validation/schema"/>
+  <parsersupports
+    feature="http://java.sun.com/xml/jaxp/properties/schemaSource"/>
+</or>
+
+ +Check for XML Schema support. + +
+
+<parsersupports
+  property="http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation"
+  value="document.xsd"/>
+
+ +Check for Xerces-specific definition of the location of the no namespace schema. +

Copyright © 2001-2005 Apache Software Foundation. All rights Reserved.

diff --git a/src/etc/testcases/taskdefs/conditions/parsersupports.xml b/src/etc/testcases/taskdefs/conditions/parsersupports.xml new file mode 100644 index 000000000..7e4684fe2 --- /dev/null +++ b/src/etc/testcases/taskdefs/conditions/parsersupports.xml @@ -0,0 +1,93 @@ + + + + + + + + Expected failure before here + + + + + + + Expected failure before here + + + + + + + + + + Expected namespace support + + + + + + + + + + + Expected DTD declaration property settable. + + + + + + + + + + + Expected no property + + + + + + + + + Expected unsupported property. + + + + + + + + + + + Expected XSD support on Xerces. + + + + \ No newline at end of file diff --git a/src/main/org/apache/tools/ant/taskdefs/condition/ParserSupports.java b/src/main/org/apache/tools/ant/taskdefs/condition/ParserSupports.java new file mode 100644 index 000000000..1cc486365 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/condition/ParserSupports.java @@ -0,0 +1,150 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.tools.ant.taskdefs.condition; + +import org.apache.tools.ant.ProjectComponent; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.util.JAXPUtils; +import org.xml.sax.XMLReader; +import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; + +/** + * test for the XML parser supporting a particular feature + * @since Ant 1.7 + */ +public class ParserSupports extends ProjectComponent implements Condition { + + private String feature; + private String property; + private String value; + public static final String ERROR_BOTH_ATTRIBUTES = + "Property and feature attributes are exclusive"; + public static final String FEATURE="feature"; + public static final String PROPERTY = "property"; + + public static final String NOT_RECOGNIZED = + " not recognized: "; + private static final String NOT_SUPPORTED = + " not supported: "; + public static final String ERROR_NO_ATTRIBUTES = "Neither feature or property are set"; + public static final String ERROR_NO_VALUE = "A value is needed when testing for property support"; + + /** + * Feature to probe for. + * + * @param feature + */ + public void setFeature(String feature) { + this.feature = feature; + } + + /** + * Property to probe for + * @param property + */ + public void setProperty(String property) { + this.property = property; + } + + /** + * Optional value to set. + * Converted to a boolean value when setting a property + * @param value + */ + public void setValue(String value) { + this.value = value; + } + + + + /** + * validate the args, then try to set the feature or property + * @return + * @throws BuildException + */ + public boolean eval() throws BuildException { + if(feature!=null && property!=null) { + throw new BuildException(ERROR_BOTH_ATTRIBUTES); + } + if(feature==null && property==null) { + throw new BuildException(ERROR_NO_ATTRIBUTES); + } + //pick a value that is good for everything + if(feature!=null) { + return evalFeature(); + } else { + if(value==null) { + throw new BuildException(ERROR_NO_VALUE); + } + return evalProperty(); + } + } + + /** + * get our reader + * @return a reader + */ + private XMLReader getReader() { + JAXPUtils.getParser(); + return JAXPUtils.getXMLReader(); + } + + /** + * set a feature + * @return true if the feature could be set + */ + public boolean evalFeature() { + XMLReader reader = getReader(); + if (value == null) { + value = "true"; + } + boolean v= Project.toBoolean(value); + try { + reader.setFeature(feature,v); + } catch (SAXNotRecognizedException e) { + log(FEATURE+NOT_RECOGNIZED+feature,Project.MSG_VERBOSE); + return false; + } catch (SAXNotSupportedException e) { + log(FEATURE+NOT_SUPPORTED + feature, Project.MSG_VERBOSE); + return false; + } + return true; + } + + /** + * set a feature + * + * @return true if the feature could be set + */ + public boolean evalProperty() { + XMLReader reader = getReader(); + try { + reader.setProperty(property, value); + } catch (SAXNotRecognizedException e) { + log(PROPERTY + NOT_RECOGNIZED + property, Project.MSG_VERBOSE); + return false; + } catch (SAXNotSupportedException e) { + log(PROPERTY + NOT_SUPPORTED + property, Project.MSG_VERBOSE); + return false; + } + return true; + } + + +} diff --git a/src/main/org/apache/tools/ant/types/defaults.properties b/src/main/org/apache/tools/ant/types/defaults.properties index 41c18033f..e3077660b 100644 --- a/src/main/org/apache/tools/ant/types/defaults.properties +++ b/src/main/org/apache/tools/ant/types/defaults.properties @@ -42,3 +42,4 @@ mavenrepository=org.apache.tools.ant.taskdefs.repository.MavenRepository scriptselector=org.apache.tools.ant.types.optional.ScriptSelector scriptcondition=org.apache.tools.ant.types.optional.ScriptCondition xor=org.apache.tools.ant.taskdefs.condition.Xor +parsersupports=org.apache.tools.ant.taskdefs.condition.ParserSupports diff --git a/src/testcases/org/apache/tools/ant/taskdefs/condition/ParserSupportsTest.java b/src/testcases/org/apache/tools/ant/taskdefs/condition/ParserSupportsTest.java new file mode 100644 index 000000000..c2cbd678d --- /dev/null +++ b/src/testcases/org/apache/tools/ant/taskdefs/condition/ParserSupportsTest.java @@ -0,0 +1,52 @@ +package org.apache.tools.ant.taskdefs.condition; + +import org.apache.tools.ant.BuildFileTest; + +/** + + */ +public class ParserSupportsTest extends BuildFileTest { + + public ParserSupportsTest(String name) { + super(name); + } + + /** + * The JUnit setup method + */ + public void setUp() { + configureProject("src/etc/testcases/taskdefs/conditions/parsersupports.xml"); + } + + public void testEmpty() throws Exception { + expectBuildExceptionContaining("testEmpty", + ParserSupports.ERROR_NO_ATTRIBUTES, + ParserSupports.ERROR_NO_ATTRIBUTES); + } + + public void testBoth() throws Exception { + expectBuildExceptionContaining("testBoth", + ParserSupports.ERROR_BOTH_ATTRIBUTES, + ParserSupports.ERROR_BOTH_ATTRIBUTES); + } + + public void testNamespaces() throws Exception { + executeTarget("testNamespaces"); + } + + public void testPropertyNoValue() throws Exception { + expectBuildExceptionContaining("testPropertyNoValue", + ParserSupports.ERROR_NO_VALUE, + ParserSupports.ERROR_NO_VALUE); + } + + public void testUnknownProperty() throws Exception { + executeTarget("testUnknownProperty"); + } + public void NotestPropertyInvalid() throws Exception { + executeTarget("testPropertyInvalid"); + } + public void NotestXercesProperty() throws Exception { + executeTarget("testXercesProperty"); + } +}