/*******************************************************************************
 * Copyright (c) 2007, 2010 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.internal.jpa1.context.orm;

import org.eclipse.jpt.common.core.utility.TextRange;
import org.eclipse.jpt.core.context.Cascade;
import org.eclipse.jpt.core.context.orm.OrmRelationshipMapping;
import org.eclipse.jpt.core.internal.context.orm.AbstractOrmRelationshipMapping;
import org.eclipse.jpt.core.internal.context.orm.AbstractOrmXmlContextNode;
import org.eclipse.jpt.core.jpa2.context.Cascade2_0;
import org.eclipse.jpt.core.jpa2.context.orm.OrmCascade2_0;
import org.eclipse.jpt.core.resource.orm.AbstractXmlRelationshipMapping;
import org.eclipse.jpt.core.resource.orm.CascadeType;
import org.eclipse.jpt.core.resource.orm.OrmFactory;

public class GenericOrmCascade
	extends AbstractOrmXmlContextNode
	implements OrmCascade2_0
{
	protected boolean all;

	protected boolean persist;

	protected boolean merge;

	protected boolean remove;

	protected boolean refresh;

	/* JPA 2.0 */
	protected boolean detach;


	/**
	 * This is built directly by the mapping implementation; as opposed to via
	 * a platform-specific factory.
	 * @see AbstractOrmRelationshipMapping#buildCascade()
	 */
	public GenericOrmCascade(OrmRelationshipMapping parent) {
		super(parent);
		this.all = this.buildAll();
		this.persist = this.buildPersist();
		this.merge = this.buildMerge();
		this.remove = this.buildRemove();
		this.refresh = this.buildRefresh();
		this.detach = this.buildDetach();
	}


	// ********** synchronize/update **********

	@Override
	public void synchronizeWithResourceModel() {
		super.synchronizeWithResourceModel();
		this.setAll_(this.buildAll());
		this.setPersist_(this.buildPersist());
		this.setMerge_(this.buildMerge());
		this.setRemove_(this.buildRemove());
		this.setRefresh_(this.buildRefresh());
		this.setDetach_(this.buildDetach());
	}


	// ********** all **********

	public boolean isAll() {
		return this.all;
	}

	public void setAll(boolean all) {
		if (this.all != all) {
			CascadeType xmlCascade = this.getXmlCascadeForUpdate();
			this.setAll_(all);
			xmlCascade.setCascadeAll(all);
			this.removeXmlCascadeIfUnset();
		}
	}

	protected void setAll_(boolean all) {
		boolean old = this.all;
		this.all = all;
		this.firePropertyChanged(ALL_PROPERTY, old, all);
	}

	protected boolean buildAll() {
		CascadeType xmlCascade = this.getXmlCascade();
		return (xmlCascade != null) && xmlCascade.isCascadeAll();
	}


	// ********** persist **********

	public boolean isPersist() {
		return this.persist;
	}

	public void setPersist(boolean persist) {
		if (this.persist != persist) {
			CascadeType xmlCascade = this.getXmlCascadeForUpdate();
			this.setPersist_(persist);
			xmlCascade.setCascadePersist(persist);
			this.removeXmlCascadeIfUnset();
		}
	}

	protected boolean setPersist_(boolean persist) {
		boolean old = this.persist;
		this.persist = persist;
		return this.firePropertyChanged(PERSIST_PROPERTY, old, persist);
	}

	protected boolean buildPersist() {
		CascadeType xmlCascade = this.getXmlCascade();
		return (xmlCascade != null) && xmlCascade.isCascadePersist();
	}


	// ********** merge **********

	public boolean isMerge() {
		return this.merge;
	}

	public void setMerge(boolean merge) {
		if (this.merge != merge) {
			CascadeType xmlCascade = this.getXmlCascadeForUpdate();
			this.setMerge_(merge);
			xmlCascade.setCascadeMerge(merge);
			this.removeXmlCascadeIfUnset();
		}
	}

	protected boolean setMerge_(boolean merge) {
		boolean old = this.merge;
		this.merge = merge;
		return this.firePropertyChanged(MERGE_PROPERTY, old, merge);
	}

	protected boolean buildMerge() {
		CascadeType xmlCascade = this.getXmlCascade();
		return (xmlCascade != null) && xmlCascade.isCascadeMerge();
	}


	// ********** remove **********

	public boolean isRemove() {
		return this.remove;
	}

	public void setRemove(boolean remove) {
		if (this.remove != remove) {
			CascadeType xmlCascade = this.getXmlCascadeForUpdate();
			this.setRemove_(remove);
			xmlCascade.setCascadeRemove(remove);
			this.removeXmlCascadeIfUnset();
		}
	}

	protected boolean setRemove_(boolean remove) {
		boolean old = this.remove;
		this.remove = remove;
		return this.firePropertyChanged(REMOVE_PROPERTY, old, remove);
	}

	protected boolean buildRemove() {
		CascadeType xmlCascade = this.getXmlCascade();
		return (xmlCascade != null) && xmlCascade.isCascadeRemove();
	}


	// ********** refresh **********

	public boolean isRefresh() {
		return this.refresh;
	}

	public void setRefresh(boolean refresh) {
		if (this.refresh != refresh) {
			CascadeType xmlCascade = this.getXmlCascadeForUpdate();
			this.setRefresh_(refresh);
			xmlCascade.setCascadeRefresh(refresh);
			this.removeXmlCascadeIfUnset();
		}
	}

	protected boolean setRefresh_(boolean refresh) {
		boolean old = this.refresh;
		this.refresh = refresh;
		return this.firePropertyChanged(REFRESH_PROPERTY, old, refresh);
	}

	protected boolean buildRefresh() {
		CascadeType xmlCascade = this.getXmlCascade();
		return (xmlCascade != null) && xmlCascade.isCascadeRefresh();
	}


	// ********** detach **********

	public boolean isDetach() {
		return this.detach;
	}

	public void setDetach(boolean detach) {
		if (this.detach != detach) {
			CascadeType xmlCascade = this.getXmlCascadeForUpdate();
			this.setDetach_(detach);
			xmlCascade.setCascadeDetach(detach);
			this.removeXmlCascadeIfUnset();
		}
	}

	protected boolean setDetach_(boolean detach) {
		boolean old = this.detach;
		this.detach = detach;
		return this.firePropertyChanged(DETACH_PROPERTY, old, detach);
	}

	protected boolean buildDetach() {
		return this.isJpa2_0Compatible() && this.buildDetach_();
	}

	protected boolean buildDetach_() {
		CascadeType xmlCascade = this.getXmlCascade();
		return (xmlCascade != null) && xmlCascade.isCascadeDetach();
	}


	// ********** XML cascade **********

	/**
	 * Return <code>null</code> if XML cascade does not exists.
	 */
	protected CascadeType getXmlCascade() {
		return this.getXmlRelationshipMapping().getCascade();
	}

	/**
	 * Build the XML cascade if it does not exist.
	 */
	protected CascadeType getXmlCascadeForUpdate() {
		CascadeType xmlCascade = this.getXmlCascade();
		return (xmlCascade != null) ? xmlCascade : this.buildXmlCascade();
	}

	protected CascadeType buildXmlCascade() {
		CascadeType xmlCascade = OrmFactory.eINSTANCE.createCascadeType();
		this.getXmlRelationshipMapping().setCascade(xmlCascade);
		return xmlCascade;
	}

	protected void removeXmlCascadeIfUnset() {
		if (this.getXmlCascade().isUnset()) {
			this.removeXmlCascade();
		}
	}

	protected void removeXmlCascade() {
		this.getXmlRelationshipMapping().setCascade(null);
	}


	// ********** misc **********

	@Override
	public OrmRelationshipMapping getParent() {
		return (OrmRelationshipMapping) super.getParent();
	}

	protected OrmRelationshipMapping getRelationshipMapping() {
		return this.getParent();
	}

	protected AbstractXmlRelationshipMapping getXmlRelationshipMapping() {
		return this.getRelationshipMapping().getXmlAttributeMapping();
	}

	public void initializeFrom(Cascade oldCascade) {
		this.setAll(oldCascade.isAll());
		this.setPersist(oldCascade.isPersist());
		this.setMerge(oldCascade.isMerge());
		this.setRemove(oldCascade.isRemove());
		this.setRefresh(oldCascade.isRefresh());
		if (this.isJpa2_0Compatible()) {
			this.setDetach(((Cascade2_0) oldCascade).isDetach());
		}
	}

	public TextRange getValidationTextRange() {
		CascadeType xmlCascade = this.getXmlCascade();
		return (xmlCascade != null) ?
				xmlCascade.getValidationTextRange() :
				this.getRelationshipMapping().getValidationTextRange();
	}
}
