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