blob: 8b0e2e94f0d15c87bcbf9aea55940f607fd445d9 [file] [log] [blame]
package org.eclipse.jdt.internal.debug.ui.monitors;
/**********************************************************************
Copyright (c) 2000, 2002 IBM Corp. All rights reserved.
This file is made available under the terms of the Common Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v10.html
**********************************************************************/
import org.eclipse.jdt.debug.core.IJavaObject;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
/**
* Provides the tree data for the thread view
*/
public class ThreadsViewContentProvider implements ITreeContentProvider {
/**
* MonitorWrapper for the thread view
* We use it to know the state of the monitor we display: owned or in contention
*/
public class MonitorWrapper{
public static final int OWNED_MONITOR = 1;
public static final int CONTENDED_MONITOR = 2;
public IJavaObject monitor;
public int state;
}
/**
* ThreadWrapper for the monitor view
* We use it to know the state of the thread we display: caught in a deadlock or not
*/
public class ThreadWrapper{
public IJavaThread thread;
public boolean isCaughtInDeadlock;
}
protected TreeViewer fViewer= null;
/**
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(Object)
*/
public Object[] getChildren(Object parentElement) {
//the parent will be ThreadWrapper
if (parentElement instanceof ThreadWrapper) {
IJavaThread thread= (IJavaThread)((ThreadWrapper)parentElement).thread;
//owned monitors
IJavaObject[] ownedMonitors= MonitorManager.getDefault().getOwnedMonitors(thread);
//contended monitor
IJavaObject contendedMonitor= MonitorManager.getDefault().getContendedMonitor(thread);
if (ownedMonitors == null && contendedMonitor == null) {
return null;
}
//adding the monitors to the result
int size= 0;
if (ownedMonitors != null) {
size= ownedMonitors.length;
}
if (contendedMonitor != null) {
size= size + 1;
}
//transforming the result to MonitorWrapper, setting the type
Object[] children= new Object[size];
if (ownedMonitors != null) {
for (int i = 0; i < ownedMonitors.length; i++) {
MonitorWrapper mw = new MonitorWrapper();
mw.monitor = ownedMonitors[i];
mw.state = MonitorWrapper.OWNED_MONITOR;
children[i]= mw;
}
}
if (contendedMonitor != null) {
MonitorWrapper mw = new MonitorWrapper();
mw.monitor = contendedMonitor;
mw.state = MonitorWrapper.CONTENDED_MONITOR;
children[children.length - 1]= mw;
}
return children;
}
return null;
}
/**
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(Object)
*/
public Object getParent(Object element) {
if (element instanceof IJavaThread) {
return MonitorManager.getDefault().getOwnedMonitors((IJavaThread)element);
} else if (element instanceof IJavaObject) {
return MonitorManager.getDefault().getOwningThread((IJavaObject)element);
}
return null;
}
/**
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(Object)
*/
public boolean hasChildren(Object element) {
if (element instanceof IJavaThread) {
IJavaThread thread= (IJavaThread)element;
IJavaObject[] ownedMonitors= MonitorManager.getDefault().getOwnedMonitors(thread);
IJavaObject contendedMonitor= MonitorManager.getDefault().getContendedMonitor(thread);
if (ownedMonitors == null && contendedMonitor == null) {
return false;
} else {
return true;
}
}
return false;
}
/**
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(Object)
*/
public Object[] getElements(Object inputElement) {
//the root elements are ThreadWrapper
IJavaThread[] allThreads= MonitorManager.getDefault().getThreads();
Object[] res = new Object[allThreads.length];
for (int i = 0; i < allThreads.length; i++) {
ThreadWrapper tw = new ThreadWrapper();
tw.thread= allThreads[i];
if(MonitorManager.getDefault().isCaughtInDeadlock(allThreads[i])) {
tw.isCaughtInDeadlock = true;
} else {
tw.isCaughtInDeadlock = false;
}
res[i] = tw;
}
return res;
}
/**
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {
fViewer= null;
}
/**
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(Viewer, Object, Object)
*/
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
fViewer= (TreeViewer)viewer;
}
}