01: package net.sourceforge.pmd.dcd.graph;
02:
03: import java.lang.ref.WeakReference;
04: import java.lang.reflect.Method;
05:
06: import net.sourceforge.pmd.dcd.ClassLoaderUtil;
07: import net.sourceforge.pmd.dcd.asm.TypeSignatureVisitor;
08:
09: import org.objectweb.asm.signature.SignatureReader;
10:
11: /**
12: * Represents a Class Method in a UsageGraph.
13: */
14: public class MethodNode extends MemberNode<MethodNode, Method> {
15:
16: private WeakReference<Method> methodReference;
17:
18: public MethodNode(ClassNode classNode, String name, String desc) {
19: super (classNode, name, desc);
20: // getMember();
21: }
22:
23: public Method getMember() {
24: Method method = methodReference == null ? null
25: : methodReference.get();
26: if (method == null) {
27: SignatureReader signatureReader = new SignatureReader(desc);
28: TypeSignatureVisitor visitor = new TypeSignatureVisitor();
29: signatureReader.accept(visitor);
30: method = ClassLoaderUtil
31: .getMethod(super .getClassNode().getType(), name,
32: visitor.getMethodParameterTypes());
33: methodReference = new WeakReference<Method>(method);
34: }
35: return method;
36: }
37:
38: public int compareTo(MethodNode that) {
39: // Order by method name
40: int cmp = this .getName().compareTo(that.getName());
41: if (cmp == 0) {
42: // Order by parameter list length
43: cmp = this .getMember().getParameterTypes().length
44: - that.getMember().getParameterTypes().length;
45: if (cmp == 0) {
46: // Order by parameter class name
47: for (int i = 0; i < this .getMember()
48: .getParameterTypes().length; i++) {
49: cmp = this .getMember().getParameterTypes()[i]
50: .getName().compareTo(
51: that.getMember()
52: .getParameterTypes()[i]
53: .getName());
54: if (cmp != 0) {
55: break;
56: }
57: }
58: }
59: }
60: return cmp;
61: }
62:
63: public boolean equals(Object obj) {
64: if (obj instanceof MethodNode) {
65: MethodNode that = (MethodNode) obj;
66: return super .equals(that);
67: }
68: return false;
69: }
70: }
|