RE: Issue Xpath-30: Reusing result sets

There are two other concerns regarding reuse that come to mind.  

The first concern is would be the potential surprise resource hit by keeping
a result set around for potential reuse.  Quite a few of the result sets
would have trivial costs to maintain for reuse (number values and the like)
and an application might try to do some caching of XPathResult for future
reuse.  However, a partially traversed iterator would keep the associated
document from going out of scope and could have an very high cost to
maintain in the cache.  This might suggest some sort of close()/detach()
method that would release any resources locked by the result set and would
cause most method calls to raise some type of invalid state exception.

The second concern is that allowing reuse makes it unsafe to provide access
to a result set that is part of the state of an object, since there is
nothing to prevent code that gets access to a result set from reusing it for
a totally random query.  Something like:

class Foo {
   private XPathResult snapshotOfBarElements;
   public XPathResult getBarElements() {
	return snapshotOfBarElements;
   }
   //
   //
   public double getTotalCost() {
	//   some iteration over bars
   }
}

XPathResult bars = myFoo.getBarElements();
//
//    this could really screw up the myFoo object
//
XPathResult count =
xpathEval.evaluate("count(*)",docelem,null,NUMBER_TYPE,bars);
//
//    likely to fail
double cost = myFoo.getTotalCost();


This could be addressed by providing a mechanism that where the application
can mark a XPathResult as not being reusable.  This might take the form of a
read/write boolean property (allowReuse for example) where trying to set the
value to true from false would be ignored.  So you could do

   public XPathResult getBarElements() {
	snapshotOfBarElements.setAllowReuse(false);
	return snapshotOfBarElements;
   }

And would not have the possibility for the caller to corrupt the state of
the object.

Received on Thursday, 28 March 2002 15:11:09 UTC