1
2
3
4 package net.sourceforge.pmd.dcd.graph;
5
6 import java.lang.ref.WeakReference;
7 import java.util.ArrayList;
8 import java.util.Collections;
9 import java.util.List;
10
11 import net.sourceforge.pmd.dcd.ClassLoaderUtil;
12
13
14
15
16
17 public class ClassNode implements NodeVisitorAcceptor, Comparable<ClassNode> {
18
19 private final String name;
20
21 private WeakReference<Class<?>> typeReference;
22
23 private List<FieldNode> fieldNodes;
24
25 private List<ConstructorNode> constructorNodes;
26
27 private List<MethodNode> methodNodes;
28
29 public ClassNode(String name) {
30 this.name = name;
31 }
32
33 public Object accept(NodeVisitor visitor, Object data) {
34 visitor.visitFields(this, data);
35 visitor.visitConstructors(this, data);
36 visitor.visitMethods(this, data);
37 return data;
38 }
39
40 public String getName() {
41 return name;
42 }
43
44 public Class<?> getType() {
45 Class<?> type = typeReference == null ? null : typeReference.get();
46 if (type == null) {
47 type = ClassLoaderUtil.getClass(ClassLoaderUtil.fromInternalForm(name));
48 typeReference = new WeakReference<Class<?>>(type);
49 }
50 return type;
51 }
52
53 public FieldNode defineField(String name, String desc) {
54 if (fieldNodes == null) {
55 fieldNodes = new ArrayList<FieldNode>(1);
56 }
57 for (FieldNode fieldNode : fieldNodes) {
58 if (fieldNode.equals(name, desc)) {
59 return fieldNode;
60 }
61 }
62 FieldNode fieldNode = new FieldNode(this, name, desc);
63 fieldNodes.add(fieldNode);
64 return fieldNode;
65 }
66
67 public ConstructorNode defineConstructor(String name, String desc) {
68 if (constructorNodes == null) {
69 constructorNodes = new ArrayList<ConstructorNode>(1);
70 }
71 for (ConstructorNode constructorNode : constructorNodes) {
72 if (constructorNode.equals(name, desc)) {
73 return constructorNode;
74 }
75 }
76
77 ConstructorNode constructorNode = new ConstructorNode(this, name, desc);
78 constructorNodes.add(constructorNode);
79 return constructorNode;
80 }
81
82 public MethodNode defineMethod(String name, String desc) {
83 if (methodNodes == null) {
84 methodNodes = new ArrayList<MethodNode>(1);
85 }
86 for (MethodNode methodNode : methodNodes) {
87 if (methodNode.equals(name, desc)) {
88 return methodNode;
89 }
90 }
91
92 MethodNode methodNode = new MethodNode(this, name, desc);
93 methodNodes.add(methodNode);
94 return methodNode;
95 }
96
97 public List<FieldNode> getFieldNodes() {
98 return fieldNodes != null ? fieldNodes : Collections.<FieldNode> emptyList();
99 }
100
101 public List<ConstructorNode> getConstructorNodes() {
102 return constructorNodes != null ? constructorNodes : Collections.<ConstructorNode> emptyList();
103 }
104
105 public List<MethodNode> getMethodNodes() {
106 return methodNodes != null ? methodNodes : Collections.<MethodNode> emptyList();
107 }
108
109 public int compareTo(ClassNode that) {
110 return this.name.compareTo(that.name);
111 }
112
113 public boolean equals(Object obj) {
114 if (obj instanceof ClassNode) {
115 return this.name.equals(((ClassNode)obj).name);
116 }
117 return false;
118 }
119
120 public int hashCode() {
121 return name.hashCode();
122 }
123 }