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:[EMAIL PROTECTED]">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:[EMAIL PROTECTED]">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;
+ }
+
}