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

import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jpt.common.core.internal.resource.java.source.SourceAnnotation;
import org.eclipse.jpt.common.core.internal.utility.jdt.NestedIndexedDeclarationAnnotationAdapter;
import org.eclipse.jpt.common.core.internal.utility.jdt.SimpleDeclarationAnnotationAdapter;
import org.eclipse.jpt.common.core.resource.java.JavaResourceAnnotatedElement;
import org.eclipse.jpt.common.core.utility.jdt.AnnotatedElement;
import org.eclipse.jpt.common.core.utility.jdt.DeclarationAnnotationAdapter;
import org.eclipse.jpt.common.core.utility.jdt.IndexedDeclarationAnnotationAdapter;
import org.eclipse.jpt.common.utility.internal.iterables.ListIterable;
import org.eclipse.jpt.jaxb.core.resource.java.JAXB;
import org.eclipse.jpt.jaxb.core.resource.java.XmlElementAnnotation;
import org.eclipse.jpt.jaxb.core.resource.java.XmlElementsAnnotation;

/**
 * javax.xml.bind.annotation.XmlElements
 */
public class SourceXmlElementsAnnotation
		extends SourceAnnotation
		implements XmlElementsAnnotation {
	
	public static final DeclarationAnnotationAdapter DECLARATION_ANNOTATION_ADAPTER 
	= new SimpleDeclarationAnnotationAdapter(JAXB.XML_ELEMENTS);

	
	private final XmlElementsAnnotationContainer xmlElementsContainer = new XmlElementsAnnotationContainer();
	
	public SourceXmlElementsAnnotation(JavaResourceAnnotatedElement parent, AnnotatedElement annotatedElement) {
		this(parent, annotatedElement, DECLARATION_ANNOTATION_ADAPTER);
	}
	
	public SourceXmlElementsAnnotation(JavaResourceAnnotatedElement parent, AnnotatedElement annotatedElement, DeclarationAnnotationAdapter daa) {
		super(parent, annotatedElement, daa);
	}
	
	public String getAnnotationName() {
		return JAXB.XML_ELEMENTS;
	}
	
	public void initialize(CompilationUnit astRoot) {
		this.xmlElementsContainer.initializeFromContainerAnnotation(this.getAstAnnotation(astRoot));
	}
	
	public void synchronizeWith(CompilationUnit astRoot) {
		this.xmlElementsContainer.synchronize(this.getAstAnnotation(astRoot));
	}
	
	
	// **************** xmlns *************************************************
	
	public ListIterable<XmlElementAnnotation> getXmlElements() {
		return this.xmlElementsContainer.getNestedAnnotations();
	}
	
	public int getXmlElementsSize() {
		return this.xmlElementsContainer.getNestedAnnotationsSize();
	}
	
	public XmlElementAnnotation xmlElementAt(int index) {
		return this.xmlElementsContainer.getNestedAnnotation(index);
	}
	
	public XmlElementAnnotation addXmlElement(int index) {
		return this.xmlElementsContainer.addNestedAnnotation(index);
	}
	
	private XmlElementAnnotation buildXmlElement(int index) {
		return SourceXmlElementAnnotation.buildNestedSourceXmlElementAnnotation(this, this.annotatedElement, buildXmlElementIndexedDeclarationAnnotationAdapter(index));
	}
	
	private IndexedDeclarationAnnotationAdapter buildXmlElementIndexedDeclarationAnnotationAdapter(int index) {
		return new NestedIndexedDeclarationAnnotationAdapter(
			this.daa, JAXB.XML_ELEMENTS__VALUE, index, JAXB.XML_ELEMENT);
	}
	
	public void moveXmlElement(int targetIndex, int sourceIndex) {
		this.xmlElementsContainer.moveNestedAnnotation(targetIndex, sourceIndex);
	}
	
	public void removeXmlElement(int index) {
		this.xmlElementsContainer.removeNestedAnnotation(index);
	}
	
	/**
	* adapt the AnnotationContainer interface to the xml schema's xmlns
	*/
	class XmlElementsAnnotationContainer 
		extends AnnotationContainer<XmlElementAnnotation>
		{
		@Override
		protected String getNestedAnnotationsListName() {
			return XML_ELEMENTS_LIST;
		}
		@Override
		protected String getElementName() {
			return JAXB.XML_ELEMENTS__VALUE;
		}
		@Override
		protected String getNestedAnnotationName() {
			return JAXB.XML_ELEMENT;
		}
		@Override
		protected XmlElementAnnotation buildNestedAnnotation(int index) {
			return SourceXmlElementsAnnotation.this.buildXmlElement(index);
		}
	}
}
