blob: b78e93bb8e0522e10c21c1349f5f81c07c61d4ba [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2009 Wind River Systems and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.examples.dsf.timers;
import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.concurrent.Sequence;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.cdt.dsf.service.IDsfService;
import org.eclipse.cdt.examples.dsf.DsfExamplesPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
/**
* Sequence that stops the services in the timers session.
*/
public class ServicesShutdownSequence extends Sequence {
// Session that the services are running in.
final private DsfSession fSession;
// DSF Services is created as the first step of the sequence. It
// cannot be created by the constructor because it can only be called
// in the session thread.
DsfServicesTracker fTracker;
public ServicesShutdownSequence(DsfSession session) {
super(session.getExecutor());
fSession = session;
}
Step[] fSteps = new Step[] { new Step() {
@Override
public void execute(RequestMonitor requestMonitor) {
fTracker = new DsfServicesTracker(DsfExamplesPlugin.getBundleContext(), fSession.getId());
requestMonitor.done();
}
@Override
public void rollBack(RequestMonitor requestMonitor) {
// Dispose the tracker in case shutdown sequence is aborted
// and is rolled back.
fTracker.dispose();
fTracker = null;
requestMonitor.done();
}
}, new Step() {
@Override
public void execute(RequestMonitor requestMonitor) {
shutdownService(AlarmService.class, requestMonitor);
}
}, new Step() {
@Override
public void execute(RequestMonitor requestMonitor) {
shutdownService(TimerService.class, requestMonitor);
}
}, new Step() {
@Override
public void execute(RequestMonitor requestMonitor) {
// Dispose the tracker after the services are shut down.
fTracker.dispose();
fTracker = null;
requestMonitor.done();
}
} };
@Override
public Step[] getSteps() {
return fSteps;
}
// A convenience method that shuts down given service. Only service class
// is used to identify the service.
private <V extends IDsfService> void shutdownService(Class<V> clazz, RequestMonitor requestMonitor) {
IDsfService service = fTracker.getService(clazz);
if (service != null) {
service.shutdown(requestMonitor);
} else {
requestMonitor.setStatus(new Status(IStatus.ERROR, DsfExamplesPlugin.PLUGIN_ID,
IDsfStatusConstants.INTERNAL_ERROR, "Service '" + clazz.getName() + "' not found.", null));
requestMonitor.done();
}
}
}