From 76ae23935169b24f54520da482e6ceb26cd890a6 Mon Sep 17 00:00:00 2001 From: Oliver Burn Date: Sat, 7 Dec 2002 13:02:52 +0000 Subject: [PATCH] Refactoring to move all the XML parsing logic into a common place. --- .../tools/checkstyle/AbstractLoader.java | 120 ++++++++++++++++++ .../tools/checkstyle/ConfigurationLoader.java | 41 +----- .../tools/checkstyle/HardErrorHandler.java | 63 --------- .../tools/checkstyle/PackageNamesLoader.java | 52 +------- 4 files changed, 131 insertions(+), 145 deletions(-) create mode 100644 src/checkstyle/com/puppycrawl/tools/checkstyle/AbstractLoader.java delete mode 100644 src/checkstyle/com/puppycrawl/tools/checkstyle/HardErrorHandler.java diff --git a/src/checkstyle/com/puppycrawl/tools/checkstyle/AbstractLoader.java b/src/checkstyle/com/puppycrawl/tools/checkstyle/AbstractLoader.java new file mode 100644 index 000000000..fcc116e6e --- /dev/null +++ b/src/checkstyle/com/puppycrawl/tools/checkstyle/AbstractLoader.java @@ -0,0 +1,120 @@ +//////////////////////////////////////////////////////////////////////////////// +// checkstyle: Checks Java source code for adherence to a set of rules. +// Copyright (C) 2001-2002 Oliver Burn +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//////////////////////////////////////////////////////////////////////////////// +package com.puppycrawl.tools.checkstyle; + +import java.io.IOException; +import java.io.InputStream; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.DefaultHandler; + +/** + * Contains the common implementation of a loader, for loading a configuration + * from an XML file. + *

