[jdom-interest] suggested JDOM2 improvements

Leigh L Klotz Jr leigh.klotz at xerox.com
Fri Jan 20 14:58:43 PST 2012

On 01/20/2012 12:28 PM, Rolf Lear wrote:
> On the other hand, because XPathFactory instances are specified to be
> thread-safe, there is nothing stopping you from doing:
> public static final XPathFactory XPATH =
> XPathFactory.newInstance("com.example.xpath20.XPathFactory");
> Then in your code you can freely use:
> XPathCompiled<Object> xp = XPATH.compile("//*");
> ...
> The best practice would be for you to get your own instance of your own
> factory, then use that instance from wherever you need it.

I'd like to use a custom factory as you describe above, but right now, 
that makes all public methods on org.jdom2.xpath.XPath useless, because 
they use a static threadlocal factory which can only be the result of 
XPathFactory.newInstance(), which is the DEFAULTFACTORY from 
XPathFactory, which is settable only by the System property:

public abstract class XPath {

     private static final ThreadLocal<XPathFactory> localfactory =
             new ThreadLocal<XPathFactory>();

     public static List<?> selectNodes(final Object context, final 
String path)
             throws JDOMException {
         return newInstance(path).selectNodes(context);

     public static final XPath newInstance(final String path) throws 
JDOMException {
         XPathFactory fac = localfactory.get();
         if (fac == null) {
             fac = XPathFactory.newInstance();
         return fac.compile(path);

The reason I use a custom factory is to work around a performance 
problem with Jaxen: 
org.jaxen.saxpath.helpers.XPathReaderFactory.createReader() does an 
expensive synchronized System.getProperty() that causes concurrency 
bottlenecks, and it's done frequently, and there's no way to configure 
Jaxen or JDOM to use a specific implementation class rather than consult 
System.getProperty every time.

To fix this, I have to split apart a whole stack of factory code from 
JDOM and Jaxen, just in order to get at the createReader() method.

Another reason to use a custom XPath factory would be to use the JDOM 
API for XPath to get the work done with Saxon.

So, to summarize, my complaint is that if I want to use a custom XPath 
factory for whatever reason (and I've given two above), I cannot use any 
of the XPath public static methods.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.jdom.org/pipermail/jdom-interest/attachments/20120120/ad08e8ad/attachment.html>

More information about the jdom-interest mailing list