@Override
    public void startElement(final String uri, final String localName, final String qName, final Attributes atts)
            throws SAXException {
        super.startElement(uri, localName, qName, atts);

        cb.append(START_ELEMENT);
        cb.append(uri);
        cb.append(DELIMITER);
        cb.append(localName);
        cb.append(DELIMITER);
        cb.append(qName);
        cb.append(DELIMITER);

        for (int i = 0; i < atts.getLength(); i++) {
            cb.append(atts.getURI(i));
            cb.append(COMMA);
            cb.append(atts.getLocalName(i));
            cb.append(COMMA);
            cb.append(atts.getQName(i));
            cb.append(COMMA);
            cb.append(atts.getType(i));
            cb.append(COMMA);
            cb.append(atts.getValue(i));
        }

        writeln(cb);
    }
@param uri       the Namespace URI, or the empty string if the element has no
                 Namespace URI or if Namespace processing is not being
                 performed
@param localName the local name (without prefix), or the empty string if
                 Namespace processing is not being performed
@param qName     the qualified name (with prefix), or the empty string if
                 qualified names are not available
@param atts      the attributes attached to the element. If there are no
                 attributes, it shall be an empty Attributes object. The value
                 of this object after startElement returns is undefined
@throws org.xml.sax.SAXException any SAX exception, possibly wrapping another exception
@see #endElement
@see org.xml.sax.Attributes
@see org.xml.sax.helpers.AttributesImpl
stroom-pipeline/src/main/java/stroom/pipeline/filter/TestSAXEventFilter.java