View Javadoc
1   package eu.simuline.relana.model;
2   
3   import java.util.Set;
4   import java.util.HashSet;
5   
6   /**
7    * Wraps a {@link Deficiency} and serves as a node in the graph 
8    * describing the relation <code>\implies</code>. 
9    *
10   *
11   * Created: Thu Apr 14 19:49:45 2005
12   *
13   * @author <a href="mailto:ernst.reissner@simuline.eu">Ernst Reissner</a>
14   * @version 1.0
15   */
16  
17  public final class DeficiencyNode {
18  
19      /* -------------------------------------------------------------------- *
20       * attributes.                                                          *
21       * -------------------------------------------------------------------- */
22  
23      private Set<DeficiencyNode> predecessors;
24  
25      private Set<DeficiencyNode> successors;
26  
27      // must be final because of {@link #hashCode()} 
28      private final Deficiency deficiency;
29  
30      /* -------------------------------------------------------------------- *
31       * constructors.                                                        *
32       * -------------------------------------------------------------------- */
33  
34      public DeficiencyNode(Deficiency deficiency) {
35  	this(deficiency,
36  	     new HashSet<DeficiencyNode>(),
37  	     new HashSet<DeficiencyNode>());
38      }
39  
40      public DeficiencyNode(Deficiency deficiency,
41  			  Set<DeficiencyNode> predecessors,
42  			  Set<DeficiencyNode> successors) {
43  	this.deficiency = deficiency;
44  	this.predecessors = predecessors;
45  	this.successors = successors;
46      } // DeficiencyNode constructor 
47  
48      public DeficiencyNode(DeficiencyNode node) {
49  	this(node.deficiency,
50  	     new HashSet<DeficiencyNode>(node.predecessors),
51  	     new HashSet<DeficiencyNode>(node.successors));
52      } // DeficiencyNode constructor 
53  
54  
55      /* -------------------------------------------------------------------- *
56       * methods.                                                             *
57       * -------------------------------------------------------------------- */
58  
59  
60      public static Set<Deficiency> unwrap(Set<DeficiencyNode> defNodes) {
61  	Set<Deficiency> res = new HashSet<Deficiency>();
62  	for (DeficiencyNode node : defNodes) {
63  	    res.add(node.getDeficiency());
64  	}
65  	
66  	return res;
67      }
68  
69      public Deficiency getDeficiency() {
70  	return this.deficiency;
71      }
72  
73      public Set<DeficiencyNode> getPredecessors() {
74  	return this.predecessors;
75      }
76  
77      public Set<DeficiencyNode> getSuccessors() {
78  	return this.successors;
79      }
80  
81      public void addPredecessor(DeficiencyNode deficiencyNode) {
82  	this.predecessors.add(deficiencyNode);
83      }
84  
85      public void addSuccessor(DeficiencyNode deficiencyNode) {
86  	this.successors.add(deficiencyNode);
87      }
88  
89      public void addPredecessors(Set<DeficiencyNode> nodes) {
90  	this.predecessors.addAll(nodes);
91      }
92  
93      public void addSuccessors(Set<DeficiencyNode> nodes) {
94  	this.successors.addAll(nodes);
95      }
96  
97      @SuppressWarnings("checkstyle:nowhitespaceafter")
98      public void addAll(DeficiencyNode other) {
99  	if (!other.getDeficiency().equals(getDeficiency())) {
100 	    throw new IllegalArgumentException
101 		("Deficiencies" + getDeficiency() + " and " + 
102 		    other.getDeficiency() + " should coincide. ");
103 	}
104 	
105 	this.predecessors.addAll(other.getPredecessors());
106 	this.  successors.addAll(other.getSuccessors  ());
107     }
108 
109     public DeficiencyNode getInverse() {
110 	return new DeficiencyNode(this.deficiency,
111 				  this.successors,
112 				  this.predecessors);
113     }
114 
115     public String toString() {
116 	StringBuffer res = new StringBuffer();
117 	res.append("\n<DeficiencyNode deficiency=\"");
118 	res.append(this.deficiency);
119 	res.append("\">");
120 	if (!this.predecessors.isEmpty()) {
121 	    res.append("<Predecessors>");
122 	    for (DeficiencyNode node : this.predecessors) {
123 		res.append(node.getDeficiency().getName());
124 	    }
125 	    res.append("</Predecessors>\n");
126 
127 	}
128 	
129 	if (!this.successors.isEmpty()) {
130 	    res.append("<Successors>");
131 	    for (DeficiencyNode node : this.successors) {
132 		res.append(node.getDeficiency().getName());
133 	    }
134 	    res.append("</Successors>\n");
135 	}
136 	res.append("</DeficiencyNode>");
137 	return res.toString();
138     }
139 
140     public boolean equals(Object obj) {
141 	if (!(obj instanceof DeficiencyNode)) {
142 	    return false;
143 	}
144 	DeficiencyNode other = (DeficiencyNode) obj;
145 	return 
146 	    getDeficiency  ().equals(other.getDeficiency  ()) && 
147 	    getPredecessors().equals(other.getPredecessors()) && 
148 	    getSuccessors  ().equals(other.getSuccessors  ());
149     }
150 
151     public int hashCode() {
152 	return getDeficiency().hashCode();
153     }
154 
155 } // DeficiencyNode