package org.fcrepo.utilities.xml; import java.util.concurrent.locks.ReentrantLock; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.commons.pool.PoolableObjectFactory; public class PoolableDocumentBuilderFactory implements PoolableObjectFactory<DocumentBuilder> { private final DocumentBuilderFactory m_factory; private final ReentrantLock m_lock = new ReentrantLock(); public PoolableDocumentBuilderFactory(boolean namespaceAware, boolean ignoreComments) { m_factory = DocumentBuilderFactory.newInstance(); m_factory.setNamespaceAware(namespaceAware); m_factory.setIgnoringComments(ignoreComments); } @Override public void activateObject(DocumentBuilder object) throws Exception { object.reset(); } @Override public void destroyObject(DocumentBuilder object) throws Exception { // no-op } @Override public DocumentBuilder makeObject() throws ParserConfigurationException { m_lock.lock(); DocumentBuilder result = null; try { result = m_factory.newDocumentBuilder(); } finally { m_lock.unlock(); } return result; } @Override public void passivateObject(DocumentBuilder object) throws Exception { // no-op } @Override public boolean validateObject(DocumentBuilder object) { return true; } }