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 2009/01/17 00:13:12 UTC

svn commit: r735179 - in /poi/trunk/src: documentation/content/xdocs/ java/org/apache/poi/hssf/model/ java/org/apache/poi/hssf/record/ java/org/apache/poi/hssf/record/aggregates/ testcases/org/apache/poi/hssf/data/ testcases/org/apache/poi/hssf/model/ ...

Author: josh
Date: Fri Jan 16 15:13:11 2009
New Revision: 735179

URL: http://svn.apache.org/viewvc?rev=735179&view=rev
Log:
Bug 46548 - fixes for Print Settings Block (patch from Dmitriy Kumshayev + some mods)

Added:
    poi/trunk/src/testcases/org/apache/poi/hssf/data/ex46548-23133.xls   (with props)
    poi/trunk/src/testcases/org/apache/poi/hssf/record/aggregates/TestPageSettingBlock.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/Sheet.java
    poi/trunk/src/java/org/apache/poi/hssf/record/BOFRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/UnknownRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/PageSettingsBlock.java
    poi/trunk/src/testcases/org/apache/poi/hssf/model/TestSheet.java
    poi/trunk/src/testcases/org/apache/poi/hssf/record/aggregates/AllRecordAggregateTests.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=735179&r1=735178&r2=735179&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/changes.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/changes.xml Fri Jan 16 15:13:11 2009
@@ -37,6 +37,7 @@
 
 		<!-- Don't forget to update status.xml too! -->
         <release version="3.5-beta5" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">46548 - Print Settings Block fixes - continued PLS records and PSB in sheet sub-streams</action>
            <action dev="POI-DEVELOPERS" type="add">46523 - added implementation for SUMIF function</action>
            <action dev="POI-DEVELOPERS" type="add">Support for reading HSSF column styles</action>
            <action dev="POI-DEVELOPERS" type="fix">Hook up POIXMLTextExtractor.getMetadataTextExtractor() to the already written POIXMLPropertiesTextExtractor</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=735179&r1=735178&r2=735179&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Fri Jan 16 15:13:11 2009
@@ -34,6 +34,7 @@
 	<!-- Don't forget to update changes.xml too! -->
     <changes>
         <release version="3.5-beta5" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">46548 - Print Settings Block fixes - continued PLS records and PSB in sheet sub-streams</action>
            <action dev="POI-DEVELOPERS" type="add">46523 - added implementation for SUMIF function</action>
            <action dev="POI-DEVELOPERS" type="add">Support for reading HSSF column styles</action>
            <action dev="POI-DEVELOPERS" type="fix">Hook up POIXMLTextExtractor.getMetadataTextExtractor() to the already written POIXMLPropertiesTextExtractor</action>

Modified: poi/trunk/src/java/org/apache/poi/hssf/model/Sheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/Sheet.java?rev=735179&r1=735178&r2=735179&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/Sheet.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/Sheet.java Fri Jan 16 15:13:11 2009
@@ -56,6 +56,7 @@
 import org.apache.poi.hssf.record.ScenarioProtectRecord;
 import org.apache.poi.hssf.record.SelectionRecord;
 import org.apache.poi.hssf.record.UncalcedRecord;
+import org.apache.poi.hssf.record.UnknownRecord;
 import org.apache.poi.hssf.record.WSBoolRecord;
 import org.apache.poi.hssf.record.WindowTwoRecord;
 import org.apache.poi.hssf.record.aggregates.ColumnInfoRecordsAggregate;
@@ -163,9 +164,18 @@
 
         records            = new ArrayList<RecordBase>(128);
         // TODO - take chart streams off into separate java objects
-        int       bofEofNestingLevel = 0;  // nesting level can only get to 2 (when charts are present)
+        int       bofEofNestingLevel = 1;  // nesting level can only get to 2 (when charts are present)
         int dimsloc = -1;
 
