/*******************************************************************************
 * Copyright (c) 2008 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 org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jpt.core.JpaProject;
import org.eclipse.jpt.utility.internal.StringTools;

/**
 * This updater will update the project in a job that executes in a separate
 * thread and allows calls to #update() to return immediately.
 */
public class AsynchronousJpaProjectUpdater implements JpaProject.Updater {
	protected final JpaProject jpaProject;
	protected final UpdateJob job;

	public AsynchronousJpaProjectUpdater(JpaProject jpaProject) {
		super();
		this.jpaProject = jpaProject;
		this.job = this.buildJob();
	}

	protected UpdateJob buildJob() {
		return new UpdateJob();
	}

	/**
	 * Let the job run to completion (i.e. do not cancel it).
	 * This should reduce the number of times the job is re-scheduled.
	 */
	public void update() {
		this.job.schedule();
	}

	/**
	 * prevent the job from running again and wait for the current
	 * execution, if there is any, to end before returning
	 */
	public void dispose() {
		this.job.setShouldSchedule(false);
		try {
			this.job.join();
		} catch (InterruptedException ex) {
			// the job thread was interrupted while waiting - ignore
		}
	}

	@Override
	public String toString() {
		return StringTools.buildToStringFor(this, this.jpaProject);
	}


	/**
	 * This is the job that gets scheduled by the asynchronous updater.
	 * When the job is run it tells the JPA project to "update".
	 * Only a single instance of this job per project can run at a time.
	 */
	protected class UpdateJob extends Job {
		protected boolean shouldSchedule;

		protected UpdateJob() {
			super("Update JPA project: " + AsynchronousJpaProjectUpdater.this.jpaProject.name());  // TODO i18n
			this.shouldSchedule = true;
			this.setRule(AsynchronousJpaProjectUpdater.this.jpaProject.project());
		}

		@Override
		protected IStatus run(IProgressMonitor monitor) {
			return AsynchronousJpaProjectUpdater.this.jpaProject.update(monitor);
		}

		/**
		 * When setting to false, the job does not stop immediately;
		 * but it won't run again, even if it is scheduled.
		 */
		public void setShouldSchedule(boolean shouldSchedule) {
			this.shouldSchedule = shouldSchedule;
		}

		@Override
		public boolean shouldSchedule() {
			return this.shouldSchedule;
		}

	}

}
