| /******************************************************************************* |
| * Copyright (c) 2010, 2018 R.Dvorak and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v2.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v20.html |
| * |
| * Contributors: |
| * Sergey Boyko - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.m2m.qvt.oml.debug.core; |
| |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.jobs.ISchedulingRule; |
| import org.eclipse.core.runtime.jobs.Job; |
| import org.eclipse.debug.core.DebugException; |
| import org.eclipse.debug.core.model.IDebugElement; |
| import org.eclipse.debug.core.model.IStackFrame; |
| import org.eclipse.debug.core.model.IThread; |
| 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; |
| |
| public class QVTOWatchExpressionDelegate implements IWatchExpressionDelegate { |
| |
| public void evaluateExpression(String expression, IDebugElement context, IWatchExpressionListener listener) { |
| myExpressionText= expression; |
| myListener= listener; |
| |
| IStackFrame frame = null; |
| if (context instanceof IStackFrame) { |
| frame = (IStackFrame)context; |
| } |
| else if (context instanceof IThread) { |
| try { |
| frame = ((IThread)context).getTopStackFrame(); |
| } |
| catch (DebugException e) { |
| } |
| } |
| |
| if(frame instanceof QVTOStackFrame == false) { |
| myListener.watchEvaluationFinished(null); |
| return; |
| } |
| |
| QVTOStackFrame qvtFrame = (QVTOStackFrame)frame; |
| evaluate(qvtFrame); |
| } |
| |
| protected void evaluate(final QVTOStackFrame qvtFrame) { |
| QVTOThread thread = (QVTOThread)qvtFrame.getThread(); |
| if (!canEvaluate(thread)) { |
| myListener.watchEvaluationFinished(null); |
| return; |
| } |
| |
| Job evalJob = new Job("Evaluating " + myExpressionText) { //$NON-NLS-1$ |
| @Override |
| protected IStatus run(IProgressMonitor monitor) { |
| IValue value = null; |
| String[] errorMessages = new String[0]; |
| try { |
| value = qvtFrame.evaluate(myExpressionText); |
| } |
| catch(Exception e) { |
| errorMessages = new String[] {e.getMessage()}; |
| } |
| |
| IWatchExpressionResult watchResult = new QVTOWatchExpressionResult(myExpressionText, value, errorMessages); |
| myListener.watchEvaluationFinished(watchResult); |
| |
| return QVTODebugCore.createStatus(IStatus.OK, ""); //$NON-NLS-1$ |
| } |
| }; |
| |
| evalJob.setRule(new SequentialSchedulingRule()); |
| evalJob.schedule(); |
| } |
| |
| private boolean canEvaluate(QVTOThread qvtThread) { |
| return qvtThread != null; |
| } |
| |
| private String myExpressionText; |
| private IWatchExpressionListener myListener; |
| } |
| |
| class SequentialSchedulingRule implements ISchedulingRule { |
| public boolean contains(ISchedulingRule rule) { |
| return rule instanceof SequentialSchedulingRule; |
| } |
| |
| public boolean isConflicting(ISchedulingRule rule) { |
| return rule instanceof SequentialSchedulingRule; |
| } |
| } |