Author: fanningpj
Date: Fri May 15 07:36:27 2020
New Revision: 1877776

URL: http://svn.apache.org/viewvc?rev=1877776&view=rev
Log:
[bug-64441] synchronize code that initialises WorkbookFactory

Modified:
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbookFactory.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/WorkbookFactory.java
    
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbookFactory.java

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbookFactory.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbookFactory.java?rev=1877776&r1=1877775&r2=1877776&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbookFactory.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbookFactory.java 
Fri May 15 07:36:27 2020
@@ -33,6 +33,10 @@ import org.apache.poi.util.Internal;
 public class HSSFWorkbookFactory extends WorkbookFactory {
 
     static {
+        init();
+    }
+
+    public static void init() {
         WorkbookFactory.createHssfFromScratch = 
HSSFWorkbookFactory::createWorkbook;
         WorkbookFactory.createHssfByNode = HSSFWorkbookFactory::createWorkbook;
     }

Modified: poi/trunk/src/java/org/apache/poi/ss/usermodel/WorkbookFactory.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/WorkbookFactory.java?rev=1877776&r1=1877775&r2=1877776&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/WorkbookFactory.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/WorkbookFactory.java Fri May 
15 07:36:27 2020
@@ -53,6 +53,8 @@ public abstract class WorkbookFactory {
         Workbook apply(T t, U u) throws IOException;
     }
 
+    private static Object hssfLock = new Object();
+    private static Object xssfLock = new Object();
     protected static CreateWorkbook0 createHssfFromScratch;
     protected static CreateWorkbook1<DirectoryNode> createHssfByNode;
 
@@ -333,20 +335,40 @@ public abstract class WorkbookFactory {
 
     private static void initXssf() throws IOException {
         if (createXssfFromScratch == null) {
-            initFactory("org.apache.poi.xssf.usermodel.XSSFWorkbookFactory", 
"poi-ooxml-*.jar");
+            synchronized (xssfLock) {
+                if (createXssfFromScratch == null) {
+                    String factoryClass = 
"org.apache.poi.xssf.usermodel.XSSFWorkbookFactory";
+                    Class cls = initFactory(factoryClass, "poi-ooxml-*.jar");
+                    try {
+                        cls.getMethod("init").invoke(null);
+                    } catch (Exception e) {
+                        throw new IOException(factoryClass+" failed to init.");
+                    }
+                }
+            }
         }
     }
 
     private static void initHssf() throws IOException {
         if (createHssfFromScratch == null) {
             // HSSF is part of the main jar, so this shouldn't fail ...
-            initFactory("org.apache.poi.hssf.usermodel.HSSFWorkbookFactory", 
"poi-*.jar");
+            synchronized (hssfLock) {
+                if (createHssfFromScratch == null) {
+                    String factoryClass = 
"org.apache.poi.hssf.usermodel.HSSFWorkbookFactory";
+                    Class cls = initFactory(factoryClass, "poi-*.jar");
+                    try {
+                        cls.getMethod("init").invoke(null);
+                    } catch (Exception e) {
+                        throw new IOException(factoryClass+" failed to init.");
+                    }
+                }
+            }
         }
     }
 
-    private static void initFactory(String factoryClass, String jar) throws 
IOException {
+    private static Class initFactory(String factoryClass, String jar) throws 
IOException {
         try {
-            Class.forName(factoryClass, true, 
WorkbookFactory.class.getClassLoader());
+            return Class.forName(factoryClass, true, 
WorkbookFactory.class.getClassLoader());
         } catch (ClassNotFoundException e) {
             throw new IOException(factoryClass+" not found - check if " + jar 
+ " is on the classpath.");
         }

Modified: 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbookFactory.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbookFactory.java?rev=1877776&r1=1877775&r2=1877776&view=diff
==============================================================================
--- 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbookFactory.java 
(original)
+++ 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbookFactory.java 
Fri May 15 07:36:27 2020
@@ -31,13 +31,16 @@ import org.apache.poi.ss.usermodel.Workb
 public class XSSFWorkbookFactory extends WorkbookFactory {
 
     static {
+        init();
+    }
+
+    public static void init() {
         WorkbookFactory.createXssfFromScratch = 
XSSFWorkbookFactory::createWorkbook;
         WorkbookFactory.createXssfByStream = 
XSSFWorkbookFactory::createWorkbook;
         WorkbookFactory.createXssfByPackage = o -> 
XSSFWorkbookFactory.createWorkbook((OPCPackage)o);
         WorkbookFactory.createXssfByFile = XSSFWorkbookFactory::createWorkbook;
     }
 
-
     /**
      * Create a new empty Workbook
      *



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@poi.apache.org
For additional commands, e-mail: commits-h...@poi.apache.org

Reply via email to