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