org.netbeans.lib.profiler.heap.HprofProxy Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.lib.profiler.heap;
import java.util.Iterator;
import java.util.Properties;
/**
*
* @author Tomas Hurka
*/
class HprofProxy {
//~ Constructors -------------------------------------------------------------------------------------------------------------
HprofProxy() {
}
//~ Methods ------------------------------------------------------------------------------------------------------------------
static Properties getProperties(Instance propertiesInstance) {
Instance defaultsObj = (Instance) propertiesInstance.getValueOfField("defaults"); // NOI18N
ObjectArrayDump entriesObj = (ObjectArrayDump) propertiesInstance.getValueOfField("table"); // NOI18N
Properties props;
if (defaultsObj != null) {
props = new Properties(getProperties(defaultsObj));
} else {
props = new Properties();
}
if (entriesObj != null) {
return getPropertiesFromTable(entriesObj, props, "key", "value"); // NOI18N
} else { // JDK 9
Instance map = (Instance) propertiesInstance.getValueOfField("map"); // NOI18N
if (map != null) {
entriesObj = (ObjectArrayDump) map.getValueOfField("table"); // NOI18N
return getPropertiesFromTable(entriesObj, props, "key", "val"); // NOI18N
} else { // old Hashtable
entriesObj = (ObjectArrayDump) propertiesInstance.getValueOfField("elementData"); // NOI18N
if (entriesObj != null) {
return getPropertiesFromTable(entriesObj, props, "key", "value"); // NOI18N
}
}
}
return null;
}
private static Properties getPropertiesFromTable(ObjectArrayDump entriesObj, Properties props, String keyName, String valueName) {
Iterator enIt = entriesObj.getValues().iterator();
while (enIt.hasNext()) {
Instance entry = (Instance) enIt.next();
for (; entry != null; entry = (Instance) entry.getValueOfField("next")) { // NOI18N
Instance key = (Instance) entry.getValueOfField(keyName);
Instance val = (Instance) entry.getValueOfField(valueName);
if (key != null) {
props.setProperty(getString(key), getString(val));
}
}
}
return props;
}
static String getString(Instance stringInstance) {
if (stringInstance == null) {
return "*null*"; // NOI18N
}
String className = stringInstance.getJavaClass().getName();
if (String.class.getName().equals(className)) {
Byte coder = (Byte) stringInstance.getValueOfField("coder"); // NOI18N
PrimitiveArrayDump chars = (PrimitiveArrayDump) stringInstance.getValueOfField("value"); // NOI18N
if (chars != null) {
Integer offset = (Integer) stringInstance.getValueOfField("offset"); // NOI18N
Integer len = (Integer) stringInstance.getValueOfField("count"); // NOI18N
if (offset == null) {
offset = Integer.valueOf(0);
}
if (len == null) {
len = chars.getLength();
}
char[] charArr = getChars(chars, coder, offset.intValue(), len.intValue());
return new String(charArr).intern();
}
return "*null*"; // NOI18N
}
// what? Non-string in system properties?
return "*"+className+"#"+stringInstance.getInstanceNumber()+"*"; // NOI18N
}
private static char[] getChars(PrimitiveArrayDump chars, Byte coder, int offset, int len) {
if (coder == null) {
return chars.getChars(offset, len);
}
int cdr = coder.intValue();
switch (cdr) {
case 0: {
char[] charArr = new char[len];
byte[] bytes = chars.getBytes(offset, len);
for (int i=0; i
© 2015 - 2025 Weber Informatics LLC | Privacy Policy