diff options
Diffstat (limited to 'common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/command/AsynchronousNotifyingRepeatingCommandWrapper.java')
-rw-r--r-- | common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/command/AsynchronousNotifyingRepeatingCommandWrapper.java | 160 |
1 files changed, 0 insertions, 160 deletions
diff --git a/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/command/AsynchronousNotifyingRepeatingCommandWrapper.java b/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/command/AsynchronousNotifyingRepeatingCommandWrapper.java deleted file mode 100644 index dd54a23709..0000000000 --- a/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/command/AsynchronousNotifyingRepeatingCommandWrapper.java +++ /dev/null @@ -1,160 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 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.utility.internal.command; - -import java.util.concurrent.ThreadFactory; -import org.eclipse.jpt.common.utility.ExceptionHandler; -import org.eclipse.jpt.common.utility.command.NotifyingRepeatingCommand; -import org.eclipse.jpt.common.utility.command.Command; -import org.eclipse.jpt.common.utility.internal.ConsumerThreadCoordinator; -import org.eclipse.jpt.common.utility.internal.ListenerList; - -/** - * Extend the asynchronous repeating command to notify listeners - * when an execution "cycle" is complete; i.e. the command has, - * for the moment, handled every outstanding "execute" request and quiesced. - * This notification is <em>not</em> guaranteed to occur with <em>every</em> - * execution "cycle"; since other, unrelated, executions can be - * triggered concurrently. - * <p> - * <strong>NB:</strong> Listeners should handle any exceptions - * appropriately (e.g. log the exception and return gracefully so the thread - * can continue the synchronization process). - */ -public class AsynchronousNotifyingRepeatingCommandWrapper - extends AsynchronousRepeatingCommandWrapper - implements NotifyingRepeatingCommand -{ - private final ListenerList<Listener> listenerList = new ListenerList<Listener>(Listener.class); - - /** - * This handles any exceptions thrown by the listeners. - */ - private final ExceptionHandler exceptionHandler; - - - // ********** construction ********** - - /** - * Construct an asynchronous notifying repeating command that executes the - * specified command. - * Allow the execution thread(s) to be assigned JDK-generated names. - */ - public AsynchronousNotifyingRepeatingCommandWrapper(Command command, ExceptionHandler exceptionHandler) { - super(command, exceptionHandler); - this.exceptionHandler = exceptionHandler; - } - - /** - * Construct an asynchronous notifying repeating command that executes the - * specified command. - * Assign the synchronization thread(s) the specified name. - */ - public AsynchronousNotifyingRepeatingCommandWrapper(Command command, String threadName, ExceptionHandler exceptionHandler) { - super(command, threadName, exceptionHandler); - this.exceptionHandler = exceptionHandler; - } - - /** - * Construct an asynchronous repeating command that executes the - * specified command. - * Use the specified thread factory to construct the synchronization thread(s). - * Assign the synchronization thread(s) the specified name. - * Any exceptions thrown by the consumer will be handled by the - * specified exception handler. - */ - public AsynchronousNotifyingRepeatingCommandWrapper(Config config) { - super(config); - this.exceptionHandler = config.getExceptionHandler(); - } - - /** - * Construct an asynchronous notifying repeating command that executes the - * specified command. - * Use the specified thread factory to construct the synchronization thread(s). - * Assign the synchronization thread(s) the specified name. - * Any exceptions thrown by the consumer will be handled by the - * specified exception handler. - */ - public AsynchronousNotifyingRepeatingCommandWrapper(Command command, ThreadFactory threadFactory, String threadName, ExceptionHandler exceptionHandler) { - super(command, threadFactory, threadName, exceptionHandler); - this.exceptionHandler = exceptionHandler; - } - - /** - * Build a consumer that will let us know when the execution thread has - * quiesced. - */ - @Override - ConsumerThreadCoordinator.Consumer buildConsumer(Command command) { - return new NotifyingConsumer(command); - } - - - // ********** NotifyingRepeatingCommand implementation ********** - - public void addListener(Listener listener) { - this.listenerList.add(listener); - } - - public void removeListener(Listener listener) { - this.listenerList.remove(listener); - } - - /** - * Notify our listeners. - */ - /* CU private */ void executionQuiesced() { - for (Listener listener : this.listenerList.getListeners()) { - try { - listener.executionQuiesced(this); - } catch (RuntimeException ex) { - // we could let the ConsumerThreadCoordinator handle these; - // but then the loop would be stopped with the first exception... - this.exceptionHandler.handleException(ex); - } - } - } - - - // ********** consumer ********** - - /** - * Extend {@link AsynchronousRepeatingCommandWrapper.Consumer} - * to notify the repeating command when execution has quiesced - * (i.e. the command has finished executing and there are no further - * requests for execution). - * Because execution is asynchronous, no other thread will be able to - * initiate another execution until the command's listeners have been - * notified. Note also, the command's listeners can, themselves, - * trigger another execution (by directly or indirectly calling - * {@link org.eclipse.jpt.common.utility.command.Command#execute()}); - * but this execution will not occur until <em>after</em> all the - * listeners have been notified. - */ - /* CU private */ class NotifyingConsumer - extends Consumer - { - NotifyingConsumer(Command command) { - super(command); - } - - @Override - public void consume() { - super.consume(); - // hmmm - we will notify listeners even when we our thread is "interrupted"; - // that seems ok... ~bjv - if (AsynchronousNotifyingRepeatingCommandWrapper.this.executeFlag.isFalse()) { - AsynchronousNotifyingRepeatingCommandWrapper.this.executionQuiesced(); - } - } - - } -} |