/*******************************************************************************
 * Copyright (c) 2006, 2007 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;

import java.util.HashSet;
import java.util.Hashtable;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IResource;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.impl.EObjectImpl;

/**
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 *
 *
 * @see org.eclipse.jpt.core.internal.JpaCorePackage#getJpaEObject()
 * @model kind="class" abstract="true"
 * @generated
 */
public abstract class JpaEObject extends EObjectImpl implements IJpaEObject
{
	/**
	 * Sets of "insignificant" feature ids, keyed by class.
	 * This is built up lazily, as the objects are modified.
	 */
	private static final Map<Class<? extends JpaEObject>, Set<Integer>> insignificantFeatureIdSets = new Hashtable<Class<? extends JpaEObject>, Set<Integer>>();

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected JpaEObject() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected EClass eStaticClass() {
		return JpaCorePackage.Literals.JPA_EOBJECT;
	}

	public IJpaProject getJpaProject() {
		IJpaEObject container = (IJpaEObject) this.eContainer();
		return (container == null) ? null : container.getJpaProject();
	}

	public IResource getResource() {
		return this.getJpaProject().getProject();
	}

	// ********** change notification **********
	/**
	 * override to prevent notification when the object's state is unchanged
	 */
	@Override
	public void eNotify(Notification notification) {
		if (!notification.isTouch()) {
			super.eNotify(notification);
			this.featureChanged(notification.getFeatureID(this.getClass()));
		}
	}

	protected void featureChanged(int featureId) {
		if (this.featureIsSignificant(featureId)) {
			IJpaProject project = this.getJpaProject();
			// check that the model is fully initialized
			if (project != null) {
				project.resynch();
			}
		}
	}

	protected boolean featureIsSignificant(int featureId) {
		return !this.featureIsInsignificant(featureId);
	}

	protected boolean featureIsInsignificant(int featureId) {
		return this.insignificantFeatureIds().contains(featureId);
	}

	/**
	 * Return a set of the object's "insignificant" feature ids.
	 * These are the EMF features that, when they change, will NOT cause the
	 * object (or its containing tree) to be resynched, i.e. defaults calculated.
	 * If you need instance-based calculation of your "insignificant" aspects,
	 * override this method. If class-based calculation is sufficient,
	 * override #addInsignificantFeatureIdsTo(Set).
	 */
	protected Set<Integer> insignificantFeatureIds() {
		synchronized (insignificantFeatureIdSets) {
			Set<Integer> insignificantFeatureIds = insignificantFeatureIdSets.get(this.getClass());
			if (insignificantFeatureIds == null) {
				insignificantFeatureIds = new HashSet<Integer>();
				this.addInsignificantFeatureIdsTo(insignificantFeatureIds);
				insignificantFeatureIdSets.put(this.getClass(), insignificantFeatureIds);
			}
			return insignificantFeatureIds;
		}
	}

	/**
	 * Add the object's "insignificant" feature ids to the specified set.
	 * These are the EMF features that, when they change, will NOT cause the
	 * object (or its containing tree) to be resynched, i.e. defaults calculated.
	 * If class-based calculation of your "insignificant" features is sufficient,
	 * override this method. If you need instance-based calculation,
	 * override #insignificantFeatureIds().
	 */
	protected void addInsignificantFeatureIdsTo(Set<Integer> insignificantFeatureIds) {
	// when you override this method, don't forget to include:
	//	super.addInsignificantFeatureIdsTo(insignificantFeatureIds);
	}
}
