/**
 * Copyright (C) 2010 Orbeon, Inc.
 *
 * This program is free software; you can redistribute it and/or modify it under the terms of the
 * GNU Lesser General Public License as published by the Free Software Foundation; either version
 * 2.1 of the License, or (at your option) any later version.
 *
 * 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.
 *
 * The full text of the license is available at http://www.gnu.org/copyleft/lesser.html
 */
package org.orbeon.oxf.xml.saxrewrite;

import org.orbeon.oxf.xml.XMLReceiver;
import org.xml.sax.Attributes;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;

/**
 * Driver for a state machine that response to SAX events. Just forwards SAX events to a State which in turn returns
 * the next State.
 */
public final class StatefulHandler implements XMLReceiver {
    /**
     * The current state.
     */
    private State state;

    public StatefulHandler(final State initialState) {
        state = initialState;
    }

    public void characters(final char[] ch, final int strt, final int len)
            throws SAXException {
        state = state.characters(ch, strt, len);
    }

    public void endDocument() throws SAXException {
        state = state.endDocument();
    }

    public void endElement(final String ns, final String lnam, final String qnam)
            throws SAXException {
        state = state.endElement(ns, lnam, qnam);
    }

    public void endPrefixMapping(final String pfx) throws SAXException {
        state = state.endPrefixMapping(pfx);
    }

    public void ignorableWhitespace(final char[] ch, final int strt, final int len)
            throws SAXException {
        state = state.ignorableWhitespace(ch, strt, len);
    }

    public void processingInstruction(final String trgt, final String dat)
            throws SAXException {
        state = state.processingInstruction(trgt, dat);
    }

    public void setDocumentLocator(final Locator loc) {
        state = state.setDocumentLocator(loc);
    }

    public void skippedEntity(final String nam) throws SAXException {
        state = state.skippedEntity(nam);
    }

    public void startDocument() throws SAXException {
        state = state.startDocument();
    }

    public void startElement
            (final String ns, final String lnam, final String qnam, final Attributes atts)
            throws SAXException {
        state = state.startElement(ns, lnam, qnam, atts);
    }

    public void startPrefixMapping(final String pfx, final String uri) throws SAXException {
        state = state.startPrefixMapping(pfx, uri);
    }

    public void startDTD(String name, String publicId, String systemId) throws SAXException {
        state = state.startDTD(name, publicId, systemId);
    }

    public void endDTD() throws SAXException {
        state = state.endDTD();
    }

    public void startEntity(String name) throws SAXException {
        state = state.startEntity(name);
    }

    public void endEntity(String name) throws SAXException {
        state = state.endEntity(name);
    }

    public void startCDATA() throws SAXException {
        state = state.startCDATA();
    }

    public void endCDATA() throws SAXException {
        state = state.endCDATA();
    }

    public void comment(char[] ch, int start, int length) throws SAXException {
        state = state.comment(ch, start, length);
    }
}
