/** * Copyright (c) 2005-2012 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ /* * Author: tusk * Created: Dec 05, 2004 */ package org.python.pydev.debug.model; import java.util.Arrays; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.model.IDebugElement; import org.eclipse.debug.core.model.IValue; import org.eclipse.debug.core.model.IWatchExpressionDelegate; import org.eclipse.debug.core.model.IWatchExpressionListener; import org.eclipse.debug.core.model.IWatchExpressionResult; import org.python.pydev.debug.core.PydevDebugPlugin; import org.python.pydev.debug.model.remote.AbstractDebuggerCommand; import org.python.pydev.debug.model.remote.EvaluateExpressionCommand; import org.python.pydev.debug.model.remote.ICommandResponseListener; public class PyWatchExpressionDelegate implements IWatchExpressionDelegate, IWatchExpressionResult, ICommandResponseListener { protected PyVariable variables[] = new PyVariable[0]; protected IDebugElement context; protected String expression; protected IWatchExpressionListener listener; /* (non-Javadoc) * @see org.eclipse.debug.core.model.IWatchExpressionDelegate#evaluateExpression(java.lang.String, org.eclipse.debug.core.model.IDebugElement, org.eclipse.debug.core.model.IWatchExpressionListener) */ @Override public void evaluateExpression(String expression, IDebugElement context, IWatchExpressionListener listener) { this.expression = expression; this.context = context; this.listener = listener; if (context instanceof PyStackFrame) { AbstractDebugTarget target = (AbstractDebugTarget) context.getDebugTarget(); if (target == null) { return; //disposed } // send the command, and then busy-wait EvaluateExpressionCommand cmd = new EvaluateExpressionCommand(target, expression, ((PyStackFrame) context) .getLocalsLocator().getPyDBLocation(), false); cmd.setCompletionListener(this); target.postCommand(cmd); } else { addError("unknown expression context"); listener.watchEvaluationFinished(this); } } protected String errors[] = new String[0]; /* (non-Javadoc) * @see org.eclipse.debug.core.model.IWatchExpressionResult#getValue() */ @Override public IValue getValue() { synchronized (variables) { if (variables.length == 0) { variables = new PyVariable[1]; variables[0] = new PyVariable((AbstractDebugTarget) context.getDebugTarget(), "Error", "pydev ERROR", "Could not resolve variable", null); } return variables[0]; } } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IWatchExpressionResult#hasErrors() */ @Override public boolean hasErrors() { return errors.length > 0; } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IWatchExpressionResult#getErrorMessages() */ @Override public String[] getErrorMessages() { return errors; } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IWatchExpressionResult#getExpressionText() */ @Override public String getExpressionText() { return expression; } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IWatchExpressionResult#getException() */ @Override public DebugException getException() { return null; } public void addError(String error_string) { errors = Arrays.copyOf(errors, errors.length + 1); errors[errors.length - 1] = error_string; } /* (non-Javadoc) * @see org.python.pydev.debug.model.remote.ICommandResponseListener#commandComplete(org.python.pydev.debug.model.remote.AbstractDebuggerCommand) */ @Override public void commandComplete(AbstractDebuggerCommand cmd) { try { String payload = ((EvaluateExpressionCommand) cmd).getResponse(); synchronized (variables) { variables = XMLUtils.XMLToVariables((AbstractDebugTarget) context.getDebugTarget(), ((PyStackFrame) context).getExpressionLocator(), payload); } } catch (CoreException e) { synchronized (variables) { variables = new PyVariable[1]; variables[0] = new PyVariable((PyDebugTarget) context.getDebugTarget(), "Error", "pydev ERROR", "Could not resolve variable", null); } PydevDebugPlugin.log(IStatus.ERROR, "Error fetching a variable", e); } synchronized (variables) { if (variables[0] instanceof PyVariableCollection) { ((PyVariableCollection) variables[0]).isWatchExpression = true; } } listener.watchEvaluationFinished(this); } }