/*
 * Copyright (c) 2013, 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 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.XPathQName;
import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
import org.eclipse.persistence.internal.oxm.mappings.Field;
import org.eclipse.persistence.oxm.schema.XMLSchemaReference;
import org.w3c.dom.Node;

/**
 * This class represents marshal record behaviour that is common to all XML
 * platforms.
 */
public interface AbstractMarshalRecord<
    ABSTRACT_SESSION extends CoreAbstractSession,
    FIELD extends CoreField,
    MARSHALLER extends Marshaller,
    NAMESPACE_RESOLVER extends NamespaceResolver> extends XMLRecord<ABSTRACT_SESSION> {

    public List addExtraNamespacesToNamespaceResolver(Descriptor descriptor, CoreAbstractSession session, boolean allowOverride, boolean ignoreEqualResolvers);

    public boolean addXsiTypeAndClassIndicatorIfRequired(Descriptor descriptor, Descriptor referenceDescriptor, Field xmlField, boolean isRootElement);

    public boolean addXsiTypeAndClassIndicatorIfRequired(Descriptor descriptor, Descriptor referenceDescriptor, Field xmlField,Object originalObject, Object obj, boolean wasXMLRoot, boolean isRootElement);

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

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

    public Node getDOM();

    public XPathQName getLeafElementType();

    public MARSHALLER getMarshaller();

    public NAMESPACE_RESOLVER getNamespaceResolver();

    public Object getOwningObject();

    public boolean hasCustomNamespaceMapper();

    public boolean hasEqualNamespaceResolvers();

    /**
     * Determine if namespaces will be considered during marshal/unmarshal operations.
     */
    public boolean isNamespaceAware();

    public boolean isXOPPackage();

    public void namespaceDeclaration(String prefix, String typeUri);

    public Object put(FIELD field, Object object);

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

    public String resolveNamespacePrefix(String prefix);

    public void setCustomNamespaceMapper(boolean customNamespaceMapper);

    public void setEqualNamespaceResolvers(boolean equalNRs);

    public void setLeafElementType(QName leafElementType);

    public void setLeafElementType(XPathQName leafElementType);

    public void setMarshaller(MARSHALLER marshaller);

    public void setNamespaceResolver(NAMESPACE_RESOLVER namespaceResolver);

    public void setOwningObject(Object owningObject);

    public void setSession(ABSTRACT_SESSION session);

    public void setXOPPackage(boolean isXOPPackage);

    public void writeXsiTypeAttribute(Descriptor descriptor, String typeUri,  String  typeLocal, String typePrefix, boolean addToNamespaceResolver);

    public void writeXsiTypeAttribute(Descriptor xmlDescriptor, XMLSchemaReference xmlRef, boolean addToNamespaceResolver);

}
