package jdepend.metadata.util;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
public final class ParseUtil {
private final static Map<String, String> baseTypes = new HashMap<String, String>();
static {
baseTypes.put("Z", "boolean");
baseTypes.put("B", "byte");
baseTypes.put("C", "char");
baseTypes.put("D", "double");
baseTypes.put("F", "float");
baseTypes.put("I", "int");
baseTypes.put("J", "long");
baseTypes.put("S", "short");
baseTypes.put("V", "void");
}
private final static Collection<String> stateClassTypes = new HashSet<String>();
static {
stateClassTypes.add("java.lang.String");
stateClassTypes.add("java.lang.Boolean");
stateClassTypes.add("java.lang.Byte");
stateClassTypes.add("java.lang.Double");
stateClassTypes.add("java.lang.Enum");
stateClassTypes.add("java.lang.Float");
stateClassTypes.add("java.lang.Integer");
stateClassTypes.add("java.lang.Long");
stateClassTypes.add("java.lang.Number");
stateClassTypes.add("java.lang.Short");
stateClassTypes.add("java.lang.StringBuffer");
stateClassTypes.add("java.lang.StringBuilder");
stateClassTypes.add("java.lang.Void");
}
public static final char CLASS_DESCRIPTOR = 'L';
public static final char CLASS_DESCRIPTOR1 = 'I';
public static String slashesToDots(String s) {
return s.replace('/', '.');
}
public static boolean existCollectionType(String signature) {
return signature.indexOf('<') != -1;
}
public static Collection<String> signatureToTypes(String signature) {
Collection<String> rtnTypes = new ArrayList<String>();
if (signature == null || signature.length() == 0) {
return rtnTypes;
}
// 预处理 分离集合类型
if (signature.indexOf('<') != -1) {
signature = signature.replaceAll("<", ";");
signature = signature.replaceAll(">", ";");
}
String[] types = signature.split(";");
for (String type : types) {
if (type.length() > 0) {
// 处理简单类型
String baseType = baseTypes.get(signature.substring(0, 1));
if (baseType != null) {
rtnTypes.add(baseType);
}
// 处理普通类型
int startIndex = type.indexOf(CLASS_DESCRIPTOR);
if (startIndex != -1) {
rtnTypes.add(slashesToDots(type.substring(startIndex + 1)));
}
}
}
return rtnTypes;
}
public static String filterGenerics(String signature) {
StringBuilder rtn = new StringBuilder();
int start = 0;
int end = signature.indexOf('<');
int pos;
while (end != -1) {
rtn.append(signature.substring(start, end));
start = signature.indexOf('>', end) + 1;
pos = signature.indexOf('<', end + 1);
if (pos != -1 && pos < start) {
start = signature.indexOf('>', start) + 1;
}
end = signature.indexOf('<', start);
}
rtn.append(signature.substring(start));
return rtn.toString();
}
public static String getMethodInfo(String info) {
int pos = info.indexOf("[(Unknown");
if (pos == -1) {
return info;
} else {
return info.substring(0, pos);
}
}
/**
* 是否为基本类型
*
* @param types
* @return
*/
public static boolean isBaseType(String type) {
if (baseTypes.values().contains(type)) {
return true;
} else {
return false;
}
}
/**
* 是否为有状态的对象类型
*
* @param types
* @return
*/
public static boolean isStateClassType(String type) {
if (stateClassTypes.contains(type)) {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
// String c = "(()Ljava/util/List<Ljdepend/core/JDependUnit;>;)";
// String c = "()Ljava/util/List<[B>;";
// String c =
// "(<T:Lcom/neusoft/comm/utils/Entity;>(Ljava/lang/String;)TT;)";
String c = "(Ljava/lang/String;)Lcom/neusoft/edu/entity/EntityContainer<Lcom/neusoft/edu/morg/entities/UnitEntity;>;";
Collection<String> types = ParseUtil.signatureToTypes(c);
for (String type : types) {
System.out.println(type);
}
// String c =
// "Ljdepend/model/JavaClass;Ljdepend/parse/JavaClassAnalysis";
// String c =
// "()Ljava/util/Map<Ljava/lang/String;Ljava/util/ArrayList<Ljava/lang/String;>;>;";
// System.out.println(ParseUtil.filterGenerics(c));
}
}