]> source.dussan.org Git - poi.git/commitdiff
Final fix for bug 44914 - Removed warning message "WARN. Unread n bytes of record...
authorJosh Micich <josh@apache.org>
Tue, 2 Dec 2008 08:46:13 +0000 (08:46 +0000)
committerJosh Micich <josh@apache.org>
Tue, 2 Dec 2008 08:46:13 +0000 (08:46 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@722401 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/changes.xml
src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/dev/BiffViewer.java
src/java/org/apache/poi/hssf/record/RecordInputStream.java

index 1e11f2a4bc5617a65bbc4a36ea2c5a3c5a5f5574..5c5a22fe0d4f38e39b426ba1f9774041482199e7 100644 (file)
@@ -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">44914 - Fixed warning message "WARN. Unread n bytes of record 0xNN"</action>
            <action dev="POI-DEVELOPERS" type="add">46156 - Improved number to text conversion to be closer to that of Excel</action>
            <action dev="POI-DEVELOPERS" type="fix">46312 - Fixed ValueRecordsAggregate to handle removal of new empty row</action>
            <action dev="POI-DEVELOPERS" type="add">46269 - Improved error message when attempting to read BIFF2 file</action>
index d1d819ad44b9228ac7bbcc2ef86ace8a3224d346..55d983264383cb7267bedf63df47039ad1c9e71c 100644 (file)
@@ -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">44914 - Fixed warning message "WARN. Unread n bytes of record 0xNN"</action>
            <action dev="POI-DEVELOPERS" type="add">46156 - Improved number to text conversion to be closer to that of Excel</action>
            <action dev="POI-DEVELOPERS" type="fix">46312 - Fixed ValueRecordsAggregate to handle removal of new empty row</action>
            <action dev="POI-DEVELOPERS" type="add">46269 - Improved error message when attempting to read BIFF2 file</action>
index f05b6ac806ead5488750e98000117a62bfafa6a2..264aa6d7f811c623fd82d82b63ed84ec9a93df85 100644 (file)
@@ -31,6 +31,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.poi.hssf.record.*;
+import org.apache.poi.hssf.record.RecordInputStream.LeftoverDataException;
 import org.apache.poi.hssf.record.chart.*;
 import org.apache.poi.hssf.record.pivottable.*;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
@@ -63,7 +64,19 @@ public final class BiffViewer {
                List<Record> temp = new ArrayList<Record>();
 
                RecordInputStream recStream = new RecordInputStream(is);
-               while (recStream.hasNextRecord()) {
+               while (true) {
+                       boolean hasNext;
+                       try {
+                               hasNext = recStream.hasNextRecord();
+                       } catch (LeftoverDataException e) {
+                               e.printStackTrace();
+                               System.err.println("Discarding " + recStream.remaining() + " bytes and continuing");
+                               recStream.readRemainder();
+                               hasNext = recStream.hasNextRecord();
+                       }
+                       if (!hasNext) {
+                               break;
+                       }
                        recStream.nextRecord();
                        if (recStream.getSid() == 0) {
                                continue;
index b7b47ffd6d6013194ce5127bf2c924e4d12de84e..d61d04af94f1b0591fd4dc0f268617376336a866 100755 (executable)
@@ -20,6 +20,7 @@ package org.apache.poi.hssf.record;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 
+import org.apache.poi.hssf.dev.BiffViewer;
 import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.LittleEndianInput;
 import org.apache.poi.util.LittleEndianInputStream;
@@ -40,6 +41,17 @@ public final class RecordInputStream extends InputStream implements LittleEndian
         */
        private static final int DATA_LEN_NEEDS_TO_BE_READ = -1;
        private static final byte[] EMPTY_BYTE_ARRAY = { };
+       
+       /**
+        * For use in {@link BiffViewer} which may construct {@link Record}s that don't completely
+        * read all available data.  This exception should never be thrown otherwise.
+        */
+       public static final class LeftoverDataException extends RuntimeException {
+               public LeftoverDataException(int sid, int remainingByteCount) {
+                       super("Initialisation of record 0x" + Integer.toHexString(sid).toUpperCase() 
+                                       + " left " + remainingByteCount + " bytes remaining still to be read.");
+               }
+       }
 
        /** {@link LittleEndianInput} facet of the wrapped {@link InputStream} */
        private final LittleEndianInput _le;
@@ -102,17 +114,14 @@ public final class RecordInputStream extends InputStream implements LittleEndian
        }
 
        /**
-        * Note - this method is expected to be called only when completed reading the current BIFF record.
-        * Calling this before reaching the end of the current record will cause all remaining data to be
-        * discarded
+        * Note - this method is expected to be called only when completed reading the current BIFF 
+        * record.
+        * @throws LeftoverDataException if this method is called before reaching the end of the 
+        * current record.
         */
-       public boolean hasNextRecord() {
+       public boolean hasNextRecord() throws LeftoverDataException {
                if (_currentDataLength != -1 && _currentDataLength != _currentDataOffset) {
-                       System.out.println("WARN. Unread "+remaining()+" bytes of record 0x"+Integer.toHexString(_currentSid));
-                       // discard unread data
-                       while (_currentDataOffset < _currentDataLength) {
-                               readByte();
-                       }
+                       throw new LeftoverDataException(_currentSid, remaining());
                }
                if (_currentDataLength != DATA_LEN_NEEDS_TO_BE_READ) {
                        _nextSid = readNextSid();