1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
|
/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2006 - 2009 Object Refinery Ltd, Pentaho Corporation and Contributors. All rights reserved.
*/
package org.pentaho.reporting.libraries.xmlns.parser;
import java.util.ArrayList;
import org.xml.sax.SAXException;
import org.xml.sax.ext.LexicalHandler;
/**
* The comment handler is used to collect all XML comments from the
* SAX parser. The parser implementation must support comments to make
* this feature work.
*
* @author Thomas Morgner
*/
public class CommentHandler implements LexicalHandler
{
/**
* A constant marking a comment on the opening tag.
*/
public static final String OPEN_TAG_COMMENT = "parser.comment.open";
/**
* A constant marking a comment on the closing tag.
*/
public static final String CLOSE_TAG_COMMENT = "parser.comment.close";
/**
* A list containing all collected comments.
*/
private final ArrayList comment;
/**
* a flag marking whether the SAX parser is currently working in the DTD.
*/
private boolean inDTD;
private static final String[] EMPTY_COMMENTS = new String[0];
/**
* DefaultConstructor.
*/
public CommentHandler()
{
this.comment = new ArrayList();
}
/**
* Report the start of DTD declarations, if any.
* <p/>
* <p>This method is empty.</p>
*
* @param name The document type name.
* @param publicId The declared public identifier for the
* external DTD subset, or null if none was declared.
* @param systemId The declared system identifier for the
* external DTD subset, or null if none was declared.
* @throws org.xml.sax.SAXException The application may raise an
* exception.
* @see #endDTD()
* @see #startEntity(String)
*/
public void startDTD(final String name, final String publicId,
final String systemId) throws SAXException
{
this.inDTD = true;
}
/**
* Report the end of DTD declarations.
* <p/>
* <p>This method is empty.</p>
*
* @throws SAXException The application may raise an exception.
*/
public void endDTD()
throws SAXException
{
this.inDTD = false;
}
/**
* Report the beginning of some internal and external XML entities.
* <p/>
* <p>This method is empty.</p>
*
* @param name The name of the entity. If it is a parameter
* entity, the name will begin with '%', and if it is the
* external DTD subset, it will be "[dtd]".
* @throws SAXException The application may raise an exception.
* @see #endEntity(String)
* @see org.xml.sax.ext.DeclHandler#internalEntityDecl
* @see org.xml.sax.ext.DeclHandler#externalEntityDecl
*/
public void startEntity(final String name)
throws SAXException
{
// do nothing
}
/**
* Report the end of an entity.
* <p/>
* <p>This method is empty.</p>
*
* @param name The name of the entity that is ending.
* @throws SAXException The application may raise an exception.
* @see #startEntity(String)
*/
public void endEntity(final String name) throws SAXException
{
// do nothing
}
/**
* Report the start of a CDATA section.
* <p/>
* <p>This method is empty.</p>
*
* @throws SAXException The application may raise an exception.
* @see #endCDATA()
*/
public void startCDATA() throws SAXException
{
// do nothing
}
/**
* Report the end of a CDATA section.
* <p/>
* <p>This method is empty.</p>
*
* @throws SAXException The application may raise an exception.
* @see #startCDATA()
*/
public void endCDATA() throws SAXException
{
// do nothing
}
/**
* Report an XML comment anywhere in the document.
* <p/>
* <p>This callback will be used for comments inside or outside the
* document element, including comments in the external DTD
* subset (if read). Comments in the DTD must be properly
* nested inside start/endDTD and start/endEntity events (if
* used).</p>
*
* @param ch An array holding the characters in the comment.
* @param start The starting position in the array.
* @param length The number of characters to use from the array.
* @throws SAXException The application may raise an exception.
*/
public void comment(final char[] ch, final int start, final int length) throws SAXException
{
if (!this.inDTD)
{
this.comment.add(new String(ch, start, length));
}
}
/**
* Returns all collected comments as string array.
*
* @return the array containing all comments.
*/
public String[] getComments()
{
if (this.comment.isEmpty())
{
return EMPTY_COMMENTS;
}
return (String[]) this.comment.toArray(new String[this.comment.size()]);
}
/**
* Clears all comments.
*/
public void clearComments()
{
this.comment.clear();
}
}
|