Implement a primitive cache for XMLReaders. Construction of them is pretty expensive...
authorkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Fri, 24 Aug 2012 02:49:43 +0000 (02:49 +0000)
committerkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Fri, 24 Aug 2012 02:49:43 +0000 (02:49 +0000)
git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@998 180e2498-e6e9-4542-8430-84ac67f01cd8

core/src/net/sf/openrocket/file/simplesax/SimpleSAX.java

index ec17b77514271200d5b23123dc3d4301a302b563..6f9bc2eb2b413d4bafbf7b7a93ff3e0ecd981b4f 100644 (file)
@@ -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 <sampo.niskanen@iki.fi>
  */
 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<XMLReader> queue;
+               private XMLReaderCache( int maxSize ) {
+                       this.queue = new LinkedBlockingQueue<XMLReader>(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 );
+               }
+       }
+
 }