/*******************************************************************************
 * Copyright (c) 2006, 2008 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.core.context;

import java.util.Iterator;
import org.eclipse.jpt.db.Schema;

/**
 * 
 * 
 * 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.
 */
public interface TypeMapping extends JpaContextNode {
	/**
	 * Return a unique key for the ITypeMapping. If this is defined in an
	 * extension they should be equal.
	 */
	String getKey();

	PersistentType getPersistentType();

	boolean isMapped();

	/**
	 * Return the type mapping's primary table name, null if a primary table
	 * does not apply.
	 */
	String getPrimaryTableName();

	/**
	 * Return the type mapping's primary database table.
	 */
	org.eclipse.jpt.db.Table getPrimaryDbTable();

	Schema getDbSchema();

	/**
	 * Return the type mapping's "associated" tables, which includes the primary
	 * table and the collection of secondary tables.
	 */
	Iterator<Table> associatedTables();

	/**
	 * Return the type mapping's "associated" tables, which includes the primary
	 * table and the collection of secondary tables, as well as all inherited
	 * "associated" tables.
	 */
	Iterator<Table> associatedTablesIncludingInherited();

	/**
	 * Return the identifiers of the type mapping's "associated" tables, which
	 * includes the primary table and the collection of secondary tables, as
	 * well as all the inherited "associated" tables.
	 */
	Iterator<String> associatedTableNamesIncludingInherited();

	/**
	 * return the resolved associated db table with the passed in name
	 */
	org.eclipse.jpt.db.Table getDbTable(String tableName);

	/**
	 * Return whether the specified table is invalid for any annotations
	 * associated with the type mapping.
	 */
	boolean tableNameIsInvalid(String tableName);

	/**
	 * Return an Iterator of attributes. The attributes must be BasicMappings or
	 * IdMappings found in this type mapping
	 */
	<T extends PersistentAttribute> Iterator<T> overridableAttributes();

	/**
	 * Return an Iterator of attributes names. The attributes must be
	 * BasicMappings or IdMappings found in this type mapping
	 */
	Iterator<String> overridableAttributeNames();

	/**
	 * Return an Iterator of attributes. The attributes must be BasicMappings or
	 * IdMappings found in any MappedSuperclass in the inheritance hierarchy.
	 * See {@link TypeMapping#overridableAttributes()} and
	 * {@link PersistentType#inheritanceHierarchy()}
	 */
	Iterator<PersistentAttribute> allOverridableAttributes();

	/**
	 * Return an Iterator of attributes names. The attributes must be
	 * BasicMappings or IdMappings found in any MappedSuperclass in the
	 * inheritance hierarchy. See
	 * {@link TypeMapping#overridableAttributeNames()} and
	 * {@link PersistentType#inheritanceHierarchy()}
	 */
	Iterator<String> allOverridableAttributeNames();

	/**
	 * Return an Iterator of associations that can be overriden. The
	 * associations must be OneToOneMappings or ManyToOneMappings found in this
	 * type mapping
	 */
	<T extends PersistentAttribute> Iterator<T> overridableAssociations();

	/**
	 * Return an Iterator of association names. The associations must be
	 * OneToOneMappings or ManyToOneMappings found in any MappedSuperclass in
	 * the inheritance hierarchy
	 */
	Iterator<String> overridableAssociationNames();

	/**
	 * Return an Iterator of associations. The associations must be
	 * OneToOneMappings or ManyToOneMappings found in any MappedSuperclass in
	 * the inheritance hierarchy See
	 * {@link TypeMapping#overridableAssociations()} and
	 * {@link PersistentType#inheritanceHierarchy()}
	 */
	Iterator<PersistentAttribute> allOverridableAssociations();

	/**
	 * Return an Iterator of association names. The associations must be
	 * OneToOneMappings or ManyToOneMappings found in any MappedSuperclass in
	 * the inheritance hierarchy See
	 * {@link TypeMapping#overridableAssociationNames()} and
	 * {@link PersistentType#inheritanceHierarchy()}
	 */
	Iterator<String> allOverridableAssociationNames();

	/**
	 * Return whether the given attribute mapping key is valid for this
	 * particular type mapping (for example, id's are not valid for an
	 * embeddable type mapping)
	 */
	boolean attributeMappingKeyAllowed(String attributeMappingKey);
}
