package org.docx4j.utils; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class XPathFactoryUtil { private static Logger log = LoggerFactory.getLogger(XPathFactoryUtil.class); private static XPathFactory xPathFactory; private static final String DTM_MANAGER_PROP_NAME = "org.apache.xml.dtm.DTMManager"; private static final String DTM_MANAGER_CLASS_NAME = "org.apache.xml.dtm.ref.DTMManagerDefault"; public static synchronized XPathFactory getXPathFactory() { if (xPathFactory==null) { xPathFactory = XPathFactory.newInstance(); log.info("xpath implementation: " + xPathFactory.getClass().getName()); // expect org.apache.xpath.jaxp.XPathFactoryImpl // See http://www.docx4java.org/forums/data-binding-java-f16/opendope-xpath-performance-t1696.html // System.setProperty(DTM_MANAGER_PROP_NAME, DTM_MANAGER_CLASS_NAME); } return xPathFactory; } public static XPath newXPath() { getXPathFactory(); synchronized(xPathFactory) { return xPathFactory.newXPath(); } } }