MemberNode.java
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 }