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 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>
<p align="center">Copyright &copy; 2001-2005 Apache Software
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
scriptcondition=org.apache.tools.ant.types.optional.ScriptCondition
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