001 /* ======================================================================== 002 * JCommon : a free general purpose class library for the Java(tm) platform 003 * ======================================================================== 004 * 005 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors. 006 * 007 * Project Info: http://www.jfree.org/jcommon/index.html 008 * 009 * This library is free software; you can redistribute it and/or modify it 010 * under the terms of the GNU Lesser General Public License as published by 011 * the Free Software Foundation; either version 2.1 of the License, or 012 * (at your option) any later version. 013 * 014 * This library is distributed in the hope that it will be useful, but 015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 017 * License for more details. 018 * 019 * You should have received a copy of the GNU Lesser General Public 020 * License along with this library; if not, write to the Free Software 021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 022 * USA. 023 * 024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 025 * in the United States and other countries.] 026 * 027 * ------------------- 028 * CommentHandler.java 029 * ------------------- 030 * (C)opyright 2003-2005, by Thomas Morgner and Contributors. 031 * 032 * Original Author: Thomas Morgner; 033 * Contributor(s): David Gilbert (for Object Refinery Limited); 034 * 035 * $Id: CommentHandler.java,v 1.3 2005/10/18 13:25:44 mungady Exp $ 036 * 037 * Changes 038 * ------------------------- 039 * 20-Jul-2003 : Initial version 040 * 041 */ 042 043 package org.jfree.xml; 044 045 import java.util.ArrayList; 046 047 import org.xml.sax.SAXException; 048 import org.xml.sax.ext.LexicalHandler; 049 050 /** 051 * The comment handler is used to collect all XML comments from the 052 * SAX parser. The parser implementation must support comments to make 053 * this feature work. 054 * 055 * @author Thomas Morgner 056 */ 057 public class CommentHandler implements LexicalHandler { 058 059 /** A constant marking a comment on the opening tag. */ 060 public static final String OPEN_TAG_COMMENT = "parser.comment.open"; 061 062 /** A constant marking a comment on the closing tag. */ 063 public static final String CLOSE_TAG_COMMENT = "parser.comment.close"; 064 065 /** A list containing all collected comments. */ 066 private final ArrayList comment; 067 068 /** a flag marking whether the SAX parser is currently working in the DTD. */ 069 private boolean inDTD; 070 071 /** 072 * DefaultConstructor. 073 */ 074 public CommentHandler() { 075 this.comment = new ArrayList(); 076 } 077 078 /** 079 * Report the start of DTD declarations, if any. 080 * 081 * <p>This method is empty.</p> 082 * 083 * @param name The document type name. 084 * @param publicId The declared public identifier for the 085 * external DTD subset, or null if none was declared. 086 * @param systemId The declared system identifier for the 087 * external DTD subset, or null if none was declared. 088 * @exception org.xml.sax.SAXException The application may raise an 089 * exception. 090 * @see #endDTD() 091 * @see #startEntity(String) 092 */ 093 public void startDTD(final String name, final String publicId, 094 final String systemId) throws SAXException { 095 this.inDTD = true; 096 } 097 098 /** 099 * Report the end of DTD declarations. 100 * 101 * <p>This method is empty.</p> 102 * 103 * @exception org.xml.sax.SAXException The application may raise an exception. 104 */ 105 public void endDTD() 106 throws SAXException { 107 this.inDTD = false; 108 } 109 110 /** 111 * Report the beginning of some internal and external XML entities. 112 * 113 * <p>This method is empty.</p> 114 * 115 * @param name The name of the entity. If it is a parameter 116 * entity, the name will begin with '%', and if it is the 117 * external DTD subset, it will be "[dtd]". 118 * @exception org.xml.sax.SAXException The application may raise an exception. 119 * @see #endEntity(String) 120 * @see org.xml.sax.ext.DeclHandler#internalEntityDecl 121 * @see org.xml.sax.ext.DeclHandler#externalEntityDecl 122 */ 123 public void startEntity(final String name) 124 throws SAXException { 125 // do nothing 126 } 127 128 /** 129 * Report the end of an entity. 130 * 131 * <p>This method is empty.</p> 132 * 133 * @param name The name of the entity that is ending. 134 * @exception org.xml.sax.SAXException The application may raise an exception. 135 * @see #startEntity(String) 136 */ 137 public void endEntity(final String name) throws SAXException { 138 // do nothing 139 } 140 141 /** 142 * Report the start of a CDATA section. 143 * 144 * <p>This method is empty.</p> 145 * 146 * @exception org.xml.sax.SAXException The application may raise an exception. 147 * @see #endCDATA() 148 */ 149 public void startCDATA() throws SAXException { 150 // do nothing 151 } 152 153 /** 154 * Report the end of a CDATA section. 155 * 156 * <p>This method is empty.</p> 157 * 158 * @exception org.xml.sax.SAXException The application may raise an exception. 159 * @see #startCDATA() 160 */ 161 public void endCDATA() throws SAXException { 162 // do nothing 163 } 164 165 /** 166 * Report an XML comment anywhere in the document. 167 * 168 * <p>This callback will be used for comments inside or outside the 169 * document element, including comments in the external DTD 170 * subset (if read). Comments in the DTD must be properly 171 * nested inside start/endDTD and start/endEntity events (if 172 * used).</p> 173 * 174 * @param ch An array holding the characters in the comment. 175 * @param start The starting position in the array. 176 * @param length The number of characters to use from the array. 177 * @exception org.xml.sax.SAXException The application may raise an exception. 178 */ 179 public void comment(final char[] ch, final int start, final int length) throws SAXException { 180 if (!this.inDTD) { 181 this.comment.add(new String(ch, start, length)); 182 } 183 } 184 185 /** 186 * Returns all collected comments as string array. 187 * @return the array containing all comments. 188 */ 189 public String[] getComments() { 190 if (this.comment.isEmpty()) { 191 return null; 192 } 193 return (String[]) this.comment.toArray(new String[this.comment.size()]); 194 } 195 196 /** 197 * Clears all comments. 198 */ 199 public void clearComments() { 200 this.comment.clear(); 201 } 202 }