From e518cdfbbcb342cb56b315fae7be2ae60cb05c0d Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Thu, 23 Aug 2007 18:20:39 +0000 Subject: [PATCH] Fix for bug #42844 - Include some of the crazy continue record handling that we have in RecordFactory into HSSFEventFactory, so that we can handle when records aren't immediately followed by their continue git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@569101 13f79535-47bb-0310-9956-ffa450edef68 --- .../hssf/eventusermodel/HSSFEventFactory.java | 40 +++++++- .../poi/hssf/data/ContinueRecordProblem.xls | Bin 0 -> 64512 bytes .../eventusermodel/TestHSSFEventFactory.java | 88 ++++++++++++++++++ 3 files changed, 123 insertions(+), 5 deletions(-) create mode 100644 src/testcases/org/apache/poi/hssf/data/ContinueRecordProblem.xls create mode 100644 src/testcases/org/apache/poi/hssf/eventusermodel/TestHSSFEventFactory.java diff --git a/src/java/org/apache/poi/hssf/eventusermodel/HSSFEventFactory.java b/src/java/org/apache/poi/hssf/eventusermodel/HSSFEventFactory.java index a3800561e..1cd80d535 100644 --- a/src/java/org/apache/poi/hssf/eventusermodel/HSSFEventFactory.java +++ b/src/java/org/apache/poi/hssf/eventusermodel/HSSFEventFactory.java @@ -27,6 +27,10 @@ import org.apache.poi.hssf.record.Record; import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordFactory; import org.apache.poi.hssf.record.ContinueRecord; +import org.apache.poi.hssf.record.DrawingRecord; +import org.apache.poi.hssf.record.DrawingGroupRecord; +import org.apache.poi.hssf.record.ObjRecord; +import org.apache.poi.hssf.record.TextObjectRecord; import org.apache.poi.poifs.filesystem.POIFSFileSystem; /** @@ -140,11 +144,12 @@ public class HSSFEventFactory { Record rec = null; + Record lastRec = null; + DrawingRecord lastDrawingRecord = new DrawingRecord(); while (in.hasNextRecord()) { - in.nextRecord(); - + in.nextRecord(); sid = in.getSid();; // @@ -190,9 +195,34 @@ public class HSSFEventFactory // if there is only one // records, it will go here too. } - else - { - throw new RecordFormatException("Records should handle ContinueRecord internally. Should not see this exception"); + else { + // Normally, ContinueRecords are handled internally + // However, in a few cases, there is a gap between a record at + // its Continue, so we have to handle them specially + // This logic is much like in RecordFactory.createRecords() + Record[] recs = RecordFactory.createRecord(in); + ContinueRecord crec = (ContinueRecord)recs[0]; + if((lastRec instanceof ObjRecord) || (lastRec instanceof TextObjectRecord)) { + // You can have Obj records between a DrawingRecord + // and its continue! + lastDrawingRecord.processContinueRecord( crec.getData() ); + // Trigger them on the drawing record, now it's complete + rec = lastDrawingRecord; + } + else if((lastRec instanceof DrawingGroupRecord)) { + ((DrawingGroupRecord)lastRec).processContinueRecord(crec.getData()); + // Trigger them on the drawing record, now it's complete + rec = lastRec; + } + else { + throw new RecordFormatException("Records should handle ContinueRecord internally. Should not see this exception"); + } + } + + // Update our tracking of the last record + lastRec = rec; + if(rec instanceof DrawingRecord) { + lastDrawingRecord = (DrawingRecord)rec; } } if (rec != null) diff --git a/src/testcases/org/apache/poi/hssf/data/ContinueRecordProblem.xls b/src/testcases/org/apache/poi/hssf/data/ContinueRecordProblem.xls new file mode 100644 index 0000000000000000000000000000000000000000..c74b864f79399427998f4537afe7d1507f7f1fa6 GIT binary patch literal 64512 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 O=ojf8$9s#c2mTN4S*Gd$ literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/eventusermodel/TestHSSFEventFactory.java b/src/testcases/org/apache/poi/hssf/eventusermodel/TestHSSFEventFactory.java new file mode 100644 index 000000000..055629fa4 --- /dev/null +++ b/src/testcases/org/apache/poi/hssf/eventusermodel/TestHSSFEventFactory.java @@ -0,0 +1,88 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.hssf.eventusermodel; +import org.apache.poi.hssf.eventusermodel.HSSFEventFactory; +import org.apache.poi.hssf.eventusermodel.HSSFListener; + +import java.io.File; +import java.io.FileInputStream; +import java.util.ArrayList; + +import org.apache.poi.hssf.record.Record; +import org.apache.poi.hssf.record.ContinueRecord; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; + +import junit.framework.TestCase; + +public class TestHSSFEventFactory extends TestCase { + private String dirname; + + public TestHSSFEventFactory() { + dirname = System.getProperty("HSSF.testdata.path"); + } + + public void testWithMissingRecords() throws Exception { + File f = new File(dirname + "/SimpleWithSkip.xls"); + + HSSFRequest req = new HSSFRequest(); + MockHSSFListener mockListen = new MockHSSFListener(); + req.addListenerForAllRecords(mockListen); + + POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(f)); + HSSFEventFactory factory = new HSSFEventFactory(); + factory.processWorkbookEvents(req, fs); + + // Check we got the records + assertTrue( mockListen.records.size() > 100 ); + } + + public void testWithCrazyContinueRecords() throws Exception { + // Some files have crazy ordering of their continue records + // Check that we don't break on them (bug #42844) + + File f = new File(dirname + "/ContinueRecordProblem.xls"); + + HSSFRequest req = new HSSFRequest(); + MockHSSFListener mockListen = new MockHSSFListener(); + req.addListenerForAllRecords(mockListen); + + POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(f)); + HSSFEventFactory factory = new HSSFEventFactory(); + factory.processWorkbookEvents(req, fs); + + // Check we got the records + assertTrue( mockListen.records.size() > 100 ); + + // And none of them are continue ones + Record[] r = (Record[])mockListen.records.toArray( + new Record[mockListen.records.size()] ); + for(int i=0; i