/*******************************************************************************
 * Copyright (c) 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.jpa.core.internal.jpa2.resource.java.binary;

import java.util.ListIterator;
import java.util.Vector;

import org.eclipse.jdt.core.IAnnotation;
import org.eclipse.jpt.common.utility.internal.iterators.CloneListIterator;
import org.eclipse.jpt.jpa.core.internal.resource.java.binary.BinaryAnnotation;
import org.eclipse.jpt.jpa.core.jpa2.resource.java.GeneratedAnnotation;
import org.eclipse.jpt.jpa.core.resource.java.JavaResourcePersistentType;

/**
 * javax.annotation.Generated
 */
public final class BinaryGeneratedAnnotation
	extends BinaryAnnotation
	implements GeneratedAnnotation
{
	private final Vector<String> values;
	private String date;
	private String comments;


	public BinaryGeneratedAnnotation(JavaResourcePersistentType parent, IAnnotation jdtAnnotation) {
		super(parent, jdtAnnotation);
		this.values = this.buildValues();
		this.date = this.buildDate();
		this.comments = this.buildComments();
	}

	public String getAnnotationName() {
		return ANNOTATION_NAME;
	}

	@Override
	public void update() {
		super.update();
		this.updateValues();
		this.setDate_(this.buildDate());
		this.setComments_(this.buildComments());
	}

	// TODO
	private void updateValues() {
		throw new UnsupportedOperationException();
	}


	// ********** GeneratedAnnotation implementation **********

	// ***** values
	public ListIterator<String> values() {
		return new CloneListIterator<String>(this.values);
	}

	public int valuesSize() {
		return this.values.size();
	}

	public String getValue(int index) {
		return this.values.get(index);
	}

	private Vector<String> buildValues() {
		Object[] jdtValues = this.getJdtMemberValues(VALUE_ELEMENT_NAME);
		Vector<String> result = new Vector<String>(jdtValues.length);
		for (Object value : jdtValues) {
			result.add((String) value);
		}
		return result;
	}

	public void addValue(String value) {
		throw new UnsupportedOperationException();
	}

	public void addValue(int index, String value) {
		throw new UnsupportedOperationException();
	}

	public void moveValue(int targetIndex, int sourceIndex) {
		throw new UnsupportedOperationException();
	}

	public void removeValue(String value) {
		throw new UnsupportedOperationException();
	}

	public void removeValue(int index) {
		throw new UnsupportedOperationException();
	}

	// ***** date
	public String getDate() {
		return this.date;
	}

	public void setDate(String date) {
		throw new UnsupportedOperationException();
	}

	private void setDate_(String date) {
		String old = this.date;
		this.date = date;
		this.firePropertyChanged(DATE_PROPERTY, old, date);
	}

	private String buildDate() {
		return (String) this.getJdtMemberValue(DATE_ELEMENT_NAME);
	}

	// ***** comments
	public String getComments() {
		return this.comments;
	}

	public void setComments(String comments) {
		throw new UnsupportedOperationException();
	}

	private void setComments_(String comments) {
		String old = this.comments;
		this.comments = comments;
		this.firePropertyChanged(COMMENTS_PROPERTY, old, comments);
	}

	private String buildComments() {
		return (String) this.getJdtMemberValue(COMMENTS_ELEMENT_NAME);
	}

}
