From: kruland2607 Date: Fri, 24 Aug 2012 02:49:43 +0000 (+0000) Subject: Implement a primitive cache for XMLReaders. Construction of them is pretty expensive... X-Git-Tag: upstream/12.09^2~26 X-Git-Url: https://git.gag.com/?p=debian%2Fopenrocket;a=commitdiff_plain;h=adc369bb66cb4c32cd043fc241b62a28f51f836c Implement a primitive cache for XMLReaders. Construction of them is pretty expensive so we cache at most 10 of them an reuse them. If more than 10 are needed at any given time, they will be created though not cached. git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@998 180e2498-e6e9-4542-8430-84ac67f01cd8 --- diff --git a/core/src/net/sf/openrocket/file/simplesax/SimpleSAX.java b/core/src/net/sf/openrocket/file/simplesax/SimpleSAX.java index ec17b775..6f9bc2eb 100644 --- a/core/src/net/sf/openrocket/file/simplesax/SimpleSAX.java +++ b/core/src/net/sf/openrocket/file/simplesax/SimpleSAX.java @@ -1,6 +1,8 @@ package net.sf.openrocket.file.simplesax; import java.io.IOException; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; import net.sf.openrocket.aerodynamics.WarningSet; @@ -23,7 +25,9 @@ import org.xml.sax.helpers.XMLReaderFactory; * @author Sampo Niskanen */ public class SimpleSAX { - + + static final XMLReaderCache cache = new XMLReaderCache(10); + /** * Read a simple XML file. * @@ -35,13 +39,35 @@ public class SimpleSAX { */ public static void readXML(InputSource source, ElementHandler initialHandler, WarningSet warnings) throws IOException, SAXException { - + DelegatorHandler xmlhandler = new DelegatorHandler(initialHandler, warnings); - - XMLReader reader = XMLReaderFactory.createXMLReader(); + + XMLReader reader = cache.createXMLReader(); reader.setContentHandler(xmlhandler); reader.setErrorHandler(xmlhandler); reader.parse(source); + cache.releaseXMLReader(reader); } - + + private static class XMLReaderCache { + + private final BlockingQueue queue; + private XMLReaderCache( int maxSize ) { + this.queue = new LinkedBlockingQueue(maxSize); + } + + private XMLReader createXMLReader() throws SAXException { + + XMLReader reader = queue.poll(); + if ( reader == null ) { + reader = XMLReaderFactory.createXMLReader(); + } + return reader; + } + + private void releaseXMLReader( XMLReader reader ) { + queue.offer( reader ); + } + } + }