/*******************************************************************************
 * 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.internal.IJpaProject;
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 IJpaProject.Updater {
	protected final IJpaProject jpaProject;
	protected final UpdateJob job;

	public AsynchronousJpaProjectUpdater(IJpaProject 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;
		}

	}

}
