• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package com.sun.tools.jdi;
27 
28 import com.sun.jdi.*;
29 import java.util.*;
30 
31 public class ClassLoaderReferenceImpl extends ObjectReferenceImpl
32                   implements ClassLoaderReference, VMListener  {
33 
34     // This is cached only while the VM is suspended
35     private static class Cache extends ObjectReferenceImpl.Cache {
36         List<ReferenceType> visibleClasses = null;
37     }
38 
newCache()39     protected ObjectReferenceImpl.Cache newCache() {
40         return new Cache();
41     }
42 
ClassLoaderReferenceImpl(VirtualMachine aVm, long ref)43     ClassLoaderReferenceImpl(VirtualMachine aVm, long ref) {
44         super(aVm, ref);
45         vm.state().addListener(this);
46     }
47 
description()48     protected String description() {
49         return "ClassLoaderReference " + uniqueID();
50     }
51 
definedClasses()52     public List<ReferenceType> definedClasses() {
53         ArrayList<ReferenceType> definedClasses = new ArrayList<ReferenceType>();
54         for (ReferenceType type :  vm.allClasses()) {
55             if (type.isPrepared() &&
56                 equals(type.classLoader())) {
57                 definedClasses.add(type);
58             }
59         }
60         return definedClasses;
61     }
62 
visibleClasses()63     public List<ReferenceType> visibleClasses() {
64         List<ReferenceType> classes = null;
65         try {
66             Cache local = (Cache)getCache();
67 
68             if (local != null) {
69                 classes = local.visibleClasses;
70             }
71             if (classes == null) {
72                 JDWP.ClassLoaderReference.VisibleClasses.ClassInfo[]
73                   jdwpClasses = JDWP.ClassLoaderReference.VisibleClasses.
74                                             process(vm, this).classes;
75                 classes = new ArrayList<ReferenceType>(jdwpClasses.length);
76                 for (int i = 0; i < jdwpClasses.length; ++i) {
77                     classes.add(vm.referenceType(jdwpClasses[i].typeID,
78                                                  jdwpClasses[i].refTypeTag));
79                 }
80                 classes = Collections.unmodifiableList(classes);
81                 if (local != null) {
82                     local.visibleClasses = classes;
83                     if ((vm.traceFlags & VirtualMachine.TRACE_OBJREFS) != 0) {
84                         vm.printTrace(description() +
85                            " temporarily caching visible classes (count = " +
86                                       classes.size() + ")");
87                     }
88                 }
89             }
90         } catch (JDWPException exc) {
91             throw exc.toJDIException();
92         }
93         return classes;
94     }
95 
findType(String signature)96     Type findType(String signature) throws ClassNotLoadedException {
97         List<ReferenceType> types = visibleClasses();
98         Iterator<ReferenceType> iter = types.iterator();
99         while (iter.hasNext()) {
100             ReferenceType type = iter.next();
101             if (type.signature().equals(signature)) {
102                 return type;
103             }
104         }
105         JNITypeParser parser = new JNITypeParser(signature);
106         throw new ClassNotLoadedException(parser.typeName(),
107                                          "Class " + parser.typeName() + " not loaded");
108     }
109 
typeValueKey()110     byte typeValueKey() {
111         return JDWP.Tag.CLASS_LOADER;
112     }
113 }
114