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 org.whattf.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 206 2007-10-15 07:51:34Z hsivonen $ 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 a warning with specified locator. 073 * 074 * @param message the warning message 075 * @throws SAXException if something goes wrong 076 */ 077 public void warn(String message, Locator overrideLocator) throws SAXException { 078 if (errorHandler != null) { 079 SAXParseException spe = new SAXParseException(message, overrideLocator); 080 errorHandler.warning(spe); 081 } 082 } 083 084 /** 085 * Emit an error with specified locator. 086 * 087 * @param message the error message 088 * @throws SAXException if something goes wrong 089 */ 090 public void err(String message, Locator overrideLocator) throws SAXException { 091 if (errorHandler != null) { 092 SAXParseException spe = new SAXParseException(message, overrideLocator); 093 errorHandler.error(spe); 094 } 095 } 096 097 /** 098 * Emit an error. The locator is used. 099 * 100 * @param message the error message 101 * @throws SAXException if something goes wrong 102 */ 103 public void err(String message) throws SAXException { 104 if (errorHandler != null) { 105 SAXParseException spe = new SAXParseException(message, locator); 106 errorHandler.error(spe); 107 } 108 } 109 110 /** 111 * Does nothing. Subclasses are expected to override this method with 112 * an implementation that clears the state of the checker and releases 113 * objects the checker might hold references to. 114 */ 115 public void reset() { 116 } 117 118 /** 119 * Returns the errorHandler. 120 * 121 * @return the errorHandler 122 */ 123 public ErrorHandler getErrorHandler() { 124 return errorHandler; 125 } 126 127 /** 128 * Sets the errorHandler. 129 * 130 * @param errorHandler 131 * the errorHandler to set 132 */ 133 public void setErrorHandler(ErrorHandler errorHandler) { 134 this.errorHandler = errorHandler; 135 } 136 137 /** 138 * Returns the locator. 139 * 140 * @return the locator 141 */ 142 public Locator getDocumentLocator() { 143 return this.locator; 144 } 145 146 /** 147 * @see org.xml.sax.ContentHandler#setDocumentLocator(org.xml.sax.Locator) 148 */ 149 public void setDocumentLocator(Locator locator) { 150 this.locator = locator; 151 } 152 153 /** 154 * Calls <code>reset()</code>. 155 * @see org.xml.sax.ContentHandler#startDocument() 156 */ 157 public void startDocument() throws SAXException { 158 reset(); 159 } 160 161 /** 162 * Calls <code>reset()</code>. 163 * @see org.xml.sax.ContentHandler#endDocument() 164 */ 165 public void endDocument() throws SAXException { 166 reset(); 167 } 168 169 /** 170 * Calls <code>characters()</code>. 171 * 172 * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int) 173 */ 174 public final void ignorableWhitespace(char[] ch, int start, int length) 175 throws SAXException { 176 characters(ch, start, length); 177 } 178 179 /** 180 * @see org.xml.sax.ContentHandler#characters(char[], int, int) 181 */ 182 public void characters(char[] ch, int start, int length) 183 throws SAXException { 184 } 185 186 /** 187 * @see org.xml.sax.ContentHandler#endElement(java.lang.String, 188 * java.lang.String, java.lang.String) 189 */ 190 public void endElement(String uri, String localName, String qName) 191 throws SAXException { 192 } 193 194 /** 195 * @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String) 196 */ 197 public void endPrefixMapping(String prefix) throws SAXException { 198 } 199 200 /** 201 * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String, 202 * java.lang.String) 203 */ 204 public void processingInstruction(String target, String data) 205 throws SAXException { 206 } 207 208 /** 209 * @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String) 210 */ 211 public void skippedEntity(String name) throws SAXException { 212 } 213 214 /** 215 * @see org.xml.sax.ContentHandler#startElement(java.lang.String, 216 * java.lang.String, java.lang.String, org.xml.sax.Attributes) 217 */ 218 public void startElement(String uri, String localName, String qName, 219 Attributes atts) throws SAXException { 220 } 221 222 /** 223 * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String, 224 * java.lang.String) 225 */ 226 public void startPrefixMapping(String prefix, String uri) 227 throws SAXException { 228 } 229 }