/* * Copyright (c) 2008, 2011, Oracle and/or its affiliates. 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. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.tools.visualvm.modules.saplugin; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.logging.Logger; class SAWrapper { private static final Logger LOGGER = Logger.getLogger(SAWrapper.class.getName()); URLClassLoader loader; private static ClassLoader parent; File libraryPath; SAWrapper(File jdkHome, File saJarFile) throws MalformedURLException { // By default SA agent classes prefer dbx debugger to proc debugger // and Windows process debugger to windbg debugger. SA expects // special properties to be set to choose other debuggers. // We will set those here before attaching to SA agent. System.setProperty("sun.jvm.hotspot.debugger.useProcDebugger", "true"); // NOI18N System.setProperty("sun.jvm.hotspot.debugger.useWindbgDebugger", "true"); // NOI18N //File maf = new File(jdkHome, "lib/maf-1_0.jar"); URL[] saJarUrls = new URL[]{saJarFile.toURI().toURL()/*, maf.toURI().toURL()*/}; // String osArch = System.getProperty("os.arch"); // NOI18N // if ("x86".equals(osArch)) { // osArch = "i386"; // } //libraryPath = new File("lib/" + osArch); // NOI18N /// Changed this libraryPath = new File(jdkHome, "jre/bin/"); LOGGER.fine("Path " + libraryPath.getAbsolutePath()); // NOI18N //We want only one parent for all the SAPluginClassLoader instances. if (parent == null) parent = new URLClassLoader(new URL[]{saJarFile.toURI().toURL()}); loader = new SAPluginClassLoader(parent, jdkHome, saJarFile); /* loader = new URLClassLoader(saJarUrls, parent) { @Override protected String findLibrary(String libname) { String name = System.mapLibraryName(libname); File library = new File(libraryPath, name); LOGGER.fine("Library " + library.getAbsolutePath()); String f = library.getAbsolutePath();// NOI18N if (library.exists() && library.canRead()) { //return "D:/Java/jdk1.6.0_03/jre/lib/i386/sawindbg.dll"; return library.getAbsolutePath(); } return super.findLibrary(libname); } @Override public synchronized Class loadClass(String name) throws ClassNotFoundException { // First, check if the class has already been loaded Class c = findLoadedClass(name); if (c == null) { /* If we are loading any class in 'sun.jvm.hotspot.' or any of the * sub-packages (except for 'debugger' sub-pkg. please refer below), * we load it by 'this' loader. Or else, we forward the request to * 'parent' loader, system loader etc. (rest of the code follows * the patten in java.lang.ClassLoader.loadClass). * * 'sun.jvm.hotspot.debugger.' and sub-package classes are * also loaded by parent loader. This is done for two reasons: * * 1. to avoid code bloat by too many classes. * 2. to avoid loading same native library multiple times * from multiple class loaders (which results in getting a * UnsatisifiedLinkageError from System.loadLibrary). * if (name.startsWith("sun.jvm.hotspot.") && !name.startsWith("sun.jvm.hotspot.debugger.")) { return findClass(name); } if (name.startsWith("sun.jvm.hotspot.debugger.")) { c = parent.loadClass(name); } else if (parent != null) { c = parent.loadClass(name); } else { c = findSystemClass(name); } } return c; } }; } */ } Class classForName(String name) throws ClassNotFoundException { return Class.forName(name, true, loader); } Class Tool() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.tools.Tool"); // NOI18N } Class VM() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.runtime.VM"); // NOI18N } Class BugspotAgent() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.bugspot.BugSpotAgent"); // NOI18N } Class HotspotAgent() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.HotSpotAgent"); // NOI18N } Class HeapHprofBinWriter() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.utilities.HeapHprofBinWriter"); // NOI18N } Class Arguments() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.runtime.Arguments"); // NOI18N } /////////////////////////////////// Class OopInspector() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.ui.Inspector"); // NOI18N } Class JavaStackTracePanel() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.ui.JavaStackTracePanel"); // NOI18N } Class JavaThreadsPanel() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.ui.JavaThreadsPanel"); // NOI18N } Class SAListener() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.ui.SAListener"); // NOI18N } Class OopTreeNodeAdapter() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.ui.tree.OopTreeNodeAdapter"); // NOI18N } Class SimpleTreeNode() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.ui.tree.SimpleTreeNode"); // NOI18N } Class CodeViewerPanel() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.ui.classbrowser.CodeViewerPanel"); // NOI18N } Class FindPanel() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.ui.FindPanel"); // NOI18N } Class FindInHeapPanel() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.ui.FindInHeapPanel"); // NOI18N } Class FindInCodeCachePanel() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.ui.FindInCodeCachePanel"); // NOI18N } //Non-ui Class Oop() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.oops.Oop"); // NOI18N } Class JavaThread() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.runtime.JavaThread"); // NOI18N } Class FieldIdentifier() throws ClassNotFoundException { return classForName("sun.jvm.hotspot.oops.FieldIdentifier"); // NOI18N } }