git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@277735 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -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" | |||
| <h4>parsersupports</h4> | |||
| <p>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/</p> | |||
| <p>This condition was added in Apache Ant 1.7.</p> | |||
| <table border="1" cellpadding="2" cellspacing="0"> | |||
| <tr> | |||
| <td valign="top"><b>Attribute</b></td> | |||
| <td valign="top"><b>Description</b></td> | |||
| <td align="center" valign="top"><b>Required</b></td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">property</td> | |||
| <td valign="top">property to set</td> | |||
| <td valign="top" align="center">one of property or feature</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">feature</td> | |||
| <td valign="top">feature to set</td> | |||
| <td valign="top" align="center">one of property or feature</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">value</td> | |||
| <td valign="top">string (property) or boolean (feature)</td> | |||
| <td valign="top" align="center">For property tests, but not for feature tests</td> | |||
| </tr> | |||
| </table> | |||
| <pre> | |||
| <parsersupports feature="http://xml.org/sax/features/namespaces"/> | |||
| </pre> | |||
| Check for namespace support. All SAX2 parsers should have this. | |||
| <pre> | |||
| <or> | |||
| <parsersupports | |||
| feature="http://apache.org/xml/features/validation/schema"/> | |||
| <parsersupports | |||
| feature="http://java.sun.com/xml/jaxp/properties/schemaSource"/> | |||
| </or> | |||
| </pre> | |||
| Check for XML Schema support. | |||
| <pre> | |||
| <parsersupports | |||
| property="http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation" | |||
| value="document.xsd"/> | |||
| </pre> | |||
| Check for Xerces-specific definition of the location of the no namespace schema. | |||
| <hr> | |||
| <p align="center">Copyright © 2001-2005 Apache Software | |||
| Foundation. All rights Reserved.</p> | |||
| @@ -0,0 +1,93 @@ | |||
| <project name="parsersupports" > | |||
| <!-- | |||
| * 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. | |||
| * | |||
| --> | |||
| <target name="testEmpty"> | |||
| <condition property="empty"> | |||
| <parsersupports /> | |||
| </condition> | |||
| <fail>Expected failure before here</fail> | |||
| </target> | |||
| <target name="testBoth"> | |||
| <condition property="both"> | |||
| <parsersupports property="http://bar" feature="http://foo"/> | |||
| </condition> | |||
| <fail>Expected failure before here</fail> | |||
| </target> | |||
| <target name="testNamespaces"> | |||
| <fail> | |||
| <condition > | |||
| <not> | |||
| <parsersupports feature="http://xml.org/sax/features/namespaces"/> | |||
| </not> | |||
| </condition> | |||
| Expected namespace support | |||
| </fail> | |||
| </target> | |||
| <target name="testPropertyInvalid"> | |||
| <fail> | |||
| <condition> | |||
| <not> | |||
| <parsersupports | |||
| property="http://xml.org/sax/properties/declaration-handler" | |||
| value="undefined"/> | |||
| </not> | |||
| </condition> | |||
| Expected DTD declaration property settable. | |||
| </fail> | |||
| </target> | |||
| <target name="testPropertyNoValue"> | |||
| <fail> | |||
| <condition> | |||
| <not> | |||
| <parsersupports | |||
| property="http://xml.org/sax/properties/declaration-handler" | |||
| /> | |||
| </not> | |||
| </condition> | |||
| Expected no property | |||
| </fail> | |||
| </target> | |||
| <target name="testUnknownProperty"> | |||
| <fail> | |||
| <condition> | |||
| <parsersupports property="http://org.apache.ant/something" | |||
| value="undefined"/> | |||
| </condition> | |||
| Expected unsupported property. | |||
| </fail> | |||
| </target> | |||
| <target name="testXercesProperty"> | |||
| <fail> | |||
| <condition> | |||
| <not> | |||
| <parsersupports | |||
| property="http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation" | |||
| value="parsersupports.xml"/> | |||
| </not> | |||
| </condition> | |||
| Expected XSD support on Xerces. | |||
| </fail> | |||
| </target> | |||
| </project> | |||
| @@ -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; | |||
| } | |||
| } | |||
| @@ -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 | |||
| @@ -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"); | |||
| } | |||
| } | |||