/** * Copyright (c) 2013-2015 by Brainwy Software Ltda, 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. */ package org.python.pydev.debug.curr_exception; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.core.model.IStackFrame; import org.eclipse.debug.core.model.IThread; import org.eclipse.debug.core.model.IValue; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.python.pydev.core.log.Log; import org.python.pydev.debug.model.AbstractDebugTarget; import org.python.pydev.debug.model.CaughtException; import org.python.pydev.debug.model.PyVariable; public class CurrentExceptionViewContentProvider implements ITreeContentProvider { private final Map<Object, Object> parentCache = new HashMap<>(); @Override public void dispose() { parentCache.clear(); } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { parentCache.clear(); } @Override public Object[] getElements(Object inputElement) { List<IDebugTarget> elements = (List<IDebugTarget>) inputElement; for (IDebugTarget iDebugTarget : elements) { getChildren(iDebugTarget); //just to make sure we'll cache this level in the parentCache. } return elements.toArray(new IDebugTarget[elements.size()]); } @Override public Object[] getChildren(Object parentElement) { Object[] children = internalGetChildren(parentElement); if (children != null) { for (Object child : children) { parentCache.put(child, parentElement); } } return children; } private Object[] internalGetChildren(Object parentElement) { if (parentElement instanceof AbstractDebugTarget) { AbstractDebugTarget target = (AbstractDebugTarget) parentElement; List<CaughtException> currExceptions = target.getCurrExceptions(); return currExceptions.toArray(new CaughtException[currExceptions.size()]); } if (parentElement instanceof CaughtException) { CaughtException caughtException = (CaughtException) parentElement; return caughtException.threadNstack.stack; } if (parentElement instanceof IThread) { IThread pyThread = (IThread) parentElement; try { return pyThread.getStackFrames(); } catch (DebugException e) { Log.log(e); return null; } } if (parentElement instanceof IStackFrame) { IStackFrame iStackFrame = (IStackFrame) parentElement; try { return iStackFrame.getVariables(); } catch (DebugException e) { Log.log(e); return null; } } if (parentElement instanceof PyVariable) { PyVariable pyVariable = (PyVariable) parentElement; try { return pyVariable.getVariables(); } catch (DebugException e) { Log.log(e); return null; } } Log.log("Unexpected parent: " + parentElement); return null; } @Override public Object getParent(Object element) { Object parent = parentCache.get(element); return parent; } @Override public boolean hasChildren(Object element) { if (element instanceof List) { List list = (List) element; return list.size() > 0; } if (element instanceof IValue) { try { return ((IValue) element).hasVariables(); } catch (DebugException e) { Log.log(e); } } return true; } }