package com.sun.tools.jdi;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import com.sun.jdi.ClassLoaderReference;
import com.sun.jdi.ClassNotLoadedException;
import com.sun.jdi.ReferenceType;
import com.sun.jdi.Type;
import com.sun.jdi.VirtualMachine;
public class ClassLoaderReferenceImpl extends ObjectReferenceImpl
implements ClassLoaderReference
{
private static class Cache extends ObjectReferenceImpl.Cache {
List<ReferenceType> visibleClasses = null;
}
protected ObjectReferenceImpl.Cache newCache() {
return new Cache();
}
ClassLoaderReferenceImpl(VirtualMachine aVm, long ref) {
super(aVm, ref);
vm.state().addListener(this);
}
protected String description() {
return "ClassLoaderReference " + uniqueID();
}
public List<ReferenceType> definedClasses() {
ArrayList<ReferenceType> definedClasses = new ArrayList<>();
for (ReferenceType type : vm.allClasses()) {
if (type.isPrepared() &&
equals(type.classLoader())) {
definedClasses.add(type);
}
}
return definedClasses;
}
public List<ReferenceType> visibleClasses() {
List<ReferenceType> classes = null;
try {
Cache local = (Cache)getCache();
if (local != null) {
classes = local.visibleClasses;
}
if (classes == null) {
JDWP.ClassLoaderReference.VisibleClasses.ClassInfo[]
jdwpClasses = JDWP.ClassLoaderReference.VisibleClasses.
process(vm, this).classes;
classes = new ArrayList<>(jdwpClasses.length);
for (int i = 0; i < jdwpClasses.length; ++i) {
classes.add(vm.referenceType(jdwpClasses[i].typeID,
jdwpClasses[i].refTypeTag));
}
classes = Collections.unmodifiableList(classes);
if (local != null) {
local.visibleClasses = classes;
if ((vm.traceFlags & VirtualMachine.TRACE_OBJREFS) != 0) {
vm.printTrace(description() +
" temporarily caching visible classes (count = " +
classes.size() + ")");
}
}
}
} catch (JDWPException exc) {
throw exc.toJDIException();
}
return classes;
}
Type findType(String signature) throws ClassNotLoadedException {
List<ReferenceType> types = visibleClasses();
Iterator<ReferenceType> iter = types.iterator();
while (iter.hasNext()) {
ReferenceType type = iter.next();
if (type.signature().equals(signature)) {
return type;
}
}
JNITypeParser parser = new JNITypeParser(signature);
throw new ClassNotLoadedException(parser.typeName(),
"Class " + parser.typeName() + " not loaded");
}
byte typeValueKey() {
return JDWP.Tag.CLASS_LOADER;
}
}