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