/*******************************************************************************
 * Copyright (c) 2006, 2009 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 that can be overridden by a 
	 * sub type mapping. The attribute mapping type is used to determine if
	 * the attribute is overridable.
	 */
	<T extends PersistentAttribute> Iterator<T> overridableAttributes();

	/**
	/**
	 * Return an Iterator of attribute names that can be overridden by a 
	 * sub type mapping.
	 * @see
	 * {@link TypeMapping#overridableAttributes()}
	 */
	Iterator<String> overridableAttributeNames();

	/**
	 * Return an Iterator of all attributes that can be overridden in this
	 * type mapping.  The attribute mapping type is used to determine if
	 * the attribute is overridable.
	 * 
	 * See
	 * {@link TypeMapping#overridableAttributes()} and
	 * {@link PersistentType#inheritanceHierarchy()}
	 */
	Iterator<PersistentAttribute> allOverridableAttributes();

	/**
	 * Return an Iterator of all attribute names that can be overridden in this
	 * type mapping.
	 * @see
	 * {@link TypeMapping#allOverridableAttributes()}
	 */
	Iterator<String> allOverridableAttributeNames();

	/**
	 * Return an Iterator of associations that can be overridden by a 
	 * sub type mapping. The platform and joining strategy are used to determine
	 * if it is an overridable association.
	 */
	<T extends PersistentAttribute> Iterator<T> overridableAssociations();

	/**
	 * Return an Iterator of association names that can be overridden by a 
	 * sub type mapping.
	 * @see
	 * {@link TypeMapping#overridableAssociations()}
	 */
	Iterator<String> overridableAssociationNames();

	/**
	 * Return an Iterator of all associations that can be overridden in this
	 * type mapping.  The platform and joining strategy are used to determine
	 * if it is an overridable association.
	 * 
	 * See
	 * {@link TypeMapping#overridableAssociations()} and
	 * {@link PersistentType#inheritanceHierarchy()}
	 */
	Iterator<PersistentAttribute> allOverridableAssociations();
	
	/**
	 * Return an Iterator of all associations names that can be overridden in this
	 * type mapping.
	 * @see
	 * {@link TypeMapping#allOverridableAssociations()}
	 */
	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);
	
	/**
	 * Return whether any database metadata specific validation should occur.
	 * (For instance, if the connection is not active, then it should not.)
	 */
	boolean shouldValidateAgainstDatabase();
}
