/*
* 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.model.bytecode;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_NEWLINE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.DEBUG_LOGGING_BYTECODE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_BYTECODE_MAJOR_VERSION;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_BYTECODE_MINOR_VERSION;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.adoptopenjdk.jitwatch.model.IMetaMember;
import org.adoptopenjdk.jitwatch.model.MemberSignatureParts;
import org.adoptopenjdk.jitwatch.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ClassBC
{
private ConstantPool constantPool;
private String sourceFile;
private int majorVersion;
private int minorVersion;
private String fqClassName;
private List<MemberBytecode> memberBytecodeList = new ArrayList<>();
private List<String> innerClassNames = new ArrayList<>();
private Map<String, String> classGenericsMap = new LinkedHashMap<>();
private static final Logger logger = LoggerFactory.getLogger(ClassBC.class);
public ClassBC(String fqClassName)
{
this.fqClassName = fqClassName;
}
public String getFullyQualifiedClassName()
{
return fqClassName;
}
public String getPackageName()
{
return StringUtil.getPackageName(fqClassName);
}
public void addMemberBytecode(MemberBytecode memberBytecode)
{
memberBytecodeList.add(memberBytecode);
}
public List<MemberBytecode> getMemberBytecodeList()
{
return Collections.unmodifiableList(memberBytecodeList);
}
public void addGenericsMapping(String key, String value)
{
classGenericsMap.put(key, value);
}
public Map<String, String> getGenericsMap()
{
return Collections.unmodifiableMap(classGenericsMap);
}
public void addInnerClassName(String name)
{
innerClassNames.add(name);
}
public List<String> getInnerClassNames()
{
return Collections.unmodifiableList(innerClassNames);
}
public MemberBytecode getMemberBytecode(IMetaMember member)
{
if (DEBUG_LOGGING_BYTECODE)
{
logger.debug("getMemberBytecode: {}", member);
}
MemberBytecode result = null;
if (member != null)
{
for (MemberBytecode item : memberBytecodeList)
{
if (member.matchesSignature(item.getMemberSignatureParts(), true))
{
result = item;
break;
}
}
}
if (DEBUG_LOGGING_BYTECODE)
{
logger.debug("getMemberBytecode found: {}", result);
}
return result;
}
public MemberBytecode getMemberBytecodeForSignature(MemberSignatureParts msp)
{
if (DEBUG_LOGGING_BYTECODE)
{
logger.debug("getMemberBytecodeForSignature: {}", msp);
}
MemberBytecode result = null;
if (msp != null)
{
for (MemberBytecode item : memberBytecodeList)
{
if (msp.equals(item.getMemberSignatureParts()))
{
result = item;
break;
}
}
}
if (DEBUG_LOGGING_BYTECODE)
{
logger.debug("Found MemberBytecode: {}", result != null);
}
return result;
}
public ConstantPool getConstantPool()
{
return constantPool;
}
public void setConstantPool(ConstantPool constantPool)
{
this.constantPool = constantPool;
}
public String getSourceFile()
{
return sourceFile;
}
public void setSourceFile(String sourceFile)
{
this.sourceFile = sourceFile;
}
public int getMajorVersion()
{
return majorVersion;
}
public void setMajorVersion(int majorVersion)
{
this.majorVersion = majorVersion;
}
public int getMinorVersion()
{
return minorVersion;
}
public String getJavaVersion()
{
String result;
switch (majorVersion)
{
case 53:
result = "Java 9";
break;
case 52:
result = "Java 8";
break;
case 51:
result = "Java 7";
break;
case 50:
result = "Java 6.0";
break;
case 49:
result = "Java 5.0";
break;
case 48:
result = "Java 1.4";
break;
case 47:
result = "Java 1.3";
break;
case 46:
result = "Java 1.2";
break;
case 45:
result = "Java 1.1";
break;
default:
result = "Unknown java version";
break;
}
return result;
}
public void setMinorVersion(int minorVersion)
{
this.minorVersion = minorVersion;
}
@Override
public String toString()
{
StringBuilder builder = new StringBuilder();
builder.append(S_BYTECODE_MAJOR_VERSION).append(majorVersion).append(C_NEWLINE);
builder.append(S_BYTECODE_MINOR_VERSION).append(minorVersion).append(C_NEWLINE);
for (MemberBytecode item : memberBytecodeList)
{
builder.append("member: ").append(item).append(C_NEWLINE);
}
return builder.toString();
}
}