Browse Source

condition to check for parser features. Left to others to put into Ant's build.xml.

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@277735 13f79535-47bb-0310-9956-ffa450edef68
master
Steve Loughran 20 years ago
parent
commit
6c13bc7130
5 changed files with 352 additions and 0 deletions
  1. +56
    -0
      docs/manual/CoreTasks/conditions.html
  2. +93
    -0
      src/etc/testcases/taskdefs/conditions/parsersupports.xml
  3. +150
    -0
      src/main/org/apache/tools/ant/taskdefs/condition/ParserSupports.java
  4. +1
    -0
      src/main/org/apache/tools/ant/types/defaults.properties
  5. +52
    -0
      src/testcases/org/apache/tools/ant/taskdefs/condition/ParserSupportsTest.java

+ 56
- 0
docs/manual/CoreTasks/conditions.html View File

@@ -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>
&lt;parsersupports feature="http://xml.org/sax/features/namespaces"/&gt;
</pre>
Check for namespace support. All SAX2 parsers should have this.
<pre>
&lt;or&gt;
&lt;parsersupports
feature="http://apache.org/xml/features/validation/schema"/&gt;
&lt;parsersupports
feature="http://java.sun.com/xml/jaxp/properties/schemaSource"/&gt;
&lt;/or&gt;
</pre>

Check for XML Schema support.

<pre>

&lt;parsersupports
property="http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation"
value="document.xsd"/&gt;
</pre>

Check for Xerces-specific definition of the location of the no namespace schema.

<hr> <hr>
<p align="center">Copyright &copy; 2001-2005 Apache Software <p align="center">Copyright &copy; 2001-2005 Apache Software
Foundation. All rights Reserved.</p> Foundation. All rights Reserved.</p>


+ 93
- 0
src/etc/testcases/taskdefs/conditions/parsersupports.xml View File

@@ -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>

+ 150
- 0
src/main/org/apache/tools/ant/taskdefs/condition/ParserSupports.java View File

@@ -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;
}


}

+ 1
- 0
src/main/org/apache/tools/ant/types/defaults.properties View File

@@ -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

+ 52
- 0
src/testcases/org/apache/tools/ant/taskdefs/condition/ParserSupportsTest.java View File

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

Loading…
Cancel
Save