[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();
             localfactory.set(fac);
         }
         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.

Leigh.
-------------- 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