/*******************************************************************************
 * Copyright (c) 2007 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.ListIterator;

public interface EmbeddedMapping extends AttributeMapping, AttributeOverride.Owner
{
	// **************** attribute overrides **************************************

	/**
	 * Return a list iterator of the attribute overrides whether specified or default.
	 * This will not be null.
	 */
	<T extends AttributeOverride> ListIterator<T> attributeOverrides();
	
	/**
	 * Return the number of attribute overrides, both specified and default.
	 */
	int attributeOverridesSize();

	/**
	 * Return a list iterator of the specified attribute overrides.
	 * This will not be null.
	 */
	<T extends AttributeOverride> ListIterator<T> specifiedAttributeOverrides();
		String SPECIFIED_ATTRIBUTE_OVERRIDES_LIST = "specifiedAttributeOverridesList";
	
	/**
	 * Return the number of specified attribute overrides.
	 */
	int specifiedAttributeOverridesSize();

	/**
	 * Return a list iterator of the default attribute overrides.
	 * This will not be null.
	 */
	<T extends AttributeOverride> ListIterator<T> defaultAttributeOverrides();
		String DEFAULT_ATTRIBUTE_OVERRIDES_LIST = "defaultAttributeOverridesList";

	/**
	 * Return the number of default attribute overrides.
	 */
	int defaultAttributeOverridesSize();

	/**
	 * Add a specified attribute override to the entity return the object 
	 * representing it.
	 */
	AttributeOverride addSpecifiedAttributeOverride(int index);
	
	/**
	 * Remove the specified attribute override from the entity.
	 */
	void removeSpecifiedAttributeOverride(int index);
	
	/**
	 * Remove the specified attribute override at the index from the entity.
	 */
	void removeSpecifiedAttributeOverride(AttributeOverride attributeOverride);
	
	/**
	 * Move the specified attribute override from the source index to the target index.
	 */
	void moveSpecifiedAttributeOverride(int targetIndex, int sourceIndex);

		
//	IEmbeddable embeddable();
//
//	IAttributeOverride createAttributeOverride(int index);
//
//	Iterator<String> allOverridableAttributeNames();
//
//	IAttributeOverride attributeOverrideNamed(String name);
//
//	boolean containsAttributeOverride(String name);
//
//	boolean containsSpecifiedAttributeOverride(String name);
//
//
//	class AttributeOverrideOwner implements Owner
//	{
//		private IEmbedded embedded;
//
//		public AttributeOverrideOwner(IEmbedded embedded) {
//			this.embedded = embedded;
//		}
//
//		public ITypeMapping getTypeMapping() {
//			return this.embedded.typeMapping();
//		}
//
//		public IAttributeMapping attributeMapping(String attributeName) {
//			return (IAttributeMapping) columnMapping(attributeName);
//		}
//
//		private IColumnMapping columnMapping(String name) {
//			IEmbeddable embeddable = this.embedded.embeddable();
//			if (embeddable != null) {
//				for (Iterator<IPersistentAttribute> stream = embeddable.getPersistentType().allAttributes(); stream.hasNext();) {
//					IPersistentAttribute persAttribute = stream.next();
//					if (persAttribute.getName().equals(name)) {
//						if (persAttribute.getMapping() instanceof IColumnMapping) {
//							return (IColumnMapping) persAttribute.getMapping();
//						}
//					}
//				}
//			}
//			return null;
//		}
//
//		public boolean isVirtual(IOverride override) {
//			return embedded.getDefaultAttributeOverrides().contains(override);
//		}
//
//		public ITextRange validationTextRange() {
//			return embedded.validationTextRange();
//		}
//	}
}