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 fi.iki.hsivonen.xml;
024
025 import org.xml.sax.Attributes;
026 import org.xml.sax.SAXException;
027
028 import gnu.xml.pipeline.EventConsumer;
029 import gnu.xml.pipeline.EventFilter;
030
031 public class IdContentPassFilter extends EventFilter {
032
033 private int depth;
034
035 private String id;
036
037 public IdContentPassFilter(EventConsumer next, String id) {
038 super(next);
039 setContentHandler(this);
040 this.id = id;
041 }
042
043 /**
044 * @see gnu.xml.pipeline.EventFilter#characters(char[], int, int)
045 */
046 public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
047 if (depth > 0) {
048 super.characters(arg0, arg1, arg2);
049 }
050 }
051
052 /**
053 * @see gnu.xml.pipeline.EventFilter#endElement(java.lang.String,
054 * java.lang.String, java.lang.String)
055 */
056 public void endElement(String arg0, String arg1, String arg2)
057 throws SAXException {
058 if (depth > 0) {
059 super.endElement(arg0, arg1, arg2);
060 }
061 depth--;
062 }
063
064 /**
065 * @see gnu.xml.pipeline.EventFilter#ignorableWhitespace(char[], int, int)
066 */
067 public void ignorableWhitespace(char[] arg0, int arg1, int arg2)
068 throws SAXException {
069 if (depth > 0) {
070 super.ignorableWhitespace(arg0, arg1, arg2);
071 }
072 }
073
074 /**
075 * @see gnu.xml.pipeline.EventFilter#processingInstruction(java.lang.String,
076 * java.lang.String)
077 */
078 public void processingInstruction(String arg0, String arg1)
079 throws SAXException {
080 if (depth > 0) {
081 super.processingInstruction(arg0, arg1);
082 }
083 }
084
085 /**
086 * @see gnu.xml.pipeline.EventFilter#startDocument()
087 */
088 public void startDocument() throws SAXException {
089 depth = -1;
090 super.startDocument();
091 }
092
093 /**
094 * @see gnu.xml.pipeline.EventFilter#startElement(java.lang.String,
095 * java.lang.String, java.lang.String, org.xml.sax.Attributes)
096 */
097 public void startElement(String namespaceURI, String localName,
098 String qName, Attributes atts) throws SAXException {
099 if (depth > 0) {
100 super.startElement(namespaceURI, localName,
101 qName, atts);
102 depth++;
103 } else {
104 String idAtt = atts.getValue("", "id");
105 if (id.equals(idAtt)) {
106 depth = 1;
107 return;
108 }
109 idAtt = atts.getValue("http://www.w3.org/XML/1998/namespace", "id");
110 if (idAtt == null) {
111 return;
112 }
113 if (id.equals(idAtt.trim())) {
114 depth = 1;
115 return;
116 }
117 }
118 }
119
120 }