blob: dbfe81833830b48e6129df25bffd2934f61f687a [file] [log] [blame]
/*
* Copyright (c) 2004, 2007, 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.
*
* 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 sun.jvm.hotspot.utilities.soql;
import java.util.*;
import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.runtime.*;
public class JSJavaVM extends DefaultScriptObject {
private static final int FIELD_ADDRESS_SIZE = 0;
private static final int FIELD_BUILD_INFO = 1;
private static final int FIELD_CPU = 2;
private static final int FIELD_FLAGS = 3;
private static final int FIELD_HEAP = 4;
private static final int FIELD_OS = 5;
private static final int FIELD_SYS_PROPS = 6;
private static final int FIELD_THREADS = 7;
private static final int FIELD_TYPE = 8;
private static final int FIELD_VERSION = 9;
private static final int FIELD_CLASS_PATH = 10;
private static final int FIELD_BOOT_CLASS_PATH = 11;
private static final int FIELD_USER_DIR = 12;
private static final int FIELD_UNDEFINED = -1;
public JSJavaVM(JSJavaFactory factory) {
this.factory = factory;
this.vm = VM.getVM();
}
public Object get(String name) {
int fieldID = getFieldID(name);
switch (fieldID) {
case FIELD_ADDRESS_SIZE:
return new Long(getVMBit());
case FIELD_BUILD_INFO:
return vm.getVMInternalInfo();
case FIELD_CPU:
return vm.getCPU();
case FIELD_FLAGS:
return getFlags();
case FIELD_HEAP:
return getHeap();
case FIELD_OS:
return vm.getOS();
case FIELD_SYS_PROPS:
return getSysProps();
case FIELD_THREADS:
return getThreads();
case FIELD_TYPE:
return getType();
case FIELD_VERSION:
return vm.getVMRelease();
case FIELD_CLASS_PATH:
return getClassPath();
case FIELD_BOOT_CLASS_PATH:
return getBootClassPath();
case FIELD_USER_DIR:
return getUserDir();
case FIELD_UNDEFINED:
default:
return super.get(name);
}
}
public Object[] getIds() {
Object[] superIds = super.getIds();
Object[] tmp = fields.keySet().toArray();
Object[] res = new Object[superIds.length + tmp.length];
System.arraycopy(tmp, 0, res, 0, tmp.length);
System.arraycopy(superIds, 0, res, tmp.length, superIds.length);
return res;
}
public boolean has(String name) {
if (getFieldID(name) != FIELD_UNDEFINED) {
return true;
} else {
return super.has(name);
}
}
public void put(String name, Object value) {
if (getFieldID(name) == FIELD_UNDEFINED) {
super.put(name, value);
}
}
public String toString() {
StringBuffer buf = new StringBuffer();
buf.append("Java Hotspot ");
buf.append(getType());
buf.append(' ');
buf.append(getVMBit());
buf.append(" bit VM (build ");
buf.append(vm.getVMRelease());
buf.append(")");
return buf.toString();
}
//-- Internals only below this point
private static Map fields = new HashMap();
private static void addField(String name, int fieldId) {
fields.put(name, new Integer(fieldId));
}
private static int getFieldID(String name) {
Integer res = (Integer) fields.get(name);
return (res != null)? res.intValue() : FIELD_UNDEFINED;
}
static {
addField("addressSize", FIELD_ADDRESS_SIZE);
addField("buildInfo", FIELD_BUILD_INFO);
addField("cpu", FIELD_CPU);
addField("flags", FIELD_FLAGS);
addField("heap", FIELD_HEAP);
addField("os", FIELD_OS);
addField("sysProps", FIELD_SYS_PROPS);
addField("threads", FIELD_THREADS);
addField("type", FIELD_TYPE);
addField("version", FIELD_VERSION);
addField("classPath", FIELD_CLASS_PATH);
addField("bootClassPath", FIELD_BOOT_CLASS_PATH);
addField("userDir", FIELD_USER_DIR);
}
private long getVMBit() {
// address size in bits
return vm.getAddressSize() * 8;
}
private synchronized JSMap getFlags() {
if (flagsCache == null) {
VM.Flag[] flags = vm.getCommandLineFlags();
Map map = new HashMap();
if (flags != null) {
for (int f = 0; f < flags.length; f++) {
VM.Flag flag = flags[f];
map.put(flag.getName(), flag.getValue());
}
}
flagsCache = factory.newJSMap(map);
}
return flagsCache;
}
private synchronized JSJavaHeap getHeap() {
if (heapCache == null) {
heapCache = factory.newJSJavaHeap();
}
return heapCache;
}
private synchronized JSMap getSysProps() {
if (sysPropsCache == null) {
Properties props = vm.getSystemProperties();
Map map = new HashMap();
if (props != null) {
Enumeration e = props.propertyNames();
while (e.hasMoreElements()) {
String key = (String) e.nextElement();
map.put(key, props.getProperty(key));
}
}
sysPropsCache = factory.newJSMap(map);
}
return sysPropsCache;
}
private synchronized JSList getThreads() {
if (threadsCache == null) {
List threads = new ArrayList(0);
threadsCache = factory.newJSList(threads);
JavaThread jthread = vm.getThreads().first();
while (jthread != null) {
threads.add(jthread);
jthread = jthread.next();
}
}
return threadsCache;
}
private String getType() {
if (vm.isClientCompiler()) {
return "Client";
} else if (vm.isServerCompiler()) {
return "Server";
} else {
return "Core";
}
}
private String getClassPath() {
return vm.getSystemProperty("java.class.path");
}
private String getBootClassPath() {
return vm.getSystemProperty("sun.boot.class.path");
}
private String getUserDir() {
return vm.getSystemProperty("user.dir");
}
private JSMap flagsCache;
private JSJavaHeap heapCache;
private JSMap sysPropsCache;
private JSList threadsCache;
private final JSJavaFactory factory;
private final VM vm;
}