/*
* Copyright (c) 2013-2017 Chris Newland.
* Licensed under https://github.com/AdoptOpenJDK/jitwatch/blob/master/LICENSE-BSD
* Instructions: https://github.com/AdoptOpenJDK/jitwatch/wiki
*/
package org.adoptopenjdk.jitwatch.model;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_SPACE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.DEBUG_LOGGING_PARSE_DICTIONARY;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_COMMA;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_DOT;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_OPEN_PARENTHESES;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_SLASH;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_SPACE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_TASK;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_METHOD;
import java.util.Map;
import org.adoptopenjdk.jitwatch.core.JITWatchConstants;
import org.adoptopenjdk.jitwatch.model.bytecode.Opcode;
import org.adoptopenjdk.jitwatch.util.ParseUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Task extends Tag
{
private static final Logger logger = LoggerFactory.getLogger(Task.class);
private IParseDictionary parseDictionary;
public Task(String attributeString, boolean selfClosing)
{
super(TAG_TASK, attributeString, selfClosing);
parseDictionary = new ParseDictionary(getAttributes().get(ATTR_METHOD));
}
public IParseDictionary getParseDictionary()
{
return parseDictionary;
}
public void addBCIOpcodeMapping(String methodID, int bci, Opcode opcode)
{
if (DEBUG_LOGGING_PARSE_DICTIONARY)
{
logger.debug("Adding bci mapping: {} {} {}", methodID, bci, opcode);
}
parseDictionary.putBCIOpcode(methodID, bci, opcode);
}
public void addDictionaryType(String type, Tag tag)
{
if (DEBUG_LOGGING_PARSE_DICTIONARY)
{
logger.debug("Adding type: {}", type);
}
parseDictionary.putType(type, tag);
}
public void addDictionaryMethod(String method, Tag tag)
{
if (DEBUG_LOGGING_PARSE_DICTIONARY)
{
logger.debug("Adding method: {}", method);
}
parseDictionary.putMethod(method, tag);
}
public void addDictionaryKlass(String klass, Tag tag)
{
if (DEBUG_LOGGING_PARSE_DICTIONARY)
{
logger.debug("Adding klass: {}", klass);
}
parseDictionary.putKlass(klass, tag);
}
public String decodeParseMethod(String method)
{
StringBuilder builder = new StringBuilder();
Tag methodTag = parseDictionary.getMethod(method);
Map<String, String> methodTagAttrs = methodTag.getAttributes();
String returnTypeID = methodTagAttrs.get(JITWatchConstants.ATTR_RETURN);
String args = methodTagAttrs.get(JITWatchConstants.ATTR_ARGUMENTS);
String methodName = methodTagAttrs.get(JITWatchConstants.ATTR_NAME);
String klassId = methodTagAttrs.get(JITWatchConstants.ATTR_HOLDER);
Tag klassTag = parseDictionary.getKlass(klassId);
Map<String, String> klassTagAttrs = klassTag.getAttributes();
String klassName = klassTagAttrs.get(JITWatchConstants.ATTR_NAME);
klassName = klassName.replace(S_SLASH, S_DOT);
builder.append(" <!-- ");
builder.append(ParseUtil.lookupType(returnTypeID, parseDictionary));
builder.append(C_SPACE);
builder.append(klassName);
builder.append(S_DOT);
builder.append(methodName);
builder.append(S_OPEN_PARENTHESES);
if (args != null && args.length() > 0)
{
String[] ids = args.split(S_SPACE);
for (String id : ids)
{
builder.append(ParseUtil.lookupType(id, parseDictionary));
builder.append(S_COMMA);
}
builder.deleteCharAt(builder.length() - 1);
}
builder.append(") -->");
return builder.toString();
}
}