/*******************************************************************************
 * Copyright (c) 2008, 2011 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.eclipselink.core.resource.java;

import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jpt.common.core.utility.TextRange;
import org.eclipse.jpt.common.utility.internal.iterables.ListIterable;

/**
 * Corresponds to the EclipseLink annotation
 * org.eclipse.persistence.annotations.ObjectTypeConverter
 * 
 * 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 2.1
 * @since 2.1
 */
public interface EclipseLinkObjectTypeConverterAnnotation
	extends BaseEclipseLinkTypeConverterAnnotation
{
	String ANNOTATION_NAME = EclipseLink.OBJECT_TYPE_CONVERTER;
	
	/**
	 * Corresponds to the 'conversionValues' element of the ObjectTypeConverter annotation.
	 * Return an empty iterator if the element does not exist in Java.
	 */
	ListIterable<EclipseLinkConversionValueAnnotation> getConversionValues();
		String CONVERSION_VALUES_LIST = "conversionValues"; //$NON-NLS-1$
	
	/**
	 * Corresponds to the 'conversionValues' element of the ObjectTypeConverter annotation.
	 */
	int getConversionValuesSize();
	
	/**
	 * Corresponds to the 'conversionValues' element of the ObjectTypeConverter annotation.
	 */
	EclipseLinkConversionValueAnnotation conversionValueAt(int index);
	
	/**
	 * Corresponds to the 'conversionValues' element of the ObjectTypeConverter annotation.
	 */
	EclipseLinkConversionValueAnnotation addConversionValue(int index);
	
	/**
	 * Corresponds to the 'conversionValues' element of the ObjectTypeConverter annotation.
	 */
	void moveConversionValue(int targetIndex, int sourceIndex);
	
	/**
	 * Corresponds to the 'conversionValues' element of the ObjectTypeConverter annotation.
	 */
	void removeConversionValue(int index);
	

	/**
	 * Corresponds to the 'defaultObjectValue' element of the ObjectTypeConverter annotation.
	 * Return null if the element does not exist in Java.
	 */
	String getDefaultObjectValue();
		String DEFAULT_OBJECT_VALUE_PROPERTY = "defaultObjectValue"; //$NON-NLS-1$

	/**
	 * Corresponds to the 'defaultObjectValue' element of the ObjectTypeConverter annotation.
	 * Set to null to remove the element.
	 */
	void setDefaultObjectValue(String value);

	/**
	 * Return the {@link TextRange} for the 'defaultObjectValue' element. If the element 
	 * does not exist return the {@link TextRange} for the ObjectTypeConverter annotation.
	 */
	TextRange getDefaultObjectValueTextRange(CompilationUnit astRoot);

}
