dmitri 2002/10/12 19:26:50
Modified: jxpath/src/java/org/apache/commons/jxpath/ri
JXPathContextReferenceImpl.java
Log:
Fixed this bug: setLenient(true) did not have the advertised effect in some cases
Revision Changes Path
1.22 +19 -8
jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.java
Index: JXPathContextReferenceImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.java,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- JXPathContextReferenceImpl.java 26 Aug 2002 22:29:49 -0000 1.21
+++ JXPathContextReferenceImpl.java 13 Oct 2002 02:26:50 -0000 1.22
@@ -211,15 +211,26 @@
public Object getValue(String xpath, Expression expr){
Object result = expr.computeValue(getRootContext());
- if (result == null && !lenient){
- throw new JXPathException("No value for xpath: " + xpath);
- }
-
if (result instanceof EvalContext){
EvalContext ctx = (EvalContext)result;
result = ctx.getSingleNodePointer();
+ if (!lenient && result == null){
+ throw new JXPathException("No value for xpath: " + xpath);
+ }
}
if (result instanceof NodePointer){
+ if (!lenient && !((NodePointer)result).isActual()){
+ // We need to differentiate between pointers representing
+ // a non-existing property and one representing a property
+ // whose value is null. In the latter case, the pointer
+ // is going to have isActual == false, but its parent,
+ // which is a non-node pointer identifying the bean property,
+ // will return isActual() == true.
+ NodePointer parent = ((NodePointer)result).getParent();
+ if (parent == null || parent.isNode() || !parent.isActual()){
+ throw new JXPathException("No value for xpath: " + xpath);
+ }
+ }
result = ((NodePointer)result).getValue();
}
return result;
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>