blob: 6e0ec65cc95ca24e4dcbb72c9d027dbbce553b50 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 The Regents of the University of California.
* This material was produced under U.S. Government contract W-7405-ENG-36
* for Los Alamos National Laboratory, which is operated by the University
* of California for the U.S. Department of Energy. The U.S. Government has
* rights to use, reproduce, and distribute this software. NEITHER THE
* GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR
* ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified
* to produce derivative works, such modified software should be clearly marked,
* so as not to confuse it with the version available from LANL.
*
* Additionally, 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
*
* LA-CC 04-115
*******************************************************************************/
package org.eclipse.ptp.debug.internal.core.pdi.manager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ptp.debug.core.TaskSet;
import org.eclipse.ptp.debug.core.pdi.IPDISession;
import org.eclipse.ptp.debug.core.pdi.PDIException;
import org.eclipse.ptp.debug.core.pdi.event.IPDIEvent;
import org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager;
import org.eclipse.ptp.debug.core.pdi.messages.Messages;
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.IPDIStackFrame;
import org.eclipse.ptp.debug.core.pdi.model.IPDITarget;
import org.eclipse.ptp.debug.core.pdi.model.IPDITargetExpression;
import org.eclipse.ptp.debug.core.pdi.model.IPDIThread;
import org.eclipse.ptp.debug.core.pdi.model.IPDIVariable;
import org.eclipse.ptp.debug.core.pdi.model.aif.IAIF;
import org.eclipse.ptp.debug.core.pdi.request.IPDIDeleteVariableRequest;
import org.eclipse.ptp.debug.core.pdi.request.IPDIEvaluateExpressionRequest;
import org.eclipse.ptp.debug.core.pdi.request.IPDIEvaluatePartialExpressionRequest;
/**
* @author Clement chu
*
*/
public class ExpressionManager extends AbstractPDIManager implements IPDIExpressionManager {
final static IPDIExpression[] EMPTY_EXPRESSIONS = {};
Map<TaskSet, List<IPDIExpression>> expMap;
Map<TaskSet, List<IPDIVariable>> varMap;
Map<String, IPDIMultiExpressions> mutliExprMap;
public ExpressionManager(IPDISession session) {
super(session, true);
expMap = new Hashtable<TaskSet, List<IPDIExpression>>();
varMap = new Hashtable<TaskSet, List<IPDIVariable>>();
mutliExprMap = new HashMap<String, IPDIMultiExpressions>();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager#
* cleanMultiExpressions(org.eclipse.ptp.core.util.TaskSet,
* org.eclipse.core.runtime.IProgressMonitor)
*/
public void cleanMultiExpressions(TaskSet tasks, IProgressMonitor monitor) throws PDIException {
for (IPDIMultiExpressions mexpr : getMultiExpressions()) {
mexpr.cleanExpressionsValue(tasks, monitor);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager#
* cleanMultiExpressions(java.lang.String,
* org.eclipse.ptp.core.util.TaskSet,
* org.eclipse.core.runtime.IProgressMonitor)
*/
public void cleanMultiExpressions(String exprText, TaskSet tasks, IProgressMonitor monitor) throws PDIException {
IPDIMultiExpressions mexpr = getMultiExpression(exprText);
if (mexpr == null)
throw new PDIException(tasks, NLS.bind(Messages.ExpressionManager_0, exprText));
mexpr.cleanExpressionsValue(tasks, monitor);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager#createExpression
* (org.eclipse.ptp.core.util.TaskSet, java.lang.String)
*/
public IPDITargetExpression createExpression(TaskSet qTasks, String name) throws PDIException {
IPDITargetExpression expression = session.getModelFactory().newExpression(session, qTasks, name);
List<IPDIExpression> exprList = getExpressionList(qTasks);
exprList.add(expression);
return expression;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager#
* createMutliExpressions(org.eclipse.ptp.core.util.TaskSet,
* java.lang.String, boolean)
*/
public void createMutliExpressions(TaskSet tasks, String exprText, boolean enabled) {
mutliExprMap.put(exprText, session.getModelFactory().newMultiExpressions(session, tasks, exprText, enabled));
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager#createVariable
* (org.eclipse.ptp.debug.core.pdi.model.IPDIStackFrame, java.lang.String)
*/
public IPDIVariable createVariable(IPDIStackFrame frame, String expr) throws PDIException {
IPDITarget target = frame.getTarget();
IPDIThread currentThread = target.getCurrentThread();
IPDIStackFrame currentFrame = currentThread.getCurrentStackFrame();
target.lockTarget();
try {
target.setCurrentThread(frame.getThread(), false);
frame.getThread().setCurrentStackFrame(frame, false);
IPDIEvaluatePartialExpressionRequest request = session.getRequestFactory().getEvaluatePartialExpressionRequest(
target.getTasks(), expr, null, false);
session.getEventRequestManager().addEventRequest(request);
IAIF aif = request.getPartialAIF(target.getTasks());
String varid = request.getId(target.getTasks());
IPDIVariable v = session.getModelFactory().newLocalVariable(session, target.getTasks(), null, frame, expr, null, 0, 0,
varid);
v.setAIF(aif);
List<IPDIVariable> varList = getVariableList(target.getTasks());
varList.add(v);
return v;
} finally {
target.setCurrentThread(currentThread, false);
currentThread.setCurrentStackFrame(currentFrame, false);
target.releaseTarget();
}
}
/**
* @param qTasks
* @throws PDIException
*/
public void deleteAllVariables(TaskSet qTasks) throws PDIException {
List<IPDIVariable> varList = getVariableList(qTasks);
IPDIVariable[] variables = varList.toArray(new IPDIVariable[varList.size()]);
for (int i = 0; i < variables.length; ++i) {
deleteVariable(variables[i]);
}
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager#deleteVariable
* (org.eclipse.ptp.debug.core.pdi.model.IPDIVariable)
*/
public void deleteVariable(IPDIVariable variable) throws PDIException {
IPDIDeleteVariableRequest request = session.getRequestFactory().getDeletePartialExpressionRequest(variable.getTasks(),
variable.getId());
session.getEventRequestManager().addEventRequest(request);
request.waitUntilCompleted(variable.getTasks());
List<IPDIVariable> varList = getVariableList(variable.getTasks());
varList.remove(variable);
List<IPDIEvent> eventList = new ArrayList<IPDIEvent>();
IPDIVariable[] children = variable.getChildren();
if (children != null) {
for (int i = 0; i < children.length; ++i) {
if (children[0] instanceof IPDIVariable) {
IPDIVariable child = children[i];
eventList.add(session.getEventFactory().newDestroyedEvent(
session.getEventFactory().newVariableInfo(session, variable.getTasks(), child.getId(), child)));
}
}
}
eventList.add(session.getEventFactory().newDestroyedEvent(
session.getEventFactory().newVariableInfo(session, variable.getTasks(), variable.getId(), variable)));
session.getEventManager().fireEvents(eventList.toArray(new IPDIEvent[0]));
}
/**
* @param qTasks
* @throws PDIException
*/
public void destroyAllExpressions(TaskSet qTasks) throws PDIException {
IPDIExpression[] expressions = getExpressions(qTasks);
destroyExpressions(qTasks, expressions);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager#
* destroyExpressions(org.eclipse.ptp.core.util.TaskSet,
* org.eclipse.ptp.debug.core.pdi.model.IPDIExpression[])
*/
public void destroyExpressions(TaskSet qTasks, IPDIExpression[] expressions) throws PDIException {
List<IPDIExpression> expList = getExpressionList(qTasks);
for (int i = 0; i < expressions.length; ++i) {
expList.remove(expressions[i]);
}
}
/**
* @param qTasks
* @param expr
* @return
* @throws PDIException
*/
public IAIF getAIF(TaskSet qTasks, String expr) throws PDIException {
IPDIEvaluatePartialExpressionRequest request = session.getRequestFactory().getEvaluatePartialExpressionRequest(qTasks,
expr, null, false);
session.getEventRequestManager().addEventRequest(request);
return request.getPartialAIF(qTasks);
}
/**
* @param qTasks
* @return
* @throws PDIException
*/
public IPDIExpression[] getExpressions(TaskSet qTasks) throws PDIException {
List<IPDIExpression> expList = expMap.get(qTasks);
if (expList != null) {
return expList.toArray(EMPTY_EXPRESSIONS);
}
return EMPTY_EXPRESSIONS;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager#
* getExpressionValue(org.eclipse.ptp.core.util.TaskSet, java.lang.String)
*/
public IAIF getExpressionValue(TaskSet qTasks, String expr) throws PDIException {
IPDIEvaluateExpressionRequest request = session.getRequestFactory().getEvaluateExpressionRequest(qTasks, expr);
session.getEventRequestManager().addEventRequest(request);
return request.getAIF(qTasks);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager#
* getMultiExpression(java.lang.String)
*/
public IPDIMultiExpressions getMultiExpression(String exprText) {
return mutliExprMap.get(exprText);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager#
* getMultiExpressions()
*/
public IPDIMultiExpressions[] getMultiExpressions() {
return mutliExprMap.values().toArray(new IPDIMultiExpressions[0]);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager#
* getMultiExpressions(int)
*/
public IPDIExpression[] getMultiExpressions(int task) {
List<IPDIExpression> exprList = new ArrayList<IPDIExpression>();
for (IPDIMultiExpressions mexpr : getMultiExpressions()) {
if (!mexpr.isEnabled())
continue;
IPDIExpression expr = mexpr.getExpression(task);
if (expr != null) {
exprList.add(expr);
}
}
return exprList.toArray(new IPDIExpression[0]);
}
/**
* @param qTasks
* @param varId
* @return
*/
public IPDIVariable getVariable(TaskSet qTasks, String varid) {
List<IPDIVariable> varList = getVariableList(qTasks);
IPDIVariable[] vars = varList.toArray(new IPDIVariable[0]);
for (int i = 0; i < vars.length; i++) {
if (vars[i].getId().equals(varid)) {
return vars[i];
}
IPDIVariable v = vars[i].getChild(varid);
if (v != null) {
return v;
}
}
return null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager#
* removeMutliExpressions(org.eclipse.ptp.core.util.TaskSet,
* java.lang.String)
*/
public void removeMutliExpressions(TaskSet tasks, String exprText) {
IPDIMultiExpressions mexpr = getMultiExpression(exprText);
if (mexpr != null) {
mexpr.removeExpression(tasks);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager#
* removeMutliExpressions(java.lang.String)
*/
public void removeMutliExpressions(String exprText) {
IPDIMultiExpressions mexpr = getMultiExpression(exprText);
if (mexpr != null) {
mexpr.shutdown();
}
mutliExprMap.remove(exprText);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ptp.debug.internal.core.pdi.AbstractPDIManager#shutdown()
*/
@Override
public void shutdown() {
expMap.clear();
varMap.clear();
mutliExprMap.clear();
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ptp.debug.internal.core.pdi.AbstractPDIManager#update(org
* .eclipse.ptp.core.util.TaskSet)
*/
@Override
public void update(TaskSet qTasks) throws PDIException {
update(qTasks, new String[0]);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager#update(org
* .eclipse.ptp.core.util.TaskSet, java.lang.String[])
*/
public void update(TaskSet qTasks, String[] varList) throws PDIException {
List<IPDIEvent> eventList = new ArrayList<IPDIEvent>();
for (int i = 0; i < varList.length; i++) {
IPDIVariable variable = getVariable(qTasks, varList[i]);
if (variable != null) {
eventList.add(session.getEventFactory().newChangedEvent(
session.getEventFactory().newVariableInfo(session, qTasks, varList[i], variable)));
}
}
session.getEventManager().fireEvents(eventList.toArray(new IPDIEvent[0]));
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager#
* updateMultiExpressions(org.eclipse.ptp.core.util.TaskSet,
* org.eclipse.core.runtime.IProgressMonitor)
*/
public void updateMultiExpressions(TaskSet tasks, IProgressMonitor monitor) throws PDIException {
for (IPDIMultiExpressions mexpr : getMultiExpressions()) {
if (mexpr.isEnabled())
mexpr.updateExpressionsValue(tasks, monitor);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager#
* updateMultiExpressions(java.lang.String,
* org.eclipse.ptp.core.util.TaskSet,
* org.eclipse.core.runtime.IProgressMonitor)
*/
public void updateMultiExpressions(String exprText, TaskSet tasks, IProgressMonitor monitor) throws PDIException {
IPDIMultiExpressions mexpr = getMultiExpression(exprText);
if (mexpr == null)
throw new PDIException(tasks, NLS.bind(Messages.ExpressionManager_0, exprText));
if (mexpr.isEnabled())
mexpr.updateExpressionsValue(tasks, monitor);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.debug.core.pdi.manager.IPDIExpressionManager#
* updateStatusMultiExpressions(java.lang.String, boolean)
*/
public void updateStatusMultiExpressions(String exprText, boolean enabled) {
IPDIMultiExpressions mexpr = getMultiExpression(exprText);
if (mexpr != null) {
mexpr.setEnabled(enabled);
}
}
/**
* @param qTasks
* @return
*/
private synchronized List<IPDIExpression> getExpressionList(TaskSet qTasks) {
List<IPDIExpression> expList = expMap.get(qTasks);
if (expList == null) {
expList = Collections.synchronizedList(new ArrayList<IPDIExpression>());
expMap.put(qTasks, expList);
}
return expList;
}
/**
* @param qTasks
* @return
*/
private synchronized List<IPDIVariable> getVariableList(TaskSet qTasks) {
List<IPDIVariable> varList = varMap.get(qTasks);
if (varList == null) {
varList = Collections.synchronizedList(new ArrayList<IPDIVariable>());
varMap.put(qTasks, varList);
}
return varList;
}
}