blob: ab12e268b8d14cdfd0126191ae6f6f61eb791c61 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002, 2004 IBM Corporation and others.
* All rights reserved. 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
*
* Contributors:
* IBM - Initial API and implementation
*******************************************************************************/
package org.eclipse.core.tools.runtime;
import java.util.*;
import org.eclipse.core.runtime.internal.stats.*;
import org.eclipse.core.tools.IFlattable;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
/**
* Content provider for the LoadedClassesView
*/
public class LoadedClassesViewContentProvider implements ITreeContentProvider, IFlattable {
private boolean flat;
private String inputNames[] = new String[0];
public void setFlat(boolean mode) {
flat = mode;
}
public Object[] getChildren(Object element) {
if (flat || !(element instanceof ClassStats))
return new Object[0];
ArrayList result = new ArrayList(10);
for (Iterator i = ((ClassStats) element).getLoadedClasses().iterator(); i.hasNext();) {
ClassStats child = (ClassStats) i.next();
if (filterChildren(child, inputNames))
result.add(child);
}
return result.toArray(new Object[result.size()]);
}
private boolean filterChildren(ClassStats element, String[] filters) {
String name = element.getClassloader().getId();
for (int i = 0; i < filters.length; i++)
if (filters[i].equals(name))
return true;
ArrayList children = element.getLoadedClasses();
for (Iterator i = children.iterator(); i.hasNext();)
if (filterChildren((ClassStats) i.next(), filters))
return true;
return false;
}
public Object getParent(Object element) {
if (flat || !(element instanceof ClassStats))
return null;
return ((ClassStats) element).getLoadedBy();
}
public boolean hasChildren(Object element) {
if (flat || !(element instanceof ClassStats))
return false;
for (Iterator i = ((ClassStats) element).getLoadedClasses().iterator(); i.hasNext();)
if (filterChildren((ClassStats) i.next(), inputNames))
return true;
return false;
}
public Object[] getElements(Object inputElement) {
if (!StatsManager.MONITOR_CLASSES)
return null;
if (inputElement instanceof Object[]) {
Object[] elements = (Object[]) inputElement;
if (elements.length == 0 || !(elements[0] instanceof BundleStats))
return null;
Set result = new HashSet(51);
for (int i = 0; i < elements.length; i++) {
ClassStats[] classes = getClasses(((BundleStats) elements[i]).getSymbolicName());
result.addAll(Arrays.asList(classes));
}
return result.toArray(new Object[result.size()]);
}
return null;
}
private ClassStats[] getClasses(String id) {
ClassloaderStats loader = ClassloaderStats.getLoader(id);
if (loader == null)
return new ClassStats[0];
ClassStats[] classes = loader.getClasses();
if (flat)
return classes;
ArrayList result = new ArrayList();
for (int i = 0; i < classes.length; i++) {
ClassStats target = classes[i];
while (target.getLoadedBy() != null)
target = target.getLoadedBy();
result.add(target);
}
return (ClassStats[]) result.toArray(new ClassStats[result.size()]);
}
public void dispose() {
// do nothing
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
if (oldInput == newInput)
return;
if (newInput == null) {
inputNames = new String[0];
return;
}
Object[] list = (Object[]) newInput;
inputNames = new String[list.length];
for (int i = 0; i < list.length; i++)
inputNames[i] = ((BundleStats) list[i]).getSymbolicName();
}
}