I want to query a collection and then remove the documents found by the
query. I have something that works, but I had to go about it in a strange
way. I just want to confirm that there isn't a better way to do it. Here's
what I would have expected to work:
// spacedb is my Collecion and getQueryService is just a
// convenience function
ResourceSet resultSet = getQueryService(spacedb).query(xpath);
ResourceIterator results = resultSet.getIterator();
while (results.hasMoreResources()) {
Resource res = results.nextResource();
if (res instanceof XMLResource) {
// do some stuff with it if you want,
// then remove it...
spacedb.removeResource(res);
// this throws an exception!
}
Instead, I have to do something like this:
ResourceSet resultSet = getQueryService(spacedb).query(xpath);
ResourceIterator results = resultSet.getIterator();
while (results.hasMoreResources()) {
Resource res = results.nextResource();
if (res instanceof XMLResource) {
// do some stuff with it if you want,
// find the key (getId() doesn't work, apparently
// because Resources from ResourceSets are "anonymous"?)
try {
Node xmldoc = res.getContentAsDOM().getFirstChild();
NamedNodeMap attrs = xmldoc.getAttributes();
Node keyNode = attrs.getNamedItemNS(
"http://xml.apache.org/xindice/Query",
"key");
key = keyNode.getNodeValue();
}
catch (Exception e) {
//deal with any DOM exceptions
}
// now that we have the key, remove resource from collection
try {
Resource doc = spacedb.getResource(key);
if (doc != null) {
spacedb.removeResource(doc);
}
}
catch (Exception e) {
// etc.
}
}
}
Is this the easiest way? Or am I missing something fundamental. It seems to
me it shouldn't be this hard, but it was the only way I could get it to
work. Any enlightenment appreciated.
Cheers,
Vanessa