01: /*
02: * Copyright Aduna (http://www.aduna-software.com/) (c) 1997-2006.
03: *
04: * Licensed under the Aduna BSD-style license.
05: */
06: package org.openrdf.query.algebra;
07:
08: /**
09: * Main interface for all query model nodes.
10: */
11: public interface QueryModelNode extends Cloneable {
12:
13: /**
14: * Visits this node. The node reports itself to the visitor with the proper
15: * runtime type.
16: */
17: public <X extends Exception> void visit(QueryModelVisitor<X> visitor)
18: throws X;
19:
20: /**
21: * Visits the children of this node. The node calls
22: * {@link #visit(QueryModelVisitor)} on all of its child nodes.
23: */
24: public <X extends Exception> void visitChildren(
25: QueryModelVisitor<X> visitor) throws X;
26:
27: /**
28: * Gets the node's parent.
29: *
30: * @return The parent node, if any.
31: */
32: public QueryModelNode getParentNode();
33:
34: /**
35: * Sets the node's parent.
36: *
37: * @param parent
38: * The parent node for this node.
39: */
40: public void setParentNode(QueryModelNode parent);
41:
42: /**
43: * Replaces one of the child nodes with a new node.
44: *
45: * @param current
46: * The current child node.
47: * @param replacement
48: * The new child node.
49: * @throws IllegalArgumentException
50: * If <tt>current</tt> is not one of node's children.
51: * @throws ClassCastException
52: * If <tt>replacement</tt> is of an incompatible type.
53: */
54: public void replaceChildNode(QueryModelNode current,
55: QueryModelNode replacement);
56:
57: /**
58: * Substitutes this node with a new node in the query model tree.
59: *
60: * @param replacement
61: * The new node.
62: * @throws IllegalStateException
63: * If this node does not have a parent node.
64: * @throws ClassCastException
65: * If <tt>replacement</tt> is of an incompatible type.
66: */
67: public void replaceWith(QueryModelNode replacement);
68:
69: /**
70: * Returns an indented print of the node tree, starting from this node.
71: */
72: public String toString();
73:
74: /**
75: * Returns the signature of this query model node. Signatures normally
76: * include the node's name and any parameters, but not parent or child nodes.
77: * This method is used by {@link #toString()}.
78: *
79: * @return The node's signature, e.g. <tt>SLICE (offset=10, limit=10)</tt>.
80: */
81: public String getSignature();
82:
83: /**
84: * Returns a (deep) clone of this query model node. This method recursively
85: * clones the entire node tree, starting from this nodes.
86: *
87: * @return A deep clone of this query model node.
88: */
89: public QueryModelNode clone();
90: }
|