1 /*
2 * Zemucan: A Syntax Assistant for DB2
3 * Copyright (C) 2009, 2010 Andres Gomez Casanova
4 *
5 * This file is part of Zemucan.
6 *
7 * Zemucan is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * Zemucan is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, see <http://www.gnu.org/licenses/>.
19 *
20 * Contact:
21 * a n g o c a at y a h o o dot c o m
22 * Cra. 45 No 61 - 31, Bogota, Colombia.
23 *
24 * Author: $LastChangedBy: angoca $:
25 * Date: $LastChangedDate: 2011-03-06 23:10:20 -0500 (dom, 06 mar 2011) $:
26 * Revision: $LastChangedRevision: 1917 $:
27 * URL: $HeadURL: https://zemucan.svn.sourceforge.net/svnroot/zemucan/branches/zemucan_v1/source-code/graph/src/main/java/name/angoca/zemucan/core/graph/model/EndingNode.java $:
28 */
29 package name.angoca.zemucan.core.graph.model;
30
31 import java.util.List;
32
33 import name.angoca.zemucan.core.graph.api.ChildEndingNodeException;
34 import name.angoca.zemucan.core.graph.api.InvalidGraphNodeException;
35 import name.angoca.zemucan.tools.Constants;
36
37 /**
38 * This token represents the last token in the grammar (the ending node in the
39 * graph.) All the possible ways ends in this token.
40 * <p>
41 * This object is immutable, once it is created, their properties cannot be
42 * changed. This is the reason because there are not setter methods.
43 * <p>
44 * <b>Control Version</b>
45 * <p>
46 * <ul>
47 * <li>0.0.1 Class creation.</li>
48 * <li>0.0.2 Recommendations from PMD.</li>
49 * <li>0.0.3 Change constant value.</li>
50 * <li>0.0.4 Starting and ending token as constants.</li>
51 * <li>0.0.5 Equals from super.</li>
52 * <li>0.0.6 Equals different super.</li>
53 * <li>1.0.0 Moved to version 1.</li>
54 * <li>1.1.0 Exception hierarchy changed.</li>
55 * <li>1.2.0 final.</li>
56 * <li>1.2.1 compareTo -> equals.</li>
57 * <li>1.3.0 Add way.</li>
58 * <li>1.3.1 GraphToken renamed by GraphNode</li>
59 * <li>1.3.2 Token constant renamed to Node.</li>
60 * <li>1.4.0 GrammarReader separated from Graph.</li>
61 * <li>1.5.0 AddChildren, toString.</li>
62 * <li>1.6.0 GraphNode hierarchy.</li>
63 * <li>1.7.0 Final methods.</li>
64 * </ul>
65 *
66 * @author Andres Gomez Casanova <a
67 * href="mailto:a n g o c a at y a h o o dot c o m">(AngocA)</a>
68 * @version 1.7.0 2010-09-03
69 */
70 public final class EndingNode extends BorderNode {
71
72 /**
73 * Constructor that defines the ending node. Its name is ENDING_NODE and
74 * this works as a reserved name token..
75 *
76 * @param graph
77 * Associated graph.
78 * @throws InvalidGraphNodeException
79 * The name is invalid.
80 */
81 EndingNode(final Graph/* ! */graph) throws InvalidGraphNodeException {
82 super(Constants.ENDING_NODE, graph);
83 }
84
85 /**
86 * Always throws an exception, because an EndingNode cannot have children.
87 *
88 * @see name.angoca.zemucan.core.graph.model.AbstractGraphNode#addChild(name.angoca.zemucan.core.graph.model.AbstractGraphNode)
89 */
90 @Override
91 final void addChild(final AbstractGraphNode/* ! */token)
92 throws AbstractGraphException {
93 throw new ChildEndingNodeException();
94 }
95
96 /*
97 * (non-Javadoc)
98 *
99 * @see
100 * name.angoca.zemucan.core.graph.model.AbstractGraphNode#equals(java.lang
101 * .Object)
102 */
103 @Override
104 public final boolean equals(final Object/* ? */object) {
105 // The equals was designed not to be symmetric with its parent.
106 boolean equals = false;
107 if (object instanceof EndingNode) {
108 final EndingNode token = (EndingNode) object;
109 final List<AbstractGraphNode> ways = token.getChildren();
110 if ((ways.size() == this.getChildren().size())
111 && (this.getChildren().size() == 0)) {
112 equals = true;
113 }
114 }
115 return equals;
116 }
117
118 /*
119 * (non-Javadoc)
120 *
121 * @see java.lang.Object#hashCode()
122 */
123 @Override
124 public final int hashCode() {
125 return Constants.ENDING_NODE.hashCode() * -1;
126 }
127
128 /*
129 * (non-Javadoc)
130 *
131 * @see
132 * name.angoca.zemucan.core.graph.model.AbstractGraphNode#represent(java
133 * .lang.String)
134 */
135 @Override
136 public final boolean represent(final String token) {
137 boolean ret = false;
138 if (token.equals(Constants.ENDING_NODE)) {
139 ret = true;
140 }
141 return ret;
142 }
143
144 /**
145 * Returns a string representation of an ending token.
146 *
147 * @see java.lang.Object#toString()
148 * @return String representation of an ending token.
149 */
150 @Override
151 public final String/* ! */toString() {
152 String ret = '{' + Constants.ENDING_NODE;
153 if (super.getParents().size() > 0) {
154 ret += '[';
155 for (final AbstractGraphNode node : super.getParents()) {
156 ret += node.getId() + '-';
157 }
158 ret = ret.substring(0, ret.length() - 1);
159 ret += ']';
160 }
161 ret += '}';
162 return ret;
163 }
164
165 }