aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Micich <josh@apache.org>2008-12-02 08:46:13 +0000
committerJosh Micich <josh@apache.org>2008-12-02 08:46:13 +0000
commit67653ff82223f622a6112dc4dd90703e1746673a (patch)
tree8d5ccc054acdd55094c69532d7740761de130497
parente8a4df9090d9d18c644897128c8e3c95bc7121f6 (diff)
downloadpoi-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.xml1
-rw-r--r--src/documentation/content/xdocs/status.xml1
-rw-r--r--src/java/org/apache/poi/hssf/dev/BiffViewer.java15
-rwxr-xr-xsrc/java/org/apache/poi/hssf/record/RecordInputStream.java27
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();