/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.dcd.graph;
import java.lang.ref.WeakReference;
import java.lang.reflect.Constructor;
import org.objectweb.asm.signature.SignatureReader;
import net.sourceforge.pmd.dcd.ClassLoaderUtil;
import net.sourceforge.pmd.dcd.asm.TypeSignatureVisitor;
/**
* Represents a Class Constructor in a UsageGraph.
*/
@SuppressWarnings("PMD.OverrideBothEqualsAndHashcode")
public class ConstructorNode extends MemberNode<ConstructorNode, Constructor<?>> {
private WeakReference<Constructor<?>> constructorReference;
public ConstructorNode(ClassNode classNode, String name, String desc) {
super(classNode, name, desc);
// getMember();
}
public boolean isStaticInitializer() {
return ClassLoaderUtil.CLINIT.equals(name);
}
public boolean isInstanceInitializer() {
return ClassLoaderUtil.INIT.equals(name);
}
@Override
public Constructor<?> getMember() {
if (ClassLoaderUtil.CLINIT.equals(name)) {
return null;
} else {
Constructor<?> constructor = constructorReference == null ? null : constructorReference.get();
if (constructor == null) {
SignatureReader signatureReader = new SignatureReader(desc);
TypeSignatureVisitor visitor = new TypeSignatureVisitor();
signatureReader.accept(visitor);
constructor = ClassLoaderUtil.getConstructor(super.getClassNode().getType(), name,
visitor.getMethodParameterTypes());
constructorReference = new WeakReference<Constructor<?>>(constructor);
}
return constructor;
}
}
@Override
public String toStringLong() {
if (ClassLoaderUtil.CLINIT.equals(name)) {
return name;
} else {
return super.toStringLong();
}
}
@Override
public int compareTo(ConstructorNode that) {
// Order by name
int cmp = this.getName().compareTo(that.getName());
if (cmp == 0) {
// Order by parameter list length
cmp = this.getMember().getParameterTypes().length - that.getMember().getParameterTypes().length;
if (cmp == 0) {
// Order by parameter class name
for (int i = 0; i < this.getMember().getParameterTypes().length; i++) {
cmp = this.getMember().getParameterTypes()[i].getName()
.compareTo(that.getMember().getParameterTypes()[i].getName());
if (cmp != 0) {
break;
}
}
}
}
return cmp;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof ConstructorNode) {
ConstructorNode that = (ConstructorNode) obj;
return super.equals(that);
}
return false;
}
/* (non-Javadoc)
* @see net.sourceforge.pmd.dcd.graph.MemberNode#hashCode()
*/
@Override
public int hashCode() {
return super.hashCode();
}
}