/*******************************************************************************
* 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.eclipselink.core.internal.v2_0.context.persistence;

import java.util.Iterator;

import org.eclipse.jpt.core.context.persistence.ClassRef;
import org.eclipse.jpt.core.context.persistence.JarFileRef;
import org.eclipse.jpt.core.context.persistence.MappingFileRef;
import org.eclipse.jpt.core.context.persistence.Persistence;
import org.eclipse.jpt.core.jpa2.context.persistence.ClassRef2_0;
import org.eclipse.jpt.core.jpa2.context.persistence.JarFileRef2_0;
import org.eclipse.jpt.core.jpa2.context.persistence.MappingFileRef2_0;
import org.eclipse.jpt.core.jpa2.context.persistence.PersistenceUnit2_0;
import org.eclipse.jpt.core.jpa2.context.persistence.options.ValidationMode;
import org.eclipse.jpt.core.jpa2.resource.persistence.XmlPersistenceUnit;
import org.eclipse.jpt.eclipselink.core.internal.context.persistence.EclipseLinkPersistenceUnit;
import org.eclipse.jpt.eclipselink.core.internal.v2_0.context.persistence.options.EclipseLinkOptions2_0;
import org.eclipse.jpt.eclipselink.core.v2_0.context.persistence.connection.Connection2_0;
import org.eclipse.jpt.eclipselink.core.v2_0.context.persistence.options.Options2_0;

/**
 *  EclipseLinkPersistenceUnit2_0
 */
public class EclipseLinkPersistenceUnit2_0
	extends EclipseLinkPersistenceUnit
	implements PersistenceUnit2_0
{
	protected ValidationMode specifiedValidationMode;
	protected ValidationMode defaultValidationMode;

	public EclipseLinkPersistenceUnit2_0(Persistence parent, org.eclipse.jpt.core.resource.persistence.XmlPersistenceUnit xmlPersistenceUnit) {
		super(parent, xmlPersistenceUnit);

		this.specifiedValidationMode = this.buildSpecifiedValidationMode();
		this.defaultValidationMode = this.buildDefaultValidationMode();
	}

	// ********** behavior **********

	protected ValidationMode buildSpecifiedValidationMode() {
		return ValidationMode.fromXmlResourceModel(this.getXmlPersistenceUnit().getValidationMode());
	}
	
	protected ValidationMode buildDefaultValidationMode() {
		return Options2_0.DEFAULT_VALIDATION_MODE; 
	}

	@Override
	public XmlPersistenceUnit getXmlPersistenceUnit() {
		return (XmlPersistenceUnit) this.xmlPersistenceUnit;
	}
	
	// **************** factory methods *********************************************

	@Override
	protected Options2_0 buildEclipseLinkOptions() {
		return new EclipseLinkOptions2_0(this);
	}

	// **************** properties *********************************************

	@Override
	public Connection2_0 getConnection() {
		return (Connection2_0) super.getConnection();
	}
	
	@Override
	public Options2_0 getOptions() {
		return (Options2_0) this.options;
	}

	// ********** updating **********

	@Override
	public void update(org.eclipse.jpt.core.resource.persistence.XmlPersistenceUnit xpu) {
		super.update(xpu);
		
		this.xmlPersistenceUnit = xpu;
		this.updateValidationMode();
	}
	
	private void updateValidationMode() {
		ValidationMode newValidationMode = this.buildSpecifiedValidationMode();

		// update with the property definition if the element is null, and discard the property
		if(newValidationMode == null && this.getOptions().getValidationMode() != null) {
			newValidationMode = this.getOptions().getValidationMode();
			this.getOptions().removeValidationMode();
		}
		this.setSpecifiedValidationMode(newValidationMode);
	}

	// ********** validation mode **********

	public ValidationMode getValidationMode() {
		return (this.specifiedValidationMode != null) ? this.specifiedValidationMode : this.defaultValidationMode;
	}

	public ValidationMode getSpecifiedValidationMode() {
		return this.specifiedValidationMode;
	}

	public void setSpecifiedValidationMode(ValidationMode specifiedValidationMode) {
		ValidationMode old = this.specifiedValidationMode;
		this.specifiedValidationMode = specifiedValidationMode;

		this.getXmlPersistenceUnit().setValidationMode(ValidationMode.toXmlResourceModel(specifiedValidationMode));
		this.firePropertyChanged(SPECIFIED_VALIDATION_MODE_PROPERTY, old, specifiedValidationMode);
	}

	public ValidationMode getDefaultValidationMode() {
		return this.defaultValidationMode;
	}

	protected void setDefaultValidationMode(ValidationMode defaultValidationMode) {
		ValidationMode old = this.defaultValidationMode;
		this.defaultValidationMode = defaultValidationMode;
		this.firePropertyChanged(DEFAULT_VALIDATION_MODE_PROPERTY, old, defaultValidationMode);
	}

	// ********** JPA 2.0 Static Metamodel **********

	public void synchronizeStaticMetamodel() {
		for (Iterator<MappingFileRef> stream = this.mappingFileRefs(); stream.hasNext(); ) {
			((MappingFileRef2_0) stream.next()).synchronizeStaticMetamodel();
		}
		for (Iterator<ClassRef> stream = this.classRefs(); stream.hasNext(); ) {
			((ClassRef2_0) stream.next()).synchronizeStaticMetamodel();
		}
		for (Iterator<JarFileRef> stream = this.jarFileRefs(); stream.hasNext(); ) {
			((JarFileRef2_0) stream.next()).synchronizeStaticMetamodel();
		}
	}
}
