/** * Copyright (c) 2011 committers of YAKINDU 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: * committers of YAKINDU - initial API and implementation * */ package org.yakindu.sct.simulation.core.debugmodel; import org.eclipse.core.resources.IMarkerDelta; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.core.model.IMemoryBlock; import org.eclipse.debug.core.model.IProcess; import org.eclipse.debug.core.model.IStep; import org.eclipse.debug.core.model.IThread; import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.ecore.EObject; import org.yakindu.base.base.NamedElement; import org.yakindu.sct.simulation.core.engine.IExecutionControl; import org.yakindu.sct.simulation.core.engine.ISimulationEngine; import org.yakindu.sct.simulation.core.sruntime.ExecutionContext; /** * * @author andreas muelder - Initial contribution and API * @author axel terfloth - extensions * */ public class SCTDebugTarget extends SCTDebugElement implements IDebugTarget, IStep { private ILaunch launch; private boolean stepping = false; private boolean terminated = false; private boolean suspended = false; private final NamedElement element; protected ISimulationEngine engine; private IExecutionControl executionControl; private AdapterImpl updater; public SCTDebugTarget(ILaunch launch, NamedElement element, ISimulationEngine engine) throws CoreException { super(null, element.eResource().getURI().toPlatformString(true)); Assert.isNotNull(element); this.launch = launch; this.element = element; this.engine = engine; } public void init() { executionControl = engine.getExecutionControl(); executionControl.init(); DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(this); } public void start() { executionControl.start(); } public IProcess getProcess() { return null; } public void stepOver() { fireEvent(new DebugEvent(getDebugTarget(), DebugEvent.STEP_OVER)); engine.getExecutionControl().stepForward(); } public synchronized IThread[] getThreads() throws DebugException { return new IThread[] {}; } public boolean hasThreads() throws DebugException { return false; } public String getName() throws DebugException { return element.getName(); } public boolean supportsBreakpoint(IBreakpoint breakpoint) { return breakpoint.getModelIdentifier().startsWith("com.yakindu.sct.simulation"); } public boolean canTerminate() { return !terminated; } public boolean isTerminated() { return terminated; } public void terminate() throws DebugException { fireEvent(new DebugEvent(getDebugTarget(), DebugEvent.TERMINATE)); terminated = true; executionControl.terminate(); engine.getExecutionContext().eAdapters().remove(updater); } public boolean canResume() { return suspended && !terminated; } public boolean canSuspend() { return !suspended && !terminated; } public boolean isSuspended() { return suspended; } public void resume() throws DebugException { fireEvent(new DebugEvent(this, DebugEvent.RESUME)); fireChangeEvent(DebugEvent.CONTENT); suspended = false; executionControl.resume(); } public void suspend() throws DebugException { fireEvent(new DebugEvent(this, DebugEvent.SUSPEND)); fireChangeEvent(DebugEvent.CONTENT); suspended = true; executionControl.suspend(); } public void breakpointAdded(IBreakpoint breakpoint) { } public void breakpointRemoved(IBreakpoint breakpoint, IMarkerDelta delta) { } public void breakpointChanged(IBreakpoint breakpoint, IMarkerDelta delta) { } public boolean canDisconnect() { return false; } public void disconnect() throws DebugException { } public boolean isDisconnected() { return false; } public boolean supportsStorageRetrieval() { return false; } public IMemoryBlock getMemoryBlock(long startAddress, long length) throws DebugException { return null; } public ILaunch getLaunch() { return launch; } public IDebugTarget getDebugTarget() { return this; } @SuppressWarnings("unchecked") public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) { if (adapter == ISimulationEngine.class) return engine; if (adapter == IExecutionControl.class) { return engine.getExecutionControl(); } if (adapter == ExecutionContext.class) { return engine.getExecutionContext(); } if (adapter == EObject.class) { return element; } return super.getAdapter(adapter); } public boolean canStepOver() { return isSuspended() && !isTerminated(); } public boolean isStepping() { return stepping; } public ISimulationEngine getSimulationEngine() { return engine; } public boolean canStepInto() { // Not used return false; } public boolean canStepReturn() { // Not used return false; } public void stepInto() throws DebugException { } public void stepReturn() throws DebugException { } }