kevinoneill 2003/08/03 20:01:57
Modified: java/src/org/apache/xindice/client/xmldb/xmlrpc CollectionImpl.java java/src/org/apache/xindice/client/xmldb/embed CollectionImpl.java java/tests/src/org/apache/xindice/integration/client/services XPathQueryTest.java java/tests/src/org/apache/xindice/integration IntegrationTests.java java/tests/src/org/apache/xindice/integration/client/basic CollectionTest.java java/src/org/apache/xindice/client/xmldb DatabaseImpl.java ResourceSetImpl.java java/tests/src/org/apache/xindice IntegrationXmlRpcTests.java java/src/org/apache/xindice/server/rpc/messages RemoveCollection.java java/src/org/apache/xindice/tools XMLTools.java Log: PR: 22009, 22011. The xml-rpc driver now works within test-all (boot the server first though). Revision Changes Path 1.27 +686 -666 xml-xindice/java/src/org/apache/xindice/client/xmldb/xmlrpc/CollectionImpl.java Index: CollectionImpl.java =================================================================== RCS file: /home/cvs/xml-xindice/java/src/org/apache/xindice/client/xmldb/xmlrpc/CollectionImpl.java,v retrieving revision 1.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- CollectionImpl.java 1 Aug 2003 19:40:16 -0000 1.26 +++ CollectionImpl.java 4 Aug 2003 03:01:57 -0000 1.27 @@ -59,6 +59,13 @@ * $Id$ */ +import java.io.StringReader; +import java.net.MalformedURLException; +import java.util.Hashtable; +import java.util.Vector; + +import javax.xml.parsers.DocumentBuilderFactory; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.xindice.client.xmldb.ResourceSetImpl; @@ -73,11 +80,7 @@ import org.apache.xindice.xml.dom.DOMParser; import org.apache.xmlrpc.XmlRpc; import org.apache.xmlrpc.XmlRpcClient; - import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xmldb.api.base.Collection; import org.xmldb.api.base.ErrorCodes; @@ -86,12 +89,6 @@ import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; -import javax.xml.parsers.DocumentBuilderFactory; -import java.io.StringReader; -import java.net.MalformedURLException; -import java.util.Hashtable; -import java.util.Vector; - /** * Implementation of XML:DB's <code>Collection</code> interface using * XML-RPC to interact with database server @@ -100,660 +97,683 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Kimbro Staken</a> */ public class CollectionImpl extends XindiceCollection { - - private static Log log = LogFactory.getLog("org.apache.xindice.client.xmldb.xmlrpc"); - - /* path to XML-RPC service on database */ - private static String XINDICE_SERVICE_LOCATION = "/Xindice/"; - - /* host and port number of server */ - private String hostPort; - - /* location of the XML-RPC service in the web server */ - private String serviceLocation; - - /* SAX parser the XML-RPC service will use */ - private String xmlrpcDriver; - - /* the XML-RPC client stub, connected to server */ - private XmlRpcClient client = null; - - /** - * Creates new <code>CollectionImpl</code> instance representing connection - * to server collection. - * - * @param hostPort hostname and port number in <code>host:port</code> format. - * Port no is optional, in which case HTTP default is assumed. - * @param serviceLocation is the path in the web server's namespace where - * the XML-RPC service is mounted. It is <code>null</code> unless - * the <code>service-location</code> property of - * <code>org.apache.xindice.client.xmlrpc.DatabaseImpl</code> - * is set. - * @param collPath is the name of the collection to open. - * @exception XMLDBException thrown if a connection could not be established, - * because of URL syntax errors, or connection failure, or if no - * collection with path <code>collPath</code> could be located. - */ - public CollectionImpl(String hostPort, String serviceLocation, String xmlrpcDriver, String collPath) throws XMLDBException { - super(collPath); - this.hostPort = hostPort; - this.serviceLocation = serviceLocation; - this.xmlrpcDriver = xmlrpcDriver; - this.collPath = collPath; - - XmlRpc.setEncoding("UTF8"); - - /* - * Determine the SAXparser the xmlrpc client will use. - * In priority order: - * DatabaseImpl xmlrpc-driver property - * (passed in the xmlrpcDriver parameter) - * System property "xindice.xmlrpc.driver" - * Default value "xerces" - */ - if (xmlrpcDriver == null) { - xmlrpcDriver = System.getProperty("xindice.xmlrpc.driver"); - } - if (xmlrpcDriver == null) { - xmlrpcDriver = "xerces"; - } - XmlRpc.setKeepAlive(true); - try { - XmlRpc.setDriver(xmlrpcDriver); - } catch (Exception e) { - throw new XMLDBException(ErrorCodes.VENDOR_ERROR, "Xerces needed", e); - } - - /* - * Determine the path in the web server to the XML-RPC service. - * In priority order: - * DatabaseImpl service-location property - * (passed in the serviceLocation parameter) - * System property "xindice.xmlrpc.service-location" - * Default value "/Xindice/" - */ - if (serviceLocation == null) { - serviceLocation = System.getProperty("xindice.xmlrpc.service-location"); - } - if (serviceLocation == null) { - serviceLocation = XINDICE_SERVICE_LOCATION; - } - - if (!serviceLocation.startsWith("/")) { - serviceLocation = "/" + serviceLocation; - } - if (!serviceLocation.endsWith("/")) { - serviceLocation = serviceLocation + "/"; - } - - log.debug("serviceLocation=<" + serviceLocation + ">"); - String xmlrpcURI = "http://" + hostPort + serviceLocation; - - try { - client = new XmlRpcClient(xmlrpcURI); - - /* Just check the collection does actually exist */ - Hashtable params = new Hashtable(); - params.put(RPCDefaultMessage.COLLECTION, collPath); - String exists = (String) runRemoteCommand("GetCollectionConfiguration", params); - if (!"yes".equals(exists)) { - - throw new XMLDBException(ErrorCodes.NO_SUCH_COLLECTION, "Collection not found: " + collPath); - } - } catch (MalformedURLException e) { - client = null; - throw new XMLDBException(ErrorCodes.INVALID_URI, e); - } catch (XMLDBException x) { - - throw x; // propagate any xmldb exception. - } catch (Exception e) { - client = null; - throw new XMLDBException(ErrorCodes.NO_SUCH_COLLECTION, "Collection not found: " + collPath, e); - } - } - - /** - * Submits a command for RPC to database server - * - * @param cmdName command name - * @param params hashtable containing named parameters to send to server - * @return the return value from the server. Type of return value depends on - * command. - * - * @exception Exception thrown if XML-RPC reports an exception. - */ - private Object runRemoteCommand(String cmdName, Hashtable params) throws Exception { - - params.put(RPCMessageInterface.MESSAGE_PARAM, cmdName); - - Vector v = new Vector(); - v.add(params); - return ((Hashtable) client.execute("run", v)).get(RPCDefaultMessage.RESULT); - } - - /** - * Retrieves a <code>Resource</code> from the database. If the - * <code>Resource</code> could not be - * located a null value will be returned. - * - * @param id the unique id for the requested resource. - * @return The retrieved <code>Resource</code> instance. - * @exception XMLDBException with expected error codes.<br /> - * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor - * specific errors that occur.<br /> - * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> - * method has been called on the <code>Collection</code><br /> - */ - public Resource getResource(String id) throws XMLDBException { - - checkOpen(); - try { - - Hashtable params = new Hashtable(); - params.put(RPCDefaultMessage.COLLECTION, collPath); - params.put(RPCDefaultMessage.NAME, id); - params.put(RPCDefaultMessage.COMPRESSED, "true"); - - Object result = runRemoteCommand("GetDocument", params); - /* - * If we get a Hashtable back then the result is compressed. - */ - if (result instanceof Hashtable) { - Hashtable compressed = (Hashtable) result; - SymbolDeserializer symbolDeserial = new SymbolDeserializer(); - return new XMLResourceImpl(id, id, this, symbolDeserial.getSymbols(compressed), (byte[]) compressed.get("document")); - } else { - return new XMLResourceImpl(id, (String) result, this); - } - - } catch (Exception e) { - return null; - } - } - - /** - * Returns the number of resources currently stored in this collection or 0 - * if the collection is empty. - * - * @return the number of resource in the collection. - * @exception XMLDBException with expected error codes.<br /> - * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor - * specific errors that occur.<br /> - * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> - * method has been called on the <code>Collection</code><br /> - */ - public int getResourceCount() throws XMLDBException { - - checkOpen(); - try { - - Hashtable params = new Hashtable(); - params.put(RPCDefaultMessage.COLLECTION, collPath); - return ((Integer) runRemoteCommand("GetDocumentCount", params)).intValue(); - } catch (XMLDBException x) { - - throw x; // propagate any xmldb exception. - } catch (Exception e) { - - throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e); - } - } - - /** - * Stores the provided resource into the database. If the resource does not - * already exist it will be created. If it does already exist it will be - * updated. - * - * @param res the resource to store in the database. - * @exception XMLDBException with expected error codes.<br /> - * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor - * specific errors that occur.<br /> - * <code>ErrorCodes.INVALID_RESOURCE</code> if the <code>Resource</code> is - * not valid. - * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> - * method has been called on the <code>Collection</code><br /> - */ - public void storeResource(Resource res) throws XMLDBException { - - if (!(res instanceof XMLResource)) { - - throw new XMLDBException(ErrorCodes.INVALID_RESOURCE, "Only XML resources supported"); - } - - if (res.getContent() == null) { - - throw new XMLDBException(ErrorCodes.INVALID_RESOURCE, "no resource data"); - } - checkOpen(); - try { - - Hashtable params = new Hashtable(); - params.put(RPCDefaultMessage.COLLECTION, collPath); - params.put(RPCDefaultMessage.NAME, res.getId()); - params.put(RPCDefaultMessage.DOCUMENT, res.getContent()); - - String name = (String) runRemoteCommand("InsertDocument", params); - ((XMLResourceImpl) res).setId(name); - - } catch (XMLDBException x) { - - throw x; // propagate any xmldb exception. - } catch (Exception e) { - - throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e); - } - } - - /* see superclass for documentation */ - public boolean isOpen() { - - return (client != null); - } - - /* see superclass for documentation */ - public String getURI() { - - return "xmldb:" + DatabaseImpl.DRIVER_NAME + "://" + hostPort + collPath; - } - - /** - * Returns a <code>Collection</code> instance for the requested child collection - * if it exists. - * - * @param name the name of the child collection to retrieve. - * @return the requested child collection or null if it couldn't be found. - * @exception XMLDBException with expected error codes.<br /> - * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor - * specific errors that occur.<br /> - * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> - * method has been called on the <code>Collection</code><br /> - */ - public Collection getChildCollection(String name) throws XMLDBException { - - if (name.indexOf('/') != -1) { - - throw new XMLDBException(ErrorCodes.INVALID_COLLECTION); - } - - try { - return new CollectionImpl(hostPort, serviceLocation, xmlrpcDriver, collPath + "/" + name); - } catch (XMLDBException e) { - - if (e.errorCode == ErrorCodes.NO_SUCH_COLLECTION) { - // per getChildCollection contract, return null if not found - return null; - } - - throw e; - } - } - - /** - * Creates a new unique ID within the context of the <code>Collection</code> - * - * @return the created id as a string. - * @exception XMLDBException with expected error codes.<br /> - * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor - * specific errors that occur.<br /> - * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> - * method has been called on the <code>Collection</code><br /> - */ - public String createId() throws XMLDBException { - - checkOpen(); - try { - - Hashtable params = new Hashtable(); - params.put(RPCDefaultMessage.COLLECTION, collPath); - return (String) runRemoteCommand("CreateNewOID", params); - } catch (XMLDBException x) { - - throw x; // propagate any xmldb exception. - } catch (Exception e) { - - throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e); - } - } - - /** - * Releases all resources consumed by the <code>Collection</code>. - * The <code>close</code> method must - * always be called when use of a <code>Collection</code> is complete. It is - * not safe to use a <code>Collection</code> after the <code>close</code> - * method has been called. - * - * @exception XMLDBException with expected error codes.<br /> - * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor - * specific errors that occur.<br /> - */ - public void close() throws org.xmldb.api.base.XMLDBException { - - client = null; - } - - /** - * Returns the parent collection for this collection or null if no parent - * collection exists. - * - * @return the parent <code>Collection</code> instance. - * @exception XMLDBException with expected error codes.<br /> - * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor - * specific errors that occur.<br /> - * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> - * method has been called on the <code>Collection</code><br /> - */ - public Collection getParentCollection() throws XMLDBException { - - // If there's only one slash then it's the root. - if (collPath.lastIndexOf("/") == 0) { - return null; - } - - try { - return new CollectionImpl(hostPort, serviceLocation, xmlrpcDriver, collPath.substring(0, collPath.lastIndexOf('/'))); - } catch (XMLDBException e) { - if (e.errorCode == ErrorCodes.NO_SUCH_COLLECTION) { - // per getParentCollection contract, return null if no parent - return null; - } - throw e; - } - } - - /** - * Removes the <code>Resource</code> from the database. - * - * @param res the resource to remove. - * @exception XMLDBException with expected error codes.<br /> - * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor - * specific errors that occur.<br /> - * <code>ErrorCodes.INVALID_RESOURCE</code> if the <code>Resource</code> is - * not valid.<br /> - * <code>ErrorCodes.NO_SUCH_RESOURCE</code> if the <code>Resource</code> is - * not known to this <code>Collection</code>. - * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> - * method has been called on the <code>Collection</code><br /> - */ - public void removeResource(Resource res) throws XMLDBException { - - if (!(res instanceof XMLResource)) { - - throw new XMLDBException(ErrorCodes.INVALID_RESOURCE, "Only XML resources supported"); - } - - if (res.getId() == null) { - throw new XMLDBException(ErrorCodes.VENDOR_ERROR, "This resource is a query result and can " + "not be removed from the database."); - } - - checkOpen(); - try { - - Hashtable params = new Hashtable(); - params.put(RPCDefaultMessage.COLLECTION, collPath); - params.put(RPCDefaultMessage.NAME, res.getId()); - runRemoteCommand("RemoveDocument", params); - } catch (XMLDBException x) { - - throw x; // propagate any xmldb exception. - } catch (Exception e) { - throw new XMLDBException(ErrorCodes.NO_SUCH_RESOURCE, e); - } - } - - /** - * Returns a list of collection names naming all child collections - * of the current collection. If no child collections exist an empty list is - * returned. - * - * @return an array containing collection names for all child - * collections. - * @exception XMLDBException with expected error codes.<br /> - * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor - * specific errors that occur.<br /> - * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> - * method has been called on the <code>Collection</code><br /> - */ - public String[] listChildCollections() throws XMLDBException { - - checkOpen(); - try { - - Hashtable params = new Hashtable(); - params.put(RPCDefaultMessage.COLLECTION, collPath); - Vector list = (Vector) runRemoteCommand("ListCollections", params); - - return (String[]) list.toArray(new String[list.size()]); - } catch (XMLDBException x) { - - throw x; // propagate any xmldb exception. - } catch (Exception e) { - - throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e); - } - } - - /** - * Returns the number of child collections under this - * <code>Collection</code> or 0 if no child collections exist. - * - * @return the number of child collections. - * @exception XMLDBException with expected error codes.<br /> - * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor - * specific errors that occur.<br /> - * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> - * method has been called on the <code>Collection</code><br /> - */ - public int getChildCollectionCount() throws XMLDBException { - - checkOpen(); - try { - - Hashtable params = new Hashtable(); - params.put(RPCDefaultMessage.COLLECTION, collPath); - Integer result = (Integer) runRemoteCommand("GetCollectionCount", params); - return result.intValue(); - - } catch (XMLDBException x) { - - throw x; // propagate any xmldb exception. - } catch (Exception e) { - throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e); - } - } - - /** - * Returns a list of the ids for all resources stored in the collection. - * - * @return a string array containing the names for all - * <code>Resource</code>s in the collection. - * @exception XMLDBException with expected error codes.<br /> - * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor - * specific errors that occur.<br /> - * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> - * method has been called on the <code>Collection</code><br /> - */ - public String[] listResources() throws XMLDBException { - - checkOpen(); - try { - - Hashtable params = new Hashtable(); - params.put(RPCDefaultMessage.COLLECTION, collPath); - Vector list = (Vector) runRemoteCommand("ListDocuments", params); - - return (String[]) list.toArray(new String[list.size()]); - } catch (XMLDBException x) { - - throw x; // propagate any xmldb exception. - } catch (Exception e) { - - throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e); - } - } - - /* see superclass for documentation */ - public ResourceSet query(String name, String queryLang, String query, Hashtable nsMap) throws XMLDBException { - - checkOpen(); - try { - - Hashtable params = new Hashtable(); - params.put(RPCDefaultMessage.COLLECTION, collPath); - params.put(RPCDefaultMessage.TYPE, queryLang); - params.put(RPCDefaultMessage.NAMESPACES, nsMap); - params.put(RPCDefaultMessage.QUERY, query); - - if (name != null) { - - params.put(RPCDefaultMessage.NAME, name); - } - - String result = (String) runRemoteCommand("Query", params); - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - dbf.setNamespaceAware(true); - Document resultDoc = dbf.newDocumentBuilder().parse(new InputSource(new StringReader(result))); - - NodeList nodes = resultDoc.getDocumentElement().getChildNodes(); - ResourceSetImpl rs = new ResourceSetImpl(this, null); - - for (int i = 0; i < nodes.getLength(); i++) { - - Node n = nodes.item(i); - - String documentId = ((Element) n).getAttributeNS(QUERY_NS, "key"); - XMLResourceImpl resource = new XMLResourceImpl(null, documentId, this, TextWriter.toString(n)); - rs.addResource(resource); - } - - return rs; - } catch (Exception e) { - - throw FaultCodes.createXMLDBException(FaultCodes.QRY_PROCESSING_ERROR, "Query error", e); - } - } - - /* see superclass for documentation */ - public Collection createCollection(String name) throws XMLDBException { - return createCollection(name, null); - } - - /* see superclass for documentation */ - public Collection createCollection(String name, Document configuration) throws XMLDBException { - checkOpen(); - try { - Hashtable params = new Hashtable(); - params.put(RPCDefaultMessage.COLLECTION, collPath); - params.put(RPCDefaultMessage.NAME, name); - if (configuration != null) { - params.put(RPCDefaultMessage.CONFIGURATION, TextWriter.toString(configuration)); - } - - runRemoteCommand("CreateCollection", params); - - return getChildCollection(name); - } catch (XMLDBException x) { - - throw x; // propagate any xmldb exception. - } catch (Exception e) { - throw new XMLDBException(ErrorCodes.INVALID_COLLECTION, "Cannot create child collection", e); - } - } - - /* see superclass for documentation */ - public void removeCollection(String childName) throws XMLDBException { - - checkOpen(); - try { - - Hashtable params = new Hashtable(); - params.put(RPCDefaultMessage.COLLECTION, collPath); - params.put(RPCDefaultMessage.NAME, childName); - String result = (String) runRemoteCommand("RemoveCollection", params); - - if (!result.equals("yes")) { - - throw new XMLDBException(ErrorCodes.INVALID_COLLECTION, "Cannot remove child collection[" + childName + "]"); - } - } catch (XMLDBException x) { - - throw x; // propagate any xmldb exception. - } catch (Exception e) { - - throw new XMLDBException(ErrorCodes.INVALID_COLLECTION, "Cannot remove child collection[" + childName + "]", e); - } - } - - /* see superclass for documentation */ - public String[] listIndexers() throws XMLDBException { - checkOpen(); - try { - Hashtable params = new Hashtable(); - params.put(RPCDefaultMessage.COLLECTION, collPath); - Vector list = (Vector) runRemoteCommand("ListIndexers", params); - - return (String[]) list.toArray(new String[list.size()]); - } catch (Exception e) { - throw FaultCodes.createXMLDBException(e); - } - } - - /* see superclass for documentation */ - public void createIndexer(Document configuration) throws XMLDBException { - checkOpen(); - try { - Hashtable params = new Hashtable(); - params.put(RPCDefaultMessage.COLLECTION, collPath); - params.put(RPCDefaultMessage.CONFIGURATION, TextWriter.toString(configuration)); - - runRemoteCommand("CreateIndexer", params); - } catch (Exception e) { - throw FaultCodes.createXMLDBException(e); - } - } - - /* see superclass for documentation */ - public void dropIndexer(String name) throws XMLDBException { - checkOpen(); - try { - Hashtable params = new Hashtable(); - params.put(RPCDefaultMessage.COLLECTION, collPath); - params.put(RPCDefaultMessage.NAME, name); - - runRemoteCommand("RemoveIndexer", params); - } catch (Exception e) { - throw FaultCodes.createXMLDBException(e); - } - } - - /* see superclass for documentation */ - public void shutdown() throws XMLDBException { - checkOpen(); - try { - Hashtable params = new Hashtable(); - - runRemoteCommand("Shutdown", params); - } catch (Exception e) { - throw FaultCodes.createXMLDBException(e); - } - } - - public MetaData getMetaData(String id) throws XMLDBException { - checkOpen(); - try { - Hashtable params = new Hashtable(); - params.put(RPCDefaultMessage.COLLECTION, collPath); - if (id != null) { - params.put(RPCDefaultMessage.NAME, id); - } - params.put(RPCDefaultMessage.COMPRESSED, "true"); - - Object result = runRemoteCommand(id == null ? "GetCollectionMeta" : "GetDocumentMeta", params); - Document metaDoc = DOMParser.toDocument(result.toString()); - MetaData meta = new MetaData(id); - meta.streamFromXML(metaDoc.getDocumentElement(), true); - return meta; - } catch (Exception e) { - throw FaultCodes.createXMLDBException(e); - } - } + + private static Log log = LogFactory.getLog("org.apache.xindice.client.xmldb.xmlrpc"); + + /* path to XML-RPC service on database */ + private static String XINDICE_SERVICE_LOCATION = "/xindice/"; + + /* host and port number of server */ + private String hostPort; + + /* location of the XML-RPC service in the web server */ + private String serviceLocation; + + /* SAX parser the XML-RPC service will use */ + private String xmlrpcDriver; + + /* the XML-RPC client stub, connected to server */ + private XmlRpcClient client = null; + + /** + * Creates new <code>CollectionImpl</code> instance representing connection + * to server collection. + * + * @param hostPort hostname and port number in <code>host:port</code> format. + * Port no is optional, in which case HTTP default is assumed. + * @param serviceLocation is the path in the web server's namespace where + * the XML-RPC service is mounted. It is <code>null</code> unless + * the <code>service-location</code> property of + * <code>org.apache.xindice.client.xmlrpc.DatabaseImpl</code> + * is set. + * @param collPath is the name of the collection to open. + * @exception XMLDBException thrown if a connection could not be established, + * because of URL syntax errors, or connection failure, or if no + * collection with path <code>collPath</code> could be located. + */ + public CollectionImpl(String hostPort, String serviceLocation, String xmlrpcDriver, String collPath) throws XMLDBException { + super(collPath); + this.hostPort = hostPort; + this.serviceLocation = serviceLocation; + this.xmlrpcDriver = xmlrpcDriver; + + XmlRpc.setEncoding("UTF8"); + + /* + * Determine the SAXparser the xmlrpc client will use. + * In priority order: + * DatabaseImpl xmlrpc-driver property + * (passed in the xmlrpcDriver parameter) + * System property "xindice.xmlrpc.driver" + * Default value "xerces" + */ + if (xmlrpcDriver == null) { + xmlrpcDriver = System.getProperty("xindice.xmlrpc.driver"); + } + if (xmlrpcDriver == null) { + xmlrpcDriver = "xerces"; + } + XmlRpc.setKeepAlive(true); + try { + XmlRpc.setDriver(xmlrpcDriver); + } + catch (Exception e) { + throw new XMLDBException(ErrorCodes.VENDOR_ERROR, "Xerces needed", e); + } + + /* + * Determine the path in the web server to the XML-RPC service. + * In priority order: + * DatabaseImpl service-location property + * (passed in the serviceLocation parameter) + * System property "xindice.xmlrpc.service-location" + * Default value "/xindice/" + */ + if (serviceLocation == null) { + serviceLocation = System.getProperty("xindice.xmlrpc.service-location"); + } + if (serviceLocation == null) { + serviceLocation = XINDICE_SERVICE_LOCATION; + } + + if (!serviceLocation.startsWith("/")) { + serviceLocation = "/" + serviceLocation; + } + if (!serviceLocation.endsWith("/")) { + serviceLocation = serviceLocation + "/"; + } + + log.debug("serviceLocation=<" + serviceLocation + ">"); + String xmlrpcURI = "http://" + hostPort + serviceLocation; + + try { + client = new XmlRpcClient(xmlrpcURI); + + /* Just check the collection does actually exist */ + Hashtable params = new Hashtable(); + params.put(RPCDefaultMessage.COLLECTION, collPath); + String exists = (String) runRemoteCommand("GetCollectionConfiguration", params); + if (!"yes".equals(exists)) { + + throw new XMLDBException(ErrorCodes.NO_SUCH_COLLECTION, "Collection not found: " + collPath); + } + } + catch (MalformedURLException e) { + client = null; + throw new XMLDBException(ErrorCodes.INVALID_URI, e); + } + catch(XMLDBException x){ + + throw x; // propagate any xmldb exception. + } + catch (Exception e) { + client = null; + throw new XMLDBException(ErrorCodes.NO_SUCH_COLLECTION, "Collection not found: " + collPath, e); + } + } + + /** + * Submits a command for RPC to database server + * + * @param cmdName command name + * @param params hashtable containing named parameters to send to server + * @return the return value from the server. Type of return value depends on + * command. + * + * @exception Exception thrown if XML-RPC reports an exception. + */ + private Object runRemoteCommand(String cmdName, Hashtable params) throws Exception { + + params.put(RPCMessageInterface.MESSAGE_PARAM, cmdName); + + Vector v = new Vector(); + v.add(params); + return ((Hashtable) client.execute("run", v)).get(RPCDefaultMessage.RESULT); + } + + /** + * Retrieves a <code>Resource</code> from the database. If the + * <code>Resource</code> could not be + * located a null value will be returned. + * + * @param id the unique id for the requested resource. + * @return The retrieved <code>Resource</code> instance. + * @exception XMLDBException with expected error codes.<br /> + * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor + * specific errors that occur.<br /> + * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> + * method has been called on the <code>Collection</code><br /> + */ + public Resource getResource(String id) throws XMLDBException { + + checkOpen(); + try { + + Hashtable params = new Hashtable(); + params.put(RPCDefaultMessage.COLLECTION, collPath); + params.put(RPCDefaultMessage.NAME, id); + params.put(RPCDefaultMessage.COMPRESSED, "true"); + + Object result = runRemoteCommand("GetDocument", params); + /* + * If we get a Hashtable back then the result is compressed. + */ + if (result instanceof Hashtable) { + Hashtable compressed = (Hashtable) result; + SymbolDeserializer symbolDeserial = new SymbolDeserializer(); + return new XMLResourceImpl(id, id, this, symbolDeserial.getSymbols(compressed), (byte[]) compressed.get("document")); + } + else { + return new XMLResourceImpl(id, (String) result, this); + } + + } + catch (Exception e) { + return null; + } + } + + /** + * Returns the number of resources currently stored in this collection or 0 + * if the collection is empty. + * + * @return the number of resource in the collection. + * @exception XMLDBException with expected error codes.<br /> + * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor + * specific errors that occur.<br /> + * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> + * method has been called on the <code>Collection</code><br /> + */ + public int getResourceCount() throws XMLDBException { + + checkOpen(); + try { + + Hashtable params = new Hashtable(); + params.put(RPCDefaultMessage.COLLECTION, collPath); + return ((Integer) runRemoteCommand("GetDocumentCount", params)).intValue(); + } + catch(XMLDBException x){ + + throw x; // propagate any xmldb exception. + } + catch (Exception e) { + + throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e); + } + } + + /** + * Stores the provided resource into the database. If the resource does not + * already exist it will be created. If it does already exist it will be + * updated. + * + * @param res the resource to store in the database. + * @exception XMLDBException with expected error codes.<br /> + * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor + * specific errors that occur.<br /> + * <code>ErrorCodes.INVALID_RESOURCE</code> if the <code>Resource</code> is + * not valid. + * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> + * method has been called on the <code>Collection</code><br /> + */ + public void storeResource(Resource res) throws XMLDBException { + + if (!(res instanceof XMLResource)) { + + throw new XMLDBException(ErrorCodes.INVALID_RESOURCE, "Only XML resources supported"); + } + + if (res.getContent() == null) { + + throw new XMLDBException(ErrorCodes.INVALID_RESOURCE, "no resource data"); + } + checkOpen(); + try { + + Hashtable params = new Hashtable(); + params.put(RPCDefaultMessage.COLLECTION, collPath); + params.put(RPCDefaultMessage.NAME, res.getId()); + params.put(RPCDefaultMessage.DOCUMENT, res.getContent()); + + String name = (String) runRemoteCommand("InsertDocument", params); + ((XMLResourceImpl) res).setId(name); + + } + catch(XMLDBException x){ + + throw x; // propagate any xmldb exception. + } + catch (Exception e) { + + throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e); + } + } + + /* see superclass for documentation */ + public boolean isOpen() { + + return (client != null); + } + + /* see superclass for documentation */ + public String getURI() { + + return "xmldb:" + DatabaseImpl.DRIVER_NAME + "://" + hostPort + collPath; + } + + /** + * Returns a <code>Collection</code> instance for the requested child collection + * if it exists. + * + * @param name the name of the child collection to retrieve. + * @return the requested child collection or null if it couldn't be found. + * @exception XMLDBException with expected error codes.<br /> + * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor + * specific errors that occur.<br /> + * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> + * method has been called on the <code>Collection</code><br /> + */ + public Collection getChildCollection(String name) throws XMLDBException { + + if (name.indexOf('/') != -1) { + + throw new XMLDBException(ErrorCodes.INVALID_COLLECTION); + } + + try { + return new CollectionImpl(hostPort, serviceLocation, xmlrpcDriver, collPath + "/" + name); + } + catch (XMLDBException e) { + + if (e.errorCode == ErrorCodes.NO_SUCH_COLLECTION) { + // per getChildCollection contract, return null if not found + return null; + } + + throw e; + } + } + + /** + * Creates a new unique ID within the context of the <code>Collection</code> + * + * @return the created id as a string. + * @exception XMLDBException with expected error codes.<br /> + * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor + * specific errors that occur.<br /> + * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> + * method has been called on the <code>Collection</code><br /> + */ + public String createId() throws XMLDBException { + + checkOpen(); + try { + + Hashtable params = new Hashtable(); + params.put(RPCDefaultMessage.COLLECTION, collPath); + return (String) runRemoteCommand("CreateNewOID", params); + } + catch(XMLDBException x){ + + throw x; // propagate any xmldb exception. + } + catch (Exception e) { + + throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e); + } + } + + /** + * Releases all resources consumed by the <code>Collection</code>. + * The <code>close</code> method must + * always be called when use of a <code>Collection</code> is complete. It is + * not safe to use a <code>Collection</code> after the <code>close</code> + * method has been called. + * + * @exception XMLDBException with expected error codes.<br /> + * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor + * specific errors that occur.<br /> + */ + public void close() throws org.xmldb.api.base.XMLDBException { + + client = null; + } + + /** + * Returns the parent collection for this collection or null if no parent + * collection exists. + * + * @return the parent <code>Collection</code> instance. + * @exception XMLDBException with expected error codes.<br /> + * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor + * specific errors that occur.<br /> + * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> + * method has been called on the <code>Collection</code><br /> + */ + public Collection getParentCollection() throws XMLDBException { + + // If there's only one slash then it's the root. + if (collPath.lastIndexOf("/") == 0) { + return null; + } + + try { + return new CollectionImpl(hostPort, serviceLocation, xmlrpcDriver, collPath.substring(0, collPath.lastIndexOf('/'))); + } + catch (XMLDBException e) { + if (e.errorCode == ErrorCodes.NO_SUCH_COLLECTION) { + // per getParentCollection contract, return null if no parent + return null; + } + throw e; + } + } + + /** + * Removes the <code>Resource</code> from the database. + * + * @param res the resource to remove. + * @exception XMLDBException with expected error codes.<br /> + * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor + * specific errors that occur.<br /> + * <code>ErrorCodes.INVALID_RESOURCE</code> if the <code>Resource</code> is + * not valid.<br /> + * <code>ErrorCodes.NO_SUCH_RESOURCE</code> if the <code>Resource</code> is + * not known to this <code>Collection</code>. + * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> + * method has been called on the <code>Collection</code><br /> + */ + public void removeResource(Resource res) throws XMLDBException { + + if (!(res instanceof XMLResource)) { + + throw new XMLDBException(ErrorCodes.INVALID_RESOURCE, "Only XML resources supported"); + } + + if (res.getId() == null) { + throw new XMLDBException(ErrorCodes.VENDOR_ERROR, "This resource is a query result and can " + "not be removed from the database."); + } + + checkOpen(); + try { + + Hashtable params = new Hashtable(); + params.put(RPCDefaultMessage.COLLECTION, collPath); + params.put(RPCDefaultMessage.NAME, res.getId()); + runRemoteCommand("RemoveDocument", params); + } + catch(XMLDBException x){ + + throw x; // propagate any xmldb exception. + } + catch (Exception e) { + throw new XMLDBException(ErrorCodes.NO_SUCH_RESOURCE, e); + } + } + + /** + * Returns a list of collection names naming all child collections + * of the current collection. If no child collections exist an empty list is + * returned. + * + * @return an array containing collection names for all child + * collections. + * @exception XMLDBException with expected error codes.<br /> + * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor + * specific errors that occur.<br /> + * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> + * method has been called on the <code>Collection</code><br /> + */ + public String[] listChildCollections() throws XMLDBException { + + checkOpen(); + try { + + Hashtable params = new Hashtable(); + params.put(RPCDefaultMessage.COLLECTION, collPath); + Vector list = (Vector) runRemoteCommand("ListCollections", params); + + return (String[]) list.toArray(new String[list.size()]); + } + catch(XMLDBException x){ + + throw x; // propagate any xmldb exception. + } + catch (Exception e) { + + throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e); + } + } + + /** + * Returns the number of child collections under this + * <code>Collection</code> or 0 if no child collections exist. + * + * @return the number of child collections. + * @exception XMLDBException with expected error codes.<br /> + * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor + * specific errors that occur.<br /> + * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> + * method has been called on the <code>Collection</code><br /> + */ + public int getChildCollectionCount() throws XMLDBException { + + checkOpen(); + try { + + Hashtable params = new Hashtable(); + params.put(RPCDefaultMessage.COLLECTION, collPath); + Integer result = (Integer) runRemoteCommand("GetCollectionCount", params); + return result.intValue(); + + } + catch(XMLDBException x){ + + throw x; // propagate any xmldb exception. + } + catch (Exception e) { + throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e); + } + } + + /** + * Returns a list of the ids for all resources stored in the collection. + * + * @return a string array containing the names for all + * <code>Resource</code>s in the collection. + * @exception XMLDBException with expected error codes.<br /> + * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor + * specific errors that occur.<br /> + * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> + * method has been called on the <code>Collection</code><br /> + */ + public String[] listResources() throws XMLDBException { + + checkOpen(); + try { + + Hashtable params = new Hashtable(); + params.put(RPCDefaultMessage.COLLECTION, collPath); + Vector list = (Vector) runRemoteCommand("ListDocuments", params); + + return (String[]) list.toArray(new String[list.size()]); + } + catch(XMLDBException x){ + + throw x; // propagate any xmldb exception. + } + catch (Exception e) { + + throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e); + } + } + + /* see superclass for documentation */ + public ResourceSet query(String name, String queryLang, String query, Hashtable nsMap) throws XMLDBException { + + checkOpen(); + try { + + Hashtable params = new Hashtable(); + params.put(RPCDefaultMessage.COLLECTION, collPath); + params.put(RPCDefaultMessage.TYPE, queryLang); + params.put(RPCDefaultMessage.NAMESPACES, nsMap); + params.put(RPCDefaultMessage.QUERY, query); + + if (name != null) { + + params.put(RPCDefaultMessage.NAME, name); + } + + String result = (String) runRemoteCommand("Query", params); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setNamespaceAware(true); + Document resultDoc = dbf.newDocumentBuilder().parse(new InputSource(new StringReader(result))); + + ResourceSetImpl rs = new ResourceSetImpl(this, resultDoc); + + return rs; + } + catch (Exception e) { + + throw FaultCodes.createXMLDBException(FaultCodes.QRY_PROCESSING_ERROR, "Query error", e); + } + } + + /* see superclass for documentation */ + public Collection createCollection(String name) throws XMLDBException { + return createCollection(name, null); + } + + /* see superclass for documentation */ + public Collection createCollection(String name, Document configuration) throws XMLDBException { + checkOpen(); + try { + Hashtable params = new Hashtable(); + params.put(RPCDefaultMessage.COLLECTION, collPath); + params.put(RPCDefaultMessage.NAME, name); + if (configuration != null) { + params.put(RPCDefaultMessage.CONFIGURATION, TextWriter.toString(configuration)); + } + + runRemoteCommand("CreateCollection", params); + + return getChildCollection(name); + } + catch(XMLDBException x){ + + throw x; // propagate any xmldb exception. + } + catch (Exception e) { + throw new XMLDBException(ErrorCodes.INVALID_COLLECTION, "Cannot create child collection", e); + } + } + + /* see superclass for documentation */ + public void removeCollection(String childName) throws XMLDBException { + + // todo: shortcut the call and fail immediatly if the collection name is null or empty + + checkOpen(); + try { + + Hashtable params = new Hashtable(); + params.put(RPCDefaultMessage.COLLECTION, collPath); + params.put(RPCDefaultMessage.NAME, childName); + String result = (String) runRemoteCommand("RemoveCollection", params); + + if (!result.equals("yes")) { + + throw new XMLDBException(ErrorCodes.INVALID_COLLECTION, "Cannot remove child collection[" + childName + "]"); + } + } + catch(XMLDBException x){ + + throw x; // propagate any xmldb exception. + } + catch (Exception e) { + + throw new XMLDBException(ErrorCodes.INVALID_COLLECTION, "Cannot remove child collection[" + childName + "]", e); + } + } + + /* see superclass for documentation */ + public String[] listIndexers() throws XMLDBException { + checkOpen(); + try { + Hashtable params = new Hashtable(); + params.put(RPCDefaultMessage.COLLECTION, collPath); + Vector list = (Vector) runRemoteCommand("ListIndexers", params); + + return (String[]) list.toArray(new String[list.size()]); + } + catch (Exception e) { + throw FaultCodes.createXMLDBException(e); + } + } + + /* see superclass for documentation */ + public void createIndexer(Document configuration) throws XMLDBException { + checkOpen(); + try { + Hashtable params = new Hashtable(); + params.put(RPCDefaultMessage.COLLECTION, collPath); + params.put(RPCDefaultMessage.CONFIGURATION, TextWriter.toString(configuration)); + + runRemoteCommand("CreateIndexer", params); + } + catch (Exception e) { + throw FaultCodes.createXMLDBException(e); + } + } + + /* see superclass for documentation */ + public void dropIndexer(String name) throws XMLDBException { + checkOpen(); + try { + Hashtable params = new Hashtable(); + params.put(RPCDefaultMessage.COLLECTION, collPath); + params.put(RPCDefaultMessage.NAME, name); + + runRemoteCommand("RemoveIndexer", params); + } + catch (Exception e) { + throw FaultCodes.createXMLDBException(e); + } + } + + /* see superclass for documentation */ + public void shutdown() throws XMLDBException { + checkOpen(); + try { + Hashtable params = new Hashtable(); + + runRemoteCommand("Shutdown", params); + } + catch (Exception e) { + throw FaultCodes.createXMLDBException(e); + } + } + + public MetaData getMetaData(String id) throws XMLDBException { + checkOpen(); + try { + Hashtable params = new Hashtable(); + params.put(RPCDefaultMessage.COLLECTION, collPath); + if (id != null) { + params.put(RPCDefaultMessage.NAME, id); + } + params.put(RPCDefaultMessage.COMPRESSED, "true"); + + Object result = runRemoteCommand(id == null? "GetCollectionMeta" : "GetDocumentMeta", params); + Document metaDoc = DOMParser.toDocument(result.toString()); + MetaData meta = new MetaData(id); + meta.streamFromXML(metaDoc.getDocumentElement(), true); + return meta; + } + catch (Exception e) { + throw FaultCodes.createXMLDBException(e); + } + } } 1.16 +74 -37 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.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- CollectionImpl.java 1 Aug 2003 19:35:51 -0000 1.15 +++ CollectionImpl.java 4 Aug 2003 03:01:57 -0000 1.16 @@ -1,3 +1,5 @@ +package org.apache.xindice.client.xmldb.embed; + /* * The Apache Software License, Version 1.1 * @@ -56,7 +58,8 @@ * * $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 +73,8 @@ import org.apache.xindice.core.meta.MetaData; import org.apache.xindice.util.Configuration; 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; @@ -84,9 +85,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 @@ -134,6 +132,7 @@ * method has been called on the <code>Collection</code><br /> */ public Resource getResource(String id) throws XMLDBException { + checkOpen(); try { Object entry = col.getEntry(id); @@ -147,9 +146,11 @@ return new XMLResourceImpl(id, id, this, ((DocumentImpl) doc).getSymbols(), ((DocumentImpl) doc).getDataBytes()); } else if (entry instanceof byte[]) { - return new BinaryResourceImpl(id, entry); + return new BinaryResourceImpl(id, (byte[]) entry); } else { - throw new XMLDBException(ErrorCodes.UNKNOWN_RESOURCE_TYPE, "Internal error: unexpected type " + entry.getClass().getName()); + throw new XMLDBException( + ErrorCodes.UNKNOWN_RESOURCE_TYPE, + "Internal error: unexpected type " + entry.getClass().getName()); } } catch (Exception e) { throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, "Message: " + e.getMessage(), e); @@ -168,6 +169,7 @@ * method has been called on the <code>Collection</code><br /> */ public int getResourceCount() throws XMLDBException { + checkOpen(); try { return (int) col.getDocumentCount(); @@ -191,6 +193,7 @@ * method has been called on the <code>Collection</code><br /> */ public void storeResource(Resource res) throws XMLDBException { + if (res.getContent() == null) { throw new XMLDBException(ErrorCodes.INVALID_RESOURCE, "no resource data"); } @@ -263,6 +266,7 @@ * method has been called on the <code>Collection</code><br /> */ public org.xmldb.api.base.Collection getChildCollection(String name) throws XMLDBException { + if (name.indexOf('/') != -1) { throw new XMLDBException(ErrorCodes.INVALID_COLLECTION); } @@ -289,6 +293,7 @@ * method has been called on the <code>Collection</code><br /> */ public String createId() throws XMLDBException { + checkOpen(); try { return col.createNewOID().toString(); @@ -357,12 +362,15 @@ * method has been called on the <code>Collection</code><br /> */ public void removeResource(Resource res) throws XMLDBException { + if (!(res instanceof XMLResource)) { throw new XMLDBException(ErrorCodes.INVALID_RESOURCE, "Only XML resources supported"); } if (res.getId() == null) { - throw new XMLDBException(ErrorCodes.VENDOR_ERROR, "This resource is a query result and can " + "not be removed from the database."); + throw new XMLDBException( + ErrorCodes.VENDOR_ERROR, + "This resource is a query result and can " + "not be removed from the database."); } checkOpen(); @@ -387,6 +395,7 @@ * method has been called on the <code>Collection</code><br /> */ public String[] listChildCollections() throws XMLDBException { + checkOpen(); try { return col.listCollections(); @@ -407,6 +416,7 @@ * method has been called on the <code>Collection</code><br /> */ public int getChildCollectionCount() throws XMLDBException { + checkOpen(); try { return (int) col.countCollections(); @@ -427,6 +437,7 @@ * method has been called on the <code>Collection</code><br /> */ public String[] listResources() throws XMLDBException { + checkOpen(); try { return col.listDocuments(); @@ -437,46 +448,26 @@ /* see superclass for documentation */ public ResourceSet query(String name, String queryLang, String query, Hashtable nsMap) throws XMLDBException { + checkOpen(); - try { - // Copy the namespaces into a NamespaceMap. - NamespaceMap namespaces = new NamespaceMap(); - Enumeration keys = nsMap.keys(); - while (keys.hasMoreElements()) { - String key = (String) keys.nextElement(); - namespaces.put(key, nsMap.get(key)); - } + try { NodeSet result; if (name != null) { - result = col.queryDocument(queryLang, query, namespaces, name); + result = col.queryDocument(queryLang, query, createNamespaceMap(nsMap), name); } else { - result = col.queryCollection(queryLang, query, namespaces); + result = col.queryCollection(queryLang, query, createNamespaceMap(nsMap)); } - ResourceSetImpl rs = new ResourceSetImpl(this, null); - - while (result.hasMoreNodes()) { - - Node n = result.getNextNode(); - if (n instanceof DBNode) { - ((DBNode) n).expandSource(); - } - - String documentId = ((Element) n).getAttributeNS(QUERY_NS, "key"); - - XMLResourceImpl resource = new XMLResourceImpl(null, documentId, this, TextWriter.toString(n)); - rs.addResource(resource); - } - - return rs; + return new ResourceSetImpl(this, nodesetToDocument(result)); } catch (Exception e) { - throw FaultCodes.createXMLDBException(FaultCodes.QRY_PROCESSING_ERROR, "Query error", e); + throw FaultCodes.createXMLDBException(FaultCodes.QRY_PROCESSING_ERROR, "Query error: " + e.getLocalizedMessage(), e); } } /* see superclass for documentation */ public org.xmldb.api.base.Collection createCollection(String name) throws XMLDBException { + checkOpen(); try { Document doc = new DocumentImpl(); @@ -511,6 +502,7 @@ /* see superclass for documentation */ public void removeCollection(String childName) throws XMLDBException { + checkOpen(); try { col.dropCollection(col.getCollection(childName)); @@ -556,6 +548,51 @@ } catch (Exception e) { throw FaultCodes.createXMLDBException(e); } + } + + // search result handling + + private Document nodesetToDocument(NodeSet ns) { + // 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()) { + Node n = ns.getNextNode(); + + if (n.getNodeType() == Node.DOCUMENT_NODE) { + n = ((Document) n).getDocumentElement(); + } + + if (n instanceof DBNode) { + ((DBNode) n).expandSource(); + } + + root.appendChild(doc.importNode(n, true)); + 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 { 1.4 +74 -3 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.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- XPathQueryTest.java 10 Apr 2003 18:33:41 -0000 1.3 +++ XPathQueryTest.java 4 Aug 2003 03:01:57 -0000 1.4 @@ -60,10 +60,14 @@ package org.apache.xindice.integration.client.services; import org.apache.xindice.integration.client.AbstractXmlDbClientTest; +import org.apache.xindice.xml.TextWriter; +import org.custommonkey.xmlunit.XMLAssert; +import org.w3c.dom.Node; import org.xmldb.api.base.Collection; import org.xmldb.api.base.ResourceIterator; import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XPathQueryService; import java.util.ArrayList; @@ -241,7 +245,73 @@ List res = asList(results); assertEquals(1, res.size()); } + + public void testGetSingleTextNode() throws Exception + { + String query = "//person[first='John' and last='Smith']/first/text()"; + + Collection col = this.client.getCollection(TEST_COLLECTION_PATH); + XPathQueryService xpathservice = (XPathQueryService) col.getService("XPathQueryService", "1.0"); + ResourceSet resultSet = xpathservice.query(query); + + ResourceIterator results = resultSet.getIterator(); + + List res = asList(results); + assertEquals(1, res.size()); + } + public void testGetMultipleTextNodes() throws Exception + { + String query = "//person/first/text()"; + + Collection col = this.client.getCollection(TEST_COLLECTION_PATH); + XPathQueryService xpathservice = (XPathQueryService) col.getService("XPathQueryService", "1.0"); + ResourceSet resultSet = xpathservice.query(query); + + ResourceIterator results = resultSet.getIterator(); + + List res = asList(results); + assertEquals(2, res.size()); + } + + public void testNamespaceDOM() throws Exception + { + String document3 = "<?xml version=\"1.0\"?>" + + "<p:person xmlns:p='http://example.net/person' >" + + "<p:first>Sally</p:first>" + + "<p:last>Smith</p:last>" + + "<p:phone type=\"work\">555-345-6789</p:phone>" + + "</p:person>"; + this.client.insertDocument(TEST_COLLECTION_PATH, "doc3", document3); + + String query = "//h:person[h:first='Sally' and h:last='Smith']/h:first"; + + Collection col = this.client.getCollection(TEST_COLLECTION_PATH); + XPathQueryService xpathservice = (XPathQueryService) col.getService("XPathQueryService", "1.0"); + xpathservice.setNamespace("h", "http://example.net/person"); + + ResourceSet resultSet = xpathservice.query(query); + + ResourceIterator results = resultSet.getIterator(); + List res = asList(results); + assertEquals(1, res.size()); + + XMLResource resource = (XMLResource) resultSet.getResource(0); + + // ensure that the resource has the correct doc id. + assertEquals("doc3", resource.getDocumentId()); + + Node node = resource.getContentAsDOM(); + + // add source node information to the compared xml as it's added by + // the query processor. + XMLAssert.assertXMLEqual("<first xmlns:src='http://xml.apache.org/xindice/Query' src:col='/db/testing/current' src:key='doc3' xmlns='http://example.net/person'>Sally</first>", TextWriter.toString(node)); + + this.client.removeDocument(TEST_COLLECTION_PATH, "doc3"); + } + + + public static List asList(ResourceIterator iter) throws Exception { if (iter == null) { @@ -255,6 +325,7 @@ } return result; } - + + } 1.2 +4 -2 xml-xindice/java/tests/src/org/apache/xindice/integration/IntegrationTests.java Index: IntegrationTests.java =================================================================== RCS file: /home/cvs/xml-xindice/java/tests/src/org/apache/xindice/integration/IntegrationTests.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- IntegrationTests.java 28 Nov 2002 08:12:26 -0000 1.1 +++ IntegrationTests.java 4 Aug 2003 03:01:57 -0000 1.2 @@ -62,6 +62,7 @@ import org.apache.xindice.integration.client.basic.CollectionTest; import org.apache.xindice.integration.client.basic.DocumentTest; import org.apache.xindice.integration.client.basic.IndexTest; +import org.apache.xindice.integration.client.services.XPathQueryTest; import org.apache.xindice.integration.client.services.XUpdateQueryTest; import junit.framework.TestSuite; @@ -78,6 +79,7 @@ suite.addTestSuite(IndexTest.class); suite.addTestSuite(DocumentTest.class); suite.addTestSuite(XUpdateQueryTest.class); + suite.addTestSuite(XPathQueryTest.class); return suite; } 1.7 +7 -3 xml-xindice/java/tests/src/org/apache/xindice/integration/client/basic/CollectionTest.java Index: CollectionTest.java =================================================================== RCS file: /home/cvs/xml-xindice/java/tests/src/org/apache/xindice/integration/client/basic/CollectionTest.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- CollectionTest.java 14 Jul 2003 21:26:11 -0000 1.6 +++ CollectionTest.java 4 Aug 2003 03:01:57 -0000 1.7 @@ -227,11 +227,15 @@ assertEquals("testing", parent.getName()); parent = parent.getParentCollection(); + + // is this assertion correct? The xml rpc driver exposes the "db" collection + // the embeded doesn't. I think the xmlrpc driver is correct, and the test + // is wrong, just looking for someone to confirm this. assertNull(parent); this.client.dropCollection(TEST_COLLECTION_PATH, "childcol"); } - + public void testGetCollectionUnknown() throws Exception { assertNull(this.client.getCollection(TEST_COLLECTION_PATH + "/unknown")); } 1.17 +21 -18 xml-xindice/java/src/org/apache/xindice/client/xmldb/DatabaseImpl.java Index: DatabaseImpl.java =================================================================== RCS file: /home/cvs/xml-xindice/java/src/org/apache/xindice/client/xmldb/DatabaseImpl.java,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- DatabaseImpl.java 1 Aug 2003 19:40:16 -0000 1.16 +++ DatabaseImpl.java 4 Aug 2003 03:01:57 -0000 1.17 @@ -58,11 +58,9 @@ * * $Id$ */ - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.xindice.client.xmldb.managed.ManagedDatabaseImpl; - import org.xmldb.api.base.Database; import org.xmldb.api.base.ErrorCodes; import org.xmldb.api.base.XMLDBException; @@ -101,7 +99,7 @@ public static String INSTANCE_NAME = "xindice, xindice-embed, xindice-managed"; /** - * The XML:DB API Core Level Conformance of this implementation. + * The XML:DB API Core Level Conformance of this implementation. */ public static String CONFORMANCE_LEVEL = "0"; @@ -186,22 +184,19 @@ * @see #getCollection for a description of the URI's format */ public boolean acceptsURI(String uri) throws XMLDBException { - if (uri == null || uri.equals("")) { - return false; - } - - createDriver(uri); - if (driver == null) { - return false; - } else { + if (uri != null && uri.length() > 0 && knownPrefix(uri)) { + // ensure the driver is initialised + createDriver(uri); return driver.acceptsURI(uri); } + + return false; } protected void createDriver(String uri) throws XMLDBException { // Determine which driver was requested. - try { - if (driver == null) { + if (driver == null) { + try { if (uri.startsWith(XMLRPC_URI)) { /* * The only way that a particular instance of xmlrpc.DatabaseImpl @@ -216,13 +211,21 @@ driver = new org.apache.xindice.client.xmldb.embed.DatabaseImpl(); } else if (uri.startsWith(MANAGED_URI)) { driver = new ManagedDatabaseImpl(); - } else { - throw new XMLDBException(ErrorCodes.INVALID_URI, uri); } + } catch (Exception e) { + log.error("Exception during creation of the Database", e); + throw new XMLDBException(ErrorCodes.INVALID_URI, uri, e); + } + + // moved to avoid double catching a creation exception + if (null == driver) { + log.warn("The uri '" + uri + "' is not handled be xindice"); + throw new XMLDBException(ErrorCodes.INVALID_URI, uri); } - } catch (Exception e) { - log.info("Exception during creation of the Database", e); - throw new XMLDBException(ErrorCodes.INVALID_URI, uri, e); } + } + + protected boolean knownPrefix(String uri) { + return (uri.startsWith(XMLRPC_URI) || (uri.startsWith(EMBED_URI)) || uri.startsWith(MANAGED_URI)); } } 1.9 +171 -165 xml-xindice/java/src/org/apache/xindice/client/xmldb/ResourceSetImpl.java Index: ResourceSetImpl.java =================================================================== RCS file: /home/cvs/xml-xindice/java/src/org/apache/xindice/client/xmldb/ResourceSetImpl.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- ResourceSetImpl.java 1 Aug 2003 19:40:16 -0000 1.8 +++ ResourceSetImpl.java 4 Aug 2003 03:01:57 -0000 1.9 @@ -66,10 +66,7 @@ import org.apache.xindice.xml.dom.DOMCompressor; import org.apache.xindice.xml.dom.DocumentImpl; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; +import org.w3c.dom.*; import org.xmldb.api.base.ErrorCodes; import org.xmldb.api.base.Resource; import org.xmldb.api.base.ResourceIterator; @@ -86,171 +83,180 @@ * or other operation. */ public class ResourceSetImpl implements ResourceSet { - public static final String RESOURCE_SET_NS = - "http://www.xmldb.org/xapi/ResourceSet"; - protected List resources = null; - protected org.xmldb.api.base.Collection collection = null; - - private SymbolTable symbols = null; - private byte[] bytes = null; - - public ResourceSetImpl(org.xmldb.api.base.Collection collection, - Document doc) throws XMLDBException { - this.collection = collection; - - if (doc != null) { - initResources(doc); - } else { - resources = Collections.synchronizedList(new ArrayList()); - } - } - - public ResourceSetImpl(org.xmldb.api.base.Collection collection, - SymbolTable symbols, byte[] bytes) throws XMLDBException { - this.collection = collection; - this.symbols = symbols; - this.bytes = bytes; - - initResources(new DocumentImpl(bytes, symbols, null)); - } - - protected void initResources(Document document) throws XMLDBException { - NodeList nodes = document.getDocumentElement().getChildNodes(); - this.resources = - Collections.synchronizedList(new ArrayList(nodes.getLength())); - - int i = 0; - while (i < nodes.getLength()) { - try { - XMLResource resource; - Node n = nodes.item(i); - String documentId = ((Element) n).getAttributeNS( - NodeSource.SOURCE_NS, "key"); - - if (bytes != null) { - DocumentImpl doc = new DocumentImpl(); - doc.setSymbols(symbols); - doc.importNode(n, true); - doc.appendChild(n); - byte[] b = DOMCompressor.Compress(doc, symbols); - resource = new XMLResourceImpl(null, documentId, collection, - symbols, b); - } else { - resource = new XMLResourceImpl(null, documentId, collection, - TextWriter.toString(n)); - } - - i++; - resources.add(resource); - } catch (Exception e) { - throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e); + public static final String RESOURCE_SET_NS = + "http://www.xmldb.org/xapi/ResourceSet"; + protected List resources = null; + protected org.xmldb.api.base.Collection collection = null; + + private SymbolTable symbols = null; + private byte[] bytes = null; + + public ResourceSetImpl(org.xmldb.api.base.Collection collection, + Document doc) throws XMLDBException { + this.collection = collection; + + if ( doc != null ) { + initResources(doc); + } + else { + resources = Collections.synchronizedList(new ArrayList()); + } + } + + public ResourceSetImpl(org.xmldb.api.base.Collection collection, + SymbolTable symbols, byte[] bytes) throws XMLDBException { + this.collection = collection; + this.symbols = symbols; + this.bytes = bytes; + + initResources(new DocumentImpl(bytes, symbols, null)); + } + + protected void initResources(Document document) throws XMLDBException { + NodeList nodes = document.getDocumentElement().getChildNodes(); + this.resources = + Collections.synchronizedList(new ArrayList(nodes.getLength())); + + int i = 0; + while ( i < nodes.getLength() ) { + try { + XMLResource resource; + Node n = nodes.item(i); + + String documentId = null; + + if (n instanceof Element) + { + documentId = ((Element) n).getAttributeNS( + NodeSource.SOURCE_NS, "key"); + } + + if ( bytes != null ) { + DocumentImpl doc = new DocumentImpl(); + doc.setSymbols(symbols); + doc.importNode(n, true); + doc.appendChild(n); + byte[] b = DOMCompressor.Compress(doc, symbols); + resource = new XMLResourceImpl(null, documentId, collection, + symbols, b); + } + else { + resource = new XMLResourceImpl(null, documentId, collection, + TextWriter.toString(n)); } - } - } - - /** - * Returns an iterator over all <code>Resource</code> instances stored in - * the set. - * - * @return a ResourceIterator over all <code>Resource</code> instances in the - * set. - * @exception XMLDBException - */ - public ResourceIterator getIterator() throws XMLDBException { - return new ResourceIteratorImpl(resources); - } - - /** - * Returns the <code>Resource</code> instance stored at the index specified - * by <code>index</code>. - * - * @param index the index of the resource to retrieve. - * @return the <code>Resource</code> instance. - * @exception XMLDBException - */ - public Resource getResource(long index) throws XMLDBException { - return (XMLResource) resources.get((int) index); - } - - /** - * Returns the number of resources contained in the set. - * - * @return the number of <code>Resource</code> instances in the set. - * @exception XMLDBException - */ - public long getSize() throws XMLDBException { - return resources.size(); - } - - /** - * Adds a <code>Resource</code> instance to the set. - * - * @exception XMLDBException - */ - public void addResource(Resource res) throws XMLDBException { - resources.add(res); - } - - /** - * Removes all <code>Resource</code> instances from the set. - * - * @exception XMLDBException - */ - public void clear() throws XMLDBException { - resources.clear(); - } - - /** - * Removes the <code>Resource</code> located at <code>index</code> from the - * set. - * - * @param index The index of the <code>Resource</code> instance to remove. - * @exception XMLDBException - */ - public void removeResource(long index) throws XMLDBException { - resources.remove((int) index); - } - - /** - * Returns a <code>Resource</code> containing an XML representation of all - * resources stored in the set. - * - * @return A <code>Resource</code> instance containing an XML representation - * of all set members. - * @exception XMLDBException - */ - public Resource getMembersAsResource() throws XMLDBException { - // This impl works but it would be nice if we just got the result set from - // the server in this format instead of having to build it. Right now it's - // pretty innefficient - Document doc = new DocumentImpl(); - - Element set = doc.createElementNS(RESOURCE_SET_NS, "xapi:resourceSet"); - set.setAttributeNS(RESOURCE_SET_NS, "xapi:collectionURI", - "xmldb:xindice://" + ((XindiceCollection) collection).getCanonicalName()); - set.setAttribute("xmlns:xapi", RESOURCE_SET_NS); - doc.appendChild(set); - - int i = 0; - while (i < resources.size()) { - XMLResource res = (XMLResource) resources.get(i); - Element resource = doc.createElementNS(RESOURCE_SET_NS, - "xapi:resource"); - resource.setAttributeNS(RESOURCE_SET_NS, "xapi:documentID", - res.getDocumentId()); - - resource.appendChild(doc.importNode( - ((Document) res.getContentAsDOM()).getDocumentElement(), true)); - - set.appendChild(resource); i++; - } + resources.add(resource); + } + catch (Exception e) { + throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e); + } + } + } + + /** + * Returns an iterator over all <code>Resource</code> instances stored in + * the set. + * + * @return a ResourceIterator over all <code>Resource</code> instances in the + * set. + * @exception XMLDBException + */ + public ResourceIterator getIterator() throws XMLDBException { + return new ResourceIteratorImpl(resources); + } + + /** + * Returns the <code>Resource</code> instance stored at the index specified + * by <code>index</code>. + * + * @param index the index of the resource to retrieve. + * @return the <code>Resource</code> instance. + * @exception XMLDBException + */ + public Resource getResource(long index) throws XMLDBException { + return (XMLResource) resources.get((int) index); + } + + /** + * Returns the number of resources contained in the set. + * + * @return the number of <code>Resource</code> instances in the set. + * @exception XMLDBException + */ + public long getSize() throws XMLDBException { + return resources.size(); + } + + /** + * Adds a <code>Resource</code> instance to the set. + * + * @exception XMLDBException + */ + public void addResource(Resource res) throws XMLDBException { + resources.add(res); + } + + /** + * Removes all <code>Resource</code> instances from the set. + * + * @exception XMLDBException + */ + public void clear() throws XMLDBException { + resources.clear(); + } + + /** + * Removes the <code>Resource</code> located at <code>index</code> from the + * set. + * + * @param index The index of the <code>Resource</code> instance to remove. + * @exception XMLDBException + */ + public void removeResource(long index) throws XMLDBException { + resources.remove((int) index); + } + + /** + * Returns a <code>Resource</code> containing an XML representation of all + * resources stored in the set. + * + * @return A <code>Resource</code> instance containing an XML representation + * of all set members. + * @exception XMLDBException + */ + public Resource getMembersAsResource() throws XMLDBException { + // This impl works but it would be nice if we just got the result set from + // the server in this format instead of having to build it. Right now it's + // pretty innefficient + Document doc = new DocumentImpl(); + + Element set = doc.createElementNS(RESOURCE_SET_NS, "xapi:resourceSet"); + set.setAttributeNS(RESOURCE_SET_NS, "xapi:collectionURI", + "xmldb:xindice://" + ((XindiceCollection) collection).getCanonicalName()); + set.setAttribute("xmlns:xapi", RESOURCE_SET_NS); + doc.appendChild(set); + + int i = 0; + while ( i < resources.size() ) { + XMLResource res = (XMLResource) resources.get(i); + Element resource = doc.createElementNS(RESOURCE_SET_NS, + "xapi:resource"); + resource.setAttributeNS(RESOURCE_SET_NS, "xapi:documentID", + res.getDocumentId()); + + resource.appendChild(doc.importNode( + ((Document) res.getContentAsDOM()).getDocumentElement(), true)); + + set.appendChild(resource); + + i++; + } - XMLResource result = new XMLResourceImpl(null, null, - collection, TextWriter.toString(doc)); + XMLResource result = new XMLResourceImpl(null, null, + collection, TextWriter.toString(doc)); - return result; - } + return result; + } } 1.6 +6 -4 xml-xindice/java/tests/src/org/apache/xindice/IntegrationXmlRpcTests.java Index: IntegrationXmlRpcTests.java =================================================================== RCS file: /home/cvs/xml-xindice/java/tests/src/org/apache/xindice/IntegrationXmlRpcTests.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- IntegrationXmlRpcTests.java 14 Jul 2003 21:25:46 -0000 1.5 +++ IntegrationXmlRpcTests.java 4 Aug 2003 03:01:57 -0000 1.6 @@ -92,7 +92,7 @@ public static Test suite() throws Exception { String url = "xmldb:xindice://"; - String hostport = System.getProperty("test.xmlrpc.hostport"); + String hostport = System.getProperty("test.xmlrpc.hostport", "localhost:8888"); if (hostport != null) { url = url + hostport; } @@ -101,7 +101,8 @@ private Database database; public void setUp() throws Exception { - String driver = "org.apache.xindice.client.xmldb.DatabaseImpl"; + String driver = "org.apache.xindice.client.xmldb.xmlrpc.DatabaseImpl"; + //String driver = "org.apache.xindice.client.xmldb.DatabaseImpl"; Class cls = Class.forName(driver); database = (Database) cls.newInstance(); @@ -113,6 +114,7 @@ if (xmlrpcDriver != null) { database.setProperty("xmlrpc-driver", xmlrpcDriver); } + DatabaseManager.registerDatabase(database); } 1.5 +5 -4 xml-xindice/java/src/org/apache/xindice/server/rpc/messages/RemoveCollection.java Index: RemoveCollection.java =================================================================== RCS file: /home/cvs/xml-xindice/java/src/org/apache/xindice/server/rpc/messages/RemoveCollection.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- RemoveCollection.java 1 Aug 2003 19:40:20 -0000 1.4 +++ RemoveCollection.java 4 Aug 2003 03:01:57 -0000 1.5 @@ -76,15 +76,16 @@ throw new Exception(MISSING_COLLECTION_PARAM); } - if (!message.containsKey(NAME)) { + final String childName= (String) message.get(NAME); + if (null == childName || childName.length() == 0) + { throw new Exception(MISSING_NAME_PARAM); } Hashtable result = new Hashtable(); try { - - Collection col = getCollection((String) message.get(COLLECTION) - + "/" + (String) message.get(NAME)); + + Collection col = getCollection((String) message.get(COLLECTION) + "/" + childName); col.dropCollection(col); result.put(RESULT, "yes"); 1.19 +540 -539 xml-xindice/java/src/org/apache/xindice/tools/XMLTools.java Index: XMLTools.java =================================================================== RCS file: /home/cvs/xml-xindice/java/src/org/apache/xindice/tools/XMLTools.java,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- XMLTools.java 1 Aug 2003 19:40:20 -0000 1.18 +++ XMLTools.java 4 Aug 2003 03:01:57 -0000 1.19 @@ -59,6 +59,12 @@ * $Id$ */ +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.util.Hashtable; +import java.util.NoSuchElementException; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.xindice.client.xmldb.DatabaseImpl; @@ -71,16 +77,11 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; + import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Database; import org.xmldb.api.base.XMLDBException; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.util.Hashtable; -import java.util.NoSuchElementException; - /** * XMLAdmin is designed to take command line arguments and give @@ -110,519 +111,519 @@ public static final String NAMESPACES = "namespaces"; public static final String IMPL_CLASS = "implClass"; - private static Log log = LogFactory.getLog("org.apache.xindice.XMLTools"); - - private Hashtable table; - protected String location = null; - private boolean initialized = false; - private static boolean verbose = false; - - public static void main(String[] args) { - try { - new XMLTools().process(args); - } catch (Exception e) { - System.out.println(e.getMessage()); - if (verbose == true) { - e.printStackTrace(System.err); - } - } - } - - /** Constructor for XMLTools, includes default variables for the command line - */ - public XMLTools() { - table = new Hashtable(); - // defaults for command switches - table.put(FILE_PATH, ""); - table.put(EXTENSION, ""); - table.put(QUERY, ""); - table.put(AUTO_KEY, ""); - table.put(VERBOSE, "false"); - } - - protected void initCommandsList() { - // Get all user elements - NodeList list = getCommandsDocument().getElementsByTagName("user"); - - if (list.getLength() > 0) { - // Retrieve the index of the first element (<user>) - Element node = (Element) list.item(0); - // get all command children from the user element - list = node.getElementsByTagName("command"); - } + private static Log log = LogFactory.getLog("org.apache.xindice.XMLTools"); - // Return the list generated - commandsList = list; - } - - /** Return true if this class has admin access - */ - public boolean isAdmin() { - return false; - } - - /** + private Hashtable table; + protected String location = null; + private boolean initialized = false; + private static boolean verbose = false; + + public static void main(String[] args) { + try { + new XMLTools().process(args); + } + catch (Exception e) { + System.out.println(e.getMessage()); + if (verbose == true) { + e.printStackTrace(System.err); + } + } + } + + /** Constructor for XMLTools, includes default variables for the command line + */ + public XMLTools() { + table = new Hashtable(); + // defaults for command switches + table.put( FILE_PATH, "" ); + table.put( EXTENSION, "" ); + table.put( QUERY, "" ); + table.put( AUTO_KEY, "" ); + table.put( VERBOSE, "false" ); + } + + protected void initCommandsList() { + // Get all user elements + NodeList list = getCommandsDocument().getElementsByTagName("user"); + + if ( list.getLength() > 0 ) { + // Retrieve the index of the first element (<user>) + Element node = (Element) list.item(0); + // get all command children from the user element + list = node.getElementsByTagName( "command" ); + } + + // Return the list generated + commandsList = list; + } + + /** Return true if this class has admin access + */ + public boolean isAdmin() { + return false; + } + + /** * Carries out necessary initialization of this class. **/ public void init() throws XindiceException, FileNotFoundException { - if (!initialized) { - initCommandsDocument(); - initCommandsList(); - initialized = true; - } + if ( !initialized ) { + initCommandsDocument(); + initCommandsList(); + initialized = true; + } } - /** * Carries out the initialization of the Commands Document. **/ protected void initCommandsDocument() throws XindiceException, FileNotFoundException { - // Absolute path to the commands.xml file, relative to $XINDICE_HOME - File xindiceHome = new File(System.getProperty(Xindice.PROP_XINDICE_HOME)); - File commandsFile = new File(xindiceHome, "config/commands.xml"); + // Absolute path to the commands.xml file, relative to $XINDICE_HOME + File xindiceHome = new File( System.getProperty( Xindice.PROP_XINDICE_HOME, "." ) ); + File commandsFile = new File( xindiceHome, "config/commands.xml" ); - commandsDocument = DOMParser.toDocument(new FileInputStream(commandsFile)); + commandsDocument = DOMParser.toDocument( new FileInputStream( commandsFile ) ); } private Document commandsDocument = null; - /** * Returns the Commands Document use for configuration. **/ protected Document getCommandsDocument() { - return commandsDocument; + return commandsDocument; } protected NodeList commandsList = null; - /** * Returns the <command> elements from the Commands Document this * tool can execute. **/ protected NodeList getCommands() { - return commandsList; + return commandsList; } - /** - * The Process function is designed for the implementation of the - * command line tools, as well as, making the command line easier - * to use. - **/ - public void process(String[] args) throws XindiceException, Exception { - try { - init(); - parseArguments(args); + /** + * The Process function is designed for the implementation of the + * command line tools, as well as, making the command line easier + * to use. + **/ + public void process(String[] args) throws XindiceException, Exception { + try { + init(); + parseArguments(args); - if (!execute()) { - printHelp(); - } - } catch (IllegalArgumentException e) { + if ( !execute() ) { printHelp(); - throw new XindiceException("ERROR : " + e.getMessage(), e); - } catch (NoSuchElementException e) { - throw new NoSuchElementException("ERROR : " + e + " Switch found. Parameter missing."); - } catch (NullPointerException e) { - e.printStackTrace(System.err); - throw new NullPointerException("ERROR : " + e); - } catch (Exception e) { - e.printStackTrace(System.err); - throw new XindiceException("ERROR : " + e.getMessage(), e); - } - } - - /** - * Parses and validated the arguments of the command line. The arguments are - * stored into the <tt>table</tt> array. - * - * @exception IllegalArgumentException if an error is found - */ - protected void parseArguments(String[] args) - throws IllegalArgumentException { - // parsing arguments for the command tools - ArgTokenizer at = new ArgTokenizer(args); - - if (!at.hasMoreTokens()) { - throw new IllegalArgumentException("No argument found"); - } - - // Action should always be the second token, if not there show help - table.put(ACTION, at.nextToken()); - - // Loop over remaining command line arguments, populating hashtable - while (at.hasMoreTokens()) { - String token = at.nextToken(); - - if (token.equalsIgnoreCase("-c") || token.equalsIgnoreCase("--collection")) { - String colname = at.nextSwitchToken(); - if (!colname.startsWith("/") && - !colname.startsWith("xmldb:xindice")) { - throw new IllegalArgumentException("The name of a collection must start with '/'"); - } - table.put(COLLECTION, colname); - } else if (token.equalsIgnoreCase("-e") || token.equalsIgnoreCase("--extension")) { - table.put(EXTENSION, at.nextSwitchToken()); - } else if (token.equalsIgnoreCase("-f") || token.equalsIgnoreCase("--filepath")) { - table.put(FILE_PATH, at.nextSwitchToken()); - } else if (token.equalsIgnoreCase("-h") || token.equalsIgnoreCase("--help")) { - table.put(ACTION, "help"); - } else if (token.equalsIgnoreCase("-n") || token.equalsIgnoreCase("--nameOf")) { - table.put(NAME_OF, at.nextSwitchToken()); - } else if (token.equalsIgnoreCase("-p") || token.equalsIgnoreCase("--pattern")) { - table.put(PATTERN, at.nextSwitchToken()); - } else if (token.equalsIgnoreCase("-q") || token.equalsIgnoreCase("--query")) { - table.put(QUERY, at.nextSwitchToken()); - } else if (token.equalsIgnoreCase("-u") || token.equalsIgnoreCase("--uri")) { - table.put(URI, at.nextSwitchToken()); - } else if (token.equalsIgnoreCase("-v") || token.equalsIgnoreCase("--verbose")) { - table.put(VERBOSE, "true"); - } else if (token.equalsIgnoreCase("-l") || token.equalsIgnoreCase("--localdb")) { - table.put(LOCAL, "true"); - } else if (token.equalsIgnoreCase("-d") || token.equalsIgnoreCase("--dbconfig")) { - String configFile = at.nextSwitchToken(); - if (!new File(configFile).isAbsolute()) { - configFile = new File(System.getProperty("user.dir"), configFile).getAbsolutePath(); - } - System.setProperty(Xindice.PROP_XINDICE_CONFIGURATION, configFile); - table.put(DB_CONFIG, configFile); - } else if (token.equalsIgnoreCase("-s") || token.equalsIgnoreCase("--namespaces")) { - table.put(NAMESPACES, at.nextSwitchToken()); - // Index specific options - } else if (token.equalsIgnoreCase("-t") || token.equalsIgnoreCase("--type")) { - table.put(TYPE, at.nextSwitchToken()); - } else if (token.equalsIgnoreCase("+trim")) { - if (!table.containsKey(TYPE)) { - table.put(TYPE, "trimmed"); - } - } else if (token.equalsIgnoreCase("-trim")) { - if (!table.containsKey(TYPE)) { - table.put(TYPE, "string"); - } - } else if (token.equalsIgnoreCase("--pagesize")) { - table.put(PAGE_SIZE, at.nextSwitchToken()); - } else if (token.equalsIgnoreCase("--maxkeysize")) { - table.put(MAX_KEY_SIZE, at.nextSwitchToken()); + } + } catch (IllegalArgumentException e) { + printHelp(); + throw new XindiceException("ERROR : " + e.getMessage(), e); + } catch (NoSuchElementException e) { + throw new NoSuchElementException("ERROR : " + e + " Switch found. Parameter missing."); + } catch (NullPointerException e) { + e.printStackTrace(System.err); + throw new NullPointerException("ERROR : " + e); + } catch (Exception e) { + e.printStackTrace(System.err); + throw new XindiceException("ERROR : " + e.getMessage(), e); + } + } + + /** + * Parses and validated the arguments of the command line. The arguments are + * stored into the <tt>table</tt> array. + * + * @exception IllegalArgumentException if an error is found + */ + protected void parseArguments(String[] args) + throws IllegalArgumentException { + // parsing arguments for the command tools + ArgTokenizer at = new ArgTokenizer(args); + + if ( !at.hasMoreTokens() ) { + throw new IllegalArgumentException("No argument found"); + } + + // Action should always be the second token, if not there show help + table.put( ACTION , at.nextToken() ); + + // Loop over remaining command line arguments, populating hashtable + while ( at.hasMoreTokens() ) { + String token = at.nextToken(); + + if ( token.equalsIgnoreCase( "-c" ) || token.equalsIgnoreCase( "--collection" ) ) { + String colname = at.nextSwitchToken(); + if ( !colname.startsWith( "/" ) && + !colname.startsWith( "xmldb:xindice" ) ) { + throw new IllegalArgumentException( "The name of a collection must start with '/'" ); } - } // End of while loop - } + table.put( COLLECTION, colname ); + } else if ( token.equalsIgnoreCase("-e") || token.equalsIgnoreCase("--extension") ) { + table.put( EXTENSION, at.nextSwitchToken()); + } else if ( token.equalsIgnoreCase("-f") || token.equalsIgnoreCase("--filepath") ) { + table.put( FILE_PATH, at.nextSwitchToken()); + } else if ( token.equalsIgnoreCase("-h") || token.equalsIgnoreCase("--help") ) { + table.put( ACTION, "help"); + } else if ( token.equalsIgnoreCase("-n") || token.equalsIgnoreCase("--nameOf") ) { + table.put( NAME_OF, at.nextSwitchToken()); + } else if ( token.equalsIgnoreCase("-p") || token.equalsIgnoreCase("--pattern") ) { + table.put( PATTERN, at.nextSwitchToken()); + } else if ( token.equalsIgnoreCase("-q") || token.equalsIgnoreCase("--query") ) { + table.put( QUERY, at.nextSwitchToken()); + } else if ( token.equalsIgnoreCase("-u") || token.equalsIgnoreCase("--uri") ) { + table.put( URI, at.nextSwitchToken()); + } else if ( token.equalsIgnoreCase("-v") || token.equalsIgnoreCase("--verbose") ) { + table.put( VERBOSE, "true"); + } else if ( token.equalsIgnoreCase("-l") || token.equalsIgnoreCase("--localdb") ) { + table.put( LOCAL, "true"); + } else if ( token.equalsIgnoreCase("-d") || token.equalsIgnoreCase("--dbconfig") ) { + String configFile = at.nextSwitchToken(); + if (!new File(configFile).isAbsolute()) { + configFile = new File(System.getProperty("user.dir"), configFile).getAbsolutePath(); + } + System.setProperty(Xindice.PROP_XINDICE_CONFIGURATION, configFile); + table.put(DB_CONFIG, configFile); + } else if ( token.equalsIgnoreCase("-s") || token.equalsIgnoreCase("--namespaces") ) { + table.put(NAMESPACES, at.nextSwitchToken()); + // Index specific options + } else if ( token.equalsIgnoreCase("-t") || token.equalsIgnoreCase("--type") ) { + table.put( TYPE, at.nextSwitchToken()); + } else if ( token.equalsIgnoreCase("+trim") ) { + if ( !table.containsKey( TYPE ) ) { + table.put( TYPE, "trimmed"); + } + } else if ( token.equalsIgnoreCase("-trim") ) { + if ( !table.containsKey( TYPE ) ) { + table.put( TYPE, "string"); + } + } else if ( token.equalsIgnoreCase("--pagesize") ) { + table.put( PAGE_SIZE, at.nextSwitchToken()); + } else if ( token.equalsIgnoreCase("--maxkeysize") ) { + table.put( MAX_KEY_SIZE, at.nextSwitchToken()); + } + } // End of while loop + } - /** + /** * This method is to carry out execution, after instance variables being setup by process( args ) **/ public boolean execute() throws ClassNotFoundException, InstantiationException, IllegalAccessException, Exception { - init(); - String action = (String) table.get(ACTION); + init(); + String action = (String) table.get( ACTION ); - // get command class name - String commandClass = null; - if (action != null) { - // search for the tool Class associated with the given action - NodeList commands = getCommands(); - for (int i = 0; i < commands.getLength(); i++) { - Element e = (Element) commands.item(i); - if (action.equals(e.getAttribute("switch")) || - action.equals(e.getAttribute("name"))) { - commandClass = e.getAttribute("class"); - } - } - } - - if (commandClass != null) { - try { - // register Xindice Database with xml:db - Database db = new DatabaseImpl(); - - DatabaseManager.registerDatabase(db); - - // execute command class - Command command = (Command) Class.forName(commandClass).newInstance(); - command.execute(table); - return true; - } catch (XMLDBException e) { - System.err.println("XMLDB Exception with code " + e.errorCode); - if (table.get(VERBOSE).equals("true")) { - e.printStackTrace(System.err); - } - return false; - } catch (Exception e) { - System.err.println("ERROR : " + e.getMessage()); - - if (table.get(VERBOSE).equals("true")) { - e.printStackTrace(System.err); - } - return false; + // get command class name + String commandClass = null; + if ( action != null ) { + // search for the tool Class associated with the given action + NodeList commands = getCommands(); + for ( int i = 0; i < commands.getLength(); i++ ) { + Element e = (Element) commands.item( i ); + if ( action.equals( e.getAttribute( "switch" ) ) || + action.equals( e.getAttribute( "name" ) ) ) { + commandClass = e.getAttribute( "class" ); + } + } + } + + if ( commandClass != null ) { + try { + // register Xindice Database with xml:db + Database db = new DatabaseImpl(); + + DatabaseManager.registerDatabase( db ); + + // execute command class + Command command = (Command)Class.forName( commandClass ).newInstance(); + command.execute( table ); + return true; + } catch (XMLDBException e) { + System.err.println( "XMLDB Exception with code " + e.errorCode ); + if (table.get(VERBOSE).equals("true")) { + e.printStackTrace(System.err); + } + return false; + } catch (Exception e) { + System.err.println("ERROR : " + e.getMessage() ); + + if (table.get(VERBOSE).equals("true")) { + e.printStackTrace(System.err); } - } - - return false; - } + return false; + } + } + + return false; + } + + + + public boolean handleOption(String option, ArgTokenizer at) { + return false; + } + + /** + * setAction sets the action type that will be passed to the command line. + * + * @param actionType The action value + */ + public void setAction(String actionType) { + table.put(XMLTools.ACTION, actionType); + } + + /** + * getAction returns the action type that will be passed to the command line + * tool. + * + * @return The action value + */ + public String getAction() { + return (String)table.get(XMLTools.ACTION); + } + + /** + * setCollectionName sets the collection name that will be passed + * to the command line. + * + * @param collectionName The collection value + */ + public void setCollectionName(String collectionName) { + table.put(COLLECTION, collectionName); + } + + /** + * getCollectionName returns the collection name that will be passed + * to the command line tool. + * + * @return The collection value + */ + public String getCollectionName() { + return (String)table.get(COLLECTION); + } + + /** + * setDocumentName sets the document that will be passed to the + * command line tool. + * + * @param documentName The docName value + */ + public void setDocumentName(String documentName) { + table.put(XMLTools.NAME_OF, documentName); + } + + /** + * getDocumentName returns the document that will be passed to the + * command line tool. + * + * @return The docName value + */ + public String getDocumentName() { + return (String)table.get(XMLTools.NAME_OF); + } + + /** + * setQuery sets the Query variable for Document Query from the command line. + * + * @param query - The query string + */ + public void setQuery(String query ) { + table.put(XMLTools.QUERY, query); + } + + /** + * getQuery returns the Query for Document passed to the command line tool. + */ + public String getQuery() { + return (String)table.get(XMLTools.QUERY); + } + + /** + * setName sets the name for XMLObjects passed to the command line tool. + * + * @param name The docName value + */ + public void setName(String name) { + table.put(XMLTools.NAME_OF, name); + } + + /** + * getName returns the name for XMLObjects that will be passed to the + * command line tool. + * + * @return The nameOf value + */ + public String getName() { + return (String)table.get(XMLTools.NAME_OF); + } + + /** + * setDatabaseServer sets the Database server name that will be + * passed to the command line tool. + * + * @param appName The dbServ value + */ + public void setDatabaseServer(String appName) { + table.put(XMLTools.DB_SERVER, appName); + } + + /** + * getDatabaseServer returns the Database server that will be + * passed to the command line tool. + * + * @return The dbServ value + */ + public String getDatabaseServer() { + return (String)table.get(XMLTools.DB_SERVER); + } + + /** + * setPort sets the port that will passed to the command line tool. + * + * @param portName The port value + */ + public void setPort(String portName) { + table.put(XMLTools.PORT, portName); + } + + /** + * getPort returns the port that will be passed to the command line tool. + * + * @return The port value + */ + public String getPort() { + return (String)table.get(XMLTools.PORT); + } + + /** + * setHost sets the host that will passed to the command line tool. + * + * @param hostName The host value + */ + public void setHost(String hostName) { + table.put(HOST, hostName); + } + + /** + * getPort returns the host that will be passed to the command line tool. + * + * @return The host value + */ + public String getHost() { + return (String)table.get(HOST); + } + + /** + * setFilePath sets the file path that will passed to the command line tool. + * + * @param fPath The filePath value + */ + public void setFilePath(String fPath) { + table.put(XMLTools.FILE_PATH, fPath); + } + + /** + * getFilePath returns the file path that will be passed to the command + * + * @return The filePath value + */ + public String getFilePath() { + return (String)table.get(XMLTools.FILE_PATH); + } + + /** + * setURI sets the database URI (protocol://host:port/name) that + * will be passed to the command line + * + * @param URI The URI for the database + */ + public void setURI(String URI) { + table.put(XMLTools.URI, URI); + } + + /** + * getURI gets returns the database URI (protocol://host:port/name) + * that will be passed to the command line tool + * + * @return The URI for the database + */ + public String getURI() { + return (String)table.get(XMLTools.URI); + } + + /** + * setImplementClass sets the implemented class path that will be passed + * to the command line tool. + * + * @param imClassName The implClass value + */ + public void setImplementClass(String imClassName) { + table.put(XMLTools.IMPL_CLASS, imClassName); + } + + /** + * getImplementClass returns the implmented class path that will be passed + * to the command line tool. + * + * @return The implClass value + */ + public String getImplementClass() { + return (String)table.get(XMLTools.IMPL_CLASS); + } + + + /** + * The following Security methods are simply a starting point. User names and + * their related passwords will not be this simple. Until Encryption for + * Passwords are developed, and KeyStorage is set-up, this will do for now. + * In the future, these methods will change as needed to be more efficient + * for Xindice. + */ + + + /** + * setUser sets the user that will be passed to the command line tool and + * will be used in Security issues. + * + * @param userName The user value + */ + public void setUser(String userName) { + table.put(XMLTools.USER, userName); + } + + /** + * getUser returns the user that will be passed to the command line tool and + * will be used in Security issues. + * + * @return The user value + */ + public String getUser() { + return (String)table.get(XMLTools.USER); + } + + /** + * setPassword sets the password that will be passed to the command line tool + * and will be used in conjunction with the userName value. + * + * @param pswd The passwrd value + */ + public void setPassword(String pswd) { + table.put(PASSWORD, pswd); + } + + /** + * getPassword returns the password that will be passed to the command line + * tool and will be used in conjunction with the userName value. + * + * @return The password value + */ + public String getPassword() { + return (String)table.get(PASSWORD); + } - public boolean handleOption(String option, ArgTokenizer at) { - return false; - } - - /** - * setAction sets the action type that will be passed to the command line. - * - * @param actionType The action value - */ - public void setAction(String actionType) { - table.put(XMLTools.ACTION, actionType); - } - - /** - * getAction returns the action type that will be passed to the command line - * tool. - * - * @return The action value - */ - public String getAction() { - return (String) table.get(XMLTools.ACTION); - } - - /** - * setCollectionName sets the collection name that will be passed - * to the command line. - * - * @param collectionName The collection value - */ - public void setCollectionName(String collectionName) { - table.put(COLLECTION, collectionName); - } - - /** - * getCollectionName returns the collection name that will be passed - * to the command line tool. - * - * @return The collection value - */ - public String getCollectionName() { - return (String) table.get(COLLECTION); - } - - /** - * setDocumentName sets the document that will be passed to the - * command line tool. - * - * @param documentName The docName value - */ - public void setDocumentName(String documentName) { - table.put(XMLTools.NAME_OF, documentName); - } - - /** - * getDocumentName returns the document that will be passed to the - * command line tool. - * - * @return The docName value - */ - public String getDocumentName() { - return (String) table.get(XMLTools.NAME_OF); - } - - /** - * setQuery sets the Query variable for Document Query from the command line. - * - * @param query - The query string - */ - public void setQuery(String query) { - table.put(XMLTools.QUERY, query); - } - - /** - * getQuery returns the Query for Document passed to the command line tool. - */ - public String getQuery() { - return (String) table.get(XMLTools.QUERY); - } - - /** - * setName sets the name for XMLObjects passed to the command line tool. - * - * @param name The docName value - */ - public void setName(String name) { - table.put(XMLTools.NAME_OF, name); - } - - /** - * getName returns the name for XMLObjects that will be passed to the - * command line tool. - * - * @return The nameOf value - */ - public String getName() { - return (String) table.get(XMLTools.NAME_OF); - } - - /** - * setDatabaseServer sets the Database server name that will be - * passed to the command line tool. - * - * @param appName The dbServ value - */ - public void setDatabaseServer(String appName) { - table.put(XMLTools.DB_SERVER, appName); - } - - /** - * getDatabaseServer returns the Database server that will be - * passed to the command line tool. - * - * @return The dbServ value - */ - public String getDatabaseServer() { - return (String) table.get(XMLTools.DB_SERVER); - } - - /** - * setPort sets the port that will passed to the command line tool. - * - * @param portName The port value - */ - public void setPort(String portName) { - table.put(XMLTools.PORT, portName); - } - - /** - * getPort returns the port that will be passed to the command line tool. - * - * @return The port value - */ - public String getPort() { - return (String) table.get(XMLTools.PORT); - } - - /** - * setHost sets the host that will passed to the command line tool. - * - * @param hostName The host value - */ - public void setHost(String hostName) { - table.put(HOST, hostName); - } - - /** - * getPort returns the host that will be passed to the command line tool. - * - * @return The host value - */ - public String getHost() { - return (String) table.get(HOST); - } - - /** - * setFilePath sets the file path that will passed to the command line tool. - * - * @param fPath The filePath value - */ - public void setFilePath(String fPath) { - table.put(XMLTools.FILE_PATH, fPath); - } - - /** - * getFilePath returns the file path that will be passed to the command - * - * @return The filePath value - */ - public String getFilePath() { - return (String) table.get(XMLTools.FILE_PATH); - } - - /** - * setURI sets the database URI (protocol://host:port/name) that - * will be passed to the command line - * - * @param URI The URI for the database - */ - public void setURI(String URI) { - table.put(XMLTools.URI, URI); - } - - /** - * getURI gets returns the database URI (protocol://host:port/name) - * that will be passed to the command line tool - * - * @return The URI for the database - */ - public String getURI() { - return (String) table.get(XMLTools.URI); - } - - /** - * setImplementClass sets the implemented class path that will be passed - * to the command line tool. - * - * @param imClassName The implClass value - */ - public void setImplementClass(String imClassName) { - table.put(XMLTools.IMPL_CLASS, imClassName); - } - - /** - * getImplementClass returns the implmented class path that will be passed - * to the command line tool. - * - * @return The implClass value - */ - public String getImplementClass() { - return (String) table.get(XMLTools.IMPL_CLASS); - } - - - /** - * The following Security methods are simply a starting point. User names and - * their related passwords will not be this simple. Until Encryption for - * Passwords are developed, and KeyStorage is set-up, this will do for now. - * In the future, these methods will change as needed to be more efficient - * for Xindice. - */ - - - /** - * setUser sets the user that will be passed to the command line tool and - * will be used in Security issues. - * - * @param userName The user value - */ - public void setUser(String userName) { - table.put(XMLTools.USER, userName); - } - - /** - * getUser returns the user that will be passed to the command line tool and - * will be used in Security issues. - * - * @return The user value - */ - public String getUser() { - return (String) table.get(XMLTools.USER); - } - - /** - * setPassword sets the password that will be passed to the command line tool - * and will be used in conjunction with the userName value. - * - * @param pswd The passwrd value - */ - public void setPassword(String pswd) { - table.put(PASSWORD, pswd); - } - - /** - * getPassword returns the password that will be passed to the command line - * tool and will be used in conjunction with the userName value. - * - * @return The password value - */ - public String getPassword() { - return (String) table.get(PASSWORD); - } - public void printHelp() { - NodeList list = getCommands(); + NodeList list = getCommands(); // This method relies on two things to format the output for help // Method isAdmin() - Tells us if this is an admin instance, used to hide certain output @@ -635,66 +636,66 @@ // Show the header and switch commands - System.out.println(); - System.out.println("Xindice Command Tools v" + Xindice.Version); - System.out.println(); - System.out.println("Format: xindice action [switch] [parameter]"); - System.out.println(); - System.out.println("Where: [switch] implements:"); - System.out.println(" -c " + "Collection context (must always be specified)"); - System.out.println(" -e " + "File extension for multiple documents"); - System.out.println(" -f " + "File path for document retrieval and storage"); - System.out.println(" -n " + "Name"); - System.out.println(" -p " + "Index pattern"); - System.out.println(" -q " + "Query string"); - System.out.println(" -s " + "Semi-colon delimited list of namespaces for query in "); - System.out.println(" the form prefix=namespace-uri"); - System.out.println(" -l " + "Use a local database rather then going over the network."); - System.out.println(" Should be combined with -d to specify the configuration to use."); - System.out.println(" -d " + "Path to the database configuration to use for the local "); - System.out.println(" database. Only applies if -l is specified."); - System.out.println(" -t " + "Specify the data type in collection index"); - System.out.println(" -v " + "Verbose"); - System.out.println(" --pagesize " + "Page size for file pages (default: 4096)"); - System.out.println(" --maxkeysize " + "The maximum size for file keys (default: 0=none)"); - System.out.println(); - - System.out.println("\nActions:\n"); - System.out.println(" xindice [parameter], etc...\n"); - - // Show all elements with helpclass=document - - // Loop over the commands, printing test from description attribute - for (int i = 0; i < list.getLength(); i++) { - helpClass = ((Element) list.item(i)).getAttribute("helpclass"); - - if (helpClass.equals("document")) { - desc = ((Element) list.item(i)).getAttribute("description"); - cmdswitch = ((Element) list.item(i)).getAttribute("switch"); - System.out.println(" " + StringUtilities.leftJustify(cmdswitch, 13) + desc); - } - } - - // Loop over the commands, printing text from description attribute - for (int i = 0; i < list.getLength(); i++) { - helpClass = ((Element) list.item(i)).getAttribute("helpclass"); - - if (helpClass.equals("security")) { - desc = ((Element) list.item(i)).getAttribute("description"); - cmdswitch = ((Element) list.item(i)).getAttribute("switch"); - System.out.println(" " + StringUtilities.leftJustify(cmdswitch, 13) + desc); - } - } - - System.out.println("\nExamples:\n"); - - System.out.println(" xindice ad -c /db/test -f /tmp/xmldocument -n myxmldocument"); - System.out.println(" xindice dd -c /db/test -n myxmldocument"); - System.out.println(" xindice rd -c /db/test/ocs -f a:\\file.xml -n file.xml"); - System.out.println(" xindice xpath -c /db/test/ocs -q test"); - System.out.println(" xindice xpath -c /db/test -s a=http://somedomain.com/schema.xsd -q /a:foo"); - System.out.println(); - System.out.println("For more information, please read the Xindice - Tools Reference Guide"); - System.out.println(); - } + System.out.println(); + System.out.println("Xindice Command Tools v" + Xindice.Version); + System.out.println(); + System.out.println("Format: xindice action [switch] [parameter]"); + System.out.println(); + System.out.println("Where: [switch] implements:"); + System.out.println(" -c " + "Collection context (must always be specified)"); + System.out.println(" -e " + "File extension for multiple documents"); + System.out.println(" -f " + "File path for document retrieval and storage"); + System.out.println(" -n " + "Name"); + System.out.println(" -p " + "Index pattern"); + System.out.println(" -q " + "Query string"); + System.out.println(" -s " + "Semi-colon delimited list of namespaces for query in "); + System.out.println(" the form prefix=namespace-uri"); + System.out.println(" -l " + "Use a local database rather then going over the network."); + System.out.println(" Should be combined with -d to specify the configuration to use."); + System.out.println(" -d " + "Path to the database configuration to use for the local "); + System.out.println(" database. Only applies if -l is specified."); + System.out.println(" -t " + "Specify the data type in collection index"); + System.out.println(" -v " + "Verbose"); + System.out.println(" --pagesize " + "Page size for file pages (default: 4096)"); + System.out.println(" --maxkeysize " + "The maximum size for file keys (default: 0=none)"); + System.out.println(); + + System.out.println("\nActions:\n"); + System.out.println(" xindice [parameter], etc...\n"); + + // Show all elements with helpclass=document + + // Loop over the commands, printing test from description attribute + for (int i=0; i < list.getLength(); i++) { + helpClass = ((Element)list.item(i)).getAttribute("helpclass") ; + + if ( helpClass.equals("document") ) { + desc = ((Element)list.item(i)).getAttribute("description"); + cmdswitch = ((Element)list.item(i)).getAttribute("switch"); + System.out.println(" " + StringUtilities.leftJustify(cmdswitch, 13) + desc ); + } + } + + // Loop over the commands, printing text from description attribute + for (int i=0; i < list.getLength(); i++) { + helpClass = ((Element)list.item(i)).getAttribute("helpclass") ; + + if ( helpClass.equals("security") ) { + desc = ((Element)list.item(i)).getAttribute("description"); + cmdswitch = ((Element)list.item(i)).getAttribute("switch"); + System.out.println(" " + StringUtilities.leftJustify(cmdswitch, 13) + desc ); + } + } + + System.out.println("\nExamples:\n"); + + System.out.println(" xindice ad -c /db/test -f /tmp/xmldocument -n myxmldocument"); + System.out.println(" xindice dd -c /db/test -n myxmldocument"); + System.out.println(" xindice rd -c /db/test/ocs -f a:\\file.xml -n file.xml"); + System.out.println(" xindice xpath -c /db/test/ocs -q test"); + System.out.println(" xindice xpath -c /db/test -s a=http://somedomain.com/schema.xsd -q /a:foo"); + System.out.println(); + System.out.println("For more information, please read the Xindice - Tools Reference Guide"); + System.out.println(); + } }