/*
* Copyright (c) 2013-2016 Chris Newland.
* Licensed under https://github.com/AdoptOpenJDK/jitwatch/blob/master/LICENSE-BSD
* Instructions: https://github.com/AdoptOpenJDK/jitwatch/wiki
*/
package org.adoptopenjdk.jitwatch.util;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_BYTES;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_COMPILER;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_DECOMPILES;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_NMSIZE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_STAMP;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.HEADLESS_SEPARATOR;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_HYPEN;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_NEWLINE;
import java.util.List;
import java.util.Map;
import org.adoptopenjdk.jitwatch.model.Compilation;
import org.adoptopenjdk.jitwatch.model.IMetaMember;
import org.adoptopenjdk.jitwatch.model.IReadOnlyJITDataModel;
import org.adoptopenjdk.jitwatch.model.MetaClass;
import org.adoptopenjdk.jitwatch.model.MetaPackage;
public class HeadlessUtil
{
public static String modelToString(IReadOnlyJITDataModel model, boolean onlyCompiled)
{
StringBuilder builder = new StringBuilder();
builder.append("Package").append(HEADLESS_SEPARATOR);
builder.append("Class").append(HEADLESS_SEPARATOR);
builder.append("Member Signature").append(HEADLESS_SEPARATOR);
builder.append("Is Compiled").append(HEADLESS_SEPARATOR);
builder.append("Compiler").append(HEADLESS_SEPARATOR);
builder.append("Queued Time").append(HEADLESS_SEPARATOR);
builder.append("Compiled Time").append(HEADLESS_SEPARATOR);
builder.append("Compilation Time").append(HEADLESS_SEPARATOR);
builder.append("Bytecode Size").append(HEADLESS_SEPARATOR);
builder.append("Native Size").append(HEADLESS_SEPARATOR);
builder.append("Decompiles");
builder.append(S_NEWLINE);
List<MetaPackage> roots = model.getPackageManager().getRootPackages();
for (MetaPackage mp : roots)
{
showTree(builder, mp, onlyCompiled);
}
return builder.toString();
}
private static void showTree(StringBuilder builder, MetaPackage mp, boolean onlyCompiled)
{
List<MetaPackage> childPackages = mp.getChildPackages();
for (MetaPackage childPackage : childPackages)
{
showTree(builder, childPackage, onlyCompiled);
}
List<MetaClass> packageClasses = mp.getPackageClasses();
for (MetaClass metaClass : packageClasses)
{
for (IMetaMember member : metaClass.getMetaMembers())
{
boolean isCompiled = member.isCompiled();
if (!onlyCompiled || isCompiled)
{
builder.append(mp.getName()).append(HEADLESS_SEPARATOR);
builder.append(metaClass.getName()).append(HEADLESS_SEPARATOR);
builder.append(member.toStringUnqualifiedMethodName(true, true)).append(HEADLESS_SEPARATOR);
builder.append(isCompiled ? "Y" : "N").append(HEADLESS_SEPARATOR);
builder.append(getCompiledAttributeOrNA(member, ATTR_COMPILER, S_HYPEN)).append(HEADLESS_SEPARATOR);
builder.append(getQueuedAttributeOrNA(member, ATTR_STAMP, S_HYPEN)).append(HEADLESS_SEPARATOR);
builder.append(getCompiledAttributeOrNA(member, ATTR_STAMP, S_HYPEN)).append(HEADLESS_SEPARATOR);
long lastCompilationTime = getLastCompilationTime(member);
builder.append(lastCompilationTime).append(HEADLESS_SEPARATOR);
builder.append(getCompiledAttributeOrNA(member, ATTR_BYTES, S_HYPEN)).append(HEADLESS_SEPARATOR);
builder.append(getCompiledAttributeOrNA(member, ATTR_NMSIZE, S_HYPEN)).append(HEADLESS_SEPARATOR);
builder.append(getCompiledAttributeOrNA(member, ATTR_DECOMPILES, "0"));
builder.append(S_NEWLINE);
}
}
}
}
private static long getLastCompilationTime(IMetaMember member)
{
long compileTime = 0;
Compilation lastCompilation = member.getLastCompilation();
if (lastCompilation != null)
{
compileTime = lastCompilation.getCompileTime();
}
return compileTime;
}
private static String getQueuedAttributeOrNA(IMetaMember member, String attributeName, String defaultValue)
{
String result = defaultValue;
if (member != null)
{
result = getAttributeOrNA(member.getQueuedAttributes(), attributeName, defaultValue);
}
return result;
}
private static String getCompiledAttributeOrNA(IMetaMember member, String attributeName, String defaultValue)
{
String result = defaultValue;
if (member != null)
{
result = getAttributeOrNA(member.getCompiledAttributes(), attributeName, defaultValue);
}
return result;
}
private static String getAttributeOrNA(Map<String, String> attrs, String attributeName, String defaultValue)
{
String result = defaultValue;
if (attrs.containsKey(attributeName))
{
result = attrs.get(attributeName);
}
return result;
}
}