You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by fa...@apache.org on 2020/05/15 07:36:27 UTC

svn commit: r1877776 - in /poi/trunk/src: java/org/apache/poi/hssf/usermodel/HSSFWorkbookFactory.java java/org/apache/poi/ss/usermodel/WorkbookFactory.java ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbookFactory.java

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-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org