/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.dcd.graph; import java.lang.reflect.Member; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Represents a Class Member in a UsageGraph. */ public abstract class MemberNode<S extends MemberNode<S, T>, T extends Member> implements NodeVisitorAcceptor, Comparable<S> { protected final ClassNode classNode; protected final String name; protected final String desc; private List<MemberNode> uses; private List<MemberNode> users; private Object decoration; public MemberNode(ClassNode classNode, String name, String desc) { this.classNode = classNode; this.name = name; this.desc = desc; } @Override public Object accept(NodeVisitor visitor, Object data) { visitor.visitUses(this, data); visitor.visitUsers(this, data); return data; } public ClassNode getClassNode() { return classNode; } public String getName() { return name; } public String getDesc() { return desc; } public abstract T getMember(); public void addUse(MemberNode use) { if (uses == null) { uses = new ArrayList<>(1); } if (!uses.contains(use)) { uses.add(use); } } public List<MemberNode> getUses() { return uses != null ? uses : Collections.<MemberNode>emptyList(); } public void addUser(MemberNode user) { if (users == null) { users = new ArrayList<>(1); } if (!users.contains(user)) { users.add(user); } } public List<MemberNode> getUsers() { return users != null ? users : Collections.<MemberNode>emptyList(); } @Override public String toString() { return name + " " + desc; } public String toStringLong() { return getMember().toString(); } @SuppressWarnings("PMD.SuspiciousEqualsMethodName") public boolean equals(S that) { return equals(that.name, that.desc); } public boolean equals(String name, String desc) { return this.name.equals(name) && this.desc.equals(desc); } /* (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((desc == null) ? 0 : desc.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } MemberNode other = (MemberNode) obj; if (desc == null) { if (other.desc != null) { return false; } } else if (!desc.equals(other.desc)) { return false; } if (name == null) { if (other.name != null) { return false; } } else if (!name.equals(other.name)) { return false; } return true; } }