vgritsenko    2004/02/24 19:32:52

  Modified:    java/src/org/apache/xindice/core/query QueryUtil.java
               java/tests/src/org/apache/xindice/integration/client/services
                        XPathQueryTest.java
  Log:
  Add XPath query support for comment nodes, multiple text nodes.
  
  Revision  Changes    Path
  1.4       +24 -3     
xml-xindice/java/src/org/apache/xindice/core/query/QueryUtil.java
  
  Index: QueryUtil.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/query/QueryUtil.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- QueryUtil.java    24 Feb 2004 16:52:55 -0000      1.3
  +++ QueryUtil.java    25 Feb 2004 03:32:52 -0000      1.4
  @@ -26,11 +26,16 @@
   import org.apache.xindice.xml.dom.DBNode;
   import org.apache.xindice.xml.dom.DocumentImpl;
   import org.apache.xindice.xml.dom.NodeImpl;
  +import org.apache.commons.logging.Log;
  +import org.apache.commons.logging.LogFactory;
   
   import org.w3c.dom.Attr;
   import org.w3c.dom.Document;
   import org.w3c.dom.Element;
   import org.w3c.dom.Node;
  +import org.w3c.dom.Text;
  +import org.w3c.dom.Comment;
  +import org.w3c.dom.ProcessingInstruction;
   
   import java.util.Hashtable;
   
  @@ -41,6 +46,8 @@
    */
   public class QueryUtil {
   
  +    private static final Log log = LogFactory.getLog(QueryUtil.class);
  +
       /**
        * Maps a Hashtable containing namespace definitions into a Xindice
        * NamespaceMap.
  @@ -71,9 +78,23 @@
   
                   Element holder = 
doc.createElementNS(XindiceCollection.QUERY_NS, "xq:result");
                   holder.setAttribute(NodeImpl.XMLNS_PREFIX + ":xq", 
XindiceCollection.QUERY_NS);
  -                holder.setAttributeNode((Attr)doc.importNode(n, true));
  +                holder.setAttributeNode((Attr) doc.importNode(n, true));
  +
  +                // TODO: expandSource
  +                root.appendChild(holder);
  +            } else if (element instanceof Text || element instanceof 
Comment) {
  +                Node n = (Node) element;
  +
  +                Element holder = 
doc.createElementNS(XindiceCollection.QUERY_NS, "xq:result");
  +                holder.setAttribute(NodeImpl.XMLNS_PREFIX + ":xq", 
XindiceCollection.QUERY_NS);
  +                holder.appendChild(doc.importNode(n, true));
   
  +                // TODO: expandSource
                   root.appendChild(holder);
  +            } else if (element instanceof ProcessingInstruction) {
  +                if (log.isWarnEnabled()) {
  +                    log.warn("XPath query with ProcessingInstruction result 
is not supported");
  +                }
               } else if (element instanceof Node) {
                   Node n = (Node) element;
   
  
  
  
  1.14      +43 -12    
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.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- XPathQueryTest.java       24 Feb 2004 16:52:55 -0000      1.13
  +++ XPathQueryTest.java       25 Feb 2004 03:32:52 -0000      1.14
  @@ -50,6 +50,7 @@
           String document1
                   = "<?xml version=\"1.0\"?>"
                   + "<person>"
  +                +   "<!-- John Smith -->"
                   +   "<first>John</first>"
                   +   "<last>Smith</last>"
                   +   "<age>30</age>"
  @@ -58,6 +59,7 @@
           String document2
                   = "<?xml version=\"1.0\"?>"
                   + "<person>"
  +                +   "<!-- Sally Smith -->"
                   +   "<first>Sally</first>"
                   +   "<last>Smith</last>"
                   +   "<age>20</age>"
  @@ -246,7 +248,9 @@
           ResourceSet resultSet = xpathservice.query(query);
           assertEquals(1L, resultSet.getSize());
   
  -        assertEquals("John", resultSet.getResource(0).getContent());
  +        Node result = ((XMLResource) 
resultSet.getResource(0)).getContentAsDOM();
  +        assertEquals(Node.TEXT_NODE, 
result.getChildNodes().item(0).getChildNodes().item(0).getNodeType());
  +        assertEquals("John", 
result.getChildNodes().item(0).getChildNodes().item(0).getNodeValue());
       }
   
       public void testFetchMultipleTextNodes() throws Exception {
  @@ -255,8 +259,12 @@
           ResourceSet resultSet = xpathservice.query(query);
           assertEquals(2, resultSet.getSize());
   
  -        assertEquals("John", resultSet.getResource(0).getContent());
  -        assertEquals("Sally", resultSet.getResource(1).getContent());
  +        Node result0 = ((XMLResource) 
resultSet.getResource(0)).getContentAsDOM();
  +        Node result1 = ((XMLResource) 
resultSet.getResource(1)).getContentAsDOM();
  +        assertEquals(Node.TEXT_NODE, 
result0.getChildNodes().item(0).getChildNodes().item(0).getNodeType());
  +        assertEquals(Node.TEXT_NODE, 
result1.getChildNodes().item(0).getChildNodes().item(0).getNodeType());
  +        assertEquals("John", 
result0.getChildNodes().item(0).getChildNodes().item(0).getNodeValue());
  +        assertEquals("Sally", 
result1.getChildNodes().item(0).getChildNodes().item(0).getNodeValue());
       }
   
       public void testFetchAttributeNode() throws Exception {
  @@ -276,7 +284,7 @@
           }
       }
   
  -    public void testFetchMultipleAttributeNode() throws Exception {
  +    public void testFetchMultipleAttributeNodes() throws Exception {
           String document3 = "<?xml version=\"1.0\"?>" + "<foo bar='foo'>" + 
"<bar foo='bar' bar='bar'/>" + "</foo>";
           client.insertDocument(TEST_COLLECTION_PATH, "doc3", document3);
   
  @@ -295,6 +303,28 @@
           }
       }
   
  +    public void testFetchCommentNode() throws Exception {
  +        String query = "//person/comment()[contains(., 'John')]";
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(1, resultSet.getSize());
  +
  +        Node result = ((XMLResource) 
resultSet.getResource(0)).getContentAsDOM();
  +        assertEquals(" John Smith ", 
result.getChildNodes().item(0).getChildNodes().item(0).getNodeValue());
  +    }
  +
  +    public void testFetchMultipleCommentNodes() throws Exception {
  +        String query = "//person/comment()";
  +
  +        ResourceSet resultSet = xpathservice.query(query);
  +        assertEquals(2, resultSet.getSize());
  +
  +        Node result0 = ((XMLResource) 
resultSet.getResource(0)).getContentAsDOM();
  +        Node result1 = ((XMLResource) 
resultSet.getResource(1)).getContentAsDOM();
  +        assertEquals(" John Smith ", 
result0.getChildNodes().item(0).getChildNodes().item(0).getNodeValue());
  +        assertEquals(" Sally Smith ", 
result1.getChildNodes().item(0).getChildNodes().item(0).getNodeValue());
  +    }
  +
       public void testFetchBoolean() throws Exception {
           String query = "boolean(//person)";
   
  @@ -339,13 +369,14 @@
   
           XMLResource resource = (XMLResource) resultSet.getResource(0);
   
  -        String john =
  -                "<?xml version=\"1.0\"?>"
  +        String john
  +                = "<?xml version=\"1.0\"?>"
                   + "<person xmlns:src='http://xml.apache.org/xindice/Query' 
src:col='/db/testing/current' src:key='doc1'>"
  -                + "<first>John</first>"
  -                + "<last>Smith</last>"
  -                + "<age>30</age>"
  -                + "<phone type=\"work\">555-345-6789</phone>"
  +                +   "<!-- John Smith -->"
  +                +   "<first>John</first>"
  +                +   "<last>Smith</last>"
  +                +   "<age>30</age>"
  +                +   "<phone type=\"work\">555-345-6789</phone>"
                   + "</person>";
   
           // ensure that the resource has the correct doc id.
  
  
  

Reply via email to