View Javadoc

1   /**
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
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   * Represents a Class in a UsageGraph.  Contains lists of FieldNodes,
15   * ConstructorNodes, and MethodNodes.
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 }