/*******************************************************************************
* Copyright (c) 2008, 2010 Wind River Systems 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.cdt.examples.dsf.pda.launch;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.concurrent.Sequence;
import org.eclipse.cdt.dsf.datamodel.DataModelInitializedEvent;
import org.eclipse.cdt.dsf.debug.service.BreakpointsMediator;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.cdt.examples.dsf.pda.service.PDABackend;
import org.eclipse.cdt.examples.dsf.pda.service.PDABreakpointAttributeTranslator;
import org.eclipse.cdt.examples.dsf.pda.service.PDABreakpoints;
import org.eclipse.cdt.examples.dsf.pda.service.PDACommandControl;
import org.eclipse.cdt.examples.dsf.pda.service.PDAExpressions;
import org.eclipse.cdt.examples.dsf.pda.service.PDARegisters;
import org.eclipse.cdt.examples.dsf.pda.service.PDARunControl;
import org.eclipse.cdt.examples.dsf.pda.service.PDAStack;
/**
* The initialization sequence for PDA debugger services. This sequence contains
* the series of steps that are executed to properly initialize the PDA-DSF debug
* session. If any of the individual steps fail, the initialization will abort.
* <p>
* The order in which services are initialized is important. Some services depend
* on other services and they assume that they will be initialized only if those
* services are active. Also the service events are prioritized and their priority
* depends on the order in which the services were initialized.
* </p>
*/
public class PDAServicesInitSequence extends Sequence {
Step[] fSteps = new Step[] {
new Step()
{
@Override
public void execute(RequestMonitor requestMonitor) {
// Start PDA back end debugger service.
new PDABackend(fSession, fLaunch, fProgram).initialize(requestMonitor);
}
},
new Step()
{
@Override
public void execute(RequestMonitor requestMonitor) {
// Start PDA command control service.
fCommandControl = new PDACommandControl(fSession);
fCommandControl.initialize(requestMonitor);
}
},
new Step() {
@Override
public void execute(RequestMonitor requestMonitor) {
// Start the run control service.
fRunControl = new PDARunControl(fSession);
fRunControl.initialize(requestMonitor);
}
},
new Step() {
@Override
public void execute(final RequestMonitor requestMonitor) {
// Start the low-level breakpoint service
new PDABreakpoints(fSession).initialize(new RequestMonitor(getExecutor(), requestMonitor));
}
},
new Step() {
@Override
public void execute(final RequestMonitor requestMonitor) {
// Create the breakpoint mediator and start tracking PDA breakpoints.
final BreakpointsMediator bpmService = new BreakpointsMediator(
fSession, new PDABreakpointAttributeTranslator());
bpmService.initialize(new RequestMonitor(getExecutor(), requestMonitor) {
@Override
protected void handleSuccess() {
bpmService.startTrackingBreakpoints(fCommandControl.getContext(), requestMonitor);
}
});
}
},
new Step() {
@Override
public void execute(RequestMonitor requestMonitor) {
// Start the stack service.
new PDAStack(fSession).initialize(requestMonitor);
}
},
new Step() {
@Override
public void execute(RequestMonitor requestMonitor) {
// Start the service to track expressions.
new PDAExpressions(fSession).initialize(requestMonitor);
}
},
new Step() {
@Override
public void execute(RequestMonitor requestMonitor) {
// Start the service to track expressions.
new PDARegisters(fSession).initialize(requestMonitor);
}
},
/*
* Indicate that the Data Model has been filled. This will trigger the Debug view to expand.
*/
new Step() {
@Override
public void execute(final RequestMonitor requestMonitor) {
fSession.dispatchEvent(
new DataModelInitializedEvent(fCommandControl.getContext()),
fCommandControl.getProperties());
requestMonitor.done();
}
}
};
// Sequence input parameters, used in initializing services.
private PDALaunch fLaunch;
private DsfSession fSession;
private String fProgram;
// Service references, initialized when created and used in initializing other services.
private PDACommandControl fCommandControl;
private PDARunControl fRunControl;
public PDAServicesInitSequence(DsfSession session, PDALaunch launch, String program, RequestMonitor rm)
{
super(session.getExecutor(), rm);
fLaunch = launch;
fSession = session;
fProgram = program;
}
@Override
public Step[] getSteps() {
return fSteps;
}
}