/*******************************************************************************
 * 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.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.IResourceProxy;
import org.eclipse.core.resources.IResourceProxyVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.IJobChangeListener;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.util.EObjectContainmentEList;
import org.eclipse.emf.ecore.util.InternalEList;
import org.eclipse.jdt.core.ElementChangedEvent;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jpt.core.internal.content.java.JavaPersistentType;
import org.eclipse.jpt.core.internal.content.java.JpaCompilationUnit;
import org.eclipse.jpt.core.internal.facet.JpaFacetUtils;
import org.eclipse.jpt.core.internal.platform.IContext;
import org.eclipse.jpt.db.internal.ConnectionProfile;
import org.eclipse.jpt.db.internal.JptDbPlugin;
import org.eclipse.jpt.utility.internal.iterators.CloneIterator;
import org.eclipse.jpt.utility.internal.iterators.ReadOnlyIterator;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Jpa Project</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * <ul>
 *   <li>{@link org.eclipse.jpt.core.internal.JpaProject#getPlatform <em>Platform</em>}</li>
 *   <li>{@link org.eclipse.jpt.core.internal.JpaProject#getDataSource <em>Data Source</em>}</li>
 *   <li>{@link org.eclipse.jpt.core.internal.JpaProject#isDiscoverAnnotatedClasses <em>Discover Annotated Classes</em>}</li>
 *   <li>{@link org.eclipse.jpt.core.internal.JpaProject#getFiles <em>Files</em>}</li>
 * </ul>
 * </p>
 *
 * @see org.eclipse.jpt.core.internal.JpaCorePackage#getJpaProject()
 * @model kind="class"
 * @generated
 */
public class JpaProject extends JpaEObject implements IJpaProject
{
	/**
	 * The IProject associated with this JPA project
	 */
	protected IProject project;

	/**
	 * The IJpaPlatform associated with this JPA project
	 */
	protected IJpaPlatform platform;

	/**
	 * The cached value of the '{@link #getDataSource() <em>Data Source</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getDataSource()
	 * @generated
	 * @ordered
	 */
	protected IJpaDataSource dataSource;

	/**
	 * The default value of the '{@link #isDiscoverAnnotatedClasses() <em>Discover Annotated Classes</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isDiscoverAnnotatedClasses()
	 * @generated
	 * @ordered
	 */
	protected static final boolean DISCOVER_ANNOTATED_CLASSES_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isDiscoverAnnotatedClasses() <em>Discover Annotated Classes</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isDiscoverAnnotatedClasses()
	 * @generated
	 * @ordered
	 */
	protected boolean discoverAnnotatedClasses = DISCOVER_ANNOTATED_CLASSES_EDEFAULT;

	/**
	 * This is true if the Discover Annotated Classes attribute has been set.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	protected boolean discoverAnnotatedClassesESet;

	/**
	 * The cached value of the '{@link #getFiles() <em>Files</em>}' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getFiles()
	 * @generated
	 * @ordered
	 */
	protected EList<IJpaFile> files;

	/**
	 * Flag to indicate whether this project has been filled with files
	 */
	private boolean filled = false;

	/**
	 * Flag to indicate that the resynchJob has been scheduled or is running.
	 * This is set to false when that job is completed 
	 */
	boolean resynching = false;

	/**
	 * Flag to indicate that the resynchJob needs to be run.  This is
	 * set to true if resynching = true so that the next time the job completes
	 * it will be run again. 
	 */
	boolean needsToResynch = false;

	/**
	 * Job used to reconnect the model parts throughout the project containment hierarchy
	 * @see IJpaProject#resynch()
	 */
	Job resynchJob;

	private IJobChangeListener resynchJobListener;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated NOT
	 */
	protected JpaProject() {
		super();
		this.resynchJob = buildResynchJob();
		this.resynchJobListener = buildResynchJobListener();
		Job.getJobManager().addJobChangeListener(this.resynchJobListener);
	}

	private Job buildResynchJob() {
		return new Job("Resynching JPA model ...") {
			@Override
			protected IStatus run(IProgressMonitor monitor) {
				IContext contextHierarchy = getPlatform().buildProjectContext();
				getPlatform().resynch(contextHierarchy);
				return Status.OK_STATUS;
			}
		};
	}

	private IJobChangeListener buildResynchJobListener() {
		return new JobChangeAdapter() {
			@Override
			public void done(IJobChangeEvent event) {
				super.done(event);
				if (event.getJob() == JpaProject.this.resynchJob) {
					JpaProject.this.resynching = false;
					if (JpaProject.this.needsToResynch) {
						resynch();
					}
				}
			}
		};
	}

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

