vgritsenko 2004/02/23 19:20:27
Modified: java/src/org/apache/xindice/xml NamespaceMap.java java/src/org/apache/xindice/server/rpc/messages Query.java java/src/org/apache/xindice/client/xmldb/embed CollectionImpl.java Added: java/src/org/apache/xindice/core/query QueryUtil.java Log: Reduce code duplication in handling query results Revision Changes Path 1.1 xml-xindice/java/src/org/apache/xindice/core/query/QueryUtil.java Index: QueryUtil.java =================================================================== /* * Copyright 1999-2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * CVS $Id: QueryUtil.java,v 1.1 2004/02/24 03:20:27 vgritsenko Exp $ */ package org.apache.xindice.core.query; import org.apache.xindice.core.data.NodeSet; 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; import org.apache.xindice.xml.dom.DocumentImpl; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import java.util.Hashtable; /** * Helper to convert NodeSet query result into the Document * * @version CVS $Revision: 1.1 $, $Date: 2004/02/24 03:20:27 $ */ public class QueryUtil { /** * Maps a Hashtable containing namespace definitions into a Xindice * NamespaceMap. */ public static NamespaceMap mapNamespaces(Hashtable namespaces) { if (namespaces != null && namespaces.size() > 0) { return new NamespaceMap(namespaces); } return null; } /** * Adds additional meta data to the query results, * and turns it into a DOM document. * @param expandSource if true, source meta attributes will be added */ public static Document queryResultsToDOM(NodeSet nodeSet, boolean expandSource) { DocumentImpl doc = new DocumentImpl(); Element root = doc.createElement("result"); doc.appendChild(root); int count = 0; while (nodeSet != null && nodeSet.hasMoreNodes()) { final Object element = nodeSet.getNextNode(); if (element instanceof Node) { Node n = (Node) element; if (n.getNodeType() == Node.DOCUMENT_NODE) { n = ((Document) n).getDocumentElement(); } if (expandSource && n instanceof DBNode) { ((DBNode) n).expandSource(); } root.appendChild(doc.importNode(n, true)); } 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"); } count++; } root.setAttribute("count", Integer.toString(count)); return doc; } /** * Adds additional meta data to the query results, * and turns it into a DOM document. */ public static Document queryResultsToDOM(NodeSet nodeSet) { return queryResultsToDOM(nodeSet, true); } /** * Adds additional meta data to the query results, * and turns it into a String containing XML document. * @param expandSource if true, source meta attributes will be added */ public static String queryResultsToString(NodeSet nodeSet, boolean expandSource) { return TextWriter.toString(queryResultsToDOM(nodeSet, expandSource)); } /** * Adds additional meta data to the query results, * and turns it into a String containing XML document. */ public static String queryResultsToString(NodeSet nodeSet) { return TextWriter.toString(queryResultsToDOM(nodeSet, true)); } } 1.10 +14 -2 xml-xindice/java/src/org/apache/xindice/xml/NamespaceMap.java Index: NamespaceMap.java =================================================================== RCS file: /home/cvs/xml-xindice/java/src/org/apache/xindice/xml/NamespaceMap.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- NamespaceMap.java 8 Feb 2004 03:50:13 -0000 1.9 +++ NamespaceMap.java 24 Feb 2004 03:20:27 -0000 1.10 @@ -27,6 +27,8 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.Enumeration; +import java.util.Hashtable; /** * NamespaceMap is just a HashMap extension that provides some useful @@ -36,6 +38,16 @@ */ public final class NamespaceMap extends HashMap { private Element elem = null; + + public NamespaceMap() { + } + + public NamespaceMap(Hashtable namespaces) { + for (Enumeration keys = namespaces.keys(); keys.hasMoreElements(); ) { + final String key = (String) keys.nextElement(); + setNamespace(key, (String) namespaces.get(key)); + } + } public Node getContextNode() { if (elem == null) { 1.11 +12 -100 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.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- Query.java 19 Feb 2004 02:44:42 -0000 1.10 +++ Query.java 24 Feb 2004 03:20:27 -0000 1.11 @@ -20,16 +20,9 @@ import org.apache.xindice.core.Collection; import org.apache.xindice.core.data.NodeSet; +import org.apache.xindice.core.query.QueryUtil; 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; -import org.apache.xindice.xml.dom.DocumentImpl; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; import java.util.Enumeration; import java.util.Hashtable; @@ -47,109 +40,28 @@ throw new Exception(MISSING_COLLECTION_PARAM); } - if (!message.containsKey(TYPE)) { + final String type = (String) message.get(TYPE); + if (type == null) { throw new Exception(MISSING_TYPE_PARAM); } - if (!message.containsKey(QUERY)) { + final String query = (String) message.get(QUERY); + if (query == null) { throw new Exception(MISSING_QUERY_PARAM); } Collection col = getCollection((String) message.get(COLLECTION)); - NodeSet ns = null; + NamespaceMap nsMap = QueryUtil.mapNamespaces((Hashtable) message.get(NAMESPACES)); + NodeSet ns; if (message.containsKey(NAME)) { - ns = col.queryDocument((String) message.get(TYPE), - (String) message.get(QUERY), - mapNamespaces((Hashtable) message.get(NAMESPACES)), - message.get(NAME)); + ns = col.queryDocument(type, query, nsMap, message.get(NAME)); } else { - ns = col.queryCollection((String) message.get(TYPE), - (String) message.get(QUERY), - mapNamespaces((Hashtable) message.get(NAMESPACES))); + ns = col.queryCollection(type, query, nsMap); } Hashtable result = new Hashtable(); - result.put(RESULT, queryWrapper(ns)); + result.put(RESULT, QueryUtil.queryResultsToString(ns)); return result; - } - - /** - * Maps a Hashtable containing namespace definitions into a Xindice - * NamespaceMap. - * - * @param namespaces - * @return A NamespaceMap - */ - protected NamespaceMap mapNamespaces(Hashtable namespaces) { - NamespaceMap nsMap = null; - if (namespaces.size() > 0) { - nsMap = new NamespaceMap(); - - Enumeration keys = namespaces.keys(); - while (keys.hasMoreElements()) { - String key = (String) keys.nextElement(); - nsMap.setNamespace(key, (String) namespaces.get(key)); - } - } - - return nsMap; - } - - /** - * Adds additional meta data to the query response and turns it into a - * Document. - * - * @param ns The NodeSet containing the query results. - * @return the result set as an XML document - */ - private static String queryWrapper(NodeSet ns) { - - // - // FIXME: There is a copy of this same code in org.apache.xindice.client.xmldb.embed.CollectionImpl#nodesetToDocument - // It should be refactored into some common place. May be, NodeSetUtil? - // - - // Turn the NodeSet into a document. - DocumentImpl doc = new DocumentImpl(); - - Element root = doc.createElement("result"); - doc.appendChild(root); - int count = 0; - while (ns != null && ns.hasMoreNodes()) { - 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)); - } - 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"); - } - - count++; - - } - - root.setAttribute("count", Integer.toString(count)); - return TextWriter.toString(doc); } } 1.33 +11 -73 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.32 retrieving revision 1.33 diff -u -r1.32 -r1.33 --- CollectionImpl.java 19 Feb 2004 02:50:44 -0000 1.32 +++ CollectionImpl.java 24 Feb 2004 03:20:27 -0000 1.33 @@ -18,10 +18,6 @@ package org.apache.xindice.client.xmldb.embed; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.StringTokenizer; - import org.apache.xindice.client.xmldb.ResourceSetImpl; import org.apache.xindice.client.xmldb.XindiceCollection; import org.apache.xindice.client.xmldb.resources.BinaryResourceImpl; @@ -31,11 +27,10 @@ import org.apache.xindice.core.FaultCodes; import org.apache.xindice.core.data.NodeSet; import org.apache.xindice.core.meta.MetaData; +import org.apache.xindice.core.query.QueryUtil; 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; @@ -46,6 +41,9 @@ import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.XMLResource; +import java.util.Hashtable; +import java.util.StringTokenizer; + /** * Implementation of XML:DB's <code>Collection</code> interface using * direct access to interact with database server @@ -429,14 +427,14 @@ checkOpen(); try { - NodeSet result; + NodeSet nodeSet; if (name != null) { - result = col.queryDocument(queryLang, query, createNamespaceMap(nsMap), name); + nodeSet = col.queryDocument(queryLang, query, QueryUtil.mapNamespaces(nsMap), name); } else { - result = col.queryCollection(queryLang, query, createNamespaceMap(nsMap)); + nodeSet = col.queryCollection(queryLang, query, QueryUtil.mapNamespaces(nsMap)); } - return new ResourceSetImpl(this, nodesetToDocument(result)); + return new ResourceSetImpl(this, QueryUtil.queryResultsToDOM(nodeSet)); } catch (Exception e) { throw FaultCodes.createXMLDBException(FaultCodes.QRY_PROCESSING_ERROR, "Query error: " + e.getMessage(), e); @@ -556,66 +554,6 @@ } catch (Exception e) { throw FaultCodes.createXMLDBException(e); } - } - - // search result handling - - private static Document nodesetToDocument(NodeSet ns) { - - // - // FIXME: There is a copy of this same code in org.apache.xindice.server.xmldb.rpc.messages.Query#queryWrapper - // It should be refactored into some common place. May be, NodeSetUtil? - // - - // Turn the NodeSet into a document. - DocumentImpl doc = new DocumentImpl(); - - Element root = doc.createElement("result"); - doc.appendChild(root); - int count = 0; - while (ns != null && ns.hasMoreNodes()) { - 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)); - } 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"); - } - - count++; - } - - root.setAttribute("count", Integer.toString(count)); - return doc; - } - - private NamespaceMap createNamespaceMap(Hashtable namespaces) { - NamespaceMap nsMap = null; - - if (namespaces.size() > 0) { - nsMap = new NamespaceMap(); - - Enumeration keys = namespaces.keys(); - while (keys.hasMoreElements()) { - String key = (String) keys.nextElement(); - nsMap.setNamespace(key, (String) namespaces.get(key)); - } - } - - return nsMap; } public MetaData getMetaData(String id) throws XMLDBException {