kevinoneill 2003/08/08 19:33:30
Modified: java/src/org/apache/xindice/client/xmldb/embed
CollectionImpl.java
java/tests/src/org/apache/xindice/integration/client/services
XPathQueryTest.java
java/src/org/apache/xindice/core/data EmptyNodeSet.java
NodeSet.java
java/tests/src/org/apache/xindice/core/query
XPathQueryResolverTest.java
java/src/org/apache/xindice/core/query NodeListSet.java
XPathQueryResolver.java
java/src/org/apache/xindice/server/rpc/messages Query.java
Log:
Initial support for xpath expressions that return types other than Elements.
Revision Changes Path
1.20 +32 -16
xml-xindice/java/src/org/apache/xindice/client/xmldb/embed/CollectionImpl.java
Index: CollectionImpl.java
===================================================================
RCS file:
/home/cvs/xml-xindice/java/src/org/apache/xindice/client/xmldb/embed/CollectionImpl.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- CollectionImpl.java 7 Aug 2003 20:13:20 -0000 1.19
+++ CollectionImpl.java 9 Aug 2003 02:33:30 -0000 1.20
@@ -1,3 +1,5 @@
+package org.apache.xindice.client.xmldb.embed;
+
/*
* The Apache Software License, Version 1.1
*
@@ -54,10 +56,10 @@
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
- * CVS $Id$
+ * $Id$
*/
-
-package org.apache.xindice.client.xmldb.embed;
+import java.util.Enumeration;
+import java.util.Hashtable;
import org.apache.xindice.client.xmldb.ResourceSetImpl;
import org.apache.xindice.client.xmldb.XindiceCollection;
@@ -70,10 +72,10 @@
import org.apache.xindice.core.data.NodeSet;
import org.apache.xindice.core.meta.MetaData;
import org.apache.xindice.util.Configuration;
+import org.apache.xindice.util.XindiceRuntimeException;
import org.apache.xindice.xml.NamespaceMap;
import org.apache.xindice.xml.dom.DBNode;
import org.apache.xindice.xml.dom.DocumentImpl;
-
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
@@ -84,9 +86,6 @@
import org.xmldb.api.modules.BinaryResource;
import org.xmldb.api.modules.XMLResource;
-import java.util.Enumeration;
-import java.util.Hashtable;
-
/**
* Implementation of XML:DB's <code>Collection</code> interface using
* direct access to interact with database server
@@ -564,17 +563,34 @@
doc.appendChild(root);
int count = 0;
while (ns != null && ns.hasMoreNodes()) {
- Node n = ns.getNextNode();
-
- if (n.getNodeType() == Node.DOCUMENT_NODE) {
- n = ((Document) n).getDocumentElement();
+ final Object element = ns.getNextNode();
+ if (element instanceof Node)
+ {
+ Node n = (Node) element;
+
+ if (n.getNodeType() == Node.DOCUMENT_NODE) {
+ n = ((Document) n).getDocumentElement();
+ }
+
+ if (n instanceof DBNode) {
+ ((DBNode) n).expandSource();
+ }
+
+ root.appendChild(doc.importNode(n, true));
}
-
- if (n instanceof DBNode) {
- ((DBNode) n).expandSource();
+ else if (element instanceof Boolean || element instanceof Double)
+ {
+ root.appendChild(doc.createTextNode(element.toString()));
+ }
+ else if (element instanceof String)
+ {
+ root.appendChild(doc.createTextNode((String) element));
+ }
+ else
+ {
+ throw new XindiceRuntimeException("Unknown result type (" +
element.getClass().getName() + "in nodeset");
}
- root.appendChild(doc.importNode(n, true));
count++;
}
1.9 +5 -11
xml-xindice/java/tests/src/org/apache/xindice/integration/client/services/XPathQueryTest.java
Index: XPathQueryTest.java
===================================================================
RCS file:
/home/cvs/xml-xindice/java/tests/src/org/apache/xindice/integration/client/services/XPathQueryTest.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- XPathQueryTest.java 7 Aug 2003 20:13:27 -0000 1.8
+++ XPathQueryTest.java 9 Aug 2003 02:33:30 -0000 1.9
@@ -383,7 +383,7 @@
ResourceSet resultSet = xpathservice.query(query);
// when we do support it the following tests will be run
- assertEquals(1L, resultSet.getSize());
+ assertEquals(2L, resultSet.getSize());
assertEquals("true", resultSet.getResource(1L).getContent());
} catch (XMLDBException e) {
@@ -400,10 +400,7 @@
try {
ResourceSet resultSet = xpathservice.query(query);
- // when we do support it the following tests will be run
- assertEquals(1L, resultSet.getSize());
- assertEquals("John", resultSet.getResource(1L).getContent());
-
+ assertEquals(2L, resultSet.getSize());
} catch (XMLDBException e) {
fail(e.getMessage());
}
@@ -418,10 +415,7 @@
try {
ResourceSet resultSet = xpathservice.query(query);
- // when we do support it the following tests will be run
- assertEquals(1L, resultSet.getSize());
- assertEquals("1", resultSet.getResource(1L).getContent());
-
+ assertEquals(2L, resultSet.getSize());
} catch (XMLDBException e) {
fail(e.getMessage());
}
1.4 +3 -4
xml-xindice/java/src/org/apache/xindice/core/data/EmptyNodeSet.java
Index: EmptyNodeSet.java
===================================================================
RCS file:
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/data/EmptyNodeSet.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- EmptyNodeSet.java 7 Aug 2003 20:13:21 -0000 1.3
+++ EmptyNodeSet.java 9 Aug 2003 02:33:30 -0000 1.4
@@ -59,7 +59,6 @@
package org.apache.xindice.core.data;
-import org.w3c.dom.Node;
/**
* EmptyNodeSet implements an empty NodeSet.
@@ -71,7 +70,7 @@
return false;
}
- public Node getNextNode() {
+ public Object getNextNode() {
return null;
}
}
1.4 +3 -4
xml-xindice/java/src/org/apache/xindice/core/data/NodeSet.java
Index: NodeSet.java
===================================================================
RCS file:
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/data/NodeSet.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- NodeSet.java 7 Aug 2003 20:13:21 -0000 1.3
+++ NodeSet.java 9 Aug 2003 02:33:30 -0000 1.4
@@ -59,7 +59,6 @@
package org.apache.xindice.core.data;
-import org.w3c.dom.Node;
/**
* NodeSet is an interface for iterating over a set of Nodes. NodeSets
@@ -82,5 +81,5 @@
*
* @return The next Node
*/
- Node getNextNode();
+ Object getNextNode();
}
1.3 +2 -2
xml-xindice/java/tests/src/org/apache/xindice/core/query/XPathQueryResolverTest.java
Index: XPathQueryResolverTest.java
===================================================================
RCS file:
/home/cvs/xml-xindice/java/tests/src/org/apache/xindice/core/query/XPathQueryResolverTest.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- XPathQueryResolverTest.java 28 Jun 2003 04:26:13 -0000 1.2
+++ XPathQueryResolverTest.java 9 Aug 2003 02:33:30 -0000 1.3
@@ -136,7 +136,7 @@
}
public void testSimpleXPathQuery() throws Exception {
- Node node = null;
+ Object node = null;
XPathQueryResolver queryResolv = new XPathQueryResolver();
NodeSet nodeSet = queryResolv.query(col, "/terrainmap", null, null);
if (nodeSet.hasMoreNodes()) {
@@ -147,7 +147,7 @@
}
public void testComplexXPathQuery() throws Exception {
- Node node = null;
+ Object node = null;
XPathQueryResolver queryResolv = new XPathQueryResolver();
NodeSet nodeSet =
queryResolv.query(
1.5 +3 -5
xml-xindice/java/src/org/apache/xindice/core/query/NodeListSet.java
Index: NodeListSet.java
===================================================================
RCS file:
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/query/NodeListSet.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- NodeListSet.java 7 Aug 2003 20:13:22 -0000 1.4
+++ NodeListSet.java 9 Aug 2003 02:33:30 -0000 1.5
@@ -61,8 +61,6 @@
import org.apache.xindice.core.data.NodeSet;
import org.apache.xindice.xml.dom.DBNode;
-
-import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
@@ -84,7 +82,7 @@
return (idx < list.getLength());
}
- public Node getNextNode() {
+ public Object getNextNode() {
DBNode n = (DBNode) list.item(idx++);
if (n != null)
n.expandSource();
1.18 +79 -6
xml-xindice/java/src/org/apache/xindice/core/query/XPathQueryResolver.java
Index: XPathQueryResolver.java
===================================================================
RCS file:
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/query/XPathQueryResolver.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- XPathQueryResolver.java 7 Aug 2003 20:13:22 -0000 1.17
+++ XPathQueryResolver.java 9 Aug 2003 02:33:30 -0000 1.18
@@ -110,8 +110,10 @@
import org.apache.xpath.objects.XNumber;
import org.apache.xpath.objects.XObject;
import org.apache.xpath.objects.XString;
+import org.w3c.dom.DOMException;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
+import org.w3c.dom.traversal.NodeFilter;
import org.w3c.dom.traversal.NodeIterator;
import org.xmldb.api.base.ErrorCodes;
import org.xmldb.api.base.XMLDBException;
@@ -1043,7 +1045,7 @@
public Key[] keySet;
public int keyPos = 0;
public NodeIterator ni;
- public Node node;
+ public Object node;
public ResultSet(Collection context, PrefixResolver pr, Key[]
keySet, String query) {
this.context = context;
@@ -1103,12 +1105,27 @@
switch (xobject.getType()) {
default :
- throw new XMLDBException(ErrorCodes.NOT_IMPLEMENTED,
"Only nodeset results are implemented at this time.");
+ throw new XMLDBException(ErrorCodes.NOT_IMPLEMENTED,
"Unsupported result type: " + xobject.getTypeString());
case XObject.CLASS_NODESET :
ni = xobject.nodeset();
node = ni.nextNode();
break;
+
+ case XObject.CLASS_BOOLEAN :
+ ni = EMPTY_NODE_ITERATOR;
+ node = Boolean.valueOf(xobject.bool());
+ break;
+
+ case XObject.CLASS_STRING :
+ ni = EMPTY_NODE_ITERATOR;
+ node = xobject.str();
+ break;
+
+ case XObject.CLASS_NUMBER :
+ ni = EMPTY_NODE_ITERATOR;
+ node = new Double(xobject.num());
+ break;
}
if (node != null)
@@ -1120,8 +1137,8 @@
return node != null;
}
- public Node getNextNode() {
- Node n = node;
+ public Object getNextNode() {
+ Object n = node;
node = ni.nextNode();
if (node == null) {
@@ -1135,4 +1152,60 @@
return n;
}
}
+
+ /* this only implements what we need internally */
+ private static class EmptyNodeIterator implements NodeIterator
+ {
+
+ /* (non-Javadoc)
+ * @see org.w3c.dom.traversal.NodeIterator#getWhatToShow()
+ */
+ public int getWhatToShow() {
+ throw new UnsupportedOperationException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.w3c.dom.traversal.NodeIterator#detach()
+ */
+ public void detach() {
+ throw new UnsupportedOperationException();
+ }
+
+ /* (non-Javadoc)
+ * @see
org.w3c.dom.traversal.NodeIterator#getExpandEntityReferences()
+ */
+ public boolean getExpandEntityReferences() {
+ throw new UnsupportedOperationException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.w3c.dom.traversal.NodeIterator#getRoot()
+ */
+ public Node getRoot() {
+ throw new UnsupportedOperationException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.w3c.dom.traversal.NodeIterator#nextNode()
+ */
+ public Node nextNode() throws DOMException {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.w3c.dom.traversal.NodeIterator#previousNode()
+ */
+ public Node previousNode() throws DOMException {
+ throw new UnsupportedOperationException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.w3c.dom.traversal.NodeIterator#getFilter()
+ */
+ public NodeFilter getFilter() {
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ private final static NodeIterator EMPTY_NODE_ITERATOR = new
EmptyNodeIterator();
}
1.6 +29 -10
xml-xindice/java/src/org/apache/xindice/server/rpc/messages/Query.java
Index: Query.java
===================================================================
RCS file:
/home/cvs/xml-xindice/java/src/org/apache/xindice/server/rpc/messages/Query.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- Query.java 7 Aug 2003 20:13:23 -0000 1.5
+++ Query.java 9 Aug 2003 02:33:30 -0000 1.6
@@ -62,6 +62,7 @@
import org.apache.xindice.core.Collection;
import org.apache.xindice.core.data.NodeSet;
import org.apache.xindice.server.rpc.RPCDefaultMessage;
+import org.apache.xindice.util.XindiceRuntimeException;
import org.apache.xindice.xml.NamespaceMap;
import org.apache.xindice.xml.TextWriter;
import org.apache.xindice.xml.dom.DBNode;
@@ -152,18 +153,36 @@
doc.appendChild(root);
int count = 0;
while (ns != null && ns.hasMoreNodes()) {
- Node n = ns.getNextNode();
-
- if (n.getNodeType() == Node.DOCUMENT_NODE) {
- n = ((Document) n).getDocumentElement();
+ final Object element = ns.getNextNode();
+ if (element instanceof Node)
+ {
+ Node n = (Node) element;
+
+ if (n.getNodeType() == Node.DOCUMENT_NODE) {
+ n = ((Document) n).getDocumentElement();
+ }
+
+ if (n instanceof DBNode) {
+ ((DBNode) n).expandSource();
+ }
+
+ root.appendChild(doc.importNode(n, true));
}
-
- if (n instanceof DBNode) {
- ((DBNode) n).expandSource();
+ else if (element instanceof Boolean || element instanceof Double)
+ {
+ root.appendChild(doc.createTextNode(element.toString()));
+ }
+ else if (element instanceof String)
+ {
+ root.appendChild(doc.createTextNode((String) element));
+ }
+ else
+ {
+ throw new XindiceRuntimeException("Unknown result type (" +
element.getClass().getName() + "in nodeset");
}
- root.appendChild(doc.importNode(n, true));
count++;
+
}
root.setAttribute("count", Integer.toString(count));