001    /*
002     * Copyright (c) 2006 Henri Sivonen
003     *
004     * Permission is hereby granted, free of charge, to any person obtaining a 
005     * copy of this software and associated documentation files (the "Software"), 
006     * to deal in the Software without restriction, including without limitation 
007     * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
008     * and/or sell copies of the Software, and to permit persons to whom the 
009     * Software is furnished to do so, subject to the following conditions:
010     *
011     * The above copyright notice and this permission notice shall be included in 
012     * all copies or substantial portions of the Software.
013     *
014     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
015     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
016     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
017     * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
018     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
019     * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
020     * DEALINGS IN THE SOFTWARE.
021     */
022    
023    package fi.iki.hsivonen.xml.checker;
024    
025    import org.xml.sax.Attributes;
026    import org.xml.sax.ContentHandler;
027    import org.xml.sax.ErrorHandler;
028    import org.xml.sax.Locator;
029    import org.xml.sax.SAXException;
030    import org.xml.sax.SAXParseException;
031    
032    /**
033     * The abstract base class for SAX-based content checkers that listen to 
034     * the <code>ContentHandler</code> events and emit errors and warnings to 
035     * an <code>ErrorHandler</code>.
036     * 
037     * <p>Always delegates <code>ignorableWhitespace()</code> to 
038     * <code>characters()</code>. The other <code>ContentHandler</code> 
039     * methods here are stubs that do nothing. Subclasses, therefore, never 
040     * need to call the superclass methods. 
041     * 
042     * @version $Id: Checker.java,v 1.6 2006/11/29 18:13:32 hsivonen Exp $
043     * @author hsivonen
044     */
045    public abstract class Checker implements ContentHandler {
046    
047        private ErrorHandler errorHandler;
048    
049        private Locator locator;
050    
051        /**
052         * Constructor.
053         */
054        public Checker() {
055            super();
056        }
057    
058        /**
059         * Emit a warning. The locator is used.
060         * 
061         * @param message the warning message
062         * @throws SAXException if something goes wrong
063         */
064        public void warn(String message) throws SAXException {
065            if (errorHandler != null) {
066                SAXParseException spe = new SAXParseException(message, locator);
067                errorHandler.warning(spe);
068            }
069        }
070    
071        /**
072         * Emit an error. The locator is used.
073         * 
074         * @param message the error message
075         * @throws SAXException if something goes wrong
076         */
077        public void err(String message) throws SAXException {
078            if (errorHandler != null) {
079                SAXParseException spe = new SAXParseException(message, locator);
080                errorHandler.error(spe);
081            }
082        }
083    
084        /**
085         * Does nothing. Subclasses are expected to override this method with 
086         * an implementation that clears the state of the checker and releases 
087         * objects the checker might hold references to.
088         */
089        public void reset() {
090        }
091        
092        /**
093         * Returns the errorHandler.
094         * 
095         * @return the errorHandler
096         */
097        public ErrorHandler getErrorHandler() {
098            return errorHandler;
099        }
100    
101        /**
102         * Sets the errorHandler.
103         * 
104         * @param errorHandler
105         *            the errorHandler to set
106         */
107        public void setErrorHandler(ErrorHandler errorHandler) {
108            this.errorHandler = errorHandler;
109        }
110        
111        /**
112         * Returns the locator.
113         * 
114         * @return the locator
115         */
116        public Locator getDocumentLocator() {
117            return this.locator;
118        }
119        
120        /**
121         * @see org.xml.sax.ContentHandler#setDocumentLocator(org.xml.sax.Locator)
122         */
123        public void setDocumentLocator(Locator locator) {
124            this.locator = locator;
125        }
126    
127        /**
128         * Calls <code>reset()</code>.
129         * @see org.xml.sax.ContentHandler#startDocument()
130         */
131        public void startDocument() throws SAXException {
132            reset();
133        }
134    
135        /**
136         * Calls <code>reset()</code>.
137         * @see org.xml.sax.ContentHandler#endDocument()
138         */
139        public void endDocument() throws SAXException {
140            reset();
141        }
142    
143        /**
144         * Calls <code>characters()</code>.
145         * 
146         * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int)
147         */
148        public final void ignorableWhitespace(char[] ch, int start, int length)
149                throws SAXException {
150            characters(ch, start, length);
151        }
152    
153        /**
154         * @see org.xml.sax.ContentHandler#characters(char[], int, int)
155         */
156        public void characters(char[] ch, int start, int length)
157                throws SAXException {
158        }
159        
160        /**
161         * @see org.xml.sax.ContentHandler#endElement(java.lang.String,
162         *      java.lang.String, java.lang.String)
163         */
164        public void endElement(String uri, String localName, String qName)
165                throws SAXException {
166        }
167    
168        /**
169         * @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String)
170         */
171        public void endPrefixMapping(String prefix) throws SAXException {
172        }
173    
174        /**
175         * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String,
176         *      java.lang.String)
177         */
178        public void processingInstruction(String target, String data)
179                throws SAXException {
180        }
181    
182        /**
183         * @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String)
184         */
185        public void skippedEntity(String name) throws SAXException {
186        }
187    
188        /**
189         * @see org.xml.sax.ContentHandler#startElement(java.lang.String,
190         *      java.lang.String, java.lang.String, org.xml.sax.Attributes)
191         */
192        public void startElement(String uri, String localName, String qName,
193                Attributes atts) throws SAXException {
194        }
195    
196        /**
197         * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String,
198         *      java.lang.String)
199         */
200        public void startPrefixMapping(String prefix, String uri)
201                throws SAXException {
202        }
203    }