package com.telerik.metadata; import com.telerik.metadata.desc.ClassDescriptor; import com.telerik.metadata.desc.MethodDescriptor; import com.telerik.metadata.desc.TypeDescriptor; import java.util.ArrayList; public class TreeNode { public static class MethodInfo { public MethodInfo(MethodDescriptor m) { this.name = m.getName(); this.sig = m.getSignature(); this.isResolved = false; signature = new ArrayList<TreeNode>(); } public String name; public String sig; public ArrayList<TreeNode> signature; public TreeNode declaringType; public boolean isResolved; } public static TreeNode getRoot() { TreeNode root = new TreeNode(); root.setName(""); root.children.add(BYTE); root.children.add(SHORT); root.children.add(INTEGER); root.children.add(LONG); root.children.add(FLOAT); root.children.add(DOUBLE); root.children.add(BOOLEAN); root.children.add(CHAR); return root; } public static class FieldInfo { public FieldInfo(String name) { this.name = name; } public String name; public TreeNode valueType; public TreeNode declaringType; public boolean isFinalType; } public static final byte Package = 0; public static final byte Class = 1 << 0; public static final byte Interface = 1 << 1; public static final byte Static = 1 << 2; public static final byte Array = 1 << 3; public static final byte Primitive = 1 << 4; public static final byte Final = 1; public TreeNode() { children = new ArrayList<TreeNode>(); instanceMethods = new ArrayList<TreeNode.MethodInfo>(); staticMethods = new ArrayList<TreeNode.MethodInfo>(); instanceFields = new ArrayList<TreeNode.FieldInfo>(); staticFields = new ArrayList<TreeNode.FieldInfo>(); } public static final TreeNode BYTE = getPrimitive("B", (byte) 1); public static final TreeNode SHORT = getPrimitive("S", (byte) 2); public static final TreeNode INTEGER = getPrimitive("I", (byte) 3); public static final TreeNode LONG = getPrimitive("J", (byte) 4); public static final TreeNode FLOAT = getPrimitive("F", (byte) 5); public static final TreeNode DOUBLE = getPrimitive("D", (byte) 6); public static final TreeNode BOOLEAN = getPrimitive("Z", (byte) 7); public static final TreeNode CHAR = getPrimitive("C", (byte) 8); public static TreeNode getPrimitive(TypeDescriptor type) throws Exception { if (!ClassUtil.isPrimitive(type)) { throw new Exception("type must be primitive"); } if (type.equals(TypeDescriptor.BYTE)) { return TreeNode.BYTE; } else if (type.equals(TypeDescriptor.SHORT)) { return TreeNode.SHORT; } else if (type.equals(TypeDescriptor.INT)) { return TreeNode.INTEGER; } else if (type.equals(TypeDescriptor.LONG)) { return TreeNode.LONG; } else if (type.equals(TypeDescriptor.FLOAT)) { return TreeNode.FLOAT; } else if (type.equals(TypeDescriptor.DOUBLE)) { return TreeNode.DOUBLE; } else if (type.equals(TypeDescriptor.BOOLEAN)) { return TreeNode.BOOLEAN; } else if (type.equals(TypeDescriptor.CHAR)) { return TreeNode.CHAR; } else if (type.equals(TypeDescriptor.VOID)) { return null; } else { throw new Exception("unknown type=" + type.toString()); } } public static TreeNode getPrimitive(ClassDescriptor clazz) throws Exception { if (!ClassUtil.isPrimitive(clazz)) { throw new Exception("clazz must be primitive"); } String name = clazz.getClassName(); if (name.equals("byte")) { return TreeNode.BYTE; } else if (name.equals("short")) { return TreeNode.SHORT; } else if (name.equals("int")) { return TreeNode.INTEGER; } else if (name.equals("long")) { return TreeNode.LONG; } else if (name.equals("float")) { return TreeNode.FLOAT; } else if (name.equals("double")) { return TreeNode.DOUBLE; } else if (name.equals("boolean")) { return TreeNode.BOOLEAN; } else if (name.equals("char")) { return TreeNode.CHAR; } else if (name.equals("void")) { return null; } else { throw new Exception("unknown type=" + name); } } public static TreeNode getPrimitive(String name) throws IllegalArgumentException { if (name.equals("B")) { return TreeNode.BYTE; } else if (name.equals("S")) { return TreeNode.SHORT; } else if (name.equals("I")) { return TreeNode.INTEGER; } else if (name.equals("J")) { return TreeNode.LONG; } else if (name.equals("F")) { return TreeNode.FLOAT; } else if (name.equals("D")) { return TreeNode.DOUBLE; } else if (name.equals("Z")) { return TreeNode.BOOLEAN; } else if (name.equals("C")) { return TreeNode.CHAR; } else if (name.equals("V")) { return null; } else { throw new IllegalArgumentException("unknown type=" + name); } } private static TreeNode getPrimitive(String name, byte id) { TreeNode node = new TreeNode(); node.setName(name); node.nodeType = (byte) (Primitive + id); node.offsetValue = 1; return node; } public String getName() { return _name; } public void setName(String value) { _name = value; } private String _name; // public short id; public short firstChildId; public short nextSiblingId; // public byte nodeType; public int offsetName; public int offsetValue; // public TreeNode arrayElement; // public ArrayList<MethodInfo> instanceMethods; public ArrayList<MethodInfo> staticMethods; public ArrayList<FieldInfo> instanceFields; public ArrayList<FieldInfo> staticFields; public TreeNode baseClassNode; // public ArrayList<TreeNode> children; public TreeNode getChild(String childName) { TreeNode child = null; for (TreeNode c : children) { boolean found = c.getName().equals(childName); if (found) { child = c; break; } } return child; } public TreeNode createChild(String childName) { TreeNode child = new TreeNode(); child.setName(childName); children.add(child); return child; } public TreeNode attachChild(ClassDescriptor clazz) throws Exception { TreeNode child = getPrimitive(clazz); children.add(child); return child; } }