	/**
	 * @see IJpaProject#getProject()
	 */
	public IProject getProject() {
		return project;
	}

	void setProject(IProject theProject) {
		project = theProject;
	}

	public IJavaProject getJavaProject() {
		return JavaCore.create(getProject());
	}

	/**
	 * @see IJpaProject#getModel()
	 */
	public IJpaModel getModel() {
		return (IJpaModel) eContainer();
	}

	/**
	 * Returns the value of the '<em><b>Platform</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Platform</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Platform</em>' reference.
	 * @see #setPlatform(IJpaPlatform)
	 * @see org.eclipse.jpt.core.internal.JpaCorePackage#getJpaProject_Platform()
	 * @model resolveProxies="false" required="true" ordered="false"
	 * @generated
	 */
	public IJpaPlatform getPlatformGen() {
		return platform;
	}

	public IJpaPlatform getPlatform() {
		if (platform == null) {
			setPlatform(JpaFacetUtils.getPlatform(project));
		}
		return getPlatformGen();
	}

	/**
	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.JpaProject#getPlatform <em>Platform</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Platform</em>' reference.
	 * @see #getPlatform()
	 * @generated
	 */
	public void setPlatformGen(IJpaPlatform newPlatform) {
		IJpaPlatform oldPlatform = platform;
		platform = newPlatform;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, JpaCorePackage.JPA_PROJECT__PLATFORM, oldPlatform, platform));
	}

	public void setPlatform(IJpaPlatform jpaPlatform) {
		jpaPlatform.setProject(this);
		setPlatformGen(jpaPlatform);
	}

	/**
	 * @see IJpaProject#setPlatform(String)
	 */
	public void setPlatform(String platformId) {
		setPlatform(JpaPlatformRegistry.INSTANCE.getJpaPlatform(platformId));
	}

	/**
	 * Returns the value of the '<em><b>Data Source</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Data Source</em>' containment reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Data Source</em>' containment reference.
	 * @see #setDataSource(IJpaDataSource)
	 * @see org.eclipse.jpt.core.internal.JpaCorePackage#getJpaProject_DataSource()
	 * @model containment="true" ordered="false"
	 * @generated
	 */
	public IJpaDataSource getDataSourceGen() {
		return dataSource;
	}

	public synchronized IJpaDataSource getDataSource() {
		if (dataSource == null) {
			setDataSource(JpaFacetUtils.getConnectionName(project));
		}
		return getDataSourceGen();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain basicSetDataSource(IJpaDataSource newDataSource, NotificationChain msgs) {
		IJpaDataSource oldDataSource = dataSource;
		dataSource = newDataSource;
		if (eNotificationRequired()) {
			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, JpaCorePackage.JPA_PROJECT__DATA_SOURCE, oldDataSource, newDataSource);
			if (msgs == null)
				msgs = notification;
			else
				msgs.add(notification);
		}
		return msgs;
	}

	/**
	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.JpaProject#getDataSource <em>Data Source</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Data Source</em>' containment reference.
	 * @see #getDataSource()
	 * @generated
	 */
	public void setDataSource(IJpaDataSource newDataSource) {
		if (newDataSource != dataSource) {
			NotificationChain msgs = null;
			if (dataSource != null)
				msgs = ((InternalEObject) dataSource).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - JpaCorePackage.JPA_PROJECT__DATA_SOURCE, null, msgs);
			if (newDataSource != null)
				msgs = ((InternalEObject) newDataSource).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - JpaCorePackage.JPA_PROJECT__DATA_SOURCE, null, msgs);
			msgs = basicSetDataSource(newDataSource, msgs);
			if (msgs != null)
				msgs.dispatch();
		}
		else if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, JpaCorePackage.JPA_PROJECT__DATA_SOURCE, newDataSource, newDataSource));
	}

	/**
	 * @see IJpaProject#setDataSource(String)
	 */
	public void setDataSource(String connectionProfileName) {
		if (dataSource == null) {
			JpaDataSource ds = JpaCoreFactory.eINSTANCE.createJpaDataSource();
			setDataSource(ds);
		}
		dataSource.setConnectionProfileName(connectionProfileName);
	}

	/**
	 * Returns the value of the '<em><b>Discover Annotated Classes</b></em>' attribute.
	 * The default value is <code>"false"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Discover Annotated Classes</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Discover Annotated Classes</em>' attribute.
	 * @see #isSetDiscoverAnnotatedClasses()
	 * @see #unsetDiscoverAnnotatedClasses()
	 * @see #setDiscoverAnnotatedClasses(boolean)
	 * @see org.eclipse.jpt.core.internal.JpaCorePackage#getJpaProject_DiscoverAnnotatedClasses()
	 * @model default="false" unique="false" unsettable="true" required="true" ordered="false"
	 * @generated
	 */
	public boolean isDiscoverAnnotatedClassesGen() {
		return discoverAnnotatedClasses;
	}

	public boolean isDiscoverAnnotatedClasses() {
		if (!isSetDiscoverAnnotatedClasses()) {
			setDiscoverAnnotatedClasses(JpaFacetUtils.getDiscoverAnnotatedClasses(project));
		}
		return isDiscoverAnnotatedClassesGen();
	}

	/**
	 * Sets the value of the '{@link org.eclipse.jpt.core.internal.JpaProject#isDiscoverAnnotatedClasses <em>Discover Annotated Classes</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Discover Annotated Classes</em>' attribute.
	 * @see #isSetDiscoverAnnotatedClasses()
	 * @see #unsetDiscoverAnnotatedClasses()
	 * @see #isDiscoverAnnotatedClasses()
	 * @generated
	 */
	public void setDiscoverAnnotatedClasses(boolean newDiscoverAnnotatedClasses) {
		boolean oldDiscoverAnnotatedClasses = discoverAnnotatedClasses;
		discoverAnnotatedClasses = newDiscoverAnnotatedClasses;
		boolean oldDiscoverAnnotatedClassesESet = discoverAnnotatedClassesESet;
		discoverAnnotatedClassesESet = true;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, JpaCorePackage.JPA_PROJECT__DISCOVER_ANNOTATED_CLASSES, oldDiscoverAnnotatedClasses, discoverAnnotatedClasses, !oldDiscoverAnnotatedClassesESet));
	}

	/**
	 * Unsets the value of the '{@link org.eclipse.jpt.core.internal.JpaProject#isDiscoverAnnotatedClasses <em>Discover Annotated Classes</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isSetDiscoverAnnotatedClasses()
	 * @see #isDiscoverAnnotatedClasses()
	 * @see #setDiscoverAnnotatedClasses(boolean)
	 * @generated
	 */
	public void unsetDiscoverAnnotatedClasses() {
		boolean oldDiscoverAnnotatedClasses = discoverAnnotatedClasses;
		boolean oldDiscoverAnnotatedClassesESet = discoverAnnotatedClassesESet;
		discoverAnnotatedClasses = DISCOVER_ANNOTATED_CLASSES_EDEFAULT;
		discoverAnnotatedClassesESet = false;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.UNSET, JpaCorePackage.JPA_PROJECT__DISCOVER_ANNOTATED_CLASSES, oldDiscoverAnnotatedClasses, DISCOVER_ANNOTATED_CLASSES_EDEFAULT, oldDiscoverAnnotatedClassesESet));
	}

	/**
	 * Returns whether the value of the '{@link org.eclipse.jpt.core.internal.JpaProject#isDiscoverAnnotatedClasses <em>Discover Annotated Classes</em>}' attribute is set.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return whether the value of the '<em>Discover Annotated Classes</em>' attribute is set.
	 * @see #unsetDiscoverAnnotatedClasses()
	 * @see #isDiscoverAnnotatedClasses()
	 * @see #setDiscoverAnnotatedClasses(boolean)
	 * @generated
	 */
	public boolean isSetDiscoverAnnotatedClasses() {
		return discoverAnnotatedClassesESet;
	}

	@Override
	public IJpaProject getJpaProject() {
		return this;
	}

	/**
	 * Returns the value of the '<em><b>Files</b></em>' containment reference list.
	 * The list contents are of type {@link org.eclipse.jpt.core.internal.IJpaFile}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Files</em>' containment reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Files</em>' containment reference list.
	 * @see org.eclipse.jpt.core.internal.JpaCorePackage#getJpaProject_Files()
	 * @model type="org.eclipse.jpt.core.internal.IJpaFile" containment="true"
	 * @generated
	 */
	public EList<IJpaFile> getFiles() {
		if (files == null) {
			files = new EObjectContainmentEList<IJpaFile>(IJpaFile.class, this, JpaCorePackage.JPA_PROJECT__FILES);
		}
		return files;
	}

	/**
	 * INTERNAL ONLY
	 * Fill project with file resources
	 */
	void fill() throws CoreException {
		if (filled) {
			return;
		}
		IResourceProxyVisitor visitor = new IResourceProxyVisitor() {
			public boolean visit(IResourceProxy resource) throws CoreException {
				switch (resource.getType()) {
					case IResource.PROJECT :
					case IResource.FOLDER :
						return true;
					case IResource.FILE :
						IFile file = (IFile) resource.requestResource();
						if (getJpaFileInternal(file) == null) {
							createJpaFile(file);
						}
					default :
						return false;
				}
			}
		};
		getProject().accept(visitor, IResource.NONE);
		resynch();
		filled = true;
	}

	/**
	 * @see IJpaProject#getJpaFile(IFile)
	 */
	public synchronized IJpaFile getJpaFile(IFile file) {
		IJpaFile jpaFile = getJpaFileInternal(file);
		if (jpaFile != null) {
			return jpaFile;
		}
		else if (!filled) {
			return createJpaFile(file);
		}
		else {
			return null;
		}
	}

	synchronized IJpaFile getJpaFileInternal(IFile file) {
		for (IJpaFile next : this.getFiles()) {
			if (next.getFile().equals(file)) {
				return next;
			}
		}
		return null;
	}

	public Iterator<IJpaFile> jpaFiles() {
		return new ReadOnlyIterator<IJpaFile>(getFiles().iterator());
	}

	public Collection<IJpaFile> jpaFiles(String contentType) {
		Collection<IJpaFile> jpaFiles = new ArrayList<IJpaFile>();
		for (Iterator<IJpaFile> stream = jpaFiles(); stream.hasNext();) {
			IJpaFile next = stream.next();
			if (next.getContentId().equals(contentType)) {
				jpaFiles.add(next);
			}
		}
		return jpaFiles;
	}

	public JavaPersistentType findJavaPersistentType(IType type) {
		if (type == null) {
			return null;
		}
		Collection<IJpaFile> persistenceFiles = jpaFiles(JptCorePlugin.JAVA_CONTENT_TYPE);
		for (IJpaFile jpaFile : persistenceFiles) {
			JpaCompilationUnit compilationUnit = (JpaCompilationUnit) jpaFile.getContent();
			for (JavaPersistentType persistentType : compilationUnit.getTypes()) {
				if (type.equals(persistentType.getType().getJdtMember())) {
					return persistentType;
				}
			}
		}
		return null;
	}

	/**
	 * INTERNAL ONLY
	 * Dispose of project before it is removed
	 */
	void dispose() {
		for (Iterator<IJpaFile> stream = new CloneIterator<IJpaFile>(getFiles()); stream.hasNext();) {
			disposeFile((JpaFile) stream.next());
		}
		Job.getJobManager().removeJobChangeListener(this.resynchJobListener);
	}

	/**
	 * INTERNAL ONLY
	 * Dispose file and remove it
	 */
	void disposeFile(JpaFile jpaFile) {
		jpaFile.dispose();
		getFiles().remove(jpaFile);
	}

	/**
	 * INTERNAL ONLY
	 * Synch internal JPA resources.
	 */
	void synchInternalResources(IResourceDelta delta) throws CoreException {
		delta.accept(this.buildResourceDeltaVisitor());
	}

	private IResourceDeltaVisitor buildResourceDeltaVisitor() {
		return new IResourceDeltaVisitor() {
			private IResource currentResource = getProject();

			public boolean visit(IResourceDelta delta) throws CoreException {
				IResource res = delta.getResource();
				if (res.equals(currentResource))
					return true;
				if (res.getType() == IResource.FILE) {
					IFile file = (IFile) res;
					switch (delta.getKind()) {
						case IResourceDelta.ADDED :
							if (getJpaFile(file) == null) {
								createJpaFile(file);
								JpaProject.this.resynch();//TODO different api for this?
							}
							break;
						case IResourceDelta.REMOVED :
							JpaFile jpaFile = (JpaFile) getJpaFile(file);
							if (jpaFile != null) {
								disposeFile(jpaFile);
								JpaProject.this.resynch();//TODO different api for this?
							}
							break;
						case IResourceDelta.CHANGED :
							// shouldn't have to worry, since all changes we're looking for have to do with file name
					}
				}
				return true;
			}
		};
	}

	synchronized IJpaFile createJpaFile(IFile file) {
		if (!JavaCore.create(getProject()).isOnClasspath(file)) {
			return null;
		}
		IJpaFile jpaFile = JpaFileContentRegistry.getFile(this, file);
		// PWFTODO 
		// Return a NullPersistenceFile if no content found?
		if (jpaFile != null) {
			getFiles().add(jpaFile);
			return jpaFile;
		}
		return null;
	}

	/**
	 * INTERNAL ONLY
	 * Handle java element change event.
	 */
	void handleEvent(ElementChangedEvent event) {
		if (filled) {
			for (Iterator<IJpaFile> stream = jpaFiles(); stream.hasNext();) {
				((JpaFile) stream.next()).handleEvent(event);
			}
			resynch();
		}
	}

	public Iterator<IMessage> validationMessages() {
		List<IMessage> messages = new ArrayList<IMessage>();
		getPlatform().addToMessages(messages);
		return messages.iterator();
	}

	//leaving this at the JpaProject level for now instead of
	//passing it on to the JpaModel.  We don't currently support
	//multiple projects having cross-references
	public void resynch() {
		if (!this.resynching) {
			this.resynching = true;
			this.needsToResynch = false;
			this.resynchJob.schedule();
		}
		else {
			this.needsToResynch = true;
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
		switch (featureID) {
			case JpaCorePackage.JPA_PROJECT__DATA_SOURCE :
				return basicSetDataSource(null, msgs);
			case JpaCorePackage.JPA_PROJECT__FILES :
				return ((InternalEList<?>) getFiles()).basicRemove(otherEnd, msgs);
		}
		return super.eInverseRemove(otherEnd, featureID, msgs);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case JpaCorePackage.JPA_PROJECT__PLATFORM :
				return getPlatform();
			case JpaCorePackage.JPA_PROJECT__DATA_SOURCE :
				return getDataSource();
			case JpaCorePackage.JPA_PROJECT__DISCOVER_ANNOTATED_CLASSES :
				return isDiscoverAnnotatedClasses() ? Boolean.TRUE : Boolean.FALSE;
			case JpaCorePackage.JPA_PROJECT__FILES :
				return getFiles();
		}
		return super.eGet(featureID, resolve, coreType);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@SuppressWarnings("unchecked")
	@Override
	public void eSet(int featureID, Object newValue) {
		switch (featureID) {
			case JpaCorePackage.JPA_PROJECT__PLATFORM :
				setPlatform((IJpaPlatform) newValue);
				return;
			case JpaCorePackage.JPA_PROJECT__DATA_SOURCE :
				setDataSource((IJpaDataSource) newValue);
				return;
			case JpaCorePackage.JPA_PROJECT__DISCOVER_ANNOTATED_CLASSES :
				setDiscoverAnnotatedClasses(((Boolean) newValue).booleanValue());
				return;
			case JpaCorePackage.JPA_PROJECT__FILES :
				getFiles().clear();
				getFiles().addAll((Collection<? extends IJpaFile>) newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case JpaCorePackage.JPA_PROJECT__PLATFORM :
				setPlatform((IJpaPlatform) null);
				return;
			case JpaCorePackage.JPA_PROJECT__DATA_SOURCE :
				setDataSource((IJpaDataSource) null);
				return;
			case JpaCorePackage.JPA_PROJECT__DISCOVER_ANNOTATED_CLASSES :
				unsetDiscoverAnnotatedClasses();
				return;
			case JpaCorePackage.JPA_PROJECT__FILES :
				getFiles().clear();
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case JpaCorePackage.JPA_PROJECT__PLATFORM :
				return platform != null;
			case JpaCorePackage.JPA_PROJECT__DATA_SOURCE :
				return dataSource != null;
			case JpaCorePackage.JPA_PROJECT__DISCOVER_ANNOTATED_CLASSES :
				return isSetDiscoverAnnotatedClasses();
			case JpaCorePackage.JPA_PROJECT__FILES :
				return files != null && !files.isEmpty();
		}
		return super.eIsSet(featureID);
	}

	/**
	 * @generated NOT
	 */
	@Override
	public String toString() {
		StringBuffer result = new StringBuffer(super.toString());
		result.append(" (" + getProject().toString() + ")");
		return result.toString();
	}

	public ConnectionProfile connectionProfile() {
		String profileName = getDataSource().getConnectionProfileName();
		return JptDbPlugin.getDefault().getConnectionProfileRepository().profileNamed(profileName);
	}
}
