/* * 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 { // 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"; private String feature; private String property; private String value; /** * 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}. */ @Override 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; } }