diff options
-rw-r--r-- | target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/META-INF/MANIFEST.MF | 1 | ||||
-rw-r--r-- | target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/activator/UIPlugin.java | 56 |
2 files changed, 56 insertions, 1 deletions
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/META-INF/MANIFEST.MF b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/META-INF/MANIFEST.MF index 0121f1d0a..41d8dbbc6 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/META-INF/MANIFEST.MF +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/META-INF/MANIFEST.MF @@ -24,6 +24,7 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="3.8.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.statushandler;bundle-version="1.1.0", + org.eclipse.tcf.te.runtime.stepper;bundle-version="1.1.0", org.eclipse.tcf.te.tcf.core;bundle-version="1.1.0", org.eclipse.tcf.te.tcf.core.model;bundle-version="1.1.0", org.eclipse.tcf.te.tcf.core.scripting;bundle-version="1.1.0", diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/activator/UIPlugin.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/activator/UIPlugin.java index 61f27ee0d..3d4c3e93b 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/activator/UIPlugin.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/activator/UIPlugin.java @@ -17,8 +17,18 @@ import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.swt.graphics.Image; import org.eclipse.tcf.protocol.Protocol; +import org.eclipse.tcf.te.core.async.AsyncCallbackCollector; +import org.eclipse.tcf.te.runtime.concurrent.util.ExecutorsUtil; +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.services.ServiceManager; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepperService; +import org.eclipse.tcf.te.runtime.stepper.job.StepperJob; import org.eclipse.tcf.te.tcf.core.Tcf; import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.ILocatorModel; +import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel; import org.eclipse.tcf.te.tcf.locator.model.Model; import org.eclipse.tcf.te.tcf.ui.internal.ImageConsts; import org.eclipse.tcf.te.ui.jface.images.AbstractImageDescriptor; @@ -91,9 +101,53 @@ public class UIPlugin extends AbstractUIPlugin { if (proceedShutdown || forced) { // Terminate the scanner - ILocatorModel model = Model.getModel(true); + final ILocatorModel model = Model.getModel(true); if (model != null) model.getScanner().terminate(); + // Disconnect all connected connections via the stepper service + if (model != null) { + final AsyncCallbackCollector collector = new AsyncCallbackCollector(); + + Runnable runnable = new Runnable() { + @Override + public void run() { + // Get all peer model objects + IPeerModel[] peers = model.getPeers(); + // Loop them and check if disconnect is available + for (IPeerModel peerModel : peers) { + IStepperService service = ServiceManager.getInstance().getService(peerModel, IStepperService.class); + if (service != null) { + String stepGroupId = service.getStepGroupId(peerModel, IStepperService.OPERATION_DISCONNECT); + IStepContext stepContext = service.getStepContext(peerModel, IStepperService.OPERATION_DISCONNECT); + String name = service.getStepGroupName(peerModel, IStepperService.OPERATION_DISCONNECT); + boolean isEnabled = service.isEnabled(peerModel, IStepperService.OPERATION_DISCONNECT); + + if (isEnabled && stepGroupId != null && stepContext != null) { + IPropertiesContainer data = new PropertiesContainer(); + StepperJob job = new StepperJob(name != null ? name : "", //$NON-NLS-1$ + stepContext, + data, + stepGroupId, + IStepperService.OPERATION_DISCONNECT); + + ICallback callback = new AsyncCallbackCollector.SimpleCollectorCallback(collector); + job.setJobCallback(callback); + + job.schedule(); + } + } + } + + collector.initDone(); + } + }; + + Assert.isTrue(!Protocol.isDispatchThread()); + Protocol.invokeAndWait(runnable); + + ExecutorsUtil.waitAndExecute(0, collector.getConditionTester()); + } + // Close all channels now Tcf.getChannelManager().closeAll(!Protocol.isDispatchThread()); } |