Hi,

we are having the problem in our application that an XPath query does not return all results that should be in it. Some debugging through the Jackrabbit internals showed us that the NodeIterator from the query result received the right UUIDs from the Lucene index, but then removed some of them from the list because the sorting of the results failed.

The situation is that we have some nodes in the results list where not all of the node's ancestors are accessible for the Session (blocked by our AccessManager). We receive a DocOrderNodeIteratorImpl from the query that contains these nodes, and this iterator tries to sort the nodes before the first method call that accesses them. The comparator then gets an AccessDeniedException from the getAncestor() of one of the nodes, and removes these nodes with unaccessable ancestors from the node list. It also looks like the Comparator directly removes both compared nodes from the result list if one of them throws an Exception when being compared.

Is this wanted behaviour, that nodes won't be returned by a query when they cannot be sorted? And is it generally supported in JackRabbit to have nodes whose ancestors are not accessible?

We could work around that by turning off the sorting of the nodes, we don't need sorted query results here. Is there a way to achieve this trough JCR or Jackrabbit API? We are currently doing this by accessing the private org.apache.jackrabbit.core.query.lucene.QueryImpl object from the query result through Java reflection, and then calling a setRespectDocumentOrder(false) on it. But maybe there is a nicer way (as probably almost any way would be nicer) to achieve the same result?

I will attach the XPath query and Exception stack trace from our log file.

Best regards and Thanks,

Jan


15:55:53,194 DEBUG [tcmdataaccess] QueryString is: //element(*, tcs:category) [fn:lower-case(@tcs:defaultContentType) = 'information'] /element(*, tcs:categorylocalization) [ @tcs:locview = 'pngo' and @tcs:loclanguage = 'de'] 15:56:41,836 ERROR [DocOrderNodeIteratorImpl] Exception while sorting nodes in document order: javax.jcr.AccessDeniedException: cannot read item 827cae10-ad2e-44ad-927f-a65e96e0d4f2 javax.jcr.AccessDeniedException: cannot read item 827cae10- ad2e-44ad-927f-a65e96e0d4f2
        at org.apache.jackrabbit.core.ItemManager.getItem(ItemManager.java:392)
        at org.apache.jackrabbit.core.ItemManager.getNode(ItemManager.java:350)
        at org.apache.jackrabbit.core.ItemImpl.getAncestor(ItemImpl.java:1403)
at org.apache.jackrabbit.core.query.lucene.DocOrderNodeIteratorImpl $1.compare(DocOrderNodeIteratorImpl.java:220)
        at java.util.Arrays.mergeSort(Arrays.java:1284)
        at java.util.Arrays.mergeSort(Arrays.java:1295)
        at java.util.Arrays.sort(Arrays.java:1223)
at org.apache.jackrabbit.core.query.lucene.DocOrderNodeIteratorImpl.initOrd eredIterator(DocOrderNodeIteratorImpl.java:172) at org.apache.jackrabbit.core.query.lucene.DocOrderNodeIteratorImpl.hasNext (DocOrderNodeIteratorImpl.java:131) at kontrast.toshiba.datastore.accessimpl.content.search.ContentSearchImpl.g etContentList(ContentSearchImpl.java:267) at kontrast.toshiba.datastore.accessimpl.content.search.ContentSearchImpl.f indContents(ContentSearchImpl.java:187) at kontrast.toshiba.datastore.accessimpl.content.search.ContentSearchImpl.p erformQuery(ContentSearchImpl.java:117) at kontrast.toshiba.datastore.accessimpl.content.search.ContentSearchImpl.g etResults(ContentSearchImpl.java:89)

Reply via email to