From 866ae7562a51de72161c4f46beb0280987e5818f Mon Sep 17 00:00:00 2001 From: Josh Micich Date: Sun, 14 Sep 2008 18:55:28 +0000 Subject: [PATCH] Fix for bug 45978 - removed eager initialisation of SheetReferences git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@695264 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/changes.xml | 1 + src/documentation/content/xdocs/status.xml | 1 + .../org/apache/poi/hssf/model/LinkTable.java | 4 -- .../org/apache/poi/hssf/model/Workbook.java | 28 +++------ .../poi/hssf/record/formula/Area3DPtg.java | 2 +- .../poi/hssf/record/formula/Ref3DPtg.java | 17 +---- .../poi/hssf/usermodel/HSSFWorkbook.java | 16 +++-- .../apache/poi/hssf/util/SheetReferences.java | 46 -------------- .../org/apache/poi/hssf/HSSFTests.java | 24 +++---- .../data/ex45978-extraLinkTableSheets.xls | Bin 0 -> 43520 bytes .../TestEventWorkbookBuilder.java | 13 ++-- .../poi/hssf/usermodel/TestLinkTable.java | 59 +++++++++++++++--- .../poi/hssf/util/AllHSSFUtilTests.java | 1 - .../poi/hssf/util/TestSheetReferences.java | 51 --------------- 14 files changed, 85 insertions(+), 178 deletions(-) delete mode 100644 src/java/org/apache/poi/hssf/util/SheetReferences.java create mode 100644 src/testcases/org/apache/poi/hssf/data/ex45978-extraLinkTableSheets.xls delete mode 100644 src/testcases/org/apache/poi/hssf/util/TestSheetReferences.java diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index 5f7c09520a..5ce7097f26 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -37,6 +37,7 @@ + 45978 - Fixed IOOBE in Ref3DPtg.toFormulaString() due eager initialisation of SheetReferences Made HSSFFormulaEvaluator no longer require initialisation with sheet or row Extended support for cached results of formula cells 45639 - Fixed AIOOBE due to bad index logic in ColumnInfoRecordsAggregate diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index e62842ba3a..926986edbb 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 45978 - Fixed IOOBE in Ref3DPtg.toFormulaString() due eager initialisation of SheetReferences Made HSSFFormulaEvaluator no longer require initialisation with sheet or row Extended support for cached results of formula cells 45639 - Fixed AIOOBE due to bad index logic in ColumnInfoRecordsAggregate diff --git a/src/java/org/apache/poi/hssf/model/LinkTable.java b/src/java/org/apache/poi/hssf/model/LinkTable.java index a64f134fed..2caab0fb56 100755 --- a/src/java/org/apache/poi/hssf/model/LinkTable.java +++ b/src/java/org/apache/poi/hssf/model/LinkTable.java @@ -348,10 +348,6 @@ final class LinkTable { return -1; } - public int getNumberOfREFStructures() { - return _externSheetRecord.getNumOfRefs(); - } - public String resolveNameXText(int refIndex, int definedNameIndex) { int extBookIndex = _externSheetRecord.getExtbookIndexFromRefIndex(refIndex); return _externalBookBlocks[extBookIndex].getNameText(definedNameIndex); diff --git a/src/java/org/apache/poi/hssf/model/Workbook.java b/src/java/org/apache/poi/hssf/model/Workbook.java index 7976588d34..f8a426108a 100644 --- a/src/java/org/apache/poi/hssf/model/Workbook.java +++ b/src/java/org/apache/poi/hssf/model/Workbook.java @@ -26,7 +26,6 @@ import org.apache.poi.ddf.*; import org.apache.poi.hssf.record.*; import org.apache.poi.hssf.record.formula.NameXPtg; import org.apache.poi.hssf.util.HSSFColor; -import org.apache.poi.hssf.util.SheetReferences; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; @@ -1902,34 +1901,23 @@ public final class Workbook implements Model { return linkTable; } - public SheetReferences getSheetReferences() { - SheetReferences refs = new SheetReferences(); - - if (linkTable != null) { - int numRefStructures = linkTable.getNumberOfREFStructures(); - for (short k = 0; k < numRefStructures; k++) { - - String sheetName = findSheetNameFromExternSheet(k); - refs.addSheetReference(sheetName, k); - - } - } - return refs; - } - /** finds the sheet name by his extern sheet index - * @param num extern sheet index - * @return sheet name + * @param externSheetIndex extern sheet index + * @return sheet name. */ - public String findSheetNameFromExternSheet(short num){ + public String findSheetNameFromExternSheet(int externSheetIndex){ - int indexToSheet = linkTable.getIndexToSheet(num); + int indexToSheet = linkTable.getIndexToSheet(externSheetIndex); if (indexToSheet < 0) { // TODO - what does '-1' mean here? //error check, bail out gracefully! return ""; } + if (indexToSheet >= boundsheets.size()) { + // Not sure if this can ever happen (See bug 45798) + return ""; // Seems to be what excel would do in this case + } return getSheetName(indexToSheet); } diff --git a/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java b/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java index f68aa4d3ff..55c14cdb75 100644 --- a/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java @@ -90,7 +90,7 @@ public final class Area3DPtg extends AreaPtgBase { public String toFormulaString(HSSFWorkbook book) { // First do the sheet name StringBuffer retval = new StringBuffer(); - String sheetName = Ref3DPtg.getSheetName(book, field_1_index_extern_sheet); + String sheetName = book.findSheetNameFromExternSheet(field_1_index_extern_sheet); if(sheetName != null) { if(sheetName.length() == 0) { // What excel does if sheet has been deleted diff --git a/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java b/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java index d1133d9801..e6a8a959e3 100644 --- a/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java @@ -21,7 +21,6 @@ import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.CellReference; import org.apache.poi.hssf.util.RangeAddress; -import org.apache.poi.hssf.util.SheetReferences; import org.apache.poi.util.BitField; import org.apache.poi.util.BitFieldFactory; import org.apache.poi.util.LittleEndian; @@ -160,20 +159,6 @@ public final class Ref3DPtg extends OperandPtg { } - // TODO - find a home for this method - // There is already a method on HSSFWorkbook called getSheetName but it seems to do something different. - static String getSheetName(HSSFWorkbook book, int externSheetIndex) { - // TODO - there are 3 ways this method can return null. Is each valid? - if (book == null) { - return null; - } - - SheetReferences refs = book.getSheetReferences(); - if (refs == null) { - return null; - } - return refs.getSheetName(externSheetIndex); - } /** * @return text representation of this cell reference that can be used in text * formulas. The sheet name will get properly delimited if required. @@ -181,7 +166,7 @@ public final class Ref3DPtg extends OperandPtg { public String toFormulaString(HSSFWorkbook book) { StringBuffer retval = new StringBuffer(); - String sheetName = getSheetName(book, field_1_index_extern_sheet); + String sheetName = book.findSheetNameFromExternSheet(field_1_index_extern_sheet); if(sheetName != null) { SheetNameFormatter.appendFormat(retval, sheetName); retval.append( '!' ); diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java index a708bd16c1..e751d9b38a 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java @@ -35,7 +35,6 @@ import org.apache.poi.ddf.EscherBlipRecord; import org.apache.poi.ddf.EscherRecord; import org.apache.poi.hssf.model.Sheet; import org.apache.poi.hssf.model.Workbook; -import org.apache.poi.hssf.model.DrawingManager2; import org.apache.poi.hssf.record.AbstractEscherHolderRecord; import org.apache.poi.hssf.record.BackupRecord; import org.apache.poi.hssf.record.DrawingGroupRecord; @@ -60,7 +59,6 @@ import org.apache.poi.hssf.record.formula.Ref3DPtg; import org.apache.poi.hssf.record.formula.UnionPtg; import org.apache.poi.hssf.usermodel.HSSFRow.MissingCellPolicy; import org.apache.poi.hssf.util.CellReference; -import org.apache.poi.hssf.util.SheetReferences; import org.apache.poi.poifs.filesystem.DirectoryNode; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.util.POILogFactory; @@ -858,8 +856,13 @@ public class HSSFWorkbook extends POIDocument return retval; } - public SheetReferences getSheetReferences() { - return workbook.getSheetReferences(); + /** + * @deprecated for POI internal use only (formula rendering). This method is likely to + * be removed in future versions of POI. + */ + public String findSheetNameFromExternSheet(int externSheetIndex){ + // TODO - don't expose internal ugliness like externSheet indexes to the user model API + return workbook.findSheetNameFromExternSheet(externSheetIndex); } /** @@ -1370,12 +1373,15 @@ public class HSSFWorkbook extends POIDocument } /** - * TODO - make this less cryptic / move elsewhere + * @deprecated for POI internal use only (formula rendering). This method is likely to + * be removed in future versions of POI. + * * @param refIndex Index to REF entry in EXTERNSHEET record in the Link Table * @param definedNameIndex zero-based to DEFINEDNAME or EXTERNALNAME record * @return the string representation of the defined or external name */ public String resolveNameXText(int refIndex, int definedNameIndex) { + // TODO - make this less cryptic / move elsewhere return workbook.resolveNameXText(refIndex, definedNameIndex); } diff --git a/src/java/org/apache/poi/hssf/util/SheetReferences.java b/src/java/org/apache/poi/hssf/util/SheetReferences.java deleted file mode 100644 index 9fe8dd1f3d..0000000000 --- a/src/java/org/apache/poi/hssf/util/SheetReferences.java +++ /dev/null @@ -1,46 +0,0 @@ -/* ==================================================================== - 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.util; - -import java.util.HashMap; -import java.util.Map; - -/** - * Holds a collection of Sheet names and their associated - * reference numbers. - * - * @author Andrew C. Oliver (acoliver at apache dot org) - * - */ -public class SheetReferences -{ - Map map; - public SheetReferences() - { - map = new HashMap(5); - } - - public void addSheetReference(String sheetName, int number) { - map.put(new Integer(number), sheetName); - } - - public String getSheetName(int number) { - return (String)map.get(new Integer(number)); - } - -} diff --git a/src/testcases/org/apache/poi/hssf/HSSFTests.java b/src/testcases/org/apache/poi/hssf/HSSFTests.java index ff15491d90..1edaf7e151 100644 --- a/src/testcases/org/apache/poi/hssf/HSSFTests.java +++ b/src/testcases/org/apache/poi/hssf/HSSFTests.java @@ -23,14 +23,11 @@ import junit.framework.TestSuite; import org.apache.poi.hssf.eventmodel.TestEventRecordFactory; import org.apache.poi.hssf.eventmodel.TestModelFactory; import org.apache.poi.hssf.eventusermodel.AllEventUserModelTests; +import org.apache.poi.hssf.extractor.TestExcelExtractor; import org.apache.poi.hssf.model.AllModelTests; import org.apache.poi.hssf.record.AllRecordTests; import org.apache.poi.hssf.usermodel.AllUserModelTests; -import org.apache.poi.hssf.util.TestAreaReference; -import org.apache.poi.hssf.util.TestCellReference; -import org.apache.poi.hssf.util.TestRKUtil; -import org.apache.poi.hssf.util.TestRangeAddress; -import org.apache.poi.hssf.util.TestSheetReferences; +import org.apache.poi.hssf.util.AllHSSFUtilTests; /** * Test Suite for all sub-packages of org.apache.poi.hssf
@@ -41,27 +38,20 @@ import org.apache.poi.hssf.util.TestSheetReferences; */ public final class HSSFTests { - public static void main(String[] args) { - junit.textui.TestRunner.run(suite()); - } - public static Test suite() { - TestSuite suite = new TestSuite("Tests for org.apache.poi.hssf"); - // $JUnit-BEGIN$ + TestSuite suite = new TestSuite(HSSFTests.class.getName()); suite.addTest(AllEventUserModelTests.suite()); suite.addTest(AllModelTests.suite()); suite.addTest(AllUserModelTests.suite()); suite.addTest(AllRecordTests.suite()); + suite.addTest(AllHSSFUtilTests.suite()); - suite.addTest(new TestSuite(TestAreaReference.class)); - suite.addTest(new TestSuite(TestCellReference.class)); - suite.addTest(new TestSuite(TestRangeAddress.class)); - suite.addTest(new TestSuite(TestRKUtil.class)); - suite.addTest(new TestSuite(TestSheetReferences.class)); + if (false) { // TODO - hook this test up + suite.addTest(new TestSuite(TestExcelExtractor.class)); + } suite.addTest(new TestSuite(TestEventRecordFactory.class)); suite.addTest(new TestSuite(TestModelFactory.class)); - // $JUnit-END$ return suite; } } diff --git a/src/testcases/org/apache/poi/hssf/data/ex45978-extraLinkTableSheets.xls b/src/testcases/org/apache/poi/hssf/data/ex45978-extraLinkTableSheets.xls new file mode 100644 index 0000000000000000000000000000000000000000..5e496142cbb619b83f588c428beaecb8bb6a9736 GIT binary patch literal 43520 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 - * TODO get OOO documentation updated to reflect this (that EXTERNALBOOK is optional). - * - * It's not clear what exact steps need to be taken in Excel to create such a workbook + * TODO get OOO documentation updated to reflect this (that EXTERNALBOOK is optional). + * + * It's not clear what exact steps need to be taken in Excel to create such a workbook */ public void testLinkTableWithoutExternalBookRecord_bug45046() { HSSFWorkbook wb; @@ -32,16 +32,16 @@ public final class TestLinkTable extends TestCase { // some other sanity checks assertEquals(3, wb.getNumberOfSheets()); String formula = wb.getSheetAt(0).getRow(4).getCell(13).getCellFormula(); - + if ("ipcSummenproduktIntern($P5,N$6,$A$9,N$5)".equals(formula)) { - // The reported symptom of this bugzilla is an earlier bug (already fixed) - throw new AssertionFailedError("Identified bug 41726"); + // The reported symptom of this bugzilla is an earlier bug (already fixed) + throw new AssertionFailedError("Identified bug 41726"); // This is observable in version 3.0 } - + assertEquals("ipcSummenproduktIntern($C5,N$2,$A$9,N$1)", formula); } - + public void testMultipleExternSheetRecords_bug45698() { HSSFWorkbook wb; @@ -56,4 +56,45 @@ public final class TestLinkTable extends TestCase { // some other sanity checks assertEquals(7, wb.getNumberOfSheets()); } + + public void testExtraSheetRefs_bug45978() { + HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("ex45978-extraLinkTableSheets.xls"); + /* + ex45978-extraLinkTableSheets.xls is a cut-down version of attachment 22561. + The original file produces the same error. + + This bug was caused by a combination of invalid sheet indexes in the EXTERNSHEET + record, and eager initialisation of the extern sheet references. Note - the worbook + has 2 sheets, but the EXTERNSHEET record refers to sheet indexes 0, 1 and 2. + + Offset 0x3954 (14676) + recordid = 0x17, size = 32 + [EXTERNSHEET] + numOfRefs = 5 + refrec #0: extBook=0 firstSheet=0 lastSheet=0 + refrec #1: extBook=1 firstSheet=2 lastSheet=2 + refrec #2: extBook=2 firstSheet=1 lastSheet=1 + refrec #3: extBook=0 firstSheet=-1 lastSheet=-1 + refrec #4: extBook=0 firstSheet=1 lastSheet=1 + [/EXTERNSHEET] + + As it turns out, the formula in question doesn't even use externSheetIndex #1 - it + uses #4, which resolves to sheetIndex 1 -> 'Data'. + + It is not clear exactly what externSheetIndex #4 would refer to. Excel seems to + display such a formula as "''!$A2", but then complains of broken link errors. + */ + + HSSFCell cell = wb.getSheetAt(0).getRow(1).getCell(1); + String cellFormula; + try { + cellFormula = cell.getCellFormula(); + } catch (IndexOutOfBoundsException e) { + if (e.getMessage().equals("Index: 2, Size: 2")) { + throw new AssertionFailedError("Identified bug 45798"); + } + throw e; + } + assertEquals("Data!$A2", cellFormula); + } } diff --git a/src/testcases/org/apache/poi/hssf/util/AllHSSFUtilTests.java b/src/testcases/org/apache/poi/hssf/util/AllHSSFUtilTests.java index ec88e5c439..45c96e6c42 100755 --- a/src/testcases/org/apache/poi/hssf/util/AllHSSFUtilTests.java +++ b/src/testcases/org/apache/poi/hssf/util/AllHSSFUtilTests.java @@ -34,7 +34,6 @@ public class AllHSSFUtilTests { result.addTestSuite(TestHSSFColor.class); result.addTestSuite(TestRangeAddress.class); result.addTestSuite(TestRKUtil.class); - result.addTestSuite(TestSheetReferences.class); return result; } } diff --git a/src/testcases/org/apache/poi/hssf/util/TestSheetReferences.java b/src/testcases/org/apache/poi/hssf/util/TestSheetReferences.java deleted file mode 100644 index 4464d768c5..0000000000 --- a/src/testcases/org/apache/poi/hssf/util/TestSheetReferences.java +++ /dev/null @@ -1,51 +0,0 @@ - -/* ==================================================================== - 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.util; - -import junit.framework.TestCase; - -/** - * Tests the SheetReferences class. - * @author Andrew C. Oliver (acoliver at apache dot org) - */ -public class TestSheetReferences - extends TestCase -{ - public TestSheetReferences(String s) - { - super(s); - } - - /** - * Test that the SheetReferences class can add references and give them - * out - */ - public void testSheetRefs() - throws Exception - { - SheetReferences refs = new SheetReferences(); - refs.addSheetReference("A", 0); - refs.addSheetReference("B", 1); - refs.addSheetReference("C", 3); - assertTrue("ref 0 == A", refs.getSheetName(0).equals("A")); - assertTrue("ref 1 == B", refs.getSheetName(1).equals("B")); - assertTrue("ref 3 == C", refs.getSheetName(3).equals("C")); - } -}