/*******************************************************************************
 * Copyright (c) 2010, 2012 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0, which accompanies this distribution
 * and is available at http://www.eclipse.org/legal/epl-v10.html.
 * 
 * Contributors:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.jpa.core.jpa2.context;

import org.eclipse.jdt.core.IType;
import org.eclipse.jpt.common.utility.internal.iterables.ListIterable;
import org.eclipse.jpt.jpa.core.context.AttributeOverrideContainer;
import org.eclipse.jpt.jpa.core.context.CollectionMapping;
import org.eclipse.jpt.jpa.core.context.Column;
import org.eclipse.jpt.jpa.core.context.JoinColumn;
import org.eclipse.jpt.jpa.core.context.ReadOnlyJoinColumn;

/**
 * JPA 2.0 collection mapping (e.g. 1:m, m:m, element collection)
 * <p>
 * Provisional API: This interface is part of an interim API that is still
 * under development and expected to change significantly before reaching
 * stability. It is available at this early stage to solicit feedback from
 * pioneering adopters on the understanding that any code that uses this API
 * will almost certainly be broken (repeatedly) as the API evolves.
 * 
 * @version 3.2
 * @since 2.3
 */
public interface CollectionMapping2_0
	extends CollectionMapping, AttributeMapping2_0, ConvertibleKeyMapping2_0
{
	// ********** map key class **********
	
	String getMapKeyClass();

	String getSpecifiedMapKeyClass();
	void setSpecifiedMapKeyClass(String value);
		String SPECIFIED_MAP_KEY_CLASS_PROPERTY = "specifiedMapKeyClass"; //$NON-NLS-1$

	String getDefaultMapKeyClass();
		String DEFAULT_MAP_KEY_CLASS_PROPERTY = "defaultMapKeyClass"; //$NON-NLS-1$

	/**
	 * Return the character to be used for browsing or creating the map key
	 * class {@link IType}.
	 * @see org.eclipse.jdt.core.IType#getFullyQualifiedName(char)
	 */
	char getMapKeyClassEnclosingTypeSeparator();

	/**
	 * If the map key class is specified, this will return it fully qualified.
	 * If not specified, it returns the default map key class, which is always
	 * fully qualified.
	 */
	String getFullyQualifiedMapKeyClass();
		String FULLY_QUALIFIED_MAP_KEY_CLASS_PROPERTY = "fullyQualifiedMapKeyClass"; //$NON-NLS-1$


	// ********** map key column **********

	/**
	 * Return the map key column for this collection mapping.
	 */
	Column getMapKeyColumn();

	AttributeOverrideContainer getMapKeyAttributeOverrideContainer();

	// ********** map key join columns **********

	/**
	 * Return the map key join columns whether specified or default.
	 */
	ListIterable<? extends ReadOnlyJoinColumn> getMapKeyJoinColumns();

	/**
	 * Return the number of map key join columns, whether specified and default.
	 */
	int getMapKeyJoinColumnsSize();


	// ********** specified map key join columns **********

	/**
	 * Change notification identifier for "specifiedMapKeyJoinColumns" list
	 */
	String SPECIFIED_MAP_KEY_JOIN_COLUMNS_LIST = "specifiedMapKeyJoinColumns"; //$NON-NLS-1$

	/**
	 * Return the specified map key join columns.
	 */
	ListIterable<? extends JoinColumn> getSpecifiedMapKeyJoinColumns();

	/**
	 * Return the number of specified join columns.
	 */
	int getSpecifiedMapKeyJoinColumnsSize();

	/**
	 * Return whether the mapping has any specified map key join columns.
	 * (Equivalent to {@link #getSpecifiedMapKeyJoinColumnsSize()} != 0.)
	 */
	boolean hasSpecifiedMapKeyJoinColumns();

	/**
	 * Return the specified map key join column at the specified index.
	 */
	JoinColumn getSpecifiedMapKeyJoinColumn(int index);

	/**
	 * Add a specified map key join column to the relationship.
	 */
	JoinColumn addSpecifiedMapKeyJoinColumn();

	/**
	 * Add a specified map key join column to the relationship.
	 */
	JoinColumn addSpecifiedMapKeyJoinColumn(int index);

	/**
	 * Remove the specified map key join column.
	 */
	void removeSpecifiedMapKeyJoinColumn(int index);

	/**
	 * Remove the specified map key join column.
	 */
	void removeSpecifiedMapKeyJoinColumn(JoinColumn joinColumn);

	/**
	 * Move the specified map key join column from the source index to the target index.
	 */
	void moveSpecifiedMapKeyJoinColumn(int targetIndex, int sourceIndex);


	// ********** default map key join column **********

	/**
	 * Change notification identifier for "defaultMapKeyJoinColumn" property
	 */
	String DEFAULT_MAP_KEY_JOIN_COLUMN_PROPERTY = "defaultMapKeyJoinColumn"; //$NON-NLS-1$

	/**
	 * Return the default map key join column. If there are specified map key join
	 * columns, there is no default join column. There are also
	 * times that there may be no default map key join column even if there are no
	 * specified map key join columns.
	 */
	JoinColumn getDefaultMapKeyJoinColumn();

}
