/*
 * Copyright (c) 2012, 2018 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:
//     Blaise Doughan - 2.5 - initial implementation
package org.eclipse.persistence.internal.oxm.record;

import java.util.List;
import java.util.Map;

import javax.xml.namespace.QName;

import org.eclipse.persistence.core.queries.CoreAttributeGroup;
import org.eclipse.persistence.internal.core.helper.CoreField;
import org.eclipse.persistence.internal.core.sessions.CoreAbstractSession;
import org.eclipse.persistence.internal.oxm.ContainerValue;
import org.eclipse.persistence.internal.oxm.IDResolver;
import org.eclipse.persistence.internal.oxm.NodeValue;
import org.eclipse.persistence.internal.oxm.NullCapableValue;
import org.eclipse.persistence.internal.oxm.ObjectBuilder;
import org.eclipse.persistence.internal.oxm.Reference;
import org.eclipse.persistence.internal.oxm.ReferenceResolver;
import org.eclipse.persistence.internal.oxm.Root;
import org.eclipse.persistence.internal.oxm.SAXFragmentBuilder;
import org.eclipse.persistence.internal.oxm.Unmarshaller;
import org.eclipse.persistence.internal.oxm.XPathFragment;
import org.eclipse.persistence.internal.oxm.XPathNode;
import org.eclipse.persistence.internal.oxm.XPathQName;
import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
import org.eclipse.persistence.internal.oxm.mappings.Mapping;
import org.eclipse.persistence.internal.oxm.record.namespaces.UnmarshalNamespaceResolver;
import org.eclipse.persistence.internal.oxm.unmapped.DefaultUnmappedContentHandler;
import org.eclipse.persistence.internal.oxm.unmapped.UnmappedContentHandler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.ext.LexicalHandler;

/**
 * This class represents unmarshal record behaviour that is specific to the SAX
 * platform.
 */
public interface UnmarshalRecord<
    ABSTRACT_SESSION extends CoreAbstractSession,
    FIELD extends CoreField,
    ID_RESOLVER extends IDResolver,
    OBJECT_BUILDER extends ObjectBuilder,
    TRANSFORMATION_RECORD extends TransformationRecord,
    UNMARSHALLER extends Unmarshaller> extends AbstractUnmarshalRecord<ABSTRACT_SESSION, FIELD, UNMARSHALLER>, ExtendedContentHandler, LexicalHandler {

    public static final UnmappedContentHandler DEFAULT_UNMAPPED_CONTENT_HANDLER = new DefaultUnmappedContentHandler();

    public void addAttributeValue(ContainerValue containerValue, Object value);

    public void addAttributeValue(ContainerValue containerValue, Object value, Object collection);

    public Root createRoot();

    public void endUnmappedElement(String uri, String localName, String name) throws SAXException;

    public NodeValue getAttributeChildNodeValue(String namespace, String localName);

    public Attributes getAttributes();

    public CharSequence getCharacters();

    public  UnmarshalRecord getChildRecord();

    public UnmarshalRecord getChildUnmarshalRecord(OBJECT_BUILDER targetObjectBuilder);

    public Object getContainerInstance(ContainerValue containerValue);

    public Object getContainerInstance(ContainerValue containerValue, boolean b);

    public Object getCurrentObject();

    public Descriptor getDescriptor();

    /**
     * Gets the encoding for this document. Only set on the root-level UnmarshalRecord
     * @return a String representing the encoding for this doc
     */
    public String getEncoding();

    public SAXFragmentBuilder getFragmentBuilder();

    public XPathQName getLeafElementType();

    public int getLevelIndex();

    public String getLocalName();

    public String getNoNamespaceSchemaLocation();

    public XPathNode getNonAttributeXPathNode(String namespaceURI, String localName, String qName, Attributes attributes);

    public List<NullCapableValue> getNullCapableValues();

    public org.eclipse.persistence.internal.oxm.record.UnmarshalRecord getParentRecord();

    public Map<String, String> getPrefixesForFragment();

    public ReferenceResolver getReferenceResolver();

    public String getRootElementName();

    public String getRootElementNamespaceUri();

    public String getSchemaLocation();

    public XPathFragment getTextWrapperFragment();

    public TRANSFORMATION_RECORD getTransformationRecord();

    public QName getTypeQName();

    public UnmarshalContext getUnmarshalContext();

    public UNMARSHALLER getUnmarshaller();

    public UnmarshalNamespaceResolver getUnmarshalNamespaceResolver();

    /**
     * Gets the XML Version for this document. Only set on the root-level
     * UnmarshalRecord, if supported by the parser.
     */
    public String getVersion();

    public XMLReader getXMLReader();

    public XPathNode getXPathNode();

    public UnmarshalRecord initialize(OBJECT_BUILDER objectBuilder);

    public void initializeRecord(Mapping mapping) throws SAXException;

    public boolean isBufferCDATA();

    public boolean isNil();

    public boolean isSelfRecord();

    public void reference(Reference reference);

    public void removeNullCapableValue(NullCapableValue nullCapableValue);

    public void resetStringBuffer();

    public String resolveNamespaceUri(String namespaceURI);

    public void resolveReferences(ABSTRACT_SESSION session, ID_RESOLVER idResolver);

    public void setAttributes(Attributes atts);

    public void setAttributeValue(Object object, Mapping mapping);

    public void setAttributeValueNull(ContainerValue containerValue);

    public void setChildRecord(UnmarshalRecord unmarshalRecord);

    public void setContainerInstance(int index, Object containerInstance);

    public void setCurrentObject(Object object);

    public void setFragmentBuilder(SAXFragmentBuilder fragmentBuilder);

    public void setLeafElementType(QName leafElementType);

    public void setLocalName(String localName);

    public void setNil(boolean isNil);

    public void setParentRecord(UnmarshalRecord unmarshalRecord);

    public void setReferenceResolver(ReferenceResolver referenceResolver);

    public void setRootElementName(String rootElementName);

    public void setRootElementNamespaceUri(String rootElementNamespaceUri);

    public void setSelfRecord(boolean isSelfRecord);

    public void setSession(ABSTRACT_SESSION session);

    public void setTextWrapperFragment(XPathFragment textWrapperFragment);

    public void setTransformationRecord(TRANSFORMATION_RECORD transformationRecord);

    public void setTypeQName(QName qname);

    public void setUnmarshalContext(UnmarshalContext unmarshalContext);

    public void setUnmarshaller(UNMARSHALLER unmarshaller);

    public void setUnmarshalNamespaceResolver(UnmarshalNamespaceResolver unmarshalNamespaceResolver);

    public void setXMLReader(XMLReader xmlReader);

    public void unmappedContent();

    public CoreAttributeGroup getUnmarshalAttributeGroup();

    public void setUnmarshalAttributeGroup(CoreAttributeGroup group);

}
