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

Reply via email to