Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / 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 );
+               }
+       }
+
 }