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"); | |||
} | |||
} |