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

Reply via email to