    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
    043package org.jfree.xml;
    044
    045import java.util.ArrayList;
    046
    047import org.xml.sax.SAXException;
    048import 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 */
    057public 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}