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 default value of the condition to true, then in the script, | ||||
| sets the value to false. This condition always evaluates to "false" | 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> | <hr> | ||||
| <p align="center">Copyright © 2001-2005 Apache Software | <p align="center">Copyright © 2001-2005 Apache Software | ||||
| Foundation. All rights Reserved.</p> | 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 | scriptselector=org.apache.tools.ant.types.optional.ScriptSelector | ||||
| scriptcondition=org.apache.tools.ant.types.optional.ScriptCondition | scriptcondition=org.apache.tools.ant.types.optional.ScriptCondition | ||||
| xor=org.apache.tools.ant.taskdefs.condition.Xor | 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"); | |||||
| } | |||||
| } | |||||