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

import java.util.HashMap;

import org.eclipse.persistence.internal.oxm.mappings.Mapping;
import org.eclipse.persistence.oxm.sequenced.Setting;

/**
 * INTERNAL:
 * <p><b>Purpose</b>: Holds mapping reference info.  The info held in this class
 * will be used after unmarshal to resolve 1-1 and 1-M mapping references.  This 
 * is necessary to ensure that all related objects have been created before 
 * attempting to set instance values in related objects.</p>
 */

public class Reference {
	protected Mapping mapping;		// mapping associated with this reference
	protected Object sourceObject;		// the source object instance
	protected Class targetClass;		// the reference class
	protected Object primaryKey;		// primary key values for cache lookup - used in single case
	protected HashMap primaryKeyMap;	// map of primary key values for cache lookup - used in collection case
	private Setting setting;
	private Object container;

	/**
	 * Get the container this reference should be added to if it was from a collection mapping
	 * @return
	 */
	public Object getContainer() {
		return container;
	}
	
	public Setting getSetting() {
		return setting;
	}

	public void setSetting(Setting setting) {
		this.setting = setting;
	}

	/**
	 * Constructor typically used in the collection case.
	 */
	public Reference(Mapping mapping, Object source, Class target, HashMap primaryKeyMap, Object container) {
		this.mapping = mapping;
		sourceObject = source;
		targetClass = target;
		this.primaryKeyMap = primaryKeyMap;
		this.container = container;
	}
	
	/**
	 * Constructor typically used in the single case.
	 */
	public Reference(Mapping mapping, Object source, Class target, Object primaryKey) {
		this.mapping = mapping;
		sourceObject = source;
		targetClass = target;
		this.primaryKey = primaryKey;
	}

	/**
	 * Return the XMLMapping associated with this reference.
	 * 
	 * @return
	 */
	public Mapping getMapping() {
		return mapping;
	}

	/**
	 * Return the map of primary key/values required to lookup
	 * the reference class in the cache.
	 * 
	 * @return
	 */
	public HashMap getPrimaryKeyMap() {
		return primaryKeyMap;
	}

	/**
	 * Return the list of primary key values required to lookup
	 * the reference class in the cache.
	 * 
	 * @return
	 */
	public Object getPrimaryKey() {
		return primaryKey;
	}

	/**
	 * Return the source object for this reference.
	 * 
	 * @return
	 */
	public Object getSourceObject() {
		return sourceObject;
	}

	/**
	 * Return the target (reference) class for this reference.
	 * 
	 * @return
	 */
	public Class getTargetClass() {
		return targetClass;
	}
	
	/**
	 * Set the primary key value required to lookup
	 * the reference class in the cache.
	 */
	public void setPrimaryKey(Object primaryKey) {
		this.primaryKey = primaryKey;
	}
}
