Frames | No Frames |
1: /* ======================================================================== 2: * JCommon : a free general purpose class library for the Java(tm) platform 3: * ======================================================================== 4: * 5: * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors. 6: * 7: * Project Info: http://www.jfree.org/jcommon/index.html 8: * 9: * This library is free software; you can redistribute it and/or modify it 10: * under the terms of the GNU Lesser General Public License as published by 11: * the Free Software Foundation; either version 2.1 of the License, or 12: * (at your option) any later version. 13: * 14: * This library is distributed in the hope that it will be useful, but 15: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 16: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 17: * License for more details. 18: * 19: * You should have received a copy of the GNU Lesser General Public 20: * License along with this library; if not, write to the Free Software 21: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 22: * USA. 23: * 24: * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 25: * in the United States and other countries.] 26: * 27: * ------------ 28: * FrontendDefaultHandler.java 29: * ------------ 30: * (C) Copyright 2002-2005, by Object Refinery Limited. 31: * 32: * Original Author: David Gilbert (for Object Refinery Limited); 33: * Contributor(s): -; 34: * 35: * $Id: FrontendDefaultHandler.java,v 1.7 2005/10/18 13:25:44 mungady Exp $ 36: * 37: * Changes 38: * ------- 39: * 02-Feb-2005 : Initial version. 40: * 41: */ 42: package org.jfree.xml; 43: 44: import java.net.MalformedURLException; 45: import java.net.URL; 46: import java.util.Iterator; 47: import java.util.Enumeration; 48: 49: import org.jfree.util.Configuration; 50: import org.jfree.util.DefaultConfiguration; 51: import org.xml.sax.Locator; 52: import org.xml.sax.SAXException; 53: import org.xml.sax.helpers.DefaultHandler; 54: 55: /** 56: * The frontenddefault handler connects the SAX-backend with the handler implementations. 57: * It must be the base class for all parser implementations used by the ParserFrontEnd. 58: * 59: * @author Thomas Morgner 60: */ 61: public abstract class FrontendDefaultHandler extends DefaultHandler implements Configuration { 62: /** 63: * A key for the content base. 64: */ 65: public static final String CONTENTBASE_KEY = "content-base"; 66: 67: /** 68: * Storage for the parser configuration. 69: */ 70: private DefaultConfiguration parserConfiguration; 71: 72: /** 73: * The DocumentLocator can be used to resolve the current parse position. 74: */ 75: private Locator locator; 76: 77: /** 78: * The current comment handler used to receive xml comments. 79: */ 80: private final CommentHandler commentHandler; 81: 82: /** 83: * Default constructor. 84: */ 85: protected FrontendDefaultHandler() { 86: this.parserConfiguration = new DefaultConfiguration(); 87: this.commentHandler = new CommentHandler(); 88: } 89: 90: /** 91: * Returns the comment handler that is used to collect comments. 92: * 93: * @return the comment handler. 94: */ 95: public CommentHandler getCommentHandler() { 96: return this.commentHandler; 97: } 98: 99: /** 100: * Receive an object for locating the origin of SAX document events. 101: * <p/> 102: * The locator allows the application to determine the end position of 103: * any document-related event, even if the parser is not reporting an 104: * error. Typically, the application will use this information for 105: * reporting its own errors (such as character content that does not 106: * match an application's business rules). The information returned by 107: * the locator is probably not sufficient for use with a search engine. 108: * 109: * @param locator the locator. 110: */ 111: public void setDocumentLocator(final Locator locator) { 112: this.locator = locator; 113: } 114: 115: /** 116: * Returns the current locator. 117: * 118: * @return the locator. 119: */ 120: public Locator getLocator() { 121: return this.locator; 122: } 123: 124: /** 125: * Returns the configuration property with the specified key. 126: * 127: * @param key the property key. 128: * @return the property value. 129: */ 130: public String getConfigProperty(final String key) { 131: return getConfigProperty(key, null); 132: } 133: 134: /** 135: * Returns the configuration property with the specified key (or the specified default value 136: * if there is no such property). 137: * <p/> 138: * If the property is not defined in this configuration, the code will lookup the property in 139: * the parent configuration. 140: * 141: * @param key the property key. 142: * @param defaultValue the default value. 143: * @return the property value. 144: */ 145: public String getConfigProperty(final String key, final String defaultValue) { 146: return this.parserConfiguration.getConfigProperty(key, defaultValue); 147: } 148: 149: /** 150: * Sets a parser configuration value. 151: * 152: * @param key the key. 153: * @param value the value. 154: */ 155: public void setConfigProperty(final String key, final String value) { 156: if (value == null) { 157: this.parserConfiguration.remove(key); 158: } 159: else { 160: this.parserConfiguration.setProperty(key, value); 161: } 162: } 163: 164: public Enumeration getConfigProperties() 165: { 166: return parserConfiguration.getConfigProperties(); 167: } 168: 169: /** 170: * Returns a new instance of the parser. 171: * 172: * @return a new instance of the parser. 173: */ 174: public abstract FrontendDefaultHandler newInstance(); 175: 176: /** 177: * Returns all keys with the given prefix. 178: * 179: * @param prefix the prefix 180: * @return the iterator containing all keys with that prefix 181: */ 182: public Iterator findPropertyKeys(final String prefix) { 183: return this.parserConfiguration.findPropertyKeys(prefix); 184: } 185: 186: /** 187: * Returns the parse result. This method is called at the end of the 188: * parsing process and expects the generated object. 189: * 190: * @return the object. 191: * @throws SAXException if something went wrong. 192: */ 193: public abstract Object getResult() throws SAXException; 194: 195: /** 196: * Gets the ContentBase used to resolve relative URLs. 197: * 198: * @return the current contentbase, or null if no contentBase is set. 199: */ 200: public URL getContentBase() { 201: final String contentBase = getConfigProperty(Parser.CONTENTBASE_KEY); 202: if (contentBase == null) { 203: return null; 204: } 205: try { 206: return new URL(contentBase); 207: } 208: catch (MalformedURLException mfe) { 209: throw new IllegalStateException("Content Base is illegal." + contentBase); 210: } 211: } 212: 213: 214: }