blob: 8c633b8449b59d600f513873ee6a304a5de04099 [file] [log] [blame]
package org.eclipse.ptp.debug.internal.core.pdi.model;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.ptp.core.util.BitList;
import org.eclipse.ptp.debug.core.pdi.IPDISession;
import org.eclipse.ptp.debug.core.pdi.PDIException;
import org.eclipse.ptp.debug.core.pdi.SessionObject;
import org.eclipse.ptp.debug.core.pdi.model.IPDIExpression;
import org.eclipse.ptp.debug.core.pdi.model.IPDIMultiExpressions;
import org.eclipse.ptp.debug.core.pdi.model.aif.AIFFactory;
import org.eclipse.ptp.debug.core.pdi.model.aif.IAIF;
import org.eclipse.ptp.debug.core.pdi.request.IPDIDataEvaluateExpressionRequest;
/**
* @author clement
*
*/
/**
* @author greg
*
*/
public class MultiExpressions extends SessionObject implements IPDIMultiExpressions {
class MExpression implements IPDIExpression {
private int id;
private IAIF aif;
public MExpression(int id) {
this.id = id;
}
public void dispose() throws PDIException {
aif = null;
}
public boolean equals(IPDIExpression expr) {
if (expr instanceof MExpression) {
return ((MExpression)expr).getId() == id;
}
return false;
}
public IAIF getAIF() throws PDIException {
return aif;
}
public String getExpressionText() {
return expr;
}
public int getId() {
return id;
}
public void setAIF(IAIF aif) {
this.aif = aif;
}
}
private String expr;
private boolean enabled;
private Map<Integer,IPDIExpression> expressions = new HashMap<Integer,IPDIExpression>();
public MultiExpressions(IPDISession session, BitList tasks, String ex, boolean enabled) {
super(session, tasks);
this.expr = ex;
this.enabled = enabled;
initital();
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.pdi.model.IPDIMultiExpressions#addExpression(org.eclipse.ptp.debug.core.pdi.model.IPDIExpression)
*/
public void addExpression(IPDIExpression expression) {
if (expression instanceof MExpression) {
Integer id = new Integer(((MExpression)expression).getId());
expressions.put(id, expression);
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.pdi.model.IPDIMultiExpressions#cleanExpressionsValue(org.eclipse.ptp.core.util.BitList, org.eclipse.core.runtime.IProgressMonitor)
*/
public void cleanExpressionsValue(BitList tasks, IProgressMonitor monitor) {
monitor.setTaskName("Cleaning expression ["+expr+"]...");
for (int task : tasks.toArray()) {
IPDIExpression expression = getExpression(task);
if (expression != null) {
expression.setAIF(null);
}
monitor.worked(1);
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.pdi.model.IPDIMultiExpressions#getAIF(org.eclipse.ptp.debug.core.pdi.model.IPDIExpression)
*/
public IAIF getAIF(IPDIExpression expression) throws PDIException {
return expression.getAIF();
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.pdi.model.IPDIMultiExpressions#getExpression(int)
*/
public IPDIExpression getExpression(int task) {
return expressions.get(new Integer(task));
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.pdi.model.IPDIMultiExpressions#getExpressions()
*/
public IPDIExpression[] getExpressions() {
return expressions.values().toArray(new IPDIExpression[0]);
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.pdi.model.IPDIMultiExpressions#getExpressionText()
*/
public String getExpressionText() {
return expr;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.pdi.model.IPDIMultiExpressions#isEnabled()
*/
public boolean isEnabled() {
return enabled;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.pdi.model.IPDIMultiExpressions#removeExpression(org.eclipse.ptp.core.util.BitList)
*/
public void removeExpression(BitList tasks) {
for (int task : tasks.toArray()) {
expressions.remove(new Integer(task));
}
}
public void removeExpression(IPDIExpression expression) {
if (expression instanceof MExpression) {
Integer id = new Integer(((MExpression)expression).getId());
expressions.remove(id);
}
}
/**
* @param enabled
*/
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.pdi.model.IPDIMultiExpressions#shutdown()
*/
public void shutdown() {
expressions.clear();
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.pdi.model.IPDIMultiExpressions#updateExpressionsValue(org.eclipse.ptp.core.util.BitList, org.eclipse.core.runtime.IProgressMonitor)
*/
public void updateExpressionsValue(BitList tasks, IProgressMonitor monitor) throws PDIException {
monitor.setTaskName("Updating expression ["+expr+"]...");
IPDIDataEvaluateExpressionRequest request = session.getRequestFactory().getDataEvaluateExpresionRequest(tasks, expr);
session.getEventRequestManager().addEventRequest(request);
Map<BitList, Object> results = request.getResultMap(tasks);
for (Iterator<BitList> i = results.keySet().iterator(); i.hasNext();) {
BitList sTasks = i.next();
Object obj = results.get(sTasks);
if (!(obj instanceof IAIF)) {
//set unknown aif for tasks
for (int task : sTasks.toArray()) {
IPDIExpression expression = getExpression(task);
if (expression == null)
continue;
expression.setAIF(AIFFactory.UNKNOWNAIF());
}
continue;
//throw new PDIException(tasks, "Updating expression value error");
}
IAIF aif = (IAIF)obj;
for (int task : sTasks.toArray()) {
IPDIExpression expression = getExpression(task);
if (expression == null)
continue;
if (monitor.isCanceled()) {
expression.setAIF(AIFFactory.UNKNOWNAIF());
throw new PDIException(tasks, "Updating is cancelled by user");
}
expression.setAIF(aif);
monitor.worked(1);
}
}
}
/**
*
*/
private void initital() {
for (int task : getTasks().toArray()) {
addExpression(new MExpression(task));
}
}
}