+        if (rs.peekNextSid() == BOFRecord.sid) {
+            BOFRecord bof = (BOFRecord) rs.getNext();
+            if (bof.getType() != BOFRecord.TYPE_WORKSHEET) {
+                // TODO - fix junit tests throw new RuntimeException("Bad BOF record type");
+            }
+            records.add(bof);
+        } else {
+            throw new RuntimeException("BOF record expected");
+        }
         while (rs.hasNext()) {
             int recSid = rs.peekNextSid();
 
@@ -200,12 +210,34 @@
 
             if (PageSettingsBlock.isComponentRecord(recSid)) {
                 PageSettingsBlock psb = new PageSettingsBlock(rs);
-                if (bofEofNestingLevel == 1) {
-                    if (_psBlock == null) {
-                        _psBlock = psb;
+                if (_psBlock == null) {
+                    _psBlock = psb;
+                } else {
+                    if (bofEofNestingLevel == 2) {
+                        // It's normal for a chart to have its own PageSettingsBlock
+                        // Fall through and add psb here, because chart records 
+                        // are stored loose among the sheet records.
+                        // this latest psb does not clash with _psBlock
+                    } else if (windowTwo != null) {
+                        // probably 'Custom View Settings' sub-stream which is found between
+                        // USERSVIEWBEGIN(01AA) and USERSVIEWEND(01AB)
+                        // This happens three times in test sample file "29982.xls"
+                         if (rs.peekNextSid() != UnknownRecord.USERSVIEWEND_01AB) {
+                            // not quite the expected situation
+                            throw new RuntimeException("two Page Settings Blocks found in the same sheet");
+                        }
                     } else {
-                        // more than one 'Page Settings Block' at nesting level 1 ?
-                        // apparently this happens in about 15 test sample files
+                            // Some apps write PLS, WSBOOL, <psb> but PLS is part of <psb>
+                            // This happens in the test sample file "NoGutsRecords.xls" and "WORKBOOK_in_capitals.xls"
+                            // In this case the first PSB is two records back
+                            int prevPsbIx = records.size()-2;
+                            if (_psBlock != records.get(prevPsbIx) || !(records.get(prevPsbIx+1) instanceof WSBoolRecord)) {
+                                // not quite the expected situation
+                                throw new RuntimeException("two Page Settings Blocks found in the same sheet");
+                            }
+                            records.remove(prevPsbIx); // WSBOOL will drop down one position.
+                            psb = mergePSBs(_psBlock, psb);
+                            _psBlock = psb;
                     }
                 }
                 records.add(psb);
@@ -332,7 +364,34 @@
         if (log.check( POILogger.DEBUG ))
             log.log(POILogger.DEBUG, "sheet createSheet (existing file) exited");
     }
+    /**
+     * Hack to recover from the situation where the page settings block has been split by
+     * an intervening {@link WSBoolRecord}
+     */
+    private static PageSettingsBlock mergePSBs(PageSettingsBlock a, PageSettingsBlock b) {
+        List<Record> temp = new ArrayList<Record>();
+        RecordTransferrer rt = new RecordTransferrer(temp);
+        a.visitContainedRecords(rt);
+        b.visitContainedRecords(rt);
+        RecordStream rs = new RecordStream(temp, 0);
+        PageSettingsBlock result = new PageSettingsBlock(rs);
+        if (rs.hasNext()) {
+            throw new RuntimeException("PageSettingsBlocks did not merge properly");
+        }
+        return result;
+    }
 
+    private static final class RecordTransferrer  implements RecordVisitor {
+
+        private final List<Record> _destList;
+
+        public RecordTransferrer(List<Record> destList) {
+            _destList = destList;
+        }
+        public void visitRecord(Record r) {
+            _destList.add(r);
+        }
+    }
     private static final class RecordCloner implements RecordVisitor {
 
         private final List<RecordBase> _destList;

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/BOFRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/BOFRecord.java?rev=735179&r1=735178&r2=735179&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/BOFRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/BOFRecord.java Fri Jan 16 15:13:11 2009
@@ -20,6 +20,8 @@
 import org.apache.poi.util.HexDump;
 import org.apache.poi.util.LittleEndianOutput;
 
+import com.sun.java_cup.internal.version;
+
 /**
  * Title: Beginning Of File (0x0809)<P>
  * Description: Somewhat of a misnomer, its used for the beginning of a set of
@@ -35,8 +37,8 @@
      */
     public final static short sid = 0x809;
 
-    /** suggested default (0x06 - BIFF8) */
-    public final static int VERSION             = 0x06;
+    /** suggested default (0x0600 - BIFF8) */
+    public final static int VERSION             = 0x0600;
     /** suggested default 0x10d3 */
     public final static int BUILD               = 0x10d3;
     /** suggested default  0x07CC (1996) */
@@ -63,6 +65,19 @@
      */
     public BOFRecord() {
     }
+    
+    private BOFRecord(int type) {
+        field_1_version = VERSION;
+        field_2_type = type;
+        field_3_build = BUILD;
+        field_4_year = BUILD_YEAR;
+        field_5_history = 0x01;
+        field_6_rversion = VERSION;
+    }
+    
+    public static BOFRecord createSheetBOF() {
+        return new BOFRecord(TYPE_WORKSHEET);
+    }
 
     public BOFRecord(RecordInputStream in) {
         field_1_version  = in.readShort();

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/UnknownRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/UnknownRecord.java?rev=735179&r1=735178&r2=735179&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/UnknownRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/UnknownRecord.java Fri Jan 16 15:13:11 2009
@@ -42,6 +42,8 @@
 	public static final int BITMAP_00E9          = 0x00E9;
 	public static final int PHONETICPR_00EF      = 0x00EF;
 	public static final int LABELRANGES_015F     = 0x015F;
+	public static final int USERSVIEWBEGIN_01AA  = 0x01AA;
+	public static final int USERSVIEWEND_01AB    = 0x01AB;
 	public static final int QUICKTIP_0800        = 0x0800;
 	public static final int SHEETEXT_0862        = 0x0862; // OOO calls this SHEETLAYOUT
 	public static final int SHEETPROTECTION_0867 = 0x0867;
@@ -145,8 +147,8 @@
 			case LABELRANGES_015F: return "LABELRANGES";
 			case 0x01BA: return "CODENAME";
 			case 0x01A9: return "USERBVIEW";
-			case 0x01AA: return "USERSVIEWBEGIN";
-			case 0x01AB: return "USERSVIEWEND";
+			case USERSVIEWBEGIN_01AA: return "USERSVIEWBEGIN";
+			case USERSVIEWEND_01AB: return "USERSVIEWEND";
 			case 0x01AD: return "QSI";
 
 			case 0x01C0: return "EXCEL9FILE";

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/PageSettingsBlock.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/PageSettingsBlock.java?rev=735179&r1=735178&r2=735179&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/PageSettingsBlock.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/PageSettingsBlock.java Fri Jan 16 15:13:11 2009
@@ -19,11 +19,13 @@
 
 import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 
 import org.apache.poi.hssf.model.RecordStream;
 import org.apache.poi.hssf.model.Sheet;
 import org.apache.poi.hssf.record.BottomMarginRecord;
+import org.apache.poi.hssf.record.ContinueRecord;
 import org.apache.poi.hssf.record.FooterRecord;
 import org.apache.poi.hssf.record.HCenterRecord;
 import org.apache.poi.hssf.record.HeaderRecord;
@@ -60,6 +62,13 @@
 	private TopMarginRecord _topMargin;
 	private BottomMarginRecord _bottomMargin;
 	private Record _pls;
+	/**
+	 * holds any continue records found after the PLS record.<br/>
+	 * This would not be required if PLS was properly interpreted.
+	 * Currently, PLS is an {@link UnknownRecord} and does not automatically
+	 * include any trailing {@link ContinueRecord}s.
+	 */
+	private List<ContinueRecord> _plsContinues;
 	private PrintSetupRecord printSetup;
 	private Record _bitmap;
 
@@ -140,13 +149,19 @@
 			case BottomMarginRecord.sid:
 				_bottomMargin = (BottomMarginRecord) rs.getNext();
 				break;
-			case 0x004D: // PLS
+			case UnknownRecord.PLS_004D:
 				_pls = rs.getNext();
+				while (rs.peekNextSid()==ContinueRecord.sid) {
+					if (_plsContinues==null) {
+						_plsContinues = new LinkedList<ContinueRecord>();
+					}
+					_plsContinues.add((ContinueRecord)rs.getNext());
+				}
 				break;
 			case PrintSetupRecord.sid:
 				printSetup = (PrintSetupRecord)rs.getNext();
 				break;
-			case 0x00E9: // BITMAP
+			case UnknownRecord.BITMAP_00E9:
 				_bitmap = rs.getNext();
 				break;
 			default:
@@ -202,6 +217,11 @@
 		visitIfPresent(_topMargin, rv);
 		visitIfPresent(_bottomMargin, rv);
 		visitIfPresent(_pls, rv);
+		if (_plsContinues != null) {
+			for (ContinueRecord cr : _plsContinues) {
+				visitIfPresent(cr, rv);
+			}
+		}
 		visitIfPresent(printSetup, rv);
 		visitIfPresent(_bitmap, rv);
 	}
@@ -335,58 +355,51 @@
 	 * @param margin which margin to get
 	 * @return the size of the margin
 	 */
-   public double getMargin(short margin) {
-	   Margin m = getMarginRec(margin);
-	   if (m != null) {
-		return m.getMargin();
-	} else {
-	   switch ( margin )
-	   {
-	   case Sheet.LeftMargin:
-		   return .75;
-	   case Sheet.RightMargin:
-		   return .75;
-	   case Sheet.TopMargin:
-		   return 1.0;
-	   case Sheet.BottomMargin:
-		   return 1.0;
-	   }
+	public double getMargin(short margin) {
+		Margin m = getMarginRec(margin);
+		if (m != null) {
+			return m.getMargin();
+		}
+		switch (margin) {
+			case Sheet.LeftMargin:   return .75;
+			case Sheet.RightMargin:  return .75;
+			case Sheet.TopMargin:    return 1.0;
+			case Sheet.BottomMargin: return 1.0;
+		}
 		throw new RuntimeException( "Unknown margin constant:  " + margin );
-   }
-   }
+	}
 
 	/**
 	 * Sets the size of the margin in inches.
 	 * @param margin which margin to get
 	 * @param size the size of the margin
 	 */
-   public void setMargin(short margin, double size) {
-   Margin m = getMarginRec(margin);
-   if (m  == null) {
-	   switch ( margin )
-	   {
-	   case Sheet.LeftMargin:
-		   _leftMargin = new LeftMarginRecord();
-		   m = _leftMargin;
-		   break;
-	   case Sheet.RightMargin:
-		   _rightMargin = new RightMarginRecord();
-		   m = _rightMargin;
-		   break;
-	   case Sheet.TopMargin:
-		   _topMargin = new TopMarginRecord();
-		   m = _topMargin;
-		   break;
-	   case Sheet.BottomMargin:
-		   _bottomMargin = new BottomMarginRecord();
-		   m = _bottomMargin;
-		   break;
-	   default :
-		   throw new RuntimeException( "Unknown margin constant:  " + margin );
-	   }
-   }
-   m.setMargin( size );
-   }
+	public void setMargin(short margin, double size) {
+		Margin m = getMarginRec(margin);
+		if (m  == null) {
+			switch (margin) {
+				case Sheet.LeftMargin:
+					_leftMargin = new LeftMarginRecord();
+					m = _leftMargin;
+					break;
+				case Sheet.RightMargin:
+					_rightMargin = new RightMarginRecord();
+					m = _rightMargin;
+					break;
+				case Sheet.TopMargin:
+					_topMargin = new TopMarginRecord();
+					m = _topMargin;
+					break;
+				case Sheet.BottomMargin:
+					_bottomMargin = new BottomMarginRecord();
+					m = _bottomMargin;
+					break;
+				default :
+					throw new RuntimeException( "Unknown margin constant:  " + margin );
+			}
+		}
+		m.setMargin( size );
+	}
 
 	/**
 	 * Shifts all the page breaks in the range "count" number of rows/columns

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

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

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/model/TestSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/model/TestSheet.java?rev=735179&r1=735178&r2=735179&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/model/TestSheet.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/model/TestSheet.java Fri Jan 16 15:13:11 2009
@@ -68,7 +68,7 @@
     public void testCreateSheet() {
         // Check we're adding row and cell aggregates
         List<Record> records = new ArrayList<Record>();
-        records.add( new BOFRecord() );
+        records.add(BOFRecord.createSheetBOF());
         records.add( new DimensionsRecord() );
         records.add(createWindow2Record());
         records.add(EOFRecord.instance);
@@ -187,6 +187,7 @@
             new CellRangeAddress(0, 1, 0, 2),
         };
         MergeCellsRecord merged = new MergeCellsRecord(cras, 0, cras.length);
+        records.add(BOFRecord.createSheetBOF());
         records.add(new DimensionsRecord());
         records.add(new RowRecord(0));
         records.add(new RowRecord(1));
@@ -449,7 +450,7 @@
     public void testUncalcSize_bug45066() {
 
         List<Record> records = new ArrayList<Record>();
-        records.add(new BOFRecord());
+        records.add(BOFRecord.createSheetBOF());
         records.add(new UncalcedRecord());
         records.add(new DimensionsRecord());
         records.add(createWindow2Record());
@@ -600,7 +601,7 @@
         nr.setValue(3.0);
 
         List<Record> inRecs = new ArrayList<Record>();
-        inRecs.add(new BOFRecord());
+        inRecs.add(BOFRecord.createSheetBOF());
         inRecs.add(new RowRecord(rowIx));
         inRecs.add(nr);
         inRecs.add(createWindow2Record());

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/aggregates/AllRecordAggregateTests.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/aggregates/AllRecordAggregateTests.java?rev=735179&r1=735178&r2=735179&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/aggregates/AllRecordAggregateTests.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/aggregates/AllRecordAggregateTests.java Fri Jan 16 15:13:11 2009
@@ -1,41 +1,42 @@
-/* ====================================================================
-   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.record.aggregates;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Collects all tests for package <tt>org.apache.poi.hssf.record.aggregates</tt>.
- * 
- * @author Josh Micich
- */
-public final class AllRecordAggregateTests {
-	
-	public static Test suite() {
-		TestSuite result = new TestSuite(AllRecordAggregateTests.class.getName());
-
-		result.addTestSuite(TestCFRecordsAggregate.class);
-		result.addTestSuite(TestColumnInfoRecordsAggregate.class);
-		result.addTestSuite(TestFormulaRecordAggregate.class);
-		result.addTestSuite(TestRowRecordsAggregate.class);
-		result.addTestSuite(TestSharedValueManager.class);
-		result.addTestSuite(TestValueRecordsAggregate.class);
-		return result;
-	}
-}
+/* ====================================================================
+   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.record.aggregates;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * Collects all tests for package <tt>org.apache.poi.hssf.record.aggregates</tt>.
+ * 
+ * @author Josh Micich
+ */
+public final class AllRecordAggregateTests {
+	
+	public static Test suite() {
+		TestSuite result = new TestSuite(AllRecordAggregateTests.class.getName());
+
+		result.addTestSuite(TestCFRecordsAggregate.class);
+		result.addTestSuite(TestColumnInfoRecordsAggregate.class);
+		result.addTestSuite(TestFormulaRecordAggregate.class);
+		result.addTestSuite(TestRowRecordsAggregate.class);
+		result.addTestSuite(TestSharedValueManager.class);
+		result.addTestSuite(TestValueRecordsAggregate.class);
+		result.addTestSuite(TestPageSettingBlock.class);
+		return result;
+	}
+}

Added: poi/trunk/src/testcases/org/apache/poi/hssf/record/aggregates/TestPageSettingBlock.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/aggregates/TestPageSettingBlock.java?rev=735179&view=auto
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/aggregates/TestPageSettingBlock.java (added)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/aggregates/TestPageSettingBlock.java Fri Jan 16 15:13:11 2009
@@ -0,0 +1,50 @@
+/* ====================================================================
+   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.record.aggregates;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.TestCase;
+
+import org.apache.poi.hssf.HSSFTestDataSamples;
+import org.apache.poi.hssf.usermodel.HSSFPrintSetup;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+
+/**
+ * Tess for {@link PageSettingsBlock}
+ * 
+ * @author Dmitriy Kumshayev
+ */
+public final class TestPageSettingBlock extends TestCase {
+	
+	public void testPrintSetup_bug46548() {
+		
+		// PageSettingBlock in this file contains PLS (sid=x004D) record 
+		// followed by ContinueRecord (sid=x003C)  
+		HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("ex46548-23133.xls");
+		HSSFSheet sheet = wb.getSheetAt(0);
+		HSSFPrintSetup ps = sheet.getPrintSetup();
+		
+		try {
+			ps.getCopies();
+		} catch (NullPointerException e) {
+			e.printStackTrace();
+			throw new AssertionFailedError("Identified bug 46548: PageSettingBlock missing PrintSetupRecord record");
+		}
+	}
+}



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