/*
 * Copyright (c) 1998, 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:
//     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.internal.oxm.record;

import org.eclipse.persistence.internal.oxm.ContainerValue;
import org.eclipse.persistence.internal.oxm.Reference;
import org.eclipse.persistence.internal.oxm.mappings.Mapping;

/**
 * The UnmarshalContext allows mappings to be unmarshalled differently depending
 * on the type of object.  An UnmarshalRecord maintains a reference to a single
 * UnmarshalContext.
 */
public interface UnmarshalContext {

    /**
     * An event indicating that startElement has been called on the unmarshalRecord.
     * @param unmarshalRecord The UnmarshalRecord that received the startElement call.
     */
    public void startElement(UnmarshalRecord unmarshalRecord);

    /**
     * An event indicating that characters has been called on the unmarshalRecord.
     * @param unmarshalRecord The UnmarshalRecord that received the characters call.
     */
    public void characters(UnmarshalRecord unmarshalRecord);

    /**
     * An event indicating that endElement has been called on the unmarshalRecord.
     * @param unmarshalRecord The UnmarshalRecord that received the endElement call.
     */
    public void endElement(UnmarshalRecord unmarshalRecord);

    /**
     * The UnmarshalContext is responsible for assigning values to the object being
     * built.
     * @param unmarshalRecord
     * @param value
     * @param mapping
     */
    public void setAttributeValue(UnmarshalRecord unmarshalRecord, Object value, Mapping mapping);

    /**
     * When a collection mapping is processed the UnmarshalContext is responsible for
     * handling the values one at a time.
     * @param unmarshalRecord
     * @param containerValue A container object such as a java.util.ArrayList, to which
     * the value will be added.
     * @param value The value to be added to the container,
     */
    public void addAttributeValue(UnmarshalRecord unmarshalRecord, ContainerValue containerValue, Object value);

    /**
     * When a collection mapping is processed the UnmarshalContext is responsible for
     * handling the values one at a time.
     * @param unmarshalRecord
     * @param containerValue A container object such as a java.util.ArrayList, to which
     * the value will be added.
     * @param value The value to be added to the container,
     * @param collection
     */
    public void addAttributeValue(UnmarshalRecord unmarshalRecord, ContainerValue containerValue, Object value, Object collection);

    /*
     * When a Reference is built the UnmarshalContext is given the ability to perform
     * further processing on it.
     * @param reference
     */
    public void reference(Reference reference);

    /**
     * This method is called when unmapped content (XML content that does not correspond to
     * any specified mapping, policy, etc.) is encountered during the unmarshal process.
     * @param unmarshalRecord The UnmarshalRecord that encountered the unmapped content .
     */
    public void unmappedContent(UnmarshalRecord unmarshalRecord);

}
