001 /*
002 * Copyright (c) 2007 Henri Sivonen
003 * Copyright (c) 2007-2009 Mozilla Foundation
004 *
005 * Permission is hereby granted, free of charge, to any person obtaining a
006 * copy of this software and associated documentation files (the "Software"),
007 * to deal in the Software without restriction, including without limitation
008 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
009 * and/or sell copies of the Software, and to permit persons to whom the
010 * Software is furnished to do so, subject to the following conditions:
011 *
012 * The above copyright notice and this permission notice shall be included in
013 * all copies or substantial portions of the Software.
014 *
015 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
016 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
017 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
018 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
019 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
020 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
021 * DEALINGS IN THE SOFTWARE.
022 */
023
024 package nu.validator.saxtree;
025
026 import java.util.List;
027
028 import org.xml.sax.Attributes;
029 import org.xml.sax.Locator;
030 import org.xml.sax.SAXException;
031
032 /**
033 * The common node superclass.
034 * @version $Id$
035 * @author hsivonen
036 */
037 public abstract class Node implements Locator {
038
039 /**
040 * The system id.
041 */
042 private final String systemId;
043
044 /**
045 * The public id.
046 */
047 private final String publicId;
048
049 /**
050 * The column.
051 */
052 private final int column;
053
054 /**
055 * The line.
056 */
057 private final int line;
058
059 /**
060 * The next sibling.
061 */
062 private Node nextSibling = null;
063
064 /**
065 * The parent.
066 */
067 private ParentNode parentNode = null;
068
069 /**
070 * The constructor.
071 *
072 * @param locator the locator
073 */
074 Node(Locator locator) {
075 if (locator == null) {
076 this.systemId = null;
077 this.publicId = null;
078 this.column = -1;
079 this.line = -1;
080 } else {
081 this.systemId = locator.getSystemId();
082 this.publicId = locator.getPublicId();
083 this.column = locator.getColumnNumber();
084 this.line = locator.getLineNumber();
085 }
086 }
087
088 /**
089 *
090 * @see org.xml.sax.Locator#getColumnNumber()
091 */
092 public int getColumnNumber() {
093 return column;
094 }
095
096 /**
097 *
098 * @see org.xml.sax.Locator#getLineNumber()
099 */
100 public int getLineNumber() {
101 return line;
102 }
103
104 /**
105 *
106 * @see org.xml.sax.Locator#getPublicId()
107 */
108 public String getPublicId() {
109 return publicId;
110 }
111
112 /**
113 *
114 * @see org.xml.sax.Locator#getSystemId()
115 */
116 public String getSystemId() {
117 return systemId;
118 }
119
120 /**
121 * Visit the node.
122 *
123 * @param treeParser the visitor
124 * @throws SAXException if stuff goes wrong
125 */
126 abstract void visit(TreeParser treeParser) throws SAXException;
127
128 /**
129 * Revisit the node.
130 *
131 * @param treeParser the visitor
132 * @throws SAXException if stuff goes wrong
133 */
134 void revisit(TreeParser treeParser) throws SAXException {
135 return;
136 }
137
138 /**
139 * Return the first child.
140 * @return the first child
141 */
142 public Node getFirstChild() {
143 return null;
144 }
145
146 /**
147 * Returns the nextSibling.
148 *
149 * @return the nextSibling
150 */
151 public final Node getNextSibling() {
152 return nextSibling;
153 }
154
155 /**
156 * Returns the previous sibling
157 * @return the previous sibling
158 */
159 public final Node getPreviousSibling() {
160 Node prev = null;
161 Node next = parentNode.getFirstChild();
162 for(;;) {
163 if (this == next) {
164 return prev;
165 }
166 prev = next;
167 next = next.nextSibling;
168 }
169 }
170
171 /**
172 * Sets the nextSibling.
173 *
174 * @param nextSibling the nextSibling to set
175 */
176 void setNextSibling(Node nextSibling) {
177 this.nextSibling = nextSibling;
178 }
179
180
181 /**
182 * Returns the parentNode.
183 *
184 * @return the parentNode
185 */
186 public final ParentNode getParentNode() {
187 return parentNode;
188 }
189
190 /**
191 * Sets the parentNode.
192 *
193 * @param parentNode the parentNode to set
194 */
195 void setParentNode(ParentNode parentNode) {
196 this.parentNode = parentNode;
197 }
198
199 /**
200 * Return the node type.
201 * @return the node type
202 */
203 public abstract NodeType getNodeType();
204
205 // Subclass-specific accessors that are hoisted here to
206 // avoid casting.
207
208 /**
209 * Detach this node from its parent.
210 */
211 public void detach() {
212 if (parentNode != null) {
213 parentNode.removeChild(this);
214 parentNode = null;
215 }
216 }
217
218 /**
219 * Returns the name.
220 *
221 * @return the name
222 */
223 public String getName() {
224 throw new UnsupportedOperationException();
225 }
226
227 /**
228 * Returns the publicIdentifier.
229 *
230 * @return the publicIdentifier
231 */
232 public String getPublicIdentifier() {
233 throw new UnsupportedOperationException();
234 }
235
236 /**
237 * Returns the systemIdentifier.
238 *
239 * @return the systemIdentifier
240 */
241 public String getSystemIdentifier() {
242 throw new UnsupportedOperationException();
243 }
244
245 /**
246 * Returns the attributes.
247 *
248 * @return the attributes
249 */
250 public Attributes getAttributes() {
251 throw new UnsupportedOperationException();
252 }
253
254 /**
255 * Returns the localName.
256 *
257 * @return the localName
258 */
259 public String getLocalName() {
260 throw new UnsupportedOperationException();
261 }
262
263 /**
264 * Returns the prefixMappings.
265 *
266 * @return the prefixMappings
267 */
268 public List<PrefixMapping> getPrefixMappings() {
269 throw new UnsupportedOperationException();
270 }
271
272 /**
273 * Returns the qName.
274 *
275 * @return the qName
276 */
277 public String getQName() {
278 throw new UnsupportedOperationException();
279 }
280
281 /**
282 * Returns the uri.
283 *
284 * @return the uri
285 */
286 public String getUri() {
287 throw new UnsupportedOperationException();
288 }
289
290 /**
291 * Returns the data.
292 *
293 * @return the data
294 */
295 public String getData() {
296 throw new UnsupportedOperationException();
297 }
298
299 /**
300 * Returns the target.
301 *
302 * @return the target
303 */
304 public String getTarget() {
305 throw new UnsupportedOperationException();
306 }
307 }