+ * The error handling policy can be described as being austere, dead set, + * disciplinary, dour, draconian, exacting, firm, forbidding, grim, hard, hard- + * boiled, harsh, harsh, in line, iron-fisted, no-nonsense, oppressive, + * persnickety, picky, prudish, punctilious, puritanical, rigid, rigorous, + * scrupulous, set, severe, square, stern, stickler, straight, strait-laced, + * stringent, stuffy, stuffy, tough, unpermissive, unsparing and uptight. + * + * @author Oliver Burn + */ +abstract class AbstractLoader + extends DefaultHandler +{ + /** the public id to resolve */ + private final String mPublicId; + /** the resource name for the DTD */ + private final String mDtdResourceName; + /** parser to read XML files **/ + private final XMLReader mParser; + + /** + * Creates a new instance. + * @param aPublicId the public ID for the DTD to resolve + * @param aDtdResourceName the resource for the DTD + * @throws SAXException if an error occurs + * @throws ParserConfigurationException if an error occurs + */ + protected AbstractLoader(String aPublicId, String aDtdResourceName) + throws SAXException, ParserConfigurationException + { + mPublicId = aPublicId; + mDtdResourceName = aDtdResourceName; + final SAXParserFactory factory = SAXParserFactory.newInstance(); + factory.setValidating(true); + mParser = factory.newSAXParser().getXMLReader(); + mParser.setContentHandler(this); + mParser.setEntityResolver(this); + mParser.setErrorHandler(this); + } + + /** + * Parses the specified input source. + * @param aInputSource the input source to parse. + * @throws IOException if an error occurs + * @throws SAXException in an error occurs + */ + protected void parseInputSource(InputSource aInputSource) + throws IOException, SAXException + { + mParser.parse(aInputSource); + } + + /** @see org.xml.sax.EntityResolver */ + public InputSource resolveEntity(String aPublicId, String aSystemId) + throws SAXException + { + if (mPublicId.equals(aPublicId)) { + final InputStream dtdIS = getClass().getClassLoader() + .getResourceAsStream(mDtdResourceName); + if (dtdIS == null) { + throw new SAXException( + "Unable to load internal dtd " + mDtdResourceName); + } + return new InputSource(dtdIS); + } + + return super.resolveEntity(aPublicId, aSystemId); + } + + /** @see org.xml.sax.ErrorHandler#warning(org.xml.sax.SAXParseException) */ + public void warning(SAXParseException aEx) throws SAXException + { + throw aEx; + } + + /** @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException) */ + public void error(SAXParseException aEx) throws SAXException + { + throw aEx; + } + + /** @see org.xml.sax.ErrorHandler#fatalError */ + public void fatalError(SAXParseException aEx) throws SAXException + { + throw aEx; + } +} diff --git a/src/checkstyle/com/puppycrawl/tools/checkstyle/ConfigurationLoader.java b/src/checkstyle/com/puppycrawl/tools/checkstyle/ConfigurationLoader.java index 2acda2156..6f33f32e0 100644 --- a/src/checkstyle/com/puppycrawl/tools/checkstyle/ConfigurationLoader.java +++ b/src/checkstyle/com/puppycrawl/tools/checkstyle/ConfigurationLoader.java @@ -24,16 +24,12 @@ import com.puppycrawl.tools.checkstyle.api.Utils; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; -import java.io.InputStream; import java.util.Properties; import java.util.Stack; import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; -import org.xml.sax.helpers.DefaultHandler; /** * Loads a configuration from a configuration XML file. @@ -42,22 +38,20 @@ import org.xml.sax.helpers.DefaultHandler; * @version 1.0 */ class ConfigurationLoader - extends DefaultHandler + extends AbstractLoader { /** the public ID for the configuration dtd */ - private static final String CONFIG_DTD_PUBLIC_ID = + private static final String DTD_PUBLIC_ID = "-//Puppy Crawl//DTD Check Configuration 1.0//EN"; /** the resource for the configuration dtd */ - private static final String CONFIG_DTD_RESOURCE = + private static final String DTD_RESOURCE_NAME = "com/puppycrawl/tools/checkstyle/configuration_1_0.dtd"; /** overriding properties **/ private final Properties mOverrideProps; - /** parser to read XML files **/ - private final XMLReader mParser; /** the loaded configurations **/ - private Stack mConfigStack = new Stack(); + private final Stack mConfigStack = new Stack(); /** the Configuration that is being built */ private Configuration mConfiguration = null; @@ -70,13 +64,8 @@ class ConfigurationLoader private ConfigurationLoader(Properties aOverrideProps) throws ParserConfigurationException, SAXException { + super(DTD_PUBLIC_ID, DTD_RESOURCE_NAME); mOverrideProps = aOverrideProps; - final SAXParserFactory factory = SAXParserFactory.newInstance(); - factory.setValidating(true); - mParser = factory.newSAXParser().getXMLReader(); - mParser.setContentHandler(this); - mParser.setEntityResolver(this); - mParser.setErrorHandler(HardErrorHandler.INSTANCE); } /** @@ -89,31 +78,13 @@ class ConfigurationLoader void parseFile(String aFilename) throws FileNotFoundException, IOException, SAXException { - mParser.parse(new InputSource(new FileReader(aFilename))); + parseInputSource(new InputSource(new FileReader(aFilename))); } /////////////////////////////////////////////////////////////////////////// // Document handler methods /////////////////////////////////////////////////////////////////////////// - /** @see org.xml.sax.EntityResolver */ - public InputSource resolveEntity(String aPublicId, String aSystemId) - throws SAXException - { - if (CONFIG_DTD_PUBLIC_ID.equals(aPublicId)) { - final InputStream dtdIS = getClass().getClassLoader() - .getResourceAsStream(CONFIG_DTD_RESOURCE); - if (dtdIS == null) { - throw new SAXException( - "Unable to load internal dtd " + CONFIG_DTD_RESOURCE); - } - return new InputSource(dtdIS); - } - - return super.resolveEntity(aPublicId, aSystemId); - } - - /** @see org.xml.sax.helpers.DefaultHandler **/ public void startElement(String aNamespaceURI, String aLocalName, diff --git a/src/checkstyle/com/puppycrawl/tools/checkstyle/HardErrorHandler.java b/src/checkstyle/com/puppycrawl/tools/checkstyle/HardErrorHandler.java deleted file mode 100644 index 744701bdf..000000000 --- a/src/checkstyle/com/puppycrawl/tools/checkstyle/HardErrorHandler.java +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// checkstyle: Checks Java source code for adherence to a set of rules. -// Copyright (C) 2001-2002 Oliver Burn -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//////////////////////////////////////////////////////////////////////////////// -package com.puppycrawl.tools.checkstyle; - -import org.xml.sax.ErrorHandler; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; - -/** - * This class implements the error handling policy for Checkstyle. The policy - * can be summarised as being austere, dead set, disciplinary, dour, draconian, - * exacting, firm, forbidding, grim, hard, hard-boiled, harsh, harsh, in line, - * iron-fisted, no-nonsense, oppressive, persnickety, picky, prudish, - * punctilious, puritanical, rigid, rigorous, scrupulous, set, severe, square, - * stern, stickler, straight, strait-laced, stringent, stuffy, stuffy, tough, - * unpermissive, unsparing or uptight. - * @author Oliver Burn - */ -class HardErrorHandler - implements ErrorHandler -{ - /** the instance for use */ - static final HardErrorHandler INSTANCE = new HardErrorHandler(); - - /** Prevent instances */ - private HardErrorHandler() - { - } - - /** @see org.xml.sax.ErrorHandler#warning(org.xml.sax.SAXParseException) */ - public void warning(SAXParseException aEx) throws SAXException - { - throw aEx; - } - - /** @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException) */ - public void error(SAXParseException aEx) throws SAXException - { - throw aEx; - } - - /** @see org.xml.sax.ErrorHandler#fatalError */ - public void fatalError(SAXParseException aEx) throws SAXException - { - throw aEx; - } -} diff --git a/src/checkstyle/com/puppycrawl/tools/checkstyle/PackageNamesLoader.java b/src/checkstyle/com/puppycrawl/tools/checkstyle/PackageNamesLoader.java index 4534a27c2..36b123396 100644 --- a/src/checkstyle/com/puppycrawl/tools/checkstyle/PackageNamesLoader.java +++ b/src/checkstyle/com/puppycrawl/tools/checkstyle/PackageNamesLoader.java @@ -28,12 +28,9 @@ import java.util.Iterator; import java.util.List; import java.util.Stack; import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; -import org.xml.sax.helpers.DefaultHandler; /** * Loads a list of package names from a package name XML file. @@ -41,14 +38,14 @@ import org.xml.sax.helpers.DefaultHandler; * @version 4-Dec-2002 */ public class PackageNamesLoader - extends DefaultHandler + extends AbstractLoader { /** the public ID for the configuration dtd */ - private static final String PACKAGE_DTD_PUBLIC_ID = + private static final String DTD_PUBLIC_ID = "-//Puppy Crawl//DTD Package Names 1.0//EN"; /** the resource for the configuration dtd */ - private static final String PACKAGE_DTD_RESOURCE = + private static final String DTD_RESOURCE_NAME = "com/puppycrawl/tools/checkstyle/packages_1_0.dtd"; /** Name of default checkstyle package names resource file. @@ -62,9 +59,6 @@ public class PackageNamesLoader /** The loaded package names */ private Stack mPackageStack = new Stack(); - /** parser to read XML files **/ - private XMLReader mParser; - /** * Creates a new PackageNameLoader instance. * @throws ParserConfigurationException if an error occurs @@ -73,12 +67,7 @@ public class PackageNamesLoader private PackageNamesLoader() throws ParserConfigurationException, SAXException { - final SAXParserFactory factory = SAXParserFactory.newInstance(); - factory.setValidating(true); - mParser = factory.newSAXParser().getXMLReader(); - mParser.setContentHandler(this); - mParser.setEntityResolver(this); - mParser.setErrorHandler(HardErrorHandler.INSTANCE); + super(DTD_PUBLIC_ID, DTD_RESOURCE_NAME); } /** @@ -91,37 +80,6 @@ public class PackageNamesLoader new String[mPackageNames.size()]); } - /** - * Parses the specified source, loading its package names. - * @param aInputSource the source to parse - * @throws FileNotFoundException if an error occurs - * @throws IOException if an error occurs - * @throws SAXException if an error occurs - */ - private void parseInputSource(InputSource aInputSource) - throws FileNotFoundException, IOException, SAXException - { - mPackageStack.clear(); - mParser.parse(aInputSource); - } - - /** @see org.xml.sax.EntityResolver */ - public InputSource resolveEntity(String aPublicId, String aSystemId) - throws SAXException - { - if (PACKAGE_DTD_PUBLIC_ID.equals(aPublicId)) { - final InputStream dtdIS = getClass().getClassLoader() - .getResourceAsStream(PACKAGE_DTD_RESOURCE); - if (dtdIS == null) { - throw new SAXException( - "Unable to load internal dtd " + PACKAGE_DTD_RESOURCE); - } - return new InputSource(dtdIS); - } - - return super.resolveEntity(aPublicId, aSystemId); - } - /** @see org.xml.sax.helpers.DefaultHandler **/ public void startElement(String aNamespaceURI, String aLocalName, @@ -217,7 +175,7 @@ public class PackageNamesLoader * @throws CheckstyleException if an error occurs. */ private static String[] loadPackageNames(InputSource aSource, - String aSourceName) + String aSourceName) throws CheckstyleException { try {