public class MutationEventSample implements org.w3c.dom.events.EventListener {
    
    public MutationEventSample(org.w3c.dom.Node n) throws Exception {
        org.w3c.dom.DOMImplementation di;
        if(n instanceof org.w3c.dom.Document)
            di = ((org.w3c.dom.Document)n).getImplementation();
        else
            di = n.getOwnerDocument().getImplementation();
        
        if(di.hasFeature("MutationEvents", "2.0")) {
            if(n instanceof org.w3c.dom.events.EventTarget) {
                ((org.w3c.dom.events.EventTarget)n).addEventListener(org.apache.xerces.dom.events.MutationEventImpl.DOM_ATTR_MODIFIED, this, true);
                ((org.w3c.dom.events.EventTarget)n).addEventListener(org.apache.xerces.dom.events.MutationEventImpl.DOM_CHARACTER_DATA_MODIFIED, this, true);
                ((org.w3c.dom.events.EventTarget)n).addEventListener(org.apache.xerces.dom.events.MutationEventImpl.DOM_NODE_INSERTED, this, true);
                ((org.w3c.dom.events.EventTarget)n).addEventListener(org.apache.xerces.dom.events.MutationEventImpl.DOM_NODE_INSERTED_INTO_DOCUMENT, this, true);
                ((org.w3c.dom.events.EventTarget)n).addEventListener(org.apache.xerces.dom.events.MutationEventImpl.DOM_NODE_REMOVED, this, true);
                ((org.w3c.dom.events.EventTarget)n).addEventListener(org.apache.xerces.dom.events.MutationEventImpl.DOM_NODE_REMOVED_FROM_DOCUMENT, this, true);
                ((org.w3c.dom.events.EventTarget)n).addEventListener(org.apache.xerces.dom.events.MutationEventImpl.DOM_SUBTREE_MODIFIED, this, true);
            }
            else
                throw new Exception("Node does not implement org.w3c.dom.EventTarget.");
        }
        else
            throw new Exception("DOM Mutation Events not supported here.");
    }
    
    public void handleEvent(org.w3c.dom.events.Event evt) {
        org.w3c.dom.events.MutationEvent me = (org.w3c.dom.events.MutationEvent)evt;
        System.out.println(getClass().getName()+"Received Event:");
        System.out.println("  Eventtype="+me.getType());
        System.out.println("  Target="+chaudhuri.util.DOMUtil.getLocationPath((org.w3c.dom.Node)me.getTarget()));
        System.out.println("  relatedNode="+chaudhuri.util.DOMUtil.getLocationPath((org.w3c.dom.Node)me.getRelatedNode()));
        System.out.println("  attrName="+me.getAttrName());
        System.out.println("  prevValue="+me.getPrevValue());
        System.out.println("  newValue="+me.getNewValue());
    }
    
    public static void main(String[] args) throws Exception {
        javax.xml.parsers.DocumentBuilderFactory dbf = javax.xml.parsers.DocumentBuilderFactory.newInstance();
        javax.xml.parsers.DocumentBuilder db = dbf.newDocumentBuilder();
        
        java.io.StringReader sr = new java.io.StringReader("<root attribute=\"wert\"/>");
        org.w3c.dom.Document doc = db.parse(new org.xml.sax.InputSource(sr));
        MutationEventSample mes = new MutationEventSample(doc);
        
        doc.getDocumentElement().setAttribute("attrib1", "n");
        doc.getDocumentElement().setAttribute("attrib2", "w");

        org.w3c.dom.Element e = doc.createElement("neuelement");
        doc.getDocumentElement().appendChild( e );

        e.setAttribute("h", "u");
    }
}
