This is an automated email from the ASF dual-hosted git repository.

fanningpj pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/poi.git


The following commit(s) were added to refs/heads/trunk by this push:
     new ac4e3c199e more HSSFEventFactory changes
ac4e3c199e is described below

commit ac4e3c199eb33b387da2866dfd0dc0b6d305bc25
Author: PJ Fanning <[email protected]>
AuthorDate: Fri Feb 20 20:19:10 2026 +0100

    more HSSFEventFactory changes
---
 .../poi/hssf/eventusermodel/HSSFEventFactory.java  | 154 +++++++++++++++++----
 .../hssf/eventusermodel/TestHSSFEventFactory.java  |  41 +++++-
 2 files changed, 169 insertions(+), 26 deletions(-)

diff --git 
a/poi/src/main/java/org/apache/poi/hssf/eventusermodel/HSSFEventFactory.java 
b/poi/src/main/java/org/apache/poi/hssf/eventusermodel/HSSFEventFactory.java
index 309c3a5e8f..c52000e936 100644
--- a/poi/src/main/java/org/apache/poi/hssf/eventusermodel/HSSFEventFactory.java
+++ b/poi/src/main/java/org/apache/poi/hssf/eventusermodel/HSSFEventFactory.java
@@ -47,7 +47,7 @@ public class HSSFEventFactory {
     /**
      * Processes a file into essentially record events.
      *
-     * @param req an Instance of HSSFRequest which has your registered 
listeners
+     * @param req an instance of HSSFRequest which has your registered 
listeners
      * @param fs  a POIFS filesystem containing your workbook
      * 
      * @throws IOException if the workbook contained errors 
@@ -56,15 +56,45 @@ public class HSSFEventFactory {
        processWorkbookEvents(req, fs.getRoot());
     }
 
+    /**
+     * Processes a file into essentially record events.
+     *
+     * @param req an instance of HSSFRequest which has your registered 
listeners
+     * @param fs  a POIFS filesystem containing your workbook
+     * @param password in char array format (can be null)
+     *
+     * @throws IOException if the workbook contained errors
+     * @since 6.0.0
+     */
+    public void processWorkbookEvents(HSSFRequest req, POIFSFileSystem fs,
+                                      final char[] password) throws 
IOException {
+        processWorkbookEvents(req, fs.getRoot(), password);
+    }
+
    /**
     * Processes a file into essentially record events.
     *
-    * @param req an Instance of HSSFRequest which has your registered listeners
+    * @param req an instance of HSSFRequest which has your registered listeners
     * @param dir  a DirectoryNode containing your workbook
     * 
     * @throws IOException if the workbook contained errors 
     */
     public void processWorkbookEvents(HSSFRequest req, DirectoryNode dir) 
throws IOException {
+        processWorkbookEvents(req, dir, null);
+    }
+
+    /**
+     * Processes a file into essentially record events.
+     *
+     * @param req an instance of HSSFRequest which has your registered 
listeners
+     * @param dir  a DirectoryNode containing your workbook
+     * @param password in char array format (can be null)
+     *
+     * @throws IOException if the workbook contained errors
+     * @since 6.0.0
+     */
+    public void processWorkbookEvents(HSSFRequest req, DirectoryNode dir,
+                                      final char[] password) throws 
IOException {
         // some old documents have "WORKBOOK" or "BOOK"
         String name = null;
         if (dir.hasEntry(WORKBOOK)) {
@@ -79,29 +109,45 @@ public class HSSFEventFactory {
         }
 
         try (InputStream in = dir.createDocumentInputStream(name)) {
-            processEvents(req, in);
+            processEvents(req, in, password);
         }
     }
 
-   /**
-    * Processes a file into essentially record events.
-    *
-    * @param req an Instance of HSSFRequest which has your registered listeners
-    * @param fs  a POIFS filesystem containing your workbook
-    * @return    numeric user-specified result code.
-    * 
-    * @throws HSSFUserException if the processing should be aborted
-    * @throws IOException if the workbook contained errors 
-    */
-   public short abortableProcessWorkbookEvents(HSSFRequest req, 
POIFSFileSystem fs)
-      throws IOException, HSSFUserException {
-      return abortableProcessWorkbookEvents(req, fs.getRoot());
-   }
+    /**
+     * Processes a file into essentially record events.
+     *
+     * @param req an instance of HSSFRequest which has your registered 
listeners
+     * @param fs  a POIFS filesystem containing your workbook
+     * @return numeric user-specified result code.
+     * @throws HSSFUserException if the processing should be aborted
+     * @throws IOException       if the workbook contained errors
+     */
+    public short abortableProcessWorkbookEvents(HSSFRequest req, 
POIFSFileSystem fs)
+            throws IOException, HSSFUserException {
+        return abortableProcessWorkbookEvents(req, fs.getRoot());
+    }
 
     /**
      * Processes a file into essentially record events.
      *
-     * @param req an Instance of HSSFRequest which has your registered 
listeners
+     * @param req an instance of HSSFRequest which has your registered 
listeners
+     * @param fs  a POIFS filesystem containing your workbook
+     * @param password in char array format (can be null)
+     * @return numeric user-specified result code.
+     * @throws HSSFUserException if the processing should be aborted
+     * @throws IOException       if the workbook contained errors
+     * @since 6.0.0
+     */
+    public short abortableProcessWorkbookEvents(HSSFRequest req, 
POIFSFileSystem fs,
+                                                final char[] password)
+            throws IOException, HSSFUserException {
+        return abortableProcessWorkbookEvents(req, fs.getRoot(), password);
+    }
+
+    /**
+     * Processes a file into essentially record events.
+     *
+     * @param req an instance of HSSFRequest which has your registered 
listeners
      * @param dir  a DirectoryNode containing your workbook
      * @return    numeric user-specified result code.
      * 
@@ -115,6 +161,26 @@ public class HSSFEventFactory {
         }
     }
 
+    /**
+     * Processes a file into essentially record events.
+     *
+     * @param req an instance of HSSFRequest which has your registered 
listeners
+     * @param dir  a DirectoryNode containing your workbook
+     * @param password in char array format (can be null)
+     * @return    numeric user-specified result code.
+     *
+     * @throws HSSFUserException if the processing should be aborted
+     * @throws IOException if the workbook contained errors
+     * @since 6.0.0
+     */
+    public short abortableProcessWorkbookEvents(HSSFRequest req, DirectoryNode 
dir,
+                                                final char[] password)
+            throws IOException, HSSFUserException {
+        try (InputStream in = dir.createDocumentInputStream("Workbook")) {
+            return abortableProcessEvents(req, in, password);
+        }
+    }
+
     /**
      * Processes a DocumentInputStream into essentially Record events.
      *
@@ -123,23 +189,43 @@ public class HSSFEventFactory {
      * user code or <code>HSSFUserException</code> will be passed back.
      *
      * @see 
org.apache.poi.poifs.filesystem.POIFSFileSystem#createDocumentInputStream(String)
-     * @param req an Instance of HSSFRequest which has your registered 
listeners
+     * @param req an instance of HSSFRequest which has your registered 
listeners
      * @param in  a DocumentInputStream obtained from POIFS's POIFSFileSystem 
object
      */
     public void processEvents(HSSFRequest req, InputStream in) {
         try {
-            genericProcessEvents(req, in);
+            genericProcessEvents(req, in, null);
         } catch (HSSFUserException hue) {
             /*If an HSSFUserException user exception is thrown, ignore it.*/
         }
     }
 
+    /**
+     * Processes a DocumentInputStream into essentially Record events.
+     *
+     * If an <code>AbortableHSSFListener</code> causes a halt to processing 
during this call
+     * the method will return just as with 
<code>abortableProcessEvents</code>, but no
+     * user code or <code>HSSFUserException</code> will be passed back.
+     *
+     * @see 
org.apache.poi.poifs.filesystem.POIFSFileSystem#createDocumentInputStream(String)
+     * @param req an instance of HSSFRequest which has your registered 
listeners
+     * @param in  a DocumentInputStream obtained from POIFS's POIFSFileSystem 
object
+     * @param password in char array format (can be null)
+     * @since 6.0.0
+     */
+    public void processEvents(HSSFRequest req, InputStream in, final char[] 
password) {
+        try {
+            genericProcessEvents(req, in, password);
+        } catch (HSSFUserException hue) {
+            /*If an HSSFUserException user exception is thrown, ignore it.*/
+        }
+    }
 
     /**
      * Processes a DocumentInputStream into essentially Record events.
      *
      * @see 
org.apache.poi.poifs.filesystem.POIFSFileSystem#createDocumentInputStream(String)
-     * @param req an Instance of HSSFRequest which has your registered 
listeners
+     * @param req an instance of HSSFRequest which has your registered 
listeners
      * @param in  a DocumentInputStream obtained from POIFS's POIFSFileSystem 
object
      * @return    numeric user-specified result code.
      * 
@@ -147,23 +233,41 @@ public class HSSFEventFactory {
      */
     public short abortableProcessEvents(HSSFRequest req, InputStream in)
         throws HSSFUserException {
-        return genericProcessEvents(req, in);
+        return genericProcessEvents(req, in, null);
+    }
+
+    /**
+     * Processes a DocumentInputStream into essentially Record events.
+     *
+     * @see 
org.apache.poi.poifs.filesystem.POIFSFileSystem#createDocumentInputStream(String)
+     * @param req an instance of HSSFRequest which has your registered 
listeners
+     * @param in  a DocumentInputStream obtained from POIFS's POIFSFileSystem 
object
+     * @param password in char array format (can be null)
+     * @return    numeric user-specified result code.
+     *
+     * @throws HSSFUserException if the processing should be aborted
+     * @since 6.0.0
+     */
+    public short abortableProcessEvents(HSSFRequest req, InputStream in, final 
char[] password)
+            throws HSSFUserException {
+        return genericProcessEvents(req, in, password);
     }
 
     /**
      * Processes a DocumentInputStream into essentially Record events.
      *
      * @see 
org.apache.poi.poifs.filesystem.POIFSFileSystem#createDocumentInputStream(String)
-     * @param req an Instance of HSSFRequest which has your registered 
listeners
+     * @param req an instance of HSSFRequest which has your registered 
listeners
      * @param in  a DocumentInputStream obtained from POIFS's POIFSFileSystem 
object
      * @return    numeric user-specified result code.
      */
-    private short genericProcessEvents(HSSFRequest req, InputStream in)
+    private short genericProcessEvents(HSSFRequest req, InputStream in, final 
char[] password)
         throws HSSFUserException {
         short userCode = 0;
 
         // Create a new RecordStream and use that
-        RecordFactoryInputStream recordStream = new 
RecordFactoryInputStream(in, false);
+        RecordFactoryInputStream recordStream = new RecordFactoryInputStream(
+                in, false, password);
 
         // Process each record as they come in
         while(true) {
diff --git 
a/poi/src/test/java/org/apache/poi/hssf/eventusermodel/TestHSSFEventFactory.java
 
b/poi/src/test/java/org/apache/poi/hssf/eventusermodel/TestHSSFEventFactory.java
index 4f5ea89a6b..b23639647e 100644
--- 
a/poi/src/test/java/org/apache/poi/hssf/eventusermodel/TestHSSFEventFactory.java
+++ 
b/poi/src/test/java/org/apache/poi/hssf/eventusermodel/TestHSSFEventFactory.java
@@ -64,7 +64,7 @@ final class TestHSSFEventFactory {
         try (InputStream is = 
HSSFTestDataSamples.openSampleFileStream(sampleFileName);
              POIFSFileSystem fs = new POIFSFileSystem(is)) {
             HSSFEventFactory factory = new HSSFEventFactory();
-            factory.processWorkbookEvents(req, fs);
+            factory.processWorkbookEvents(req, fs, password.toCharArray());
         }
         return records;
     }
@@ -135,6 +135,45 @@ final class TestHSSFEventFactory {
 
     @Test
     void testWithPasswordProtectedWorkbooks() throws Exception {
+        final List<org.apache.poi.hssf.record.Record> records =
+                openSample("xor-encryption-abc.xls", "abc");
+
+        // Check we got the sheet and the contents
+        assertTrue(records.size() > 50);
+
+        // Has one sheet, with values 1,2,3 in column A rows 1-3
+        boolean hasSheet = false, hasA1 = false, hasA2 = false, hasA3 = false;
+        for (org.apache.poi.hssf.record.Record r : records) {
+            if (r instanceof BoundSheetRecord) {
+                BoundSheetRecord bsr = (BoundSheetRecord) r;
+                assertEquals("Sheet1", bsr.getSheetname());
+                hasSheet = true;
+            }
+            if (r instanceof NumberRecord) {
+                NumberRecord nr = (NumberRecord) r;
+                if (nr.getColumn() == 0 && nr.getRow() == 0) {
+                    assertEquals(1, (int) nr.getValue());
+                    hasA1 = true;
+                }
+                if (nr.getColumn() == 0 && nr.getRow() == 1) {
+                    assertEquals(2, (int) nr.getValue());
+                    hasA2 = true;
+                }
+                if (nr.getColumn() == 0 && nr.getRow() == 2) {
+                    assertEquals(3, (int) nr.getValue());
+                    hasA3 = true;
+                }
+            }
+        }
+
+        assertTrue(hasSheet, "Sheet record not found");
+        assertTrue(hasA1, "Numeric record for A1 not found");
+        assertTrue(hasA2, "Numeric record for A2 not found");
+        assertTrue(hasA3, "Numeric record for A3 not found");
+    }
+
+    @Test
+    void testWithPasswordProtectedWorkbooksBiff8EncryptionKey() throws 
Exception {
         // With the password, is properly processed
         Biff8EncryptionKey.setCurrentUserPassword("abc");
         try {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to