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.dynamic;
19
20 import java.util.Locale;
21
22 import org.apache.commons.jxpath.DynamicPropertyHandler;
23 import org.apache.commons.jxpath.JXPathIntrospector;
24 import org.apache.commons.jxpath.ri.QName;
25 import org.apache.commons.jxpath.ri.model.NodeIterator;
26 import org.apache.commons.jxpath.ri.model.NodePointer;
27 import org.apache.commons.jxpath.ri.model.beans.PropertyIterator;
28 import org.apache.commons.jxpath.ri.model.beans.PropertyOwnerPointer;
29 import org.apache.commons.jxpath.ri.model.beans.PropertyPointer;
30
31
32
33
34
35 public class DynamicPointer extends PropertyOwnerPointer {
36
37 private static final long serialVersionUID = -1842347025295904256L;
38
39
40
41
42 private final QName qName;
43
44
45
46
47 private final Object bean;
48
49
50
51
52 private final DynamicPropertyHandler handler;
53
54
55
56
57
58
59
60
61
62 public DynamicPointer(final NodePointer parent, final QName qName, final Object bean, final DynamicPropertyHandler handler) {
63 super(parent);
64 this.qName = qName;
65 this.bean = bean;
66 this.handler = handler;
67 }
68
69
70
71
72
73
74
75
76
77 public DynamicPointer(final QName qName, final Object bean, final DynamicPropertyHandler handler, final Locale locale) {
78 super(null, locale);
79 this.qName = qName;
80 this.bean = bean;
81 this.handler = handler;
82 }
83
84 @Override
85 public String asPath() {
86 return parent == null ? "/" : super.asPath();
87 }
88
89 @Override
90 public NodeIterator attributeIterator(final QName qName) {
91 return new DynamicAttributeIterator(this, qName);
92 }
93
94 @Override
95 public NodeIterator createNodeIterator(final String property, final boolean reverse, final NodePointer startWith) {
96 return new PropertyIterator(this, property, reverse, startWith);
97 }
98
99 @Override
100 public boolean equals(final Object object) {
101 if (object == this) {
102 return true;
103 }
104 if (!(object instanceof DynamicPointer)) {
105 return false;
106 }
107 final DynamicPointer other = (DynamicPointer) object;
108 if (bean != other.bean) {
109 return false;
110 }
111 return qName == other.qName || qName != null && qName.equals(other.qName);
112 }
113
114
115
116
117
118
119 @Override
120 public Object getBaseValue() {
121 return bean;
122 }
123
124
125
126
127
128
129 @Override
130 public int getLength() {
131 return 1;
132 }
133
134 @Override
135 public QName getName() {
136 return qName;
137 }
138
139 @Override
140 public PropertyPointer getPropertyPointer() {
141 return new DynamicPropertyPointer(this, handler);
142 }
143
144 @Override
145 public int hashCode() {
146 return System.identityHashCode(bean) + (qName == null ? 0 : qName.hashCode());
147 }
148
149 @Override
150 public boolean isCollection() {
151 return false;
152 }
153
154 @Override
155 public boolean isDynamicPropertyDeclarationSupported() {
156 return true;
157 }
158
159 @Override
160 public boolean isLeaf() {
161 final Object value = getNode();
162 return value == null || JXPathIntrospector.getBeanInfo(value.getClass()).isAtomic();
163 }
164 }