1 /*
   2  * Copyright (c) 2004, 2007, 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.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 package sun.jvm.hotspot.utilities.soql;
  26 
  27 import java.util.*;
  28 import sun.jvm.hotspot.debugger.*;
  29 import sun.jvm.hotspot.oops.*;
  30 import sun.jvm.hotspot.runtime.*;
  31 
  32 public class JSJavaVM extends DefaultScriptObject {
  33     private static final int FIELD_ADDRESS_SIZE = 0;
  34     private static final int FIELD_BUILD_INFO   = 1;
  35     private static final int FIELD_CPU          = 2;
  36     private static final int FIELD_FLAGS        = 3;
  37     private static final int FIELD_HEAP         = 4;
  38     private static final int FIELD_OS           = 5;
  39     private static final int FIELD_SYS_PROPS    = 6;
  40     private static final int FIELD_THREADS      = 7;
  41     private static final int FIELD_TYPE         = 8;
  42     private static final int FIELD_VERSION      = 9;
  43     private static final int FIELD_CLASS_PATH   = 10;
  44     private static final int FIELD_BOOT_CLASS_PATH  = 11;
  45     private static final int FIELD_USER_DIR     = 12;
  46     private static final int FIELD_UNDEFINED    = -1;
  47 
  48     public JSJavaVM(JSJavaFactory factory) {
  49         this.factory = factory;
  50         this.vm = VM.getVM();
  51     }
  52 
  53     public Object get(String name) {
  54         int fieldID = getFieldID(name);
  55         switch (fieldID) {
  56         case FIELD_ADDRESS_SIZE:
  57             return new Long(getVMBit());
  58         case FIELD_BUILD_INFO:
  59             return vm.getVMInternalInfo();
  60         case FIELD_CPU:
  61             return vm.getCPU();
  62         case FIELD_FLAGS:
  63             return getFlags();
  64         case FIELD_HEAP:
  65             return getHeap();
  66         case FIELD_OS:
  67             return vm.getOS();
  68         case FIELD_SYS_PROPS:
  69             return getSysProps();
  70         case FIELD_THREADS:
  71             return getThreads();
  72         case FIELD_TYPE:
  73             return getType();
  74         case FIELD_VERSION:
  75             return vm.getVMRelease();
  76         case FIELD_CLASS_PATH:
  77             return getClassPath();
  78         case FIELD_USER_DIR:
  79             return getUserDir();
  80         case FIELD_UNDEFINED:
  81         default:
  82             return super.get(name);
  83         }
  84     }
  85 
  86     public Object[] getIds() {
  87         Object[] superIds = super.getIds();
  88         Object[] tmp = fields.keySet().toArray();
  89         Object[] res = new Object[superIds.length + tmp.length];
  90         System.arraycopy(tmp, 0, res, 0, tmp.length);
  91         System.arraycopy(superIds, 0, res, tmp.length, superIds.length);
  92         return res;
  93     }
  94 
  95     public boolean has(String name) {
  96         if (getFieldID(name) != FIELD_UNDEFINED) {
  97             return true;
  98         } else {
  99             return super.has(name);
 100         }
 101     }
 102 
 103     public void put(String name, Object value) {
 104         if (getFieldID(name) == FIELD_UNDEFINED) {
 105             super.put(name, value);
 106         }
 107     }
 108 
 109     public String toString() {
 110         StringBuffer buf = new StringBuffer();
 111         buf.append("Java Hotspot ");
 112         buf.append(getType());
 113         buf.append(' ');
 114         buf.append(getVMBit());
 115         buf.append(" bit VM (build ");
 116         buf.append(vm.getVMRelease());
 117         buf.append(")");
 118         return buf.toString();
 119     }
 120 
 121     //-- Internals only below this point
 122     private static Map fields = new HashMap();
 123     private static void addField(String name, int fieldId) {
 124         fields.put(name, new Integer(fieldId));
 125     }
 126 
 127     private static int getFieldID(String name) {
 128         Integer res = (Integer) fields.get(name);
 129         return (res != null)? res.intValue() : FIELD_UNDEFINED;
 130     }
 131 
 132     static {
 133         addField("addressSize", FIELD_ADDRESS_SIZE);
 134         addField("buildInfo", FIELD_BUILD_INFO);
 135         addField("cpu", FIELD_CPU);
 136         addField("flags", FIELD_FLAGS);
 137         addField("heap", FIELD_HEAP);
 138         addField("os", FIELD_OS);
 139         addField("sysProps", FIELD_SYS_PROPS);
 140         addField("threads", FIELD_THREADS);
 141         addField("type", FIELD_TYPE);
 142         addField("version", FIELD_VERSION);
 143         addField("classPath", FIELD_CLASS_PATH);
 144         addField("userDir", FIELD_USER_DIR);
 145     }
 146 
 147     private long getVMBit() {
 148         // address size in bits
 149         return vm.getAddressSize() * 8;
 150     }
 151 
 152     private synchronized JSMap getFlags() {
 153         if (flagsCache == null) {
 154             VM.Flag[] flags = vm.getCommandLineFlags();
 155             Map map = new HashMap();
 156             if (flags != null) {
 157                 for (int f = 0; f < flags.length; f++) {
 158                     VM.Flag flag = flags[f];
 159                     map.put(flag.getName(), flag.getValue());
 160                 }
 161             }
 162             flagsCache = factory.newJSMap(map);
 163         }
 164         return flagsCache;
 165     }
 166 
 167     private synchronized JSJavaHeap getHeap() {
 168         if (heapCache == null) {
 169             heapCache = factory.newJSJavaHeap();
 170         }
 171         return heapCache;
 172     }
 173 
 174     private synchronized JSMap getSysProps() {
 175         if (sysPropsCache == null) {
 176             Properties props = vm.getSystemProperties();
 177             Map map = new HashMap();
 178             if (props != null) {
 179                 Enumeration e = props.propertyNames();
 180                 while (e.hasMoreElements()) {
 181                     String key = (String) e.nextElement();
 182                     map.put(key, props.getProperty(key));
 183                 }
 184             }
 185             sysPropsCache = factory.newJSMap(map);
 186         }
 187         return sysPropsCache;
 188     }
 189 
 190     private synchronized JSList getThreads() {
 191         if (threadsCache == null) {
 192             List threads = new ArrayList(0);
 193             threadsCache = factory.newJSList(threads);
 194             VM.getVM().getThreads().doJavaThreads((thread) -> threads.add(thread));
 195         }
 196         return threadsCache;
 197     }
 198 
 199     private String getType() {
 200         if (vm.isClientCompiler()) {
 201             return "Client";
 202         } else if (vm.isServerCompiler()) {
 203             return "Server";
 204         } else {
 205             return "Core";
 206         }
 207     }
 208 
 209     private String getClassPath() {
 210         return vm.getSystemProperty("java.class.path");
 211     }
 212 
 213     private String getUserDir() {
 214         return vm.getSystemProperty("user.dir");
 215     }
 216 
 217     private JSMap      flagsCache;
 218     private JSJavaHeap heapCache;
 219     private JSMap      sysPropsCache;
 220     private JSList     threadsCache;
 221     private final JSJavaFactory factory;
 222     private final VM vm;
 223 }