diff options
author | Uwe Stieber | 2013-05-20 14:26:35 +0000 |
---|---|---|
committer | Uwe Stieber | 2013-05-20 14:26:35 +0000 |
commit | a208df59737db0fa329bc999094b621c3b30a4fb (patch) | |
tree | 9275266951ac9f9a0939a2c6d0127cc73a85df58 | |
parent | 2ee1fbe519139aab8bed61efa5ee0d9f26ef5230 (diff) | |
download | org.eclipse.tcf-a208df59737db0fa329bc999094b621c3b30a4fb.tar.gz org.eclipse.tcf-a208df59737db0fa329bc999094b621c3b30a4fb.tar.xz org.eclipse.tcf-a208df59737db0fa329bc999094b621c3b30a4fb.zip |
Target Explorer: Add abstract job implementation where the logic is executed in the TCF event dispatch thread
5 files changed, 214 insertions, 40 deletions
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/META-INF/MANIFEST.MF b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/META-INF/MANIFEST.MF index 59b0cc287..4a64c2f68 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/META-INF/MANIFEST.MF +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/META-INF/MANIFEST.MF @@ -1,40 +1,43 @@ -Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.tcf.te.tcf.core;singleton:=true
-Bundle-Version: 1.1.0.qualifier
-Bundle-Activator: org.eclipse.tcf.te.tcf.core.activator.CoreBundleActivator
-Bundle-Vendor: %providerName
-Require-Bundle: org.eclipse.core.runtime;bundle-version="3.8.0",
- org.eclipse.core.expressions;bundle-version="3.4.400",
- org.eclipse.tcf;bundle-version="1.1.0",
- org.eclipse.tcf.core;bundle-version="1.1.0",
- org.eclipse.tcf.te.runtime;bundle-version="1.1.0",
- org.eclipse.tcf.te.core;bundle-version="1.1.0",
- org.eclipse.tcf.te.runtime.persistence;bundle-version="1.1.0",
- org.eclipse.tcf.te.runtime.services;bundle-version="1.1.0",
- org.eclipse.tcf.te.runtime.stepper;bundle-version="1.1.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ActivationPolicy: lazy
-Bundle-Localization: plugin
-Export-Package: org.eclipse.tcf.te.tcf.core,
- org.eclipse.tcf.te.tcf.core.activator;x-internal:=true,
- org.eclipse.tcf.te.tcf.core.async,
- org.eclipse.tcf.te.tcf.core.concurrent,
- org.eclipse.tcf.te.tcf.core.interfaces,
- org.eclipse.tcf.te.tcf.core.interfaces.steps,
- org.eclipse.tcf.te.tcf.core.interfaces.tracing,
- org.eclipse.tcf.te.tcf.core.internal;x-internal:=true,
- org.eclipse.tcf.te.tcf.core.internal.utils;x-internal:=true,
- org.eclipse.tcf.te.tcf.core.iterators,
- org.eclipse.tcf.te.tcf.core.listeners,
- org.eclipse.tcf.te.tcf.core.listeners.interfaces,
- org.eclipse.tcf.te.tcf.core.nls;x-internal:=true,
- org.eclipse.tcf.te.tcf.core.peers,
- org.eclipse.tcf.te.tcf.core.steps,
- org.eclipse.tcf.te.tcf.core.streams,
- org.eclipse.tcf.te.tcf.core.util,
- org.eclipse.tcf.te.tcf.core.util.persistence,
- org.eclipse.tcf.te.tcf.core.va,
- org.eclipse.tcf.te.tcf.core.va.interfaces,
- org.eclipse.tcf.te.tcf.core.va.internal;x-internal:=true
+Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %pluginName +Bundle-SymbolicName: org.eclipse.tcf.te.tcf.core;singleton:=true +Bundle-Version: 1.1.0.qualifier +Bundle-Activator: org.eclipse.tcf.te.tcf.core.activator.CoreBundleActivator +Bundle-Vendor: %providerName +Require-Bundle: org.eclipse.core.runtime;bundle-version="3.8.0", + org.eclipse.core.expressions;bundle-version="3.4.400", + org.eclipse.tcf;bundle-version="1.1.0", + org.eclipse.tcf.core;bundle-version="1.1.0", + org.eclipse.tcf.te.runtime;bundle-version="1.1.0", + org.eclipse.tcf.te.core;bundle-version="1.1.0", + org.eclipse.tcf.te.runtime.persistence;bundle-version="1.1.0", + org.eclipse.tcf.te.runtime.services;bundle-version="1.1.0", + org.eclipse.tcf.te.runtime.stepper;bundle-version="1.1.0", + org.eclipse.tcf.te.runtime.statushandler;bundle-version="1.1.0" +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Bundle-ActivationPolicy: lazy +Bundle-Localization: plugin +Export-Package: org.eclipse.tcf.te.tcf.core, + org.eclipse.tcf.te.tcf.core.activator;x-internal:=true, + org.eclipse.tcf.te.tcf.core.async, + org.eclipse.tcf.te.tcf.core.concurrent, + org.eclipse.tcf.te.tcf.core.help, + org.eclipse.tcf.te.tcf.core.interfaces, + org.eclipse.tcf.te.tcf.core.interfaces.steps, + org.eclipse.tcf.te.tcf.core.interfaces.tracing, + org.eclipse.tcf.te.tcf.core.internal;x-internal:=true, + org.eclipse.tcf.te.tcf.core.internal.utils;x-internal:=true, + org.eclipse.tcf.te.tcf.core.iterators, + org.eclipse.tcf.te.tcf.core.jobs, + org.eclipse.tcf.te.tcf.core.listeners, + org.eclipse.tcf.te.tcf.core.listeners.interfaces, + org.eclipse.tcf.te.tcf.core.nls;x-internal:=true, + org.eclipse.tcf.te.tcf.core.peers, + org.eclipse.tcf.te.tcf.core.steps, + org.eclipse.tcf.te.tcf.core.streams, + org.eclipse.tcf.te.tcf.core.util, + org.eclipse.tcf.te.tcf.core.util.persistence, + org.eclipse.tcf.te.tcf.core.va, + org.eclipse.tcf.te.tcf.core.va.interfaces, + org.eclipse.tcf.te.tcf.core.va.internal;x-internal:=true diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/help/IContextHelpIds.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/help/IContextHelpIds.java new file mode 100644 index 000000000..e7c4d9766 --- /dev/null +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/help/IContextHelpIds.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2013 Wind River Systems, Inc. and others. 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: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.core.help; + +import org.eclipse.tcf.te.tcf.core.activator.CoreBundleActivator; + +/** + * Context help id definitions. + */ +public interface IContextHelpIds { + + /** + * Core plug-in common context help id prefix. + */ + public final static String PREFIX = CoreBundleActivator.getUniqueIdentifier() + "."; //$NON-NLS-1$ + + /** + * Common context help id to signal once a generic job operation failed. + */ + public final static String MESSAGE_OPERATION_FAILED = PREFIX + ".status.operationFailed"; //$NON-NLS-1$ +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/jobs/AbstractJob.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/jobs/AbstractJob.java new file mode 100644 index 000000000..05159b375 --- /dev/null +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/jobs/AbstractJob.java @@ -0,0 +1,139 @@ +/******************************************************************************* + * Copyright (c) 2013 Wind River Systems, Inc. and others. 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: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.core.jobs; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.tcf.protocol.Protocol; +import org.eclipse.tcf.te.runtime.callback.Callback; +import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; +import org.eclipse.tcf.te.runtime.properties.PropertiesContainer; +import org.eclipse.tcf.te.runtime.statushandler.StatusHandlerManager; +import org.eclipse.tcf.te.runtime.statushandler.interfaces.IStatusHandler; +import org.eclipse.tcf.te.runtime.statushandler.interfaces.IStatusHandlerConstants; +import org.eclipse.tcf.te.tcf.core.help.IContextHelpIds; +import org.eclipse.tcf.te.tcf.core.nls.Messages; + +/** + * Abstract TCF job implementation. + * <p> + * The job implementation assures that the job logic is executed within the + * TCF event dispatch thread. The job passes on the execution status to a + * registered status handler if no parent callback is set. + */ +public abstract class AbstractJob extends Job { + // The parent callback. + /* default */ final ICallback parentCallback; + + /** + * Constructor. + * + * @param name The job name. Must not be <code>null</code>. + */ + public AbstractJob(String name) { + this(name, null); + } + + /** + * Constructor. + * + * @param name The job name. Must not be <code>null</code>. + * @param parentCallback The parent callback or <code>null</code>. + */ + public AbstractJob(String name, ICallback parentCallback) { + super(name); + this.parentCallback = parentCallback; + } + + /* (non-Javadoc) + * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) + */ + @Override + protected final IStatus run(final IProgressMonitor monitor) { + // The first runnable is setting the thread which will finish the job at the end + Protocol.invokeLater(new Runnable() { + @Override + public void run() { + AbstractJob.this.setThread(Thread.currentThread()); + } + }); + + final IProgressMonitor finMonitor = monitor; + + // The callback to invoke from the job's logic must be created before scheduling + // the job logic asynchronously + final ICallback callback = new Callback() { + @Override + protected void internalDone(final Object caller, final IStatus status) { + // If the parent callback is not set, pass on the status to a registered status handler + if (parentCallback == null) { + // If we have a non-OK or CANCEL status, forward to the status handler + if (status != null && status.getSeverity() != IStatus.CANCEL && status.getSeverity() != IStatus.OK) { + IStatusHandler[] handler = StatusHandlerManager.getInstance().getHandler(AbstractJob.this); + if (handler.length > 0) { + IPropertiesContainer data = new PropertiesContainer(); + data.setProperty(IStatusHandlerConstants.PROPERTY_TITLE, getProperty(IStatusHandlerConstants.PROPERTY_TITLE) != null ? getProperty(IStatusHandlerConstants.PROPERTY_TITLE) : Messages.AbstractJob_error_dialogTitle); + data.setProperty(IStatusHandlerConstants.PROPERTY_CONTEXT_HELP_ID, getProperty(IStatusHandlerConstants.PROPERTY_CONTEXT_HELP_ID) != null ? getProperty(IStatusHandlerConstants.PROPERTY_CONTEXT_HELP_ID) : IContextHelpIds.MESSAGE_OPERATION_FAILED); + data.setProperty(IStatusHandlerConstants.PROPERTY_CALLER, AbstractJob.this); + + handler[0].handleStatus(status, data, null); + } + } + } else { + // Pass on the caller and the status to the parent callback + // We call the parent callback asynchronously in the TCF + // event dispatch thread. The job termination happens in + // a separate runnable. + Protocol.invokeLater(new Runnable() { + @Override + public void run() { + parentCallback.done(caller, status); + } + }); + } + + // Job termination must must happen in the TCF event dispatch thread as + // this is the thread we've set before as the termination thread. + Runnable runnable = new Runnable() { + @Override + public void run() { + // Mark the job as done + IStatus result = finMonitor.isCanceled() ? Status.CANCEL_STATUS : Status.OK_STATUS; + AbstractJob.this.done(result); + } + }; + + if (Protocol.isDispatchThread()) runnable.run(); + else Protocol.invokeLater(runnable); + } + }; + + // Run the job logic + Protocol.invokeLater(new Runnable() { + @Override + public void run() { + AbstractJob.this.run(monitor, callback); + } + }); + + return ASYNC_FINISH; + } + + /** + * Executes the job logic. + * + * @param monitor The progress monitor. Must not be <code>null</code>. + * @param callback The callback to invoke. Must not be <code>null</code>. + */ + public abstract void run(IProgressMonitor monitor, ICallback callback); +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/nls/Messages.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/nls/Messages.java index 5115bd7f6..44b336951 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/nls/Messages.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/nls/Messages.java @@ -106,4 +106,6 @@ public class Messages extends NLS { public static String Extension_error_invalidProtocolStateChangeListener; public static String Extension_error_invalidChannelStateChangeListener; + + public static String AbstractJob_error_dialogTitle; } diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/nls/Messages.properties b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/nls/Messages.properties index 909a36f8c..9d864b5da 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/nls/Messages.properties +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/nls/Messages.properties @@ -47,3 +47,5 @@ MonitorTask_TimeoutError=The callback monitor has timed out\! Extension_error_invalidProtocolStateChangeListener=Failed to instantiate the protocol state change listener from extension point ''{0}''. Extension_error_invalidChannelStateChangeListener=Failed to instantiate the channel state change listener from extension point ''{0}''. + +AbstractJob_error_dialogTitle=Error |