/*******************************************************************************
 * Copyright (c) 2012, 2013 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 v1.0 and Eclipse Distribution License v. 1.0
 * which accompanies this distribution.
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Blaise Doughan - 2.5 - initial implementation
 ******************************************************************************/
package org.eclipse.persistence.internal.oxm.record;

import java.util.ArrayList;
import java.util.List;

import javax.xml.namespace.QName;

import org.eclipse.persistence.internal.core.helper.CoreField;
import org.eclipse.persistence.internal.core.sessions.CoreAbstractSession;
import org.eclipse.persistence.internal.oxm.Marshaller;
import org.eclipse.persistence.internal.oxm.Namespace;
import org.eclipse.persistence.internal.oxm.NamespaceResolver;
import org.eclipse.persistence.internal.oxm.XMLConversionManager;
import org.eclipse.persistence.internal.oxm.XPathFragment;
import org.eclipse.persistence.internal.oxm.XPathNode;
import org.eclipse.persistence.oxm.record.MarshalRecord.CycleDetectionStack;
import org.eclipse.persistence.core.queries.CoreAttributeGroup;
import org.w3c.dom.Node;

/**
 * This class represents marshal record behaviour that is specific to the SAX
 * platform.
 */
public interface MarshalRecord<
    ABSTRACT_SESSION extends CoreAbstractSession,
    FIELD extends CoreField,
    MARSHALLER extends Marshaller,
    NAMESPACE_RESOLVER extends NamespaceResolver> extends AbstractMarshalRecord<ABSTRACT_SESSION, FIELD, MARSHALLER, NAMESPACE_RESOLVER> {

    public void add(FIELD field, Object value);

    public void addGroupingElement(XPathNode holderXPathNode);

    public void afterContainmentMarshal(Object object, Object value);

    public void attribute(String namespaceURI, String localPart,
            String qualifiedName, String value);

    public void attribute(XPathFragment nextFragment,
            NAMESPACE_RESOLVER namespaceResolver, Object fieldValue,
            QName schemaType);

    public void attribute(XPathFragment xPathFragment,
            NAMESPACE_RESOLVER namespaceResolver, String value);

    public void attributeWithoutQName(String namespaceURI,
            String localName, String prefix, String value);

    public void beforeContainmentMarshal(Object value);

    public void cdata(String string);

    public void characters(QName schemaType, Object objectValue,
            String mimeType, boolean b);

    public void characters(String c_id);

    public void closeStartElement();

    public void closeStartGroupingElements(XPathFragment groupingFragment);

    public void emptyAttribute(XPathFragment xPathFragment,
            NAMESPACE_RESOLVER namespaceResolver);

    public boolean emptyCollection(XPathFragment xPathFragment,
            NAMESPACE_RESOLVER namespaceResolver, boolean b);

    public void emptyComplex(XPathFragment xPathFragment,
            NAMESPACE_RESOLVER namespaceResolver);

    public void emptySimple(NAMESPACE_RESOLVER namespaceResolver);

    public void endCollection();

    public void endElement(XPathFragment xPathFragment,
            NAMESPACE_RESOLVER namespaceResolver);

    public void endPrefixMapping(String prefix);

    public void flush();
    
    public void forceValueWrapper();

    public CoreAttributeGroup getCurrentAttributeGroup();

    public CycleDetectionStack<Object>  getCycleDetectionStack();

    public ArrayList<XPathNode> getGroupingElements();

    public XPathFragment getTextWrapperFragment();

    public String getValueToWrite(QName schemaType, Object fieldValue,
            XMLConversionManager conversionManager);

    public boolean hasCustomNamespaceMapper();

    public boolean isWrapperAsCollectionName();

    public boolean isXOPPackage();

    public void namespaceDeclaration(String generatedPrefix, String namespaceURI);

    public void nilComplex(XPathFragment xPathFragment,
            NAMESPACE_RESOLVER namespaceResolver);

    public void nilSimple(NAMESPACE_RESOLVER namespaceResolver);

    public void node(Node item, NAMESPACE_RESOLVER namespaceResolver);

    public void openStartElement(XPathFragment xPathFragment,
            NAMESPACE_RESOLVER namespaceResolver);

    public XPathFragment openStartGroupingElements(
            NAMESPACE_RESOLVER namespaceResolver);

    public void popAttributeGroup();

    public void predicateAttribute(XPathFragment anXPathFragment,
            NAMESPACE_RESOLVER namespaceResolver);

    public void pushAttributeGroup(CoreAttributeGroup group);

    public void removeExtraNamespacesFromNamespaceResolver(List<Namespace> extraNamespaces, CoreAbstractSession session);

    public void removeGroupingElement(XPathNode holderXPathNode);

    public void setGroupingElement(ArrayList<XPathNode> object);

    public void setLeafElementType(QName leafElementType);

    public void setMarshaller(MARSHALLER marshaller);
    
    public void startCollection();
    
    public void startPrefixMapping(String prefix, String uri);

}