vgritsenko 01/12/24 12:24:21
Modified: src/org/apache/cocoon/components/source XMLDBSource.java
Log:
- change URL query syntax to use #: xmldb:///path/to/collection/#/xpath
- add support to query single resources, not only collections
Revision Changes Path
1.5 +89 -75
xml-cocoon2/src/org/apache/cocoon/components/source/XMLDBSource.java
Index: XMLDBSource.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/org/apache/cocoon/components/source/XMLDBSource.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- XMLDBSource.java 2001/12/22 19:03:04 1.4
+++ XMLDBSource.java 2001/12/24 20:24:21 1.5
@@ -21,11 +21,11 @@
import org.apache.log.Logger;
import org.xmldb.api.DatabaseManager;
-import org.xmldb.api.base.Collection;
-import org.xmldb.api.base.Database;
-import org.xmldb.api.base.ErrorCodes;
-import org.xmldb.api.base.Resource;
-import org.xmldb.api.base.Service;
+import org.xmldb.api.base.Collection;
+import org.xmldb.api.base.Database;
+import org.xmldb.api.base.ErrorCodes;
+import org.xmldb.api.base.Resource;
+import org.xmldb.api.base.Service;
import org.xmldb.api.base.XMLDBException;
import org.xmldb.api.base.ResourceSet;
import org.xmldb.api.base.ResourceIterator;
@@ -50,7 +50,7 @@
*
* @author <a href="mailto:[EMAIL PROTECTED]">Gianugo Rabellino</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Vadim Gritsenko</a>
- * @version $Id: XMLDBSource.java,v 1.4 2001/12/22 19:03:04 gianugo Exp $
+ * @version $Id: XMLDBSource.java,v 1.5 2001/12/24 20:24:21 vgritsenko Exp $
*/
public class XMLDBSource extends AbstractSAXSource {
@@ -67,8 +67,8 @@
/** The requested URL */
protected String url;
- /** The URL parameters */
- protected String urlParameters = null;
+ /** The part of URL after # sign */
+ protected String query = null;
/** The System ID */
protected String systemId;
@@ -111,7 +111,7 @@
/**
* The constructor.
- *
+ *
* @param environment the Cocoon Environment.
* @param url the URL being queried.
* @param driver the XML:DB driver class name.
@@ -128,9 +128,9 @@
this.driver = driver;
- if ((start = url.indexOf('?')) != -1) {
+ if ((start = url.indexOf('#')) != -1) {
this.url = url.substring(0, start);
- this.urlParameters = url.substring(start + 1);
+ this.query = url.substring(start + 1);
} else {
this.url = url;
}
@@ -174,7 +174,7 @@
/**
* Stream SAX events to a given ContentHandler. If the requested
- * resource is a collection, build an XML view of it.
+ * resource is a collection, build an XML view of it.
*
*/
@@ -197,38 +197,41 @@
}
private void resourceToSAX(ContentHandler handler) throws SAXException,
ProcessingException {
-
- Collection collection;
- XMLResource xmlResource;
- String col = url.substring(0, url.lastIndexOf('/'));
- String res = url.substring(url.lastIndexOf('/') + 1);
+ final String col = url.substring(0, url.lastIndexOf('/'));
+ final String res = url.substring(url.lastIndexOf('/') + 1);
try {
- collection = DatabaseManager.getCollection(col);
+ Collection collection = DatabaseManager.getCollection(col);
if (collection == null) {
throw new ResourceNotFoundException("Document " + url + " not
found");
}
- xmlResource = (XMLResource) collection.getResource(res);
+ XMLResource xmlResource = (XMLResource) collection.getResource(res);
if (xmlResource == null) {
throw new ResourceNotFoundException("Document " + url + " not
found");
}
+
+ if (query != null) {
+ // Query resource
+ if (log.isDebugEnabled()) {
+ this.log.debug("Querying resource " + res + " from collection "
+ url + "; query= " + this.query);
+ }
- xmlResource.getContentAsSAX(handler);
+ queryToSAX(handler, collection, res);
+ } else {
+ // Return entire resource
+ if (log.isDebugEnabled()) {
+ this.log.debug("Obtaining resource " + res + " from collection
" + col);
+ }
+
+ xmlResource.getContentAsSAX(handler);
+ }
+
collection.close();
} catch (XMLDBException xde) {
-
throw new ProcessingException("Unable to fetch content: " +
xde.getMessage(), xde);
-
- } catch (NullPointerException npe) {
-
- this.log.error("The XML:DB driver raised an exception");
- this.log.error("probably the document was not found");
-
- throw new ProcessingException("Null pointer exception while " +
- "retrieving document : " + npe.getMessage());
}
}
@@ -243,63 +246,75 @@
" not found");
}
- if (urlParameters != null) {
- queryToSAX(handler, collection);
- return;
- }
+ if (query != null) {
+ // Query collection
+ if (log.isDebugEnabled()) {
+ this.log.debug("Querying collection " + url + "; query= " +
this.query);
+ }
- final String ncollections =
Integer.toString(collection.getChildCollectionCount());
- final String nresources =
Integer.toString(collection.getResourceCount());
- attributes.addAttribute("", RESOURCE_COUNT_ATTR,
- RESOURCE_COUNT_ATTR, "CDATA", nresources);
- attributes.addAttribute("", COLLECTION_COUNT_ATTR,
- COLLECTION_COUNT_ATTR, "CDATA", ncollections);
-// attributes.addAttribute("", COLLECTION_BASE_ATTR,
-// COLLECTION_BASE_ATTR, "CDATA", url);
+ queryToSAX(handler, collection, null);
+ } else {
+ // List collection
+ if (log.isDebugEnabled()) {
+ this.log.debug("Listing collection " + url);
+ }
- handler.startDocument();
- handler.startPrefixMapping(PREFIX, URI);
- handler.startElement(URI, COLLECTIONS, QCOLLECTIONS, attributes);
+ final String ncollections =
Integer.toString(collection.getChildCollectionCount());
+ final String nresources =
Integer.toString(collection.getResourceCount());
+ attributes.addAttribute("", RESOURCE_COUNT_ATTR,
+ RESOURCE_COUNT_ATTR, "CDATA", nresources);
+ attributes.addAttribute("", COLLECTION_COUNT_ATTR,
+ COLLECTION_COUNT_ATTR, "CDATA", ncollections);
+// attributes.addAttribute("", COLLECTION_BASE_ATTR,
+// COLLECTION_BASE_ATTR, "CDATA", url);
+
+ handler.startDocument();
+ handler.startPrefixMapping(PREFIX, URI);
+ handler.startElement(URI, COLLECTIONS, QCOLLECTIONS, attributes);
+
+ // Print child collections
+ String[] collections = collection.listChildCollections();
+ for (int i = 0; i < collections.length; i++) {
+ attributes.clear();
+ attributes.addAttribute("", NAME_ATTR, NAME_ATTR, CDATA,
collections[i]);
+ handler.startElement(URI, COLLECTION,
+ QCOLLECTION, attributes);
+ handler.endElement(URI, COLLECTION, COLLECTION);
+ }
- // Print child collections
- String[] collections = collection.listChildCollections();
- for (int i = 0; i < collections.length; i++) {
- attributes.clear();
- attributes.addAttribute("", NAME_ATTR, NAME_ATTR, CDATA,
collections[i]);
- handler.startElement(URI, COLLECTION,
- QCOLLECTION, attributes);
- handler.endElement(URI, COLLECTION, COLLECTION);
- }
+ // Print child resources
+ String[] resources = collection.listResources();
+ for (int i = 0; i < resources.length; i++) {
+ attributes.clear();
+ attributes.addAttribute("", NAME_ATTR, NAME_ATTR, CDATA,
resources[i]);
+ handler.startElement(URI, RESOURCE,
+ QRESOURCE, attributes);
+ handler.endElement(URI, RESOURCE, RESOURCE);
+ }
- // Print child resources
- String[] resources = collection.listResources();
- for (int i = 0; i < resources.length; i++) {
- attributes.clear();
- attributes.addAttribute("", NAME_ATTR, NAME_ATTR, CDATA,
resources[i]);
- handler.startElement(URI, RESOURCE,
- QRESOURCE, attributes);
- handler.endElement(URI, RESOURCE, RESOURCE);
+ handler.endElement(URI, COLLECTIONS, QCOLLECTIONS);
+ handler.endPrefixMapping(PREFIX);
+ handler.endDocument();
}
- handler.endElement(URI, COLLECTIONS, QCOLLECTIONS);
- handler.endPrefixMapping(PREFIX);
- handler.endDocument();
+ collection.close();
} catch (XMLDBException xde) {
this.log.error("Collection listing failed. " + xde.getMessage());
throw new SAXException("Collection listing failed. " +
xde.getMessage());
}
}
- public void queryToSAX(ContentHandler handler, Collection collection) throws
SAXException {
+ private void queryToSAX(ContentHandler handler, Collection collection, String
resource) throws SAXException {
AttributesImpl attributes = new AttributesImpl();
try {
XPathQueryService service =
(XPathQueryService) collection.getService("XPathQueryService",
"1.0");
- ResourceSet resultSet = service.query(urlParameters);
+ ResourceSet resultSet = (resource == null) ?
+ service.query(query) : service.queryResource(resource, query);
- attributes.addAttribute("", QUERY_ATTR, QUERY_ATTR, "CDATA",
urlParameters);
+ attributes.addAttribute("", QUERY_ATTR, QUERY_ATTR, "CDATA", query);
attributes.addAttribute("", RESULTS_COUNT_ATTR,
RESULTS_COUNT_ATTR, "CDATA",
Long.toString(resultSet.getSize()));
@@ -312,10 +327,10 @@
// Print search results
ResourceIterator results = resultSet.getIterator();
while (results.hasMoreResources()) {
- XMLResource resource = (XMLResource)results.nextResource();
+ XMLResource result = (XMLResource)results.nextResource();
- final String id = resource.getId();
- final String documentId = resource.getDocumentId();
+ final String id = result.getId();
+ final String documentId = result.getDocumentId();
attributes.clear();
if (id != null) {
@@ -328,7 +343,7 @@
}
handler.startElement(URI, RESULT, QRESULT, attributes);
- resource.getContentAsSAX(includeHandler);
+ result.getContentAsSAX(includeHandler);
handler.endElement(URI, RESULT, RESULT);
}
@@ -337,8 +352,8 @@
handler.endPrefixMapping(PREFIX);
handler.endDocument();
} catch (XMLDBException xde) {
- this.log.error("Collection query failed. " + xde.getMessage());
- throw new SAXException("Collection query failed. " + xde.getMessage());
+ this.log.error("Query failed. " + xde.getMessage());
+ throw new SAXException("Query failed. " + xde.getMessage());
}
}
@@ -347,11 +362,10 @@
this.log = null;
this.manager = null;
this.url = null;
- this.urlParameters = null;
+ this.query = null;
}
public String getSystemId() {
return url;
}
-
}
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]