diff options
author | Josh Micich <josh@apache.org> | 2008-12-02 08:46:13 +0000 |
---|---|---|
committer | Josh Micich <josh@apache.org> | 2008-12-02 08:46:13 +0000 |
commit | 67653ff82223f622a6112dc4dd90703e1746673a (patch) | |
tree | 8d5ccc054acdd55094c69532d7740761de130497 | |
parent | e8a4df9090d9d18c644897128c8e3c95bc7121f6 (diff) | |
download | poi-67653ff82223f622a6112dc4dd90703e1746673a.tar.gz poi-67653ff82223f622a6112dc4dd90703e1746673a.zip |
Final fix for bug 44914 - Removed warning message "WARN. Unread n bytes of record 0xNN"
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@722401 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | src/documentation/content/xdocs/changes.xml | 1 | ||||
-rw-r--r-- | src/documentation/content/xdocs/status.xml | 1 | ||||
-rw-r--r-- | src/java/org/apache/poi/hssf/dev/BiffViewer.java | 15 | ||||
-rwxr-xr-x | src/java/org/apache/poi/hssf/record/RecordInputStream.java | 27 |
4 files changed, 34 insertions, 10 deletions
diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index 1e11f2a4bc..5c5a22fe0d 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -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> diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index d1d819ad44..55d9832643 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -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> diff --git a/src/java/org/apache/poi/hssf/dev/BiffViewer.java b/src/java/org/apache/poi/hssf/dev/BiffViewer.java index f05b6ac806..264aa6d7f8 100644 --- a/src/java/org/apache/poi/hssf/dev/BiffViewer.java +++ b/src/java/org/apache/poi/hssf/dev/BiffViewer.java @@ -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; diff --git a/src/java/org/apache/poi/hssf/record/RecordInputStream.java b/src/java/org/apache/poi/hssf/record/RecordInputStream.java index b7b47ffd6d..d61d04af94 100755 --- a/src/java/org/apache/poi/hssf/record/RecordInputStream.java +++ b/src/java/org/apache/poi/hssf/record/RecordInputStream.java @@ -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(); |