blob: e545f3994adf1446e02f6f37dbe8cb1428e179a5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cocoon.xml;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.xml.sax.Attributes;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.ContentHandler;
/**
* Logging content handler logs all events going through to the logger.
*
* @author <a href="mailto:vgritsenko@apache.org">Vadim Gritsenko</a>
* @version CVS $Id$
*/
public class LoggingContentHandler extends AbstractLogEnabled implements ContentHandler {
/**
* All debug messages from this handler are prefixed with this id.
*/
String id;
/** The current <code>ContentHandler</code>. */
ContentHandler contentHandler;
/**
* Creates new <code>LoggingContentHandler</code> with specified
* <code>id</code> and destination <code>contentHandler</code>.
*/
public LoggingContentHandler(String id, ContentHandler contentHandler) {
this.id = id;
this.contentHandler = contentHandler;
}
public void setDocumentLocator(Locator locator) {
log("setDocumentLocator", "");
contentHandler.setDocumentLocator(locator);
}
public void startDocument() throws SAXException {
log("startDocument", "");
this.contentHandler.startDocument();
}
public void endDocument() throws SAXException {
log ("endDocument", "");
this.contentHandler.endDocument();
}
public void startPrefixMapping(String prefix, String uri) throws SAXException {
log ("startPrefixMapping", "prefix="+prefix+",uri="+uri);
this.contentHandler.startPrefixMapping(prefix,uri);
}
public void endPrefixMapping(String prefix) throws SAXException {
log ("endPrefixMapping", "prefix="+prefix);
this.contentHandler.endPrefixMapping(prefix);
}
public void startElement(String uri, String loc, String raw, Attributes a)
throws SAXException {
log ("startElement", "uri="+uri+",local="+loc+",raw="+raw);
for (int i = 0; i < a.getLength(); i++) {
log (" ", Integer.toString(i + 1)
+ ". uri=" + a.getURI(i)
+ ",local=" + a.getLocalName(i)
+ ",qname=" + a.getQName(i)
+ ",type=" + a.getType(i)
+ ",value=" + a.getValue(i));
}
this.contentHandler.startElement(uri,loc,raw,a);
}
public void endElement(String uri, String loc, String qname) throws SAXException {
log ("endElement", "uri="+uri+",local="+loc+",qname="+qname);
this.contentHandler.endElement(uri,loc,qname);
}
public void characters(char ch[], int start, int len) throws SAXException {
log ("characters", new String(ch,start,len));
this.contentHandler.characters(ch,start,len);
}
public void ignorableWhitespace(char ch[], int start, int len) throws SAXException {
log ("ignorableWhitespace", new String(ch,start,len));
this.contentHandler.ignorableWhitespace(ch,start,len);
}
public void processingInstruction(String target, String data) throws SAXException {
log ("processingInstruction", "target="+target+",data="+data);
this.contentHandler.processingInstruction(target,data);
}
public void skippedEntity(String name) throws SAXException {
log ("skippedEntity", "name="+name);
this.contentHandler.skippedEntity(name);
}
private void log(String location, String description) {
StringBuffer logEntry = new StringBuffer();
logEntry.append(id);
logEntry.append("[");
logEntry.append(location);
logEntry.append("] ");
logEntry.append(description);
logEntry.append("\n");
getLogger().debug(logEntry.toString());
// System.out.print(logEntry.toString());
}
}