/** * 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.util.ArrayList; import java.util.Collections; import java.util.List; import net.sourceforge.pmd.dcd.ClassLoaderUtil; /** * Represents a Class in a UsageGraph. Contains lists of FieldNodes, * ConstructorNodes, and MethodNodes. */ public class ClassNode implements NodeVisitorAcceptor, Comparable<ClassNode> { private final String name; private WeakReference<Class<?>> typeReference; private List<FieldNode> fieldNodes; private List<ConstructorNode> constructorNodes; private List<MethodNode> methodNodes; public ClassNode(String name) { this.name = name; } @Override public Object accept(NodeVisitor visitor, Object data) { visitor.visitFields(this, data); visitor.visitConstructors(this, data); visitor.visitMethods(this, data); return data; } public String getName() { return name; } public Class<?> getType() { Class<?> type = typeReference == null ? null : typeReference.get(); if (type == null) { type = ClassLoaderUtil.getClass(ClassLoaderUtil.fromInternalForm(name)); typeReference = new WeakReference<Class<?>>(type); } return type; } public FieldNode defineField(String name, String desc) { if (fieldNodes == null) { fieldNodes = new ArrayList<>(1); } for (FieldNode fieldNode : fieldNodes) { if (fieldNode.equals(name, desc)) { return fieldNode; } } FieldNode fieldNode = new FieldNode(this, name, desc); fieldNodes.add(fieldNode); return fieldNode; } public ConstructorNode defineConstructor(String name, String desc) { if (constructorNodes == null) { constructorNodes = new ArrayList<>(1); } for (ConstructorNode constructorNode : constructorNodes) { if (constructorNode.equals(name, desc)) { return constructorNode; } } ConstructorNode constructorNode = new ConstructorNode(this, name, desc); constructorNodes.add(constructorNode); return constructorNode; } public MethodNode defineMethod(String name, String desc) { if (methodNodes == null) { methodNodes = new ArrayList<>(1); } for (MethodNode methodNode : methodNodes) { if (methodNode.equals(name, desc)) { return methodNode; } } MethodNode methodNode = new MethodNode(this, name, desc); methodNodes.add(methodNode); return methodNode; } public List<FieldNode> getFieldNodes() { return fieldNodes != null ? fieldNodes : Collections.<FieldNode>emptyList(); } public List<ConstructorNode> getConstructorNodes() { return constructorNodes != null ? constructorNodes : Collections.<ConstructorNode>emptyList(); } public List<MethodNode> getMethodNodes() { return methodNodes != null ? methodNodes : Collections.<MethodNode>emptyList(); } @Override public int compareTo(ClassNode that) { return this.name.compareTo(that.name); } @Override public boolean equals(Object obj) { if (obj instanceof ClassNode) { return this.name.equals(((ClassNode) obj).name); } return false; } @Override public int hashCode() { return name.hashCode(); } }