/*******************************************************************************
 * Copyright (c) 2012, 2016 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.common.core.internal.utility.command;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jpt.common.core.utility.command.JobCommand;
import org.eclipse.jpt.common.core.utility.command.JobCommandContext;
import org.eclipse.jpt.common.core.utility.command.NotifyingRepeatingJobCommand;
import org.eclipse.jpt.common.utility.exception.ExceptionHandler;
import org.eclipse.jpt.common.utility.internal.ListenerList;
import org.eclipse.jpt.common.utility.internal.model.ModelTools;

/**
 * @see org.eclipse.jpt.common.utility.internal.command.NotifyingRepeatingCommandWrapper
 */
public class NotifyingRepeatingJobCommandWrapper
	extends RepeatingJobCommandWrapper
	implements NotifyingRepeatingJobCommand
{
	private final ListenerList<Listener> listenerList = ModelTools.listenerList();


	// ********** construction **********

	/**
	 * Construct a notifying repeating command wrapper that executes the
	 * specified command. Any exceptions thrown by the command or listener
	 * will be handled by the specified exception handler.
	 */
	public NotifyingRepeatingJobCommandWrapper(JobCommand command, ExceptionHandler exceptionHandler) {
		super(command, exceptionHandler);
	}

	/**
	 * Construct a notifying repeating command wrapper that executes the
	 * specified command and uses the specified command context to execute the
	 * wrapped command whenever it is not already executing.
	 * Any exceptions thrown by the command or listener will be handled by the
	 * specified exception handler.
	 */
	public NotifyingRepeatingJobCommandWrapper(JobCommand command, JobCommandContext startCommandContext, ExceptionHandler exceptionHandler) {
		super(command, startCommandContext, exceptionHandler);
	}


	// ********** listeners **********

	public void addListener(Listener listener) {
		this.listenerList.add(listener);
	}

	public void removeListener(Listener listener) {
		this.listenerList.remove(listener);
	}


	// ********** override **********

	@Override
	/* private protected */ IStatus executeCommand(IProgressMonitor monitor) {
		IStatus status = super.executeCommand(monitor);
		if (status.getSeverity() == IStatus.CANCEL) {
			this.executionCanceled();
		}
		else if (this.state.isQuiesced()) {
			this.executionQuiesced();
		}
		return status;
	}

	/**
	 * Notify our listeners. All listeners are notified. There is no way to
	 * cancel the notifications (e.g. via a monitor or exception).
	 */
	private void executionQuiesced() {
		for (Listener listener : this.listenerList) {
			this.notifyListenerQuiesced(listener);
		}
	}

	private void notifyListenerQuiesced(Listener listener) {
		try {
			listener.executionQuiesced(this);
		} catch (Throwable ex) {
			this.exceptionHandler.handleException(ex);
		}
	}

	/**
	 * Notify our listeners. All listeners are notified. There is no way to
	 * cancel the notifications (e.g. via a monitor or exception).
	 */
	private void executionCanceled() {
		for (Listener listener : this.listenerList) {
			this.notifyListenerCanceled(listener);
		}
	}

	private void notifyListenerCanceled(Listener listener) {
		try {
			listener.executionCanceled(this);
		} catch (Throwable ex) {
			this.exceptionHandler.handleException(ex);
		}
	}
}
