You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xindice-dev@xml.apache.org by ke...@apache.org on 2003/07/10 23:45:17 UTC

cvs commit: xml-xindice/java/src/org/apache/xindice/client/xmldb/xmlrpc CollectionImpl.java DatabaseImpl.java

kevinross    2003/07/10 14:45:17

  Modified:    java/src/org/apache/xindice/client/xmldb/xmlrpc
                        CollectionImpl.java DatabaseImpl.java
  Log:
  formatting, organize imports
  
  Revision  Changes    Path
  1.22      +619 -635  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.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- CollectionImpl.java	30 May 2003 22:39:16 -0000	1.21
  +++ CollectionImpl.java	10 Jul 2003 21:45:17 -0000	1.22
  @@ -99,645 +99,629 @@
    * @author <a href="mailto:kstaken@xmldatabases.org">Kimbro Staken</a>
    */
   public class CollectionImpl extends XindiceCollection {
  -   /* path to XML-RPC service on database */
  -   private static String XINDICE_SERVICE_LOCATION = "/Xindice/";
  +	/* 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 + "/";
  +		}
  +		System.out.println("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) {
   
  -   /* 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 + "/";
  -        }
  -        System.out.println( "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 (Exception e) {
  +			throw new XMLDBException(ErrorCodes.INVALID_URI, e);
  +		}
  +		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 (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 (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 (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 (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 (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 (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 (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 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 (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 (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 (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 (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 (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 (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 (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 (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");
  -            }
  -        } catch (Exception e) {
  -            
  -            throw new XMLDBException(ErrorCodes.INVALID_COLLECTION,
  -                    "Cannot remove child collection", 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);
  -        }
  -     }
  +	/* 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 (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");
  +			}
  +		}
  +		catch (Exception e) {
  +
  +			throw new XMLDBException(ErrorCodes.INVALID_COLLECTION, "Cannot remove child collection", 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);
  +		}
  +	}
   
   }
  
  
  
  1.9       +138 -142  xml-xindice/java/src/org/apache/xindice/client/xmldb/xmlrpc/DatabaseImpl.java
  
  Index: DatabaseImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xindice/java/src/org/apache/xindice/client/xmldb/xmlrpc/DatabaseImpl.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- DatabaseImpl.java	30 May 2003 22:39:16 -0000	1.8
  +++ DatabaseImpl.java	10 Jul 2003 21:45:17 -0000	1.9
  @@ -74,147 +74,143 @@
    * @author <a href="mailto:james.bates@amplexor.com">James Bates</a>
    */
   public class DatabaseImpl extends CommonConfigurable implements Database {
  -    
  -    /* prefix used to denote XML:DB URI's that should use this driver */
  -    static String DRIVER_NAME = "xindice";
  -    
  -    /* XML:DB conformance level of this driver */
  -    private String CONFORMANCE_LEVEL = "0";
  -    
  -    /* Property name for the xml-rpc service location. */
  -    private static final String PROP_SERVICE_LOCATION = "service-location";
  -    
  -    /* Property name for the SAX parser xml-rpc will use. */
  -    private static final String PROP_XMLRPC_DRIVER = "xmlrpc-driver";
  -
  -    /**
  -     * Create a new DatabaseImpl object.
  -     */
  -    public DatabaseImpl() {
  -        super();
  -    }
  -    
  -    /**
  -     * Create a new DatabaseImpl object with a copy of the properties
  -     * from the DatabaseImpl parameter.
  -     * 
  -     * @param commonConfigurable from which the initial parameters for this
  -     *        DatabaseImpl object are copied.
  -     */
  -    public DatabaseImpl(CommonConfigurable commonConfigurable) {
  -        super(commonConfigurable);
  -    }
  -    
  -   /**
  -    * Determines whether this <code>Database</code> implementation  can handle
  -    * the URI. It should return true if the Database instance knows how to
  -    * handle the URI and false otherwise.
  -    *
  -    * @param uri the URI to check for.
  -    * @return true if the URI can be handled, false otherwise.
  -    * @exception XMLDBException with expected error codes.<br />
  -    *  <code>ErrorCodes.VENDOR_ERROR</code> for any vendor
  -    *  specific errors that occur.<br />
  -    *  <code>ErrroCodes.INVALID_URI</code> If the URI is not in a valid format. <br />
  -    */
  -    public boolean acceptsURI(String uri) throws XMLDBException {
  -
  -        return ((uri != null) && uri.startsWith(getName() + "://"));
  -    }
  -    
  -   /**
  -    * Retrieves a <code>Collection</code> instance based on the URI provided
  -    * in the <code>uri</code> parameter. The format of the URI is defined in the
  -    * documentation for DatabaseManager.getCollection().<p/>
  -    *
  -    * Authentication is handled via username and password however it is not
  -    * required that the database support authentication. Databases that do not
  -    * support authentication MUST ignore the
  -    * <code>username</code> and <code>password</code> if those provided are not
  -    * null.
  -    *
  -    * @param uri the URI to use to locate the collection.
  -    * @param password The password to use for authentication to the database or
  -    *    null if the database does not support authentication.
  -    * @return A <code>Collection</code> instance for the requested collection or
  -    *  null if the collection could not be found.
  -    * @return The <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>ErrroCodes.INVALID_URI</code> If the URI is not in a valid format. <br />
  -    *  <code>ErrroCodes.PERMISSION_DENIED</code> If the <code>username</code>
  -    *    and <code>password</code> were not accepted by the database.
  -    */
  -    public Collection getCollection(String uri, String userName, String password)
  -            throws XMLDBException {
  -                
  -        /* TODO: introduce authentication some day */
  -                
  -        if (!acceptsURI(uri)) {
  -            
  -            throw new XMLDBException(ErrorCodes.INVALID_URI);
  -        }
  -
  -        /* Chop off driver prefix, and '://' */
  -        uri = uri.substring(getName().length() + 3);
  -        
  -        /* Extract host name & port, if present */
  -        int firstSlash = uri.indexOf('/');
  -        if (firstSlash == -1) {
  -            
  -            throw new XMLDBException(ErrorCodes.INVALID_URI);
  -        }
  -        
  -        String hostPort = uri.substring(0, firstSlash);
  -        String collPath = uri.substring(firstSlash);
  -
  -        /* Absent host defaults to localhost and standard Xindice HTTP port */
  -        if (hostPort.equals("")) {
  -            hostPort = "127.0.0.1:8080";
  -        }
  -        
  +
  +	/* prefix used to denote XML:DB URI's that should use this driver */
  +	static String DRIVER_NAME = "xindice";
  +
  +	/* XML:DB conformance level of this driver */
  +	private String CONFORMANCE_LEVEL = "0";
  +
  +	/* Property name for the xml-rpc service location. */
  +	private static final String PROP_SERVICE_LOCATION = "service-location";
  +
  +	/* Property name for the SAX parser xml-rpc will use. */
  +	private static final String PROP_XMLRPC_DRIVER = "xmlrpc-driver";
  +
  +	/**
  +	 * Create a new DatabaseImpl object.
  +	 */
  +	public DatabaseImpl() {
  +		super();
  +	}
  +
  +	/**
  +	 * Create a new DatabaseImpl object with a copy of the properties
  +	 * from the DatabaseImpl parameter.
  +	 * 
  +	 * @param commonConfigurable from which the initial parameters for this
  +	 *        DatabaseImpl object are copied.
  +	 */
  +	public DatabaseImpl(CommonConfigurable commonConfigurable) {
  +		super(commonConfigurable);
  +	}
  +
  +	/**
  +	 * Determines whether this <code>Database</code> implementation  can handle
  +	 * the URI. It should return true if the Database instance knows how to
  +	 * handle the URI and false otherwise.
  +	 *
  +	 * @param uri the URI to check for.
  +	 * @return true if the URI can be handled, false otherwise.
  +	 * @exception XMLDBException with expected error codes.<br />
  +	 *  <code>ErrorCodes.VENDOR_ERROR</code> for any vendor
  +	 *  specific errors that occur.<br />
  +	 *  <code>ErrroCodes.INVALID_URI</code> If the URI is not in a valid format. <br />
  +	 */
  +	public boolean acceptsURI(String uri) throws XMLDBException {
  +
  +		return ((uri != null) && uri.startsWith(getName() + "://"));
  +	}
  +
  +	/**
  +	 * Retrieves a <code>Collection</code> instance based on the URI provided
  +	 * in the <code>uri</code> parameter. The format of the URI is defined in the
  +	 * documentation for DatabaseManager.getCollection().<p/>
  +	 *
  +	 * Authentication is handled via username and password however it is not
  +	 * required that the database support authentication. Databases that do not
  +	 * support authentication MUST ignore the
  +	 * <code>username</code> and <code>password</code> if those provided are not
  +	 * null.
  +	 *
  +	 * @param uri the URI to use to locate the collection.
  +	 * @param password The password to use for authentication to the database or
  +	 *    null if the database does not support authentication.
  +	 * @return A <code>Collection</code> instance for the requested collection or
  +	 *  null if the collection could not be found.
  +	 * @return The <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>ErrroCodes.INVALID_URI</code> If the URI is not in a valid format. <br />
  +	 *  <code>ErrroCodes.PERMISSION_DENIED</code> If the <code>username</code>
  +	 *    and <code>password</code> were not accepted by the database.
  +	 */
  +	public Collection getCollection(String uri, String userName, String password) throws XMLDBException {
  +
  +		/* TODO: introduce authentication some day */
  +		if (!acceptsURI(uri)) {
  +
  +			throw new XMLDBException(ErrorCodes.INVALID_URI);
  +		}
  +
  +		/* Chop off driver prefix, and '://' */
  +		uri = uri.substring(getName().length() + 3);
  +
  +		/* Extract host name & port, if present */
  +		int firstSlash = uri.indexOf('/');
  +		if (firstSlash == -1) {
  +
  +			throw new XMLDBException(ErrorCodes.INVALID_URI);
  +		}
  +
  +		String hostPort = uri.substring(0, firstSlash);
  +		String collPath = uri.substring(firstSlash);
  +
  +		/* Absent host defaults to localhost and standard Xindice HTTP port */
  +		if (hostPort.equals("")) {
  +			hostPort = "127.0.0.1:8080";
  +		}
  +
   		try {
  -            return new CollectionImpl(hostPort,
  -                this.getProperty(PROP_SERVICE_LOCATION),
  -                this.getProperty(PROP_XMLRPC_DRIVER),
  -                collPath);
  -        } catch(XMLDBException e) {
  -           if(e.errorCode == ErrorCodes.NO_SUCH_COLLECTION) {
  -              // per getCollection contract, return null if not found
  -              return null;
  -           }
  -		   throw e;
  +			return new CollectionImpl(hostPort, this.getProperty(PROP_SERVICE_LOCATION), this.getProperty(PROP_XMLRPC_DRIVER), collPath);
   		}
  -    }
  -    
  -    /**
  -     * Returns the prefix used in XML:DB to denote URI's that this driver can
  -     * handle.
  -     *
  -     * @return the prefix driver name
  -     * @exception XMLDBException with expected error codes.<br />
  -     *  <code>ErrorCodes.VENDOR_ERROR</code> for any vendor
  -     *  specific errors that occur.<br />
  -     */
  -    public String getName() throws XMLDBException {
  -
  -        return DRIVER_NAME;
  -    }
  -        
  -   /**
  -    * Returns the XML:DB API Conformance level for the implementation. This can
  -    * be used by client programs to determine what functionality is available to
  -    * them.
  -    *
  -    * @return the XML:DB API conformance level for this implementation.
  -    * @exception XMLDBException with expected error codes.<br />
  -    *  <code>ErrorCodes.VENDOR_ERROR</code> for any vendor
  -    *  specific errors that occur.<br />
  -    */
  -    public String getConformanceLevel() throws XMLDBException {
  -
  -        return CONFORMANCE_LEVEL;
  -    }
  -    
  +		catch (XMLDBException e) {
  +			if (e.errorCode == ErrorCodes.NO_SUCH_COLLECTION) {
  +				// per getCollection contract, return null if not found
  +				return null;
  +			}
  +			throw e;
  +		}
  +	}
  +
  +	/**
  +	 * Returns the prefix used in XML:DB to denote URI's that this driver can
  +	 * handle.
  +	 *
  +	 * @return the prefix driver name
  +	 * @exception XMLDBException with expected error codes.<br />
  +	 *  <code>ErrorCodes.VENDOR_ERROR</code> for any vendor
  +	 *  specific errors that occur.<br />
  +	 */
  +	public String getName() throws XMLDBException {
  +
  +		return DRIVER_NAME;
  +	}
  +
  +	/**
  +	 * Returns the XML:DB API Conformance level for the implementation. This can
  +	 * be used by client programs to determine what functionality is available to
  +	 * them.
  +	 *
  +	 * @return the XML:DB API conformance level for this implementation.
  +	 * @exception XMLDBException with expected error codes.<br />
  +	 *  <code>ErrorCodes.VENDOR_ERROR</code> for any vendor
  +	 *  specific errors that occur.<br />
  +	 */
  +	public String getConformanceLevel() throws XMLDBException {
  +
  +		return CONFORMANCE_LEVEL;
  +	}
  +
   }