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