]> source.dussan.org Git - poi.git/commitdiff
[bug-63240] make SAXHelper.newXMLReader non-synchronized]
authorPJ Fanning <fanningpj@apache.org>
Wed, 6 Mar 2019 19:17:22 +0000 (19:17 +0000)
committerPJ Fanning <fanningpj@apache.org>
Wed, 6 Mar 2019 19:17:22 +0000 (19:17 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1854941 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/ooxml/util/SAXHelper.java
src/ooxml/testcases/org/apache/poi/ooxml/util/TestDocumentHelper.java
src/ooxml/testcases/org/apache/poi/ooxml/util/TestSAXHelper.java

index 2ebd9f8141f2b3848ce74c9981781d5113c8bb31..c954b46ca1de9dcce9e42aa193cc2b7a01d573b0 100644 (file)
@@ -46,7 +46,7 @@ public final class SAXHelper {
     /**
      * Creates a new SAX XMLReader, with sensible defaults
      */
-    public static synchronized XMLReader newXMLReader() throws SAXException, ParserConfigurationException {
+    public static XMLReader newXMLReader() throws SAXException, ParserConfigurationException {
         XMLReader xmlReader = saxFactory.newSAXParser().getXMLReader();
         xmlReader.setEntityResolver(IGNORING_ENTITY_RESOLVER);
         trySetSAXFeature(xmlReader, XMLConstants.FEATURE_SECURE_PROCESSING);
index 9ffb78627a9c94e400a2833fd1d37b067348fc8b..eb8d28ba720145f8b77f351365ea9fea50ab5625 100644 (file)
@@ -18,11 +18,13 @@ package org.apache.poi.ooxml.util;
 
 import org.junit.Test;
 import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
 
 import javax.xml.XMLConstants;
 import javax.xml.parsers.DocumentBuilder;
 import java.io.ByteArrayInputStream;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 
@@ -47,10 +49,13 @@ public class TestDocumentHelper {
                 return DocumentHelper.newDocumentBuilder();
             }));
         }
+        HashSet<DocumentBuilder> dbs = new HashSet<>();
         for(CompletableFuture<DocumentBuilder> future : futures) {
             DocumentBuilder documentBuilder = future.get(10, TimeUnit.SECONDS);
             assertTrue(documentBuilder.isNamespaceAware());
+            dbs.add(documentBuilder);
         }
+        assertEquals(limit, dbs.size());
     }
 
     @Test
index 1036a68f01844fb939a68c6bf9821d9052eab894..4087f2515761ed74471b03a9b0a56836c290732d 100644 (file)
@@ -19,8 +19,13 @@ package org.apache.poi.ooxml.util;
 import static org.junit.Assert.*;
 
 import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
 
 import javax.xml.XMLConstants;
+import javax.xml.parsers.DocumentBuilder;
 
 import org.junit.Test;
 import org.xml.sax.InputSource;
@@ -46,4 +51,28 @@ public class TestSAXHelper {
         }
         reader.parse(new InputSource(new ByteArrayInputStream("<xml></xml>".getBytes("UTF-8"))));
     }
+
+    @Test
+    public void testCreatingManyXMLReaders() throws Exception {
+        int limit = 1000;
+        ArrayList<CompletableFuture<XMLReader>> futures = new ArrayList<>();
+        for(int i = 0; i < limit; i++) {
+            futures.add(CompletableFuture.supplyAsync(() -> {
+                try {
+                    return SAXHelper.newXMLReader();
+                } catch (RuntimeException e) {
+                    throw e;
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            }));
+        }
+        HashSet<XMLReader> readers = new HashSet<>();
+        for(CompletableFuture<XMLReader> future : futures) {
+            XMLReader reader = future.get(10, TimeUnit.SECONDS);
+            assertTrue(reader.getFeature(XMLConstants.FEATURE_SECURE_PROCESSING));
+            readers.add(reader);
+        }
+        assertEquals(limit, readers.size());
+    }
 }