You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by jo...@apache.org on 2008/09/14 20:55:28 UTC

svn commit: r695264 - in /poi/trunk/src: documentation/content/xdocs/ java/org/apache/poi/hssf/model/ java/org/apache/poi/hssf/record/formula/ java/org/apache/poi/hssf/usermodel/ java/org/apache/poi/hssf/util/ testcases/org/apache/poi/hssf/ testcases/o...

Author: josh
Date: Sun Sep 14 11:55:28 2008
New Revision: 695264

URL: http://svn.apache.org/viewvc?rev=695264&view=rev
Log:
Fix for bug 45978 - removed eager initialisation of SheetReferences

Added:
    poi/trunk/src/testcases/org/apache/poi/hssf/data/ex45978-extraLinkTableSheets.xls   (with props)
Removed:
    poi/trunk/src/java/org/apache/poi/hssf/util/SheetReferences.java
    poi/trunk/src/testcases/org/apache/poi/hssf/util/TestSheetReferences.java
Modified:
    poi/trunk/src/documentation/content/xdocs/changes.xml
    poi/trunk/src/documentation/content/xdocs/status.xml
    poi/trunk/src/java/org/apache/poi/hssf/model/LinkTable.java
    poi/trunk/src/java/org/apache/poi/hssf/model/Workbook.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
    poi/trunk/src/testcases/org/apache/poi/hssf/HSSFTests.java
    poi/trunk/src/testcases/org/apache/poi/hssf/eventusermodel/TestEventWorkbookBuilder.java
    poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestLinkTable.java
    poi/trunk/src/testcases/org/apache/poi/hssf/util/AllHSSFUtilTests.java

Modified: poi/trunk/src/documentation/content/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/changes.xml?rev=695264&r1=695263&r2=695264&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/changes.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/changes.xml Sun Sep 14 11:55:28 2008
@@ -37,6 +37,7 @@
 
 		<!-- Don't forget to update status.xml too! -->
         <release version="3.1.1-alpha1" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">45978 - Fixed IOOBE in Ref3DPtg.toFormulaString() due eager initialisation of SheetReferences</action>
            <action dev="POI-DEVELOPERS" type="add">Made HSSFFormulaEvaluator no longer require initialisation with sheet or row</action>
            <action dev="POI-DEVELOPERS" type="add">Extended support for cached results of formula cells</action>
            <action dev="POI-DEVELOPERS" type="fix">45639 - Fixed AIOOBE due to bad index logic in ColumnInfoRecordsAggregate</action>

Modified: poi/trunk/src/documentation/content/xdocs/status.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=695264&r1=695263&r2=695264&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Sun Sep 14 11:55:28 2008
@@ -34,6 +34,7 @@
 	<!-- Don't forget to update changes.xml too! -->
     <changes>
         <release version="3.1.1-alpha1" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">45978 - Fixed IOOBE in Ref3DPtg.toFormulaString() due eager initialisation of SheetReferences</action>
            <action dev="POI-DEVELOPERS" type="add">Made HSSFFormulaEvaluator no longer require initialisation with sheet or row</action>
            <action dev="POI-DEVELOPERS" type="add">Extended support for cached results of formula cells</action>
            <action dev="POI-DEVELOPERS" type="fix">45639 - Fixed AIOOBE due to bad index logic in ColumnInfoRecordsAggregate</action>

Modified: poi/trunk/src/java/org/apache/poi/hssf/model/LinkTable.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/LinkTable.java?rev=695264&r1=695263&r2=695264&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/LinkTable.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/LinkTable.java Sun Sep 14 11:55:28 2008
@@ -348,10 +348,6 @@
 		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);

Modified: poi/trunk/src/java/org/apache/poi/hssf/model/Workbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/Workbook.java?rev=695264&r1=695263&r2=695264&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/Workbook.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/Workbook.java Sun Sep 14 11:55:28 2008
@@ -26,7 +26,6 @@
 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 @@
         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);
     }
 

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java?rev=695264&r1=695263&r2=695264&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java Sun Sep 14 11:55:28 2008
@@ -90,7 +90,7 @@
 	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

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java?rev=695264&r1=695263&r2=695264&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java Sun Sep 14 11:55:28 2008
@@ -21,7 +21,6 @@
 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 @@
 
     }
 
