/*
 * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.internal.oxm;

import org.eclipse.persistence.internal.oxm.record.ExtendedContentHandler;
import org.eclipse.persistence.internal.oxm.record.MarshalRecord;
import org.xml.sax.Attributes;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;

/**
 * INTERNAL:
 * <p><b>Purpose</b>: This class is used to tranfer SAX events to a TopLink OXM
 * Marshal Record. Used by XMLFragment mappings to write peices of XML to a
 * marshal record.</p>
 */

public class MarshalRecordContentHandler implements ExtendedContentHandler {
    protected MarshalRecord marshalRecord;
    protected NamespaceResolver resolver;

    public MarshalRecordContentHandler(MarshalRecord record, NamespaceResolver resolver) {
        marshalRecord = record;
        this.resolver = resolver;
    }

    public void setMarshalRecord(MarshalRecord record) {
        this.marshalRecord = record;
    }

    public MarshalRecord getMarshalRecord() {
        return marshalRecord;
    }

    @Override
    public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
        XPathFragment frag = new XPathFragment(qName);
        marshalRecord.openStartElement(frag, resolver);
        for (int i = 0; i < atts.getLength(); i++) {
            marshalRecord.attribute(atts.getURI(i), atts.getLocalName(i), atts.getQName(i), atts.getValue(i));
        }
        marshalRecord.closeStartElement();
    }

    @Override
    public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
        XPathFragment frag = new XPathFragment(qName);
        marshalRecord.endElement(frag, resolver);
    }

    @Override
    public void startPrefixMapping(String prefix, String uri) throws SAXException {
        marshalRecord.startPrefixMapping(prefix, uri);
    }

    @Override
    public void processingInstruction(String target, String data) throws SAXException {
        //refContentHandler.processingInstruction(target, data);
    }

    @Override
    public void setDocumentLocator(Locator locator) {
        //refContentHandler.setDocumentLocator(locator);
    }

    @Override
    public void startDocument() throws SAXException {
        //do nothing.  startDocument() on the content handler is not triggered when fragment on XMLMarshaller is true
    }

    @Override
    public void endDocument() throws SAXException {
        //do nothing.  startDocument() on the content handler is not triggered when fragment on XMLMarshaller is true
    }

    @Override
    public void skippedEntity(String name) throws SAXException {
        //refContentHandler.skippedEntity(name);
    }

    @Override
    public void endPrefixMapping(String prefix) throws SAXException {
        marshalRecord.endPrefixMapping(prefix);
    }

    @Override
    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
        //refContentHandler.ignorableWhitespace(ch, start, length);
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String characters = new String(ch, start, length);
        characters(characters);
    }

    @Override
    public void characters(CharSequence charSequence) throws SAXException {
        String characters = charSequence.toString();
        if (characters.trim().length() > 0) {
            marshalRecord.characters(characters);
        }
    }

    @Override
    public void setNil(boolean isNil) {}
}
