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/05/23 07:28:58 UTC

svn commit: r659429 - in /poi/trunk/src: documentation/content/xdocs/ java/org/apache/poi/hssf/model/ testcases/org/apache/poi/hssf/data/ testcases/org/apache/poi/hssf/usermodel/

Author: josh
Date: Thu May 22 22:28:54 2008
New Revision: 659429

URL: http://svn.apache.org/viewvc?rev=659429&view=rev
Log:
Fix for bug 45046 - allowed DEFINEDNAME records without EXTERNALBOOK records

Added:
    poi/trunk/src/testcases/org/apache/poi/hssf/data/ex45046-21984.xls   (with props)
    poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestLinkTable.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/testcases/org/apache/poi/hssf/usermodel/AllUserModelTests.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=659429&r1=659428&r2=659429&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/changes.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/changes.xml Thu May 22 22:28:54 2008
@@ -37,6 +37,7 @@
 
 		<!-- Don't forget to update status.xml too! -->
         <release version="3.1-final" date="2008-06-??">
+           <action dev="POI-DEVELOPERS" type="add">45046 - allowed EXTERNALBOOK(0x01AE) to be optional in the LinkTable</action>
            <action dev="POI-DEVELOPERS" type="add">45066 - fixed sheet encoding size mismatch problems</action>
            <action dev="POI-DEVELOPERS" type="add">45003 - Support embeded HDGF visio documents</action>
            <action dev="POI-DEVELOPERS" type="fix">45001 - Partial fix for HWPF Range.insertBefore() and Range.delete() with unicode characters</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=659429&r1=659428&r2=659429&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Thu May 22 22:28:54 2008
@@ -34,6 +34,7 @@
 	<!-- Don't forget to update changes.xml too! -->
     <changes>
         <release version="3.1-final" date="2008-06-??">
+           <action dev="POI-DEVELOPERS" type="add">45046 - allowed EXTERNALBOOK(0x01AE) to be optional in the LinkTable</action>
            <action dev="POI-DEVELOPERS" type="add">45066 - fixed sheet encoding size mismatch problems</action>
            <action dev="POI-DEVELOPERS" type="add">45003 - Support embeded HDGF visio documents</action>
            <action dev="POI-DEVELOPERS" type="fix">45001 - Partial fix for HWPF Range.insertBefore() and Range.delete() with unicode characters</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=659429&r1=659428&r2=659429&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 Thu May 22 22:28:54 2008
@@ -41,7 +41,7 @@
  *
  *  In BIFF8 the Link Table consists of
  *  <ul>
- *  <li>one or more EXTERNALBOOK Blocks<p/>
+ *  <li>zero or more EXTERNALBOOK Blocks<p/>
  *  	each consisting of
  *  	<ul>
  *  	<li>exactly one EXTERNALBOOK (0x01AE) record</li>
@@ -55,7 +55,7 @@
  *  	</li>
  *  	</ul>
  *  </li>
- *  <li>exactly one EXTERNSHEET (0x0017) record</li>
+ *  <li>zero or one EXTERNSHEET (0x0017) record</li>
  *  <li>zero or more DEFINEDNAME (0x0018) records</li>
  *  </ul>
  *