-    // 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 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( '!' );

Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java?rev=695264&r1=695263&r2=695264&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java Sun Sep 14 11:55:28 2008
@@ -35,7 +35,6 @@
 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.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 @@
         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 @@
     }
 
     /**
-     * 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);
     }
 

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/HSSFTests.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/HSSFTests.java?rev=695264&r1=695263&r2=695264&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/HSSFTests.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/HSSFTests.java Sun Sep 14 11:55:28 2008
@@ -23,14 +23,11 @@
 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<br/>
@@ -41,27 +38,20 @@
  */
 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;
     }
 }

Added: poi/trunk/src/testcases/org/apache/poi/hssf/data/ex45978-extraLinkTableSheets.xls
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/data/ex45978-extraLinkTableSheets.xls?rev=695264&view=auto
==============================================================================
Binary file - no diff available.

Propchange: poi/trunk/src/testcases/org/apache/poi/hssf/data/ex45978-extraLinkTableSheets.xls
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/eventusermodel/TestEventWorkbookBuilder.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/eventusermodel/TestEventWorkbookBuilder.java?rev=695264&r1=695263&r2=695264&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/eventusermodel/TestEventWorkbookBuilder.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/eventusermodel/TestEventWorkbookBuilder.java Sun Sep 14 11:55:28 2008
@@ -16,6 +16,7 @@
 ==================================================================== */
 
 package org.apache.poi.hssf.eventusermodel;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -32,7 +33,6 @@
 import org.apache.poi.hssf.record.formula.Ptg;
 import org.apache.poi.hssf.record.formula.Ref3DPtg;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.util.SheetReferences;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 /**
  * Tests for {@link EventWorkbookBuilder}
@@ -66,9 +66,6 @@
 	public void testGetStubWorkbooks() {
 		assertNotNull(listener.getStubWorkbook());
 		assertNotNull(listener.getStubHSSFWorkbook());
-		
-		assertNotNull(listener.getStubWorkbook().getSheetReferences());
-		assertNotNull(listener.getStubHSSFWorkbook().getSheetReferences());
 	}
 	
 	public void testContents() {
@@ -78,10 +75,10 @@
 		
 		assertEquals(3, listener.getStubWorkbook().getNumSheets());
 		
-		SheetReferences ref = listener.getStubWorkbook().getSheetReferences();
-		assertEquals("Sh3", ref.getSheetName(0));
-		assertEquals("Sheet1", ref.getSheetName(1));
-		assertEquals("S2", ref.getSheetName(2));
+		Workbook ref = listener.getStubWorkbook();
+		assertEquals("Sh3", ref.findSheetNameFromExternSheet(0));
+		assertEquals("Sheet1", ref.findSheetNameFromExternSheet(1));
+		assertEquals("S2", ref.findSheetNameFromExternSheet(2));
 	}
 	
 	public void testFormulas() {

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestLinkTable.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestLinkTable.java?rev=695264&r1=695263&r2=695264&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestLinkTable.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestLinkTable.java Sun Sep 14 11:55:28 2008
@@ -6,7 +6,7 @@
 import org.apache.poi.hssf.HSSFTestDataSamples;
 /**
  * Tests for LinkTable
- * 
+ *
  * @author Josh Micich
  */
 public final class TestLinkTable extends TestCase {
@@ -14,9 +14,9 @@
 	/**
 	 * The example file attached to bugzilla 45046 is a clear example of Name records being present
 	 * without an External Book (SupBook) record.  Excel has no trouble reading this file.<br/>
-	 * 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 @@
 		// 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 @@
 		// 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);
+	}
 }

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/util/AllHSSFUtilTests.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/util/AllHSSFUtilTests.java?rev=695264&r1=695263&r2=695264&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/util/AllHSSFUtilTests.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/util/AllHSSFUtilTests.java Sun Sep 14 11:55:28 2008
@@ -34,7 +34,6 @@
 		result.addTestSuite(TestHSSFColor.class);
 		result.addTestSuite(TestRangeAddress.class);
 		result.addTestSuite(TestRKUtil.class);
-		result.addTestSuite(TestSheetReferences.class);
 		return result;
 	}
 }



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