/*******************************************************************************
* Copyright (c) 2004 Vlad Dumitrescu 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:
* Vlad Dumitrescu
*******************************************************************************/
package org.erlide.backend.debug;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.model.LineBreakpoint;
import org.erlide.backend.api.IBackend;
import org.erlide.backend.debug.model.ErlangDebugTarget;
import org.erlide.engine.ErlangEngine;
import org.erlide.engine.model.ErlModelException;
import org.erlide.engine.model.IErlElement;
import org.erlide.engine.model.erlang.IErlFunctionClause;
import org.erlide.engine.model.root.IErlModule;
import org.erlide.util.ErlLogger;
public class ErlangLineBreakpoint extends LineBreakpoint implements IErlangBreakpoint {
public static final String ERLANG_LINE_BREAKPOINT_MARKER_TYPE = "org.erlide.core.erlang.lineBreakpoint.marker";
private ErlangDebugTarget target;
private String clauseHead;
private int fHitCount;
private int fBreakAction = BREAK_ACTION_BREAK;
public ErlangLineBreakpoint() {
super();
}
@Override
public String getModelIdentifier() {
return ErlDebugConstants.ID_ERLANG_DEBUG_MODEL;
}
public void createMarker(final IResource resource, final int lineNumber)
throws CoreException {
final IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
@Override
public void run(final IProgressMonitor monitor) throws CoreException {
final IMarker marker = DebugMarkerUtils.createErlangLineBreakpointMarker(
resource, lineNumber, getModelIdentifier());
setMarker(marker);
resetClauseHead(lineNumber - 1, resource);
}
};
run(getMarkerRule(resource), runnable);
}
protected void resetClauseHead(final int lineNumber, final IResource resource) {
clauseHead = "";
if (resource instanceof IFile) {
final IFile file = (IFile) resource;
final IErlModule m = ErlangEngine.getInstance().getModel().findModule(file);
if (m != null) {
try {
m.open(null);
final IErlElement e = m.getElementAtLine(lineNumber);
if (e instanceof IErlFunctionClause) {
final IErlFunctionClause clause = (IErlFunctionClause) e;
clauseHead = clause.getName() + clause.getHead();
}
} catch (final ErlModelException e1) {
ErlLogger.warn(e1);
}
}
}
}
/**
* Installs this breakpoint
*
* @param theTarget
* debug target
*/
public void install(final ErlangDebugTarget theTarget) {
target = theTarget;
if (theTarget != null) {
createRequest(ErlDebugConstants.REQUEST_INSTALL);
}
}
private void createRequest(final int request) {
final IBackend b = target.getBackend();
int line = -1;
try {
line = getLineNumber();
} catch (final CoreException e) {
ErlLogger.warn(e);
}
final IResource r = getMarker().getResource();
final String module = r.getLocation().toPortableString();
if (line != -1) {
ErlideDebug.addDeleteLineBreakpoint(b, module, line, request);
}
}
public String getModule() {
final IResource r = getMarker().getResource();
return r.getFullPath().removeFileExtension().lastSegment();
}
public void remove(final ErlangDebugTarget theTarget) {
target = theTarget;
if (theTarget != null) {
createRequest(ErlDebugConstants.REQUEST_REMOVE);
}
}
public String getClauseHead() {
if (clauseHead == null) {
try {
resetClauseHead(getLineNumber() - 1, getMarker().getResource());
} catch (final CoreException e) {
}
}
return clauseHead;
}
@Override
public void setMarker(final IMarker marker) throws CoreException {
super.setMarker(marker);
clauseHead = null;
}
@Override
public String getCondition() throws CoreException {
return null;
}
@Override
public boolean isConditionEnabled() throws CoreException {
return false;
}
@Override
public void setCondition(final String condition) throws CoreException {
}
@Override
public void setConditionEnabled(final boolean enabled) throws CoreException {
}
@Override
public boolean supportsCondition() {
return false;
}
@Override
public void setHitCount(final int hitCount) {
fHitCount = hitCount;
}
@Override
public int getHitCount() {
return fHitCount;
}
@Override
public int getBreakAction() {
return fBreakAction;
}
@Override
public void setBreakAction(final int traceAction) {
fBreakAction = traceAction;
}
public ErlangDebugTarget getTarget() {
return target;
}
@Override
public String getMessage() {
final IMarker marker = getMarker();
return "Line Breakpoint: " + marker.getResource().getName() + " [line: "
+ marker.getAttribute(IMarker.LINE_NUMBER, -1) + "]";
}
}