blob: a72a712c13e52ff3774010e8323753eac200b984 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2009 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ant.internal.launching.debug.model;
import org.eclipse.ant.internal.launching.AntLaunchingUtil;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IRegisterGroup;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IThread;
import org.eclipse.debug.core.model.IVariable;
/**
* Ant stack frame.
*/
public class AntStackFrame extends AntDebugElement implements IStackFrame {
private AntThread fThread;
private String fName;
private int fLineNumber;
private String fFilePath;
private int fId;
private String fFullPath;
/**
* Constructs a stack frame in the given thread with the given id.
*
* @param antThread
* @param id stack frame id (0 is the top of the stack)
*/
public AntStackFrame(AntThread antThread, int id, String name, String fullPath, int lineNumber) {
super((AntDebugTarget) antThread.getDebugTarget());
fId = id;
fThread = antThread;
fLineNumber= lineNumber;
fName= name;
setFilePath(fullPath);
}
public void setId(int id) {
fId= id;
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getThread()
*/
public IThread getThread() {
return fThread;
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getVariables()
*/
public IVariable[] getVariables() throws DebugException {
return fThread.getVariables();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#hasVariables()
*/
public boolean hasVariables() {
return isSuspended();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getLineNumber()
*/
public int getLineNumber() {
return fLineNumber;
}
public void setLineNumber(int lineNumber) {
fLineNumber= lineNumber;
}
public void setFilePath(String fullPath) {
fFullPath= fullPath;
IFile file= AntLaunchingUtil.getFileForLocation(fullPath, null);
if (file != null) {
fFilePath= file.getProjectRelativePath().toString();
} else {
fFilePath= new Path(fullPath).lastSegment();
}
}
public String getFilePath() {
return fFullPath;
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getCharStart()
*/
public int getCharStart() {
return -1;
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getCharEnd()
*/
public int getCharEnd() {
return -1;
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getName()
*/
public String getName() {
return fName;
}
public void setName(String name) {
fName= name;
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getRegisterGroups()
*/
public IRegisterGroup[] getRegisterGroups() {
return null;
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#hasRegisterGroups()
*/
public boolean hasRegisterGroups() {
return false;
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#canStepInto()
*/
public boolean canStepInto() {
return getThread().canStepInto();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#canStepOver()
*/
public boolean canStepOver() {
return getThread().canStepOver();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#canStepReturn()
*/
public boolean canStepReturn() {
return getThread().canStepReturn();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#isStepping()
*/
public boolean isStepping() {
return getThread().isStepping();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#stepInto()
*/
public void stepInto() throws DebugException {
getThread().stepInto();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#stepOver()
*/
public void stepOver() throws DebugException {
getThread().stepOver();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#stepReturn()
*/
public void stepReturn() throws DebugException {
getThread().stepReturn();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#canResume()
*/
public boolean canResume() {
return getThread().canResume();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
*/
public boolean canSuspend() {
return getThread().canSuspend();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
*/
public boolean isSuspended() {
return getThread().isSuspended();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#resume()
*/
public void resume() throws DebugException {
getThread().resume();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#suspend()
*/
public void suspend() throws DebugException {
getThread().suspend();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.ITerminate#canTerminate()
*/
public boolean canTerminate() {
return getThread().canTerminate();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.ITerminate#isTerminated()
*/
public boolean isTerminated() {
return getThread().isTerminated();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.ITerminate#terminate()
*/
public void terminate() throws DebugException {
getThread().terminate();
}
/**
* Returns the name of the buildfile this stack frame is associated
* with.
*
* @return the name of the buildfile this stack frame is associated
* with
*/
public String getSourceName() {
return fFilePath;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
if (obj instanceof AntStackFrame) {
AntStackFrame sf = (AntStackFrame)obj;
if (getSourceName() != null) {
return getSourceName().equals(sf.getSourceName()) &&
sf.getLineNumber() == getLineNumber() &&
sf.fId == fId;
}
return sf.fId == fId;
}
return false;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
if (getSourceName() == null) {
return fId;
}
return getSourceName().hashCode() + fId;
}
/**
* Returns this stack frame's unique identifier within its thread
*
* @return this stack frame's unique identifier within its thread
*/
protected int getIdentifier() {
return fId;
}
/**
* Returns the system, user or runtime property
* name, or <code>null</code> if unable to resolve a property with the name.
*
* @param propertyName the name of the variable to search for
* @return a property, or <code>null</code> if none
*/
public AntProperty findProperty(String propertyName) {
try {
IVariable[] groups= getVariables();
for (int i = 0; i < groups.length; i++) {
AntProperties propertiesGrouping = (AntProperties) groups[i];
AntPropertiesValue value= (AntPropertiesValue) propertiesGrouping.getValue();
IVariable[] properties= value.getVariables();
for (int j = 0; j < properties.length; j++) {
AntProperty property = (AntProperty) properties[j];
if (property.getName().equals(propertyName)) {
return property;
}
}
}
} catch (DebugException e) {
}
return null;
}
}