ConstructorNode.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.Constructor;
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 Constructor in a UsageGraph.
16  */
17 @SuppressWarnings("PMD.OverrideBothEqualsAndHashcode")
18 public class ConstructorNode extends MemberNode<ConstructorNode, Constructor<?>> {
19 
20   private WeakReference<Constructor<?>> constructorReference;
21 
22   public ConstructorNode(ClassNode classNode, String name, String desc) {
23     super(classNode, name, desc);
24     // getMember();
25   }
26 
27   public boolean isStaticInitializer() {
28     return ClassLoaderUtil.CLINIT.equals(name);
29   }
30 
31   public boolean isInstanceInitializer() {
32     return ClassLoaderUtil.INIT.equals(name);
33   }
34 
35   public Constructor<?> getMember() {
36     if (ClassLoaderUtil.CLINIT.equals(name)) {
37       return null;
38     else {
39       Constructor<?> constructor = constructorReference == null null : constructorReference.get();
40       if (constructor == null) {
41         SignatureReader signatureReader = new SignatureReader(desc);
42         TypeSignatureVisitor visitor = new TypeSignatureVisitor();
43         signatureReader.accept(visitor);
44         constructor = ClassLoaderUtil.getConstructor(super.getClassNode().getType(), name,
45             visitor.getMethodParameterTypes());
46         constructorReference = new WeakReference<Constructor<?>>(constructor);
47       }
48       return constructor;
49     }
50   }
51 
52   public String toStringLong() {
53     if (ClassLoaderUtil.CLINIT.equals(name)) {
54       return name;
55     else {
56       return super.toStringLong();
57     }
58   }
59 
60   public int compareTo(ConstructorNode that) {
61     // Order by name
62     int cmp = this.getName().compareTo(that.getName());
63     if (cmp == 0) {
64       // Order by parameter list length
65       cmp = this.getMember().getParameterTypes().length - that.getMember().getParameterTypes().length;
66       if (cmp == 0) {
67         // Order by parameter class name
68         for (int i = 0; i < this.getMember().getParameterTypes().length; i++) {
69           cmp = this.getMember().getParameterTypes()[i].getName().compareTo(
70               that.getMember().getParameterTypes()[i].getName());
71           if (cmp != 0) {
72             break;
73           }
74         }
75       }
76     }
77     return cmp;
78   }
79 
80   public boolean equals(Object obj) {
81     if (obj instanceof ConstructorNode) {
82       ConstructorNode that = (ConstructorNode)obj;
83       return super.equals(that);
84     }
85     return false;
86   }
87 }