@@ -63,6 +63,7 @@
  * @author Josh Micich
  */
 final class LinkTable {
+	// TODO make this class into a record aggregate
 
 	private static final class CRNBlock {
 
@@ -79,8 +80,8 @@
 			_crns = crns;
 		}
 		public CRNRecord[] getCrns() {
-            return (CRNRecord[]) _crns.clone();
-        }
+			return (CRNRecord[]) _crns.clone();
+		}
 	}
 
 	private static final class ExternalBookBlock {
@@ -136,16 +137,19 @@
 		while(rs.peekNextClass() == SupBookRecord.class) {
 		   temp.add(new ExternalBookBlock(rs));
 		}
-		if(temp.size() < 1) {
-			throw new RuntimeException("Need at least one EXTERNALBOOK blocks");
-		}
+		
 		_externalBookBlocks = new ExternalBookBlock[temp.size()];
 		temp.toArray(_externalBookBlocks);
 		temp.clear();
-
-		// If link table is present, there is always 1 of ExternSheetRecord
-		Record next = rs.getNext();
-		_externSheetRecord = (ExternSheetRecord)next;
+		
+		if (_externalBookBlocks.length > 0) {
+			// If any ExternalBookBlock present, there is always 1 of ExternSheetRecord
+			Record next = rs.getNext();
+			_externSheetRecord = (ExternSheetRecord) next;
+		} else {
+			_externSheetRecord = null;
+		}
+		
 		_definedNames = new ArrayList();
 		// collect zero or more DEFINEDNAMEs id=0x18
 		while(rs.peekNextClass() == NameRecord.class) {
@@ -222,7 +226,7 @@
 	public void addName(NameRecord name) {
 		_definedNames.add(name);
 
-	   // TODO - this is messy
+		// TODO - this is messy
 		// Not the most efficient way but the other way was causing too many bugs
 		int idx = findFirstRecordLocBySid(ExternSheetRecord.sid);
 		if (idx == -1) idx = findFirstRecordLocBySid(SupBookRecord.sid);
@@ -242,8 +246,8 @@
 
 	public int getSheetIndexFromExternSheetIndex(int externSheetNumber) {
 		if (externSheetNumber >= _externSheetRecord.getNumOfREFStructures()) {
-            return -1;
-        }
+			return -1;
+		}
 		return _externSheetRecord.getREFRecordAt(externSheetNumber).getIndexToFirstSupBook();
 	}
 
@@ -265,7 +269,7 @@
 			ExternSheetSubRecord esr = _externSheetRecord.getREFRecordAt(i);
 
 			if (esr.getIndexToFirstSupBook() ==  sheetNumber
-			        && esr.getIndexToLastSupBook() == sheetNumber){
+					&& esr.getIndexToLastSupBook() == sheetNumber){
 				return i;
 			}
 		}

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=659429&r1=659428&r2=659429&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 Thu May 22 22:28:54 2008
@@ -191,12 +191,11 @@
                 case ExternSheetRecord.sid :
                     throw new RuntimeException("Extern sheet is part of LinkTable");
                 case NameRecord.sid :
-                    throw new RuntimeException("DEFINEDNAME is part of LinkTable");
                 case SupBookRecord.sid :
+                    // LinkTable can start with either of these
                     if (log.check( POILogger.DEBUG ))
                         log.log(DEBUG, "found SupBook record at " + k);
                     retval.linkTable = new LinkTable(recs, k, retval.records);
-                    //                    retval.records.supbookpos = k;
                     k+=retval.linkTable.getRecordCount() - 1;
                     continue;
                 case FormatRecord.sid :

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

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

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/AllUserModelTests.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/AllUserModelTests.java?rev=659429&r1=659428&r2=659429&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/AllUserModelTests.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/AllUserModelTests.java Thu May 22 22:28:54 2008
@@ -28,7 +28,7 @@
 public class AllUserModelTests {
 	
 	public static Test suite() {
-		TestSuite result = new TestSuite("Tests for org.apache.poi.hssf.usermodel");
+		TestSuite result = new TestSuite(AllUserModelTests.class.getName());
 		
 		result.addTestSuite(TestBugs.class);
 		result.addTestSuite(TestCellStyle.class);
@@ -58,6 +58,7 @@
 		result.addTestSuite(TestHSSFSheetSetOrder.class);
 		result.addTestSuite(TestHSSFTextbox.class);
 		result.addTestSuite(TestHSSFWorkbook.class);
+		result.addTestSuite(TestLinkTable.class);
 		result.addTestSuite(TestNamedRange.class);
 		result.addTestSuite(TestOLE2Embeding.class);
 		result.addTestSuite(TestPOIFSProperties.class);

Added: 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=659429&view=auto
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestLinkTable.java (added)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestLinkTable.java Thu May 22 22:28:54 2008
@@ -0,0 +1,44 @@
+package org.apache.poi.hssf.usermodel;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.TestCase;
+
+import org.apache.poi.hssf.HSSFTestDataSamples;
+/**
+ * Tests for LinkTable
+ * 
+ * @author Josh Micich
+ */
+public final class TestLinkTable extends TestCase {
+
+	/**
+	 * 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 
+	 */
+	public void testLinkTableWithoutExternalBookRecord_bug45046() {
+		HSSFWorkbook wb;
+
+		try {
+			wb = HSSFTestDataSamples.openSampleWorkbook("ex45046-21984.xls");
+		} catch (RuntimeException e) {
+			if ("DEFINEDNAME is part of LinkTable".equals(e.getMessage())) {
+				throw new AssertionFailedError("Identified bug 45046 b");
+			}
+			throw e;
+		}
+		// 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"); 
+			// This is observable in version 3.0
+		}
+		
+		assertEquals("ipcSummenproduktIntern($C5,N$2,$A$9,N$1)", formula);
+	}
+}



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