dmitri 2002/11/27 17:02:05 Modified: jxpath/src/java/org/apache/commons/jxpath/ri JXPathContextReferenceImpl.java jxpath/src/java/org/apache/commons/jxpath/ri/axes ChildContext.java ParentContext.java PrecedingOrFollowingContext.java jxpath/src/java/org/apache/commons/jxpath/ri/model NodePointer.java VariablePointer.java jxpath/src/java/org/apache/commons/jxpath/ri/model/beans BeanPropertyPointer.java CollectionPointer.java NullElementPointer.java NullPropertyPointer.java PropertyIterator.java PropertyOwnerPointer.java jxpath/src/java/org/apache/commons/jxpath/ri/model/container ContainerPointer.java jxpath/src/java/org/apache/commons/jxpath/ri/model/dynabeans DynaBeanPropertyPointer.java jxpath/src/test/org/apache/commons/jxpath JXPathTestSuite.java jxpath/src/test/org/apache/commons/jxpath/ri/axes SimplePathInterpreterTest.java jxpath/src/test/org/apache/commons/jxpath/ri/model MixedModelTest.java Added: jxpath/src/test/org/apache/commons/jxpath/ri/model ExceptionPropertyTestBean.java jxpath/src/test/org/apache/commons/jxpath/ri/model/dynamic TestDynamicPropertyFactory.java Removed: jxpath/src/test/org/apache/commons/jxpath/ri/model TestDynamicPropertyFactory.java Log: Renamed isNode to !isContainer Cleaned up asPath Ignore exceptions during a property iteration Revision Changes Path 1.24 +17 -14 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.23 retrieving revision 1.24 diff -u -r1.23 -r1.24 --- JXPathContextReferenceImpl.java 20 Oct 2002 03:44:27 -0000 1.23 +++ JXPathContextReferenceImpl.java 28 Nov 2002 01:02:04 -0000 1.24 @@ -75,8 +75,8 @@ import org.apache.commons.jxpath.ri.model.VariablePointer; import org.apache.commons.jxpath.ri.model.beans.BeanPointerFactory; import org.apache.commons.jxpath.ri.model.beans.CollectionPointerFactory; -import org.apache.commons.jxpath.ri.model.beans.DynamicPointerFactory; import org.apache.commons.jxpath.ri.model.container.ContainerPointerFactory; +import org.apache.commons.jxpath.ri.model.dynamic.DynamicPointerFactory; import org.apache.commons.jxpath.util.TypeUtils; /** @@ -222,27 +222,30 @@ public Object getValue(String xpath, Expression expr){ Object result = expr.computeValue(getRootContext()); - if (result instanceof EvalContext){ - EvalContext ctx = (EvalContext)result; + if (result instanceof EvalContext) { + EvalContext ctx = (EvalContext) result; result = ctx.getSingleNodePointer(); - if (!lenient && result == null){ + if (!lenient && result == null) { throw new JXPathException("No value for xpath: " + xpath); } } - if (result instanceof NodePointer){ - if (!lenient && !((NodePointer)result).isActual()){ + if (result instanceof NodePointer) { + result = ((NodePointer) result).getValuePointer(); + if (!lenient && !((NodePointer) result).isActual()) { // We need to differentiate between pointers representing - // a non-existing property and one representing a property + // a non-existing property and ones 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()){ + NodePointer parent = ((NodePointer) result).getParent(); + if (parent == null + || !parent.isContainer() + || !parent.isActual()) { throw new JXPathException("No value for xpath: " + xpath); } } - result = ((NodePointer)result).getValue(); + result = ((NodePointer) result).getValue(); } return result; } 1.11 +5 -5 jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/axes/ChildContext.java Index: ChildContext.java =================================================================== RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/axes/ChildContext.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- ChildContext.java 10 Aug 2002 01:31:37 -0000 1.10 +++ ChildContext.java 28 Nov 2002 01:02:04 -0000 1.11 @@ -157,7 +157,7 @@ } if (startFromParentLocation){ NodePointer pointer = parent.getParent(); - while (pointer != null && !pointer.isNode()){ + while (pointer != null && pointer.isContainer()){ pointer = pointer.getParent(); } 1.10 +5 -5 jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/axes/ParentContext.java Index: ParentContext.java =================================================================== RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/axes/ParentContext.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- ParentContext.java 26 Nov 2002 01:20:06 -0000 1.9 +++ ParentContext.java 28 Nov 2002 01:02:04 -0000 1.10 @@ -111,7 +111,7 @@ setStarted = true; NodePointer thisLocation = parentContext.getCurrentNodePointer(); currentNodePointer = thisLocation.getParent(); - while (currentNodePointer != null && !currentNodePointer.isNode()){ + while (currentNodePointer != null && currentNodePointer.isContainer()){ currentNodePointer = currentNodePointer.getParent(); } if (currentNodePointer != null && 1.10 +5 -5 jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/axes/PrecedingOrFollowingContext.java Index: PrecedingOrFollowingContext.java =================================================================== RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/axes/PrecedingOrFollowingContext.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- PrecedingOrFollowingContext.java 26 Nov 2002 01:20:06 -0000 1.9 +++ PrecedingOrFollowingContext.java 28 Nov 2002 01:02:04 -0000 1.10 @@ -194,7 +194,7 @@ * If the pointer is auxiliary, return the parent; otherwise - the pointer itself */ private NodePointer getMaterialPointer(NodePointer pointer){ - while (pointer != null && !pointer.isNode()){ + while (pointer != null && pointer.isContainer()){ pointer = pointer.getParent(); } return pointer; 1.14 +46 -48 jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/NodePointer.java Index: NodePointer.java =================================================================== RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/NodePointer.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- NodePointer.java 26 Nov 2002 01:20:06 -0000 1.13 +++ NodePointer.java 28 Nov 2002 01:02:04 -0000 1.14 @@ -72,14 +72,13 @@ import org.apache.commons.jxpath.ri.compiler.NodeNameTest; import org.apache.commons.jxpath.ri.compiler.NodeTest; import org.apache.commons.jxpath.ri.compiler.NodeTypeTest; -import org.apache.commons.jxpath.ri.model.beans.NullElementPointer; import org.apache.commons.jxpath.ri.model.beans.NullPointer; /** * Common superclass for Pointers of all kinds. A NodePointer maps to - * a deterministic XPath that represents the location of a node in an object graph. - * This XPath uses only simple axes: child, namespace and attribute and only simple, - * context-independent predicates. + * a deterministic XPath that represents the location of a node in an + * object graph. This XPath uses only simple axes: child, namespace and + * attribute and only simple, context-independent predicates. * * @author Dmitri Plotnikov * @version $Revision$ $Date$ @@ -179,11 +178,18 @@ public abstract boolean isLeaf(); /** - * If false, this node is axiliary and can only be used as an intermediate - * in the chain of pointers. + * @deprecated Please use !isContainer() */ - public boolean isNode() { - return true; + public boolean isNode(){ + return !isContainer(); + } + + /** + * If true, this node is axiliary and can only be used as an intermediate in + * the chain of pointers. + */ + public boolean isContainer() { + return false; } /** @@ -233,16 +239,17 @@ * this method returns the pointer to the contents. * Only an auxiliary (non-node) pointer can (and should) return a * value pointer other than itself. - * Note that you probably don't want to override <code>getValuePointer()</code> - * directly. Override the <code>getImmediateValuePointer()</code> - * method instead. The <code>getValuePointer()</code> method is - * calls <code>getImmediateValuePointer()</code> and, if the result is not + * Note that you probably don't want to override + * <code>getValuePointer()</code> directly. Override the + * <code>getImmediateValuePointer()</code> method instead. The + * <code>getValuePointer()</code> method is calls + * <code>getImmediateValuePointer()</code> and, if the result is not * <code>this</code>, invokes <code>getValuePointer()</code> recursively. - * The idea here is to open all nested containers. Let's say we have a - * container within a container within a container. - * The <code>getValuePointer()</code> method should then open all - * those containers and return the pointer to the ultimate contents. - * It does so with the above recursion. + * The idea here is to open all nested containers. Let's say we have a + * container within a container within a container. The + * <code>getValuePointer()</code> method should then open all those + * containers and return the pointer to the ultimate contents. It does so + * with the above recursion. */ public NodePointer getValuePointer() { NodePointer ivp = getImmediateValuePointer(); @@ -340,7 +347,7 @@ return true; } else if (test instanceof NodeNameTest) { - if (!isNode()) { + if (isContainer()) { return false; } QName testName = ((NodeNameTest) test).getNodeName(); @@ -574,35 +581,26 @@ * Returns an XPath that maps to this Pointer. */ public String asPath() { + // If the parent of this node is a container, it is responsible + // for appended this node's part of the path. + if (parent != null && parent.isContainer()) { + return parent.asPath(); + } + StringBuffer buffer = new StringBuffer(); - if (getParent() != null) { - buffer.append(getParent().asPath()); - // TBD: the following needs to be redesigned. - // What this condition says is - // "if the parent of this node has already appended this node's - // name, don't do it again". However, I would hate to add an ugly - // API like "isResponsibleForAppendingChildName()". - if (getParent().isNode() || (parent instanceof NullElementPointer)){ - QName name = getName(); - if (name != null) { - if (buffer.length() == 0 || - buffer.charAt(buffer.length()-1) != '/'){ - buffer.append('/'); - } - if (attribute){ - buffer.append('@'); - } - buffer.append(name); - } - } + if (parent != null) { + buffer.append(parent.asPath()); } - else { - QName name = getName(); - if (attribute){ - buffer.append('@'); - } - buffer.append(name); + + if (buffer.length() == 0 + || buffer.charAt(buffer.length() - 1) != '/') { + buffer.append('/'); + } + if (attribute) { + buffer.append('@'); } + buffer.append(getName()); + if (index != WHOLE_COLLECTION && isCollection()) { buffer.append('[').append(index + 1).append(']'); } 1.9 +6 -6 jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/VariablePointer.java Index: VariablePointer.java =================================================================== RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/VariablePointer.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- VariablePointer.java 26 Nov 2002 01:20:06 -0000 1.8 +++ VariablePointer.java 28 Nov 2002 01:02:04 -0000 1.9 @@ -95,8 +95,8 @@ actual = false; } - public boolean isNode(){ - return false; + public boolean isContainer(){ + return true; } public QName getName(){ 1.11 +6 -6 jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/BeanPropertyPointer.java Index: BeanPropertyPointer.java =================================================================== RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/BeanPropertyPointer.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- BeanPropertyPointer.java 26 Nov 2002 01:20:06 -0000 1.10 +++ BeanPropertyPointer.java 28 Nov 2002 01:02:04 -0000 1.11 @@ -95,8 +95,8 @@ /** * This type of node is auxiliary. */ - public boolean isNode(){ - return false; + public boolean isContainer(){ + return true; } /** 1.10 +7 -7 jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/CollectionPointer.java Index: CollectionPointer.java =================================================================== RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/CollectionPointer.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- CollectionPointer.java 26 Nov 2002 01:33:34 -0000 1.9 +++ CollectionPointer.java 28 Nov 2002 01:02:04 -0000 1.10 @@ -113,8 +113,8 @@ || JXPathIntrospector.getBeanInfo(value.getClass()).isAtomic(); } - public boolean isNode(){ - return index == WHOLE_COLLECTION; + public boolean isContainer(){ + return index != WHOLE_COLLECTION; } public Object getImmediateNode(){ @@ -269,7 +269,7 @@ } if (index != WHOLE_COLLECTION) { // Address the list[1][2] case - if (parent != null && !parent.isNode() && + if (parent != null && parent.isContainer() && parent.getIndex() != WHOLE_COLLECTION){ buffer.append("/."); } 1.11 +6 -6 jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/NullElementPointer.java Index: NullElementPointer.java =================================================================== RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/NullElementPointer.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- NullElementPointer.java 26 Nov 2002 01:20:06 -0000 1.10 +++ NullElementPointer.java 28 Nov 2002 01:02:04 -0000 1.11 @@ -128,8 +128,8 @@ return false; } - public boolean isNode(){ - return false; + public boolean isContainer(){ + return true; } public NodePointer createPath(JXPathContext context, Object value){ 1.11 +7 -7 jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/NullPropertyPointer.java Index: NullPropertyPointer.java =================================================================== RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/NullPropertyPointer.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- NullPropertyPointer.java 26 Nov 2002 01:20:06 -0000 1.10 +++ NullPropertyPointer.java 28 Nov 2002 01:02:04 -0000 1.11 @@ -116,12 +116,12 @@ return false; } - public boolean isNode(){ - return false; + public boolean isContainer(){ + return true; } public void setValue(Object value){ - if (parent == null || !parent.isNode()){ + if (parent == null || parent.isContainer()){ throw new JXPathException("Cannot set property " + asPath() + ", the target object is null"); } 1.6 +57 -23 jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/PropertyIterator.java Index: PropertyIterator.java =================================================================== RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/PropertyIterator.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- PropertyIterator.java 12 Oct 2002 21:02:24 -0000 1.5 +++ PropertyIterator.java 28 Nov 2002 01:02:04 -0000 1.6 @@ -90,29 +90,35 @@ this.name = name; this.reverse = reverse; this.includeStart = true; - if (reverse){ + if (reverse) { this.startPropertyIndex = PropertyPointer.UNSPECIFIED_PROPERTY; this.startIndex = -1; } - if (startWith != null){ - while (startWith != null && startWith.getParent() != pointer){ + if (startWith != null) { + while (startWith != null && startWith.getParent() != pointer) { startWith = startWith.getParent(); } - if (startWith == null){ + if (startWith == null) { throw new JXPathException( - "PropertyIerator startWith parameter is not a child of the supplied parent"); + "PropertyIerator startWith parameter is " + + "not a child of the supplied parent"); } - this.startPropertyIndex = ((PropertyPointer)startWith).getPropertyIndex(); + this.startPropertyIndex = + ((PropertyPointer) startWith).getPropertyIndex(); this.startIndex = startWith.getIndex(); - if (this.startIndex == NodePointer.WHOLE_COLLECTION){ + if (this.startIndex == NodePointer.WHOLE_COLLECTION) { this.startIndex = 0; } this.includeStart = false; - if (reverse && startIndex == -1){ + if (reverse && startIndex == -1) { this.includeStart = true; } } } + + protected NodePointer getPropertyPointer(){ + return propertyNodePointer; + } public void reset(){ position = 0; @@ -123,7 +129,7 @@ if (position == 0){ if (name != null){ if (!targetReady){ - prepare(); + prepareForIndividualProperty(name); } // If there is no such property - return null if (empty){ @@ -137,7 +143,7 @@ reset(); } } - return propertyNodePointer.getValuePointer(); + return getValuePointer(); } public int getPosition(){ @@ -160,14 +166,14 @@ } if (!targetReady){ - prepare(); + prepareForIndividualProperty(name); } if (empty){ return false; } - int length = propertyNodePointer.getLength(); // TBD: cache length + int length = getLength(); int index; if (!reverse){ index = position + startIndex; @@ -207,7 +213,7 @@ int index = 1; for (int i = startPropertyIndex; i < count; i++){ propertyNodePointer.setPropertyIndex(i); - int length = propertyNodePointer.getLength(); + int length = getLength(); if (i == startPropertyIndex){ length -= startIndex; if (!includeStart){ @@ -236,7 +242,7 @@ } for (int i = start; i >= 0; i--){ propertyNodePointer.setPropertyIndex(i); - int length = propertyNodePointer.getLength(); + int length = getLength(); if (i == startPropertyIndex){ int end = startIndex; if (end == -1){ @@ -263,13 +269,9 @@ return false; } - private void prepare(){ + protected void prepareForIndividualProperty(String name){ targetReady = true; empty = true; - // TBD: simplify - if (propertyNodePointer instanceof DynamicPropertyPointer){ - propertyNodePointer.setPropertyName(name); - } String names[] = propertyNodePointer.getPropertyNames(); if (!reverse){ @@ -309,6 +311,38 @@ break; } } + } + } + + /** + * Computes length for the current pointer - ignores any exceptions + */ + private int getLength() { + int length; + try { + length = propertyNodePointer.getLength(); // TBD: cache length + } + catch (Throwable t){ + // @todo: should this exception be reported in any way? + length = 0; + } + return length; + } + + /** + * Computes value pointer for the current pointer - ignores any exceptions + */ + private NodePointer getValuePointer() { + try { + return propertyNodePointer.getValuePointer(); + } + catch (Throwable ex){ + // @todo: should this exception be reported in any way? + NullPropertyPointer npp = + new NullPropertyPointer(propertyNodePointer.getParent()); + npp.setPropertyName(propertyNodePointer.getPropertyName()); + npp.setIndex(propertyNodePointer.getIndex()); + return npp.getValuePointer(); } } } 1.11 +16 -8 jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/PropertyOwnerPointer.java Index: PropertyOwnerPointer.java =================================================================== RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/PropertyOwnerPointer.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- PropertyOwnerPointer.java 26 Nov 2002 01:20:06 -0000 1.10 +++ PropertyOwnerPointer.java 28 Nov 2002 01:02:04 -0000 1.11 @@ -84,7 +84,7 @@ public NodeIterator childIterator(NodeTest test, boolean reverse, NodePointer startWith){ if (test == null){ - return new PropertyIterator(this, null, reverse, startWith); + return createNodeIterator(null, reverse, startWith); } else if (test instanceof NodeNameTest){ QName testName = ((NodeNameTest)test).getNodeName(); @@ -98,16 +98,24 @@ else { property = testName.getName(); } - return new PropertyIterator(this, property, reverse, startWith); + return createNodeIterator(property, reverse, startWith); } else if (test instanceof NodeTypeTest){ if (((NodeTypeTest)test).getNodeType() == Compiler.NODE_TYPE_NODE){ - return new PropertyIterator(this, null, reverse, startWith); + return createNodeIterator(null, reverse, startWith); } } return null; } + public NodeIterator createNodeIterator( + String property, + boolean reverse, + NodePointer startWith) + { + return new PropertyIterator(this, property, reverse, startWith); + } + public NodeIterator attributeIterator(QName name){ return new BeanAttributeIterator(this, name); } @@ -150,7 +158,7 @@ */ public void setValue(Object value){ this.value = value; - if (parent instanceof PropertyPointer){ + if (parent.isContainer()){ parent.setValue(value); } else if (parent != null){ 1.7 +6 -6 jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/container/ContainerPointer.java Index: ContainerPointer.java =================================================================== RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/container/ContainerPointer.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- ContainerPointer.java 26 Nov 2002 01:20:07 -0000 1.6 +++ ContainerPointer.java 28 Nov 2002 01:02:04 -0000 1.7 @@ -95,8 +95,8 @@ /** * This type of node is auxiliary. */ - public boolean isNode(){ - return false; + public boolean isContainer(){ + return true; } public QName getName(){ 1.5 +6 -6 jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/dynabeans/DynaBeanPropertyPointer.java Index: DynaBeanPropertyPointer.java =================================================================== RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/dynabeans/DynaBeanPropertyPointer.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- DynaBeanPropertyPointer.java 26 Nov 2002 01:33:34 -0000 1.4 +++ DynaBeanPropertyPointer.java 28 Nov 2002 01:02:05 -0000 1.5 @@ -98,8 +98,8 @@ /** * This type of node is auxiliary. */ - public boolean isNode(){ - return false; + public boolean isContainer(){ + return true; } /** 1.2 +5 -5 jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/JXPathTestSuite.java Index: JXPathTestSuite.java =================================================================== RCS file: /home/cvs/jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/JXPathTestSuite.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- JXPathTestSuite.java 20 Oct 2002 03:48:21 -0000 1.1 +++ JXPathTestSuite.java 28 Nov 2002 01:02:05 -0000 1.2 @@ -75,9 +75,9 @@ import org.apache.commons.jxpath.ri.compiler.VariableTest; import org.apache.commons.jxpath.ri.model.MixedModelTest; import org.apache.commons.jxpath.ri.model.beans.BeanModelTest; -import org.apache.commons.jxpath.ri.model.beans.DynamicPropertiesModelTest; import org.apache.commons.jxpath.ri.model.dom.DOMModelTest; import org.apache.commons.jxpath.ri.model.dynabeans.DynaBeanModelTest; +import org.apache.commons.jxpath.ri.model.dynamic.DynamicPropertiesModelTest; import org.apache.commons.jxpath.ri.model.jdom.JDOMModelTest; import org.apache.commons.jxpath.util.BasicTypeConverterTest; 1.4 +2 -0 jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/ri/axes/SimplePathInterpreterTest.java Index: SimplePathInterpreterTest.java =================================================================== RCS file: /home/cvs/jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/ri/axes/SimplePathInterpreterTest.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- SimplePathInterpreterTest.java 26 Nov 2002 01:20:08 -0000 1.3 +++ SimplePathInterpreterTest.java 28 Nov 2002 01:02:05 -0000 1.4 @@ -9,6 +9,8 @@ import org.apache.commons.jxpath.ri.model.*; import org.apache.commons.jxpath.ri.model.beans.*; import org.apache.commons.jxpath.ri.model.dom.*; +import org.apache.commons.jxpath.ri.model.dynamic.*; + import java.util.*; public class SimplePathInterpreterTest extends TestCase { 1.2 +35 -18 jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/ri/model/MixedModelTest.java Index: MixedModelTest.java =================================================================== RCS file: /home/cvs/jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/ri/model/MixedModelTest.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- MixedModelTest.java 20 Oct 2002 03:48:22 -0000 1.1 +++ MixedModelTest.java 28 Nov 2002 01:02:05 -0000 1.2 @@ -91,8 +91,6 @@ public class MixedModelTest extends JXPathTestCase { - private static final boolean enabled = true; - private JXPathContext context; /** @@ -419,9 +417,6 @@ * Test JXPath.iterate() with map containing an array */ public void testIterateArray(){ - if (!enabled){ - return; - } Map map = new HashMap(); map.put("foo", new String[]{"a", "b", "c"}); @@ -433,9 +428,6 @@ } public void testIteratePointersArray(){ - if (!enabled){ - return; - } Map map = new HashMap(); map.put("foo", new String[]{"a", "b", "c"}); @@ -452,9 +444,6 @@ } public void testIteratePointersArrayElementWithVariable(){ - if (!enabled){ - return; - } Map map = new HashMap(); map.put("foo", new String[]{"a", "b", "c"}); @@ -470,9 +459,6 @@ } public void testIterateVector(){ - if (!enabled){ - return; - } Map map = new HashMap(); Vector vec = new Vector(); vec.add(new HashMap()); @@ -483,5 +469,36 @@ assertXPathPointerIterator(context, "/vec", list("/.[@name='vec'][1]", "/.[@name='vec'][2]")); + } + + public void testErrorProperty(){ + context.getVariables().declareVariable( + "e", + new ExceptionPropertyTestBean()); + + boolean ex = false; + try { + assertXPathValue(context, "$e/errorString", null); + } + catch (Throwable t){ + ex = true; + } + assertTrue("Legitimate exception accessing property", ex); + + assertXPathPointer(context, + "$e/errorString", + "$e/errorString"); + + assertXPathPointerLenient(context, + "$e/errorStringArray[1]", + "$e/errorStringArray[1]"); + + assertXPathPointerIterator(context, + "$e/errorString", + list("$e/errorString")); + + assertXPathPointerIterator(context, + "$e//error", + Collections.EMPTY_LIST); } } 1.1 jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/ri/model/ExceptionPropertyTestBean.java Index: ExceptionPropertyTestBean.java =================================================================== /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Commons", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.commons.jxpath.ri.model; import org.apache.commons.jxpath.TestBean; /** * * @author <a href="mailto:[EMAIL PROTECTED]">Dmitri Plotnikov</a> * @version $Id: ExceptionPropertyTestBean.java,v 1.1 2002/11/28 01:02:05 dmitri Exp $ */ public class ExceptionPropertyTestBean { public String getErrorString(){ throw new RuntimeException("errorString"); } public String[] getErrorStringArray(){ throw new RuntimeException("errorStringArray"); } public TestBean getErrorBean(){ throw new RuntimeException("errorBean"); } } 1.1 jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/ri/model/dynamic/TestDynamicPropertyFactory.java Index: TestDynamicPropertyFactory.java =================================================================== /* * $Header: /home/cvs/jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/ri/model/dynamic/TestDynamicPropertyFactory.java,v 1.1 2002/11/28 01:02:05 dmitri Exp $ * $Revision: 1.1 $ * $Date: 2002/11/28 01:02:05 $ * * ==================================================================== * The Apache Software License, Version 1.1 * * * Copyright (c) 1999-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Commons", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation and was * originally based on software copyright (c) 2001, Plotnix, Inc, * <http://www.plotnix.com/>. * For more information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.commons.jxpath.ri.model.dynamic; import java.util.HashMap; import java.util.Map; import java.util.Vector; import org.apache.commons.jxpath.*; /** * Test AbstractFactory. * * @author Dmitri Plotnikov * @version $Revision: 1.1 $ $Date: 2002/11/28 01:02:05 $ */ public class TestDynamicPropertyFactory extends AbstractFactory { /** * Create a new instance and put it in the collection on the parent object. * Return <b>false</b> if this factory cannot create the requested object. */ public boolean createObject( JXPathContext context, Pointer pointer, Object parent, String name, int index) { if (name.equals("map")) { ((TestBean) parent).setMap(new HashMap()); return true; } else if (name.equals("TestKey1")) { ((Map) parent).put(name, ""); return true; } else if (name.equals("TestKey2")) { ((Map) parent).put(name, new NestedTestBean("newName")); return true; } else if (name.equals("TestKey3")) { Vector v = new Vector(); for (int i = 0; i <= index; i++) { v.add(null); } ((Map) parent).put(name, v); return true; } else if (name.equals("TestKey4")) { ((Map) parent).put(name, new Object[] { new TestBean()}); return true; } return false; } public boolean declareVariable(JXPathContext context, String name){ return false; } }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>