1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.jxpath.ri.model.container;
19
20 import java.util.Locale;
21
22 import org.apache.commons.jxpath.Container;
23 import org.apache.commons.jxpath.ri.QName;
24 import org.apache.commons.jxpath.ri.compiler.NodeTest;
25 import org.apache.commons.jxpath.ri.model.NodeIterator;
26 import org.apache.commons.jxpath.ri.model.NodePointer;
27 import org.apache.commons.jxpath.util.ValueUtils;
28
29
30
31
32 public class ContainerPointer extends NodePointer {
33
34 private static final long serialVersionUID = 6140752946621686118L;
35
36
37
38
39 private final Container container;
40
41
42
43
44 private NodePointer valuePointer;
45
46
47
48
49
50
51
52 public ContainerPointer(final Container container, final Locale locale) {
53 super(null, locale);
54 this.container = container;
55 }
56
57
58
59
60
61
62
63 public ContainerPointer(final NodePointer parent, final Container container) {
64 super(parent);
65 this.container = container;
66 }
67
68 @Override
69 public String asPath() {
70 return parent == null ? "/" : parent.asPath();
71 }
72
73 @Override
74 public NodeIterator attributeIterator(final QName qName) {
75 return getValuePointer().attributeIterator(qName);
76 }
77
78 @Override
79 public NodeIterator childIterator(final NodeTest test, final boolean reverse, final NodePointer startWith) {
80 return getValuePointer().childIterator(test, reverse, startWith);
81 }
82
83 @Override
84 public int compareChildNodePointers(final NodePointer pointer1, final NodePointer pointer2) {
85 return pointer1.getIndex() - pointer2.getIndex();
86 }
87
88 @Override
89 public boolean equals(final Object object) {
90 if (object == this) {
91 return true;
92 }
93 if (!(object instanceof ContainerPointer)) {
94 return false;
95 }
96 final ContainerPointer other = (ContainerPointer) object;
97 return container == other.container && index == other.index;
98 }
99
100 @Override
101 public Object getBaseValue() {
102 return container;
103 }
104
105 @Override
106 public Object getImmediateNode() {
107 final Object value = getBaseValue();
108 if (index != WHOLE_COLLECTION) {
109 return index >= 0 && index < getLength() ? ValueUtils.getValue(value, index) : null;
110 }
111 return ValueUtils.getValue(value);
112 }
113
114 @Override
115 public NodePointer getImmediateValuePointer() {
116 if (valuePointer == null) {
117 final Object value = getImmediateNode();
118 valuePointer = newChildNodePointer(this, getName(), value);
119 }
120 return valuePointer;
121 }
122
123 @Override
124 public int getLength() {
125 final Object value = getBaseValue();
126 return value == null ? 1 : ValueUtils.getLength(value);
127 }
128
129 @Override
130 public QName getName() {
131 return null;
132 }
133
134 @Override
135 public String getNamespaceURI(final String prefix) {
136 return getValuePointer().getNamespaceURI(prefix);
137 }
138
139 @Override
140 public int hashCode() {
141 return System.identityHashCode(container) + index;
142 }
143
144 @Override
145 public boolean isCollection() {
146 final Object value = getBaseValue();
147 return value != null && ValueUtils.isCollection(value);
148 }
149
150
151
152
153
154
155 @Override
156 public boolean isContainer() {
157 return true;
158 }
159
160 @Override
161 public boolean isLeaf() {
162 return getValuePointer().isLeaf();
163 }
164
165 @Override
166 public NodeIterator namespaceIterator() {
167 return getValuePointer().namespaceIterator();
168 }
169
170 @Override
171 public NodePointer namespacePointer(final String namespace) {
172 return getValuePointer().namespacePointer(namespace);
173 }
174
175 @Override
176 public void setValue(final Object value) {
177
178 container.setValue(value);
179 }
180
181 @Override
182 public boolean testNode(final NodeTest nodeTest) {
183 return getValuePointer().testNode(nodeTest);
184 }
185 }