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));