git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272556 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -63,15 +63,11 @@ import java.util.Locale; | |||||
| import org.xml.sax.Locator; | import org.xml.sax.Locator; | ||||
| import org.xml.sax.InputSource; | import org.xml.sax.InputSource; | ||||
| import org.xml.sax.HandlerBase; | import org.xml.sax.HandlerBase; | ||||
| import org.xml.sax.SAXParseException; | |||||
| import org.xml.sax.SAXException; | import org.xml.sax.SAXException; | ||||
| import org.xml.sax.SAXParseException; | |||||
| import org.xml.sax.DocumentHandler; | import org.xml.sax.DocumentHandler; | ||||
| import org.xml.sax.AttributeList; | import org.xml.sax.AttributeList; | ||||
| import org.xml.sax.helpers.XMLReaderAdapter; | import org.xml.sax.helpers.XMLReaderAdapter; | ||||
| import javax.xml.parsers.SAXParserFactory; | |||||
| import javax.xml.parsers.SAXParser; | |||||
| import javax.xml.parsers.ParserConfigurationException; | |||||
| import javax.xml.parsers.FactoryConfigurationError; | |||||
| import org.apache.tools.ant.ProjectHelper; | import org.apache.tools.ant.ProjectHelper; | ||||
| import org.apache.tools.ant.UnknownElement; | import org.apache.tools.ant.UnknownElement; | ||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| @@ -83,6 +79,7 @@ import org.apache.tools.ant.IntrospectionHelper; | |||||
| import org.apache.tools.ant.TaskContainer; | import org.apache.tools.ant.TaskContainer; | ||||
| import org.apache.tools.ant.Location; | import org.apache.tools.ant.Location; | ||||
| import org.apache.tools.ant.TaskAdapter; | import org.apache.tools.ant.TaskAdapter; | ||||
| import org.apache.tools.ant.util.JAXPUtils; | |||||
| /** | /** | ||||
| * Original helper. | * Original helper. | ||||
| @@ -91,12 +88,6 @@ import org.apache.tools.ant.TaskAdapter; | |||||
| */ | */ | ||||
| public class ProjectHelperImpl extends ProjectHelper { | public class ProjectHelperImpl extends ProjectHelper { | ||||
| /** | |||||
| * Parser factory to use to create parsers. | |||||
| * @see #getParserFactory | |||||
| */ | |||||
| private static SAXParserFactory parserFactory = null; | |||||
| /** | /** | ||||
| * SAX 1 style parser used to parse the given file. This may | * SAX 1 style parser used to parse the given file. This may | ||||
| * in fact be a SAX 2 XMLReader wrapped in an XMLReaderAdapter. | * in fact be a SAX 2 XMLReader wrapped in an XMLReaderAdapter. | ||||
| @@ -139,11 +130,10 @@ public class ProjectHelperImpl extends ProjectHelper { | |||||
| buildFileParent = new File(this.buildFile.getParent()); | buildFileParent = new File(this.buildFile.getParent()); | ||||
| try { | try { | ||||
| SAXParser saxParser = getParserFactory().newSAXParser(); | |||||
| try { | try { | ||||
| parser = saxParser.getParser(); | |||||
| } catch (SAXException exc) { | |||||
| parser = new XMLReaderAdapter(saxParser.getXMLReader()); | |||||
| parser = JAXPUtils.getParser(); | |||||
| } catch (BuildException e) { | |||||
| parser = new XMLReaderAdapter(JAXPUtils.getXMLReader()); | |||||
| } | } | ||||
| @@ -163,11 +153,6 @@ public class ProjectHelperImpl extends ProjectHelper { | |||||
| parser.setErrorHandler(hb); | parser.setErrorHandler(hb); | ||||
| parser.setDTDHandler(hb); | parser.setDTDHandler(hb); | ||||
| parser.parse(inputSource); | parser.parse(inputSource); | ||||
| } catch (ParserConfigurationException exc) { | |||||
| throw new BuildException("Parser has not been configured correctly", exc); | |||||
| } catch (FactoryConfigurationError e) { | |||||
| throw new BuildException("XML parser has not been configured " | |||||
| + "correctly: " + e.getMessage(), e); | |||||
| } catch (SAXParseException exc) { | } catch (SAXParseException exc) { | ||||
| Location location = | Location location = | ||||
| new Location(buildFile.toString(), exc.getLineNumber(), | new Location(buildFile.toString(), exc.getLineNumber(), | ||||
| @@ -1151,21 +1136,6 @@ public class ProjectHelperImpl extends ProjectHelper { | |||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * Returns the parser factory to use. Only one parser | |||||
| * factory is ever created by this method (multi-threading | |||||
| * issues aside) and is then cached for future use. | |||||
| * | |||||
| * @return a SAXParserFactory to use within this class | |||||
| */ | |||||
| private static SAXParserFactory getParserFactory() { | |||||
| if (parserFactory == null) { | |||||
| parserFactory = SAXParserFactory.newInstance(); | |||||
| } | |||||
| return parserFactory; | |||||
| } | |||||
| /** | /** | ||||
| * Scans an attribute list for the <code>id</code> attribute and | * Scans an attribute list for the <code>id</code> attribute and | ||||
| * stores a reference to the target object in the project if an | * stores a reference to the target object in the project if an | ||||
| @@ -64,10 +64,6 @@ import java.net.URL; | |||||
| import java.util.Vector; | import java.util.Vector; | ||||
| import java.util.Hashtable; | import java.util.Hashtable; | ||||
| import java.util.Enumeration; | import java.util.Enumeration; | ||||
| import javax.xml.parsers.SAXParserFactory; | |||||
| import javax.xml.parsers.SAXParser; | |||||
| import javax.xml.parsers.ParserConfigurationException; | |||||
| import javax.xml.parsers.FactoryConfigurationError; | |||||
| import org.apache.tools.ant.AntClassLoader; | import org.apache.tools.ant.AntClassLoader; | ||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import org.apache.tools.ant.DirectoryScanner; | import org.apache.tools.ant.DirectoryScanner; | ||||
| @@ -78,6 +74,7 @@ import org.apache.tools.ant.types.Path; | |||||
| import org.apache.tools.ant.types.Reference; | import org.apache.tools.ant.types.Reference; | ||||
| import org.apache.tools.ant.types.XMLCatalog; | import org.apache.tools.ant.types.XMLCatalog; | ||||
| import org.apache.tools.ant.types.DTDLocation; | import org.apache.tools.ant.types.DTDLocation; | ||||
| import org.apache.tools.ant.util.JAXPUtils; | |||||
| import org.xml.sax.XMLReader; | import org.xml.sax.XMLReader; | ||||
| import org.xml.sax.EntityResolver; | import org.xml.sax.EntityResolver; | ||||
| import org.xml.sax.Parser; | import org.xml.sax.Parser; | ||||
| @@ -96,12 +93,6 @@ import org.xml.sax.helpers.ParserAdapter; | |||||
| */ | */ | ||||
| public class XMLValidateTask extends Task { | public class XMLValidateTask extends Task { | ||||
| /** | |||||
| * Parser factory to use to create parsers. | |||||
| * @see #getParserFactory | |||||
| */ | |||||
| private static SAXParserFactory parserFactory = null; | |||||
| protected static String INIT_FAILED_MSG = | protected static String INIT_FAILED_MSG = | ||||
| "Could not start xml validation: "; | "Could not start xml validation: "; | ||||
| @@ -294,20 +285,10 @@ public class XMLValidateTask extends Task { | |||||
| Object reader = null; | Object reader = null; | ||||
| if (readerClassName == null) { | if (readerClassName == null) { | ||||
| // use JAXP | |||||
| try { | try { | ||||
| SAXParser saxParser = getParserFactory().newSAXParser(); | |||||
| try { | |||||
| reader = saxParser.getXMLReader(); | |||||
| } catch (SAXException exc) { | |||||
| reader = saxParser.getParser(); | |||||
| } | |||||
| } catch (ParserConfigurationException e) { | |||||
| throw new BuildException(INIT_FAILED_MSG + e.getMessage(), | |||||
| e, getLocation()); | |||||
| } catch (SAXException e) { | |||||
| throw new BuildException(INIT_FAILED_MSG + e.getMessage(), | |||||
| e, getLocation()); | |||||
| reader = JAXPUtils.getXMLReader(); | |||||
| } catch (BuildException exc) { | |||||
| reader = JAXPUtils.getParser(); | |||||
| } | } | ||||
| } else { | } else { | ||||
| @@ -372,21 +353,6 @@ public class XMLValidateTask extends Task { | |||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * Returns the parser factory to use. Only one parser | |||||
| * factory is ever created by this method (multi-threading | |||||
| * issues aside) and is then cached for future use. | |||||
| * | |||||
| * @return a SAXParserFactory to use within this class | |||||
| */ | |||||
| private static SAXParserFactory getParserFactory() { | |||||
| if (parserFactory == null) { | |||||
| parserFactory = SAXParserFactory.newInstance(); | |||||
| } | |||||
| return parserFactory; | |||||
| } | |||||
| /* | /* | ||||
| * set a feature on the parser. | * set a feature on the parser. | ||||
| * TODO: find a way to set any feature from build.xml | * TODO: find a way to set any feature from build.xml | ||||
| @@ -0,0 +1,183 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2002 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.util; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.xml.sax.Parser; | |||||
| import org.xml.sax.SAXException; | |||||
| import org.xml.sax.XMLReader; | |||||
| import javax.xml.parsers.SAXParserFactory; | |||||
| import javax.xml.parsers.SAXParser; | |||||
| import javax.xml.parsers.ParserConfigurationException; | |||||
| import javax.xml.parsers.FactoryConfigurationError; | |||||
| /** | |||||
| * Collection of helper methods that retrieve a ParserFactory or | |||||
| * Parsers and Readers. | |||||
| * | |||||
| * <p>This class will create only a single factory instance.</p> | |||||
| * | |||||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||||
| * | |||||
| * @since Ant 1.5 | |||||
| */ | |||||
| public class JAXPUtils { | |||||
| /** | |||||
| * Parser factory to use to create parsers. | |||||
| * @see #getParserFactory | |||||
| * | |||||
| * @since Ant 1.5 | |||||
| */ | |||||
| private static SAXParserFactory parserFactory = null; | |||||
| /** | |||||
| * Returns the parser factory to use. Only one parser factory is | |||||
| * ever created by this method and is then cached for future use. | |||||
| * | |||||
| * @return a SAXParserFactory to use | |||||
| * | |||||
| * @since Ant 1.5 | |||||
| */ | |||||
| public synchronized static SAXParserFactory getParserFactory() | |||||
| throws BuildException { | |||||
| if (parserFactory == null) { | |||||
| parserFactory = newParserFactory(); | |||||
| } | |||||
| return parserFactory; | |||||
| } | |||||
| /** | |||||
| * Returns a new parser factory instance. | |||||
| * | |||||
| * @since Ant 1.5 | |||||
| */ | |||||
| public static SAXParserFactory newParserFactory() throws BuildException { | |||||
| try { | |||||
| return SAXParserFactory.newInstance(); | |||||
| } catch (FactoryConfigurationError e) { | |||||
| throw new BuildException("XML parser factory has not been " | |||||
| + "configured correctly: " | |||||
| + e.getMessage(), e); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Returns a newly created SAX 1 Parser, using the default parser | |||||
| * factory. | |||||
| * | |||||
| * @return a SAX 1 Parser. | |||||
| * @see #getParserFactory | |||||
| * @since Ant 1.5 | |||||
| */ | |||||
| public static Parser getParser() throws BuildException { | |||||
| try { | |||||
| return newSAXParser().getParser(); | |||||
| } catch (SAXException e) { | |||||
| throw convertToBuildException(e); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Returns a newly created SAX 2 XMLReader, using the default parser | |||||
| * factory. | |||||
| * | |||||
| * @return a SAX 2 XMLReader. | |||||
| * @see #getParserFactory | |||||
| * @since Ant 1.5 | |||||
| */ | |||||
| public static XMLReader getXMLReader() throws BuildException { | |||||
| try { | |||||
| return newSAXParser().getXMLReader(); | |||||
| } catch (SAXException e) { | |||||
| throw convertToBuildException(e); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * @return a new SAXParser instance as helper for getParser and | |||||
| * getXMLReader. | |||||
| * | |||||
| * @since Ant 1.5 | |||||
| */ | |||||
| private static SAXParser newSAXParser() throws BuildException { | |||||
| try { | |||||
| return getParserFactory().newSAXParser(); | |||||
| } catch (ParserConfigurationException e) { | |||||
| throw new BuildException("Cannot create parser for the given " | |||||
| + "configuration: " + e.getMessage(), e); | |||||
| } catch (SAXException e) { | |||||
| throw convertToBuildException(e); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Translate a SAXException into a BuildException | |||||
| * | |||||
| * @since Ant 1.5 | |||||
| */ | |||||
| private static BuildException convertToBuildException(SAXException e) { | |||||
| Exception nested = e.getException(); | |||||
| if (nested != null) { | |||||
| return new BuildException(nested); | |||||
| } else { | |||||
| return new BuildException(e); | |||||
| } | |||||
| } | |||||
| } | |||||