blob: 5b41af31f5422eb02e27850e265b2d6d0572434b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.ProjectComponent;
import org.apache.tools.ant.util.JAXPUtils;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
import org.xml.sax.XMLReader;
/**
* 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;
// Error messages
/** error - combined attributes not allowed */
public static final String ERROR_BOTH_ATTRIBUTES =
"Property and feature attributes are exclusive";
/** feature */
public static final String FEATURE = "feature";
/** property */
public static final String PROPERTY = "property";
/** error - not recognized */
public static final String NOT_RECOGNIZED =
" not recognized: ";
/** error - not supported */
public static final String NOT_SUPPORTED =
" not supported: ";
/** error - missing attribute */
public static final String ERROR_NO_ATTRIBUTES =
"Neither feature or property are set";
/** error - no value */
public static final String ERROR_NO_VALUE =
"A value is needed when testing for property support";
/**
* Feature to probe for.
* @param feature the feature to probe for.
*/
public void setFeature(String feature) {
this.feature = feature;
}
/**
* Property to probe for
* @param property the property to probe for.
*/
public void setProperty(String property) {
this.property = property;
}
/**
* Optional value to set.
* Converted to a boolean value when setting a property
* @param value the value to set.
*/
public void setValue(String value) {
this.value = value;
}
/** {@inheritDoc}. */
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();
}
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 property
* @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;
}
}