Skip to content

Instantly share code, notes, and snippets.

@linusfoldemo
Last active December 9, 2015 06:35
Show Gist options
  • Save linusfoldemo/1a3c7bc1d6ee46433245 to your computer and use it in GitHub Desktop.
Save linusfoldemo/1a3c7bc1d6ee46433245 to your computer and use it in GitHub Desktop.
Pooled SAXParser
withPooledSAXParser { SAXParser saxParser ->
def slurped = new XmlSlurper(saxParser).parseText(documentString);
}
package xmlparserpool
import org.apache.commons.pool.PoolableObjectFactory
import org.apache.commons.pool.impl.GenericObjectPool
import javax.xml.parsers.SAXParser
import javax.xml.parsers.SAXParserFactory
class XmlParserPool {
private final GenericObjectPool pool;
static XmlParserPool INSTANCE = new XmlParserPool(10);
private XmlParserPool(int maxActive) {
pool = new GenericObjectPool(new XmlParserPoolableObjectFactory(), maxActive,
GenericObjectPool.WHEN_EXHAUSTED_GROW, 0);
}
public SAXParser borrowObject() throws Exception {
return pool.borrowObject() as SAXParser;
}
public void returnObject(SAXParser obj) throws Exception {
pool.returnObject(obj);
}
static def withPooledSAXParser(Closure closure) {
SAXParser parser = INSTANCE.borrowObject()
try {
return closure.call(parser)
} finally {
if (null != parser) {
INSTANCE.returnObject(parser)
}
}
}
public static class XmlParserPoolableObjectFactory implements PoolableObjectFactory {
private SAXParserFactory parserFactory;
public XmlParserPoolableObjectFactory() {
parserFactory = SAXParserFactory.newInstance();
}
public Object makeObject() throws Exception {
return parserFactory.newSAXParser();
}
@Override
void destroyObject(final Object obj) throws Exception {
//noop
}
public boolean validateObject(Object obj) {
return true;
}
@Override
void activateObject(final Object obj) throws Exception {
//noop
}
@Override
void passivateObject(final Object obj) throws Exception {
//noop
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment