From: Josh Micich Date: Tue, 2 Dec 2008 08:46:13 +0000 (+0000) Subject: Final fix for bug 44914 - Removed warning message "WARN. Unread n bytes of record... X-Git-Tag: REL_3_5_BETA5~72 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=67653ff82223f622a6112dc4dd90703e1746673a;p=poi.git 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 --- 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 @@ + 44914 - Fixed warning message "WARN. Unread n bytes of record 0xNN" 46156 - Improved number to text conversion to be closer to that of Excel 46312 - Fixed ValueRecordsAggregate to handle removal of new empty row 46269 - Improved error message when attempting to read BIFF2 file 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 @@ + 44914 - Fixed warning message "WARN. Unread n bytes of record 0xNN" 46156 - Improved number to text conversion to be closer to that of Excel 46312 - Fixed ValueRecordsAggregate to handle removal of new empty row 46269 - Improved error message when attempting to read BIFF2 file 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 temp = new ArrayList(); 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();