001 /**
002 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
003 */
004 package net.sourceforge.pmd.dcd.graph;
005
006 import java.lang.reflect.Member;
007 import java.util.ArrayList;
008 import java.util.Collections;
009 import java.util.List;
010
011 /**
012 * Represents a Class Member in a UsageGraph.
013 */
014 public abstract class MemberNode<S extends MemberNode<S, T>, T extends Member> implements NodeVisitorAcceptor,
015 Comparable<S> {
016 protected final ClassNode classNode;
017
018 protected final String name;
019
020 protected final String desc;
021
022 private List<MemberNode> uses;
023
024 private List<MemberNode> users;
025
026 private Object decoration;
027
028 public MemberNode(ClassNode classNode, String name, String desc) {
029 this.classNode = classNode;
030 this.name = name;
031 this.desc = desc;
032 }
033
034 public Object accept(NodeVisitor visitor, Object data) {
035 visitor.visitUses(this, data);
036 visitor.visitUsers(this, data);
037 return data;
038 }
039
040 public ClassNode getClassNode() {
041 return classNode;
042 }
043
044 public String getName() {
045 return name;
046 }
047
048 public String getDesc() {
049 return desc;
050 }
051
052 public abstract T getMember();
053
054 public void addUse(MemberNode use) {
055 if (uses == null) {
056 uses = new ArrayList<MemberNode>(1);
057 }
058 if (!uses.contains(use)) {
059 uses.add(use);
060 }
061 }
062
063 public List<MemberNode> getUses() {
064 return uses != null ? uses : Collections.<MemberNode> emptyList();
065 }
066
067 public void addUser(MemberNode user) {
068 if (users == null) {
069 users = new ArrayList<MemberNode>(1);
070 }
071 if (!users.contains(user)) {
072 users.add(user);
073 }
074 }
075
076 public List<MemberNode> getUsers() {
077 return users != null ? users : Collections.<MemberNode> emptyList();
078 }
079
080 public String toString() {
081 return name + " " + desc;
082 }
083
084 public String toStringLong() {
085 return getMember().toString();
086 }
087
088 public abstract boolean equals(Object that);
089
090 @SuppressWarnings("PMD.SuspiciousEqualsMethodName")
091 public boolean equals(S that) {
092 return equals(that.name, that.desc);
093 }
094
095 public boolean equals(String name, String desc) {
096 return this.name.equals(name) && this.desc.equals(desc);
097 }
098
099 public int hashCode() {
100 return name.hashCode() + desc.hashCode();
101 }
102 }
|