/* * Copyright 1998-2003 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Sun designates this * particular file as subject to the "Classpath" exception as provided * by Sun in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ package com.sun.tools.jdi; import com.sun.jdi.*; import java.util.*; public class ClassLoaderReferenceImpl extends ObjectReferenceImpl implements ClassLoaderReference, VMListener { // This is cached only while the VM is suspended 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<ReferenceType>(); 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<ReferenceType>(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 & vm.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 iter = types.iterator(); while (iter.hasNext()) { ReferenceType type = (ReferenceType)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; } }