Author: nick Date: Thu Mar 6 07:54:06 2008 New Revision: 634318 URL: http://svn.apache.org/viewvc?rev=634318&view=rev Log: Change the behaviour on short last blocks to be a warning not an exception, as some people seem to have "real" valid files that trigger this. Fixed bug #28231
Added: poi/trunk/src/testcases/org/apache/poi/util/DummyPOILogger.java (with props) Modified: poi/trunk/src/documentation/content/xdocs/changes.xml poi/trunk/src/documentation/content/xdocs/status.xml poi/trunk/src/java/org/apache/poi/poifs/storage/RawDataBlock.java poi/trunk/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlock.java poi/trunk/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlockList.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=634318&r1=634317&r2=634318&view=diff ============================================================================== --- poi/trunk/src/documentation/content/xdocs/changes.xml (original) +++ poi/trunk/src/documentation/content/xdocs/changes.xml Thu Mar 6 07:54:06 2008 @@ -36,6 +36,7 @@ <!-- Don't forget to update status.xml too! --> <release version="3.1-beta1" date="2008-??-??"> + <action dev="POI-DEVELOPERS" type="fix">28231 - For apparently truncated files, which are somehow still valid, now issue a truncation warning but carry on, rather than giving an exception as before</action> <action dev="POI-DEVELOPERS" type="fix">44504 - Added initial support for recognising external functions like YEARFRAC and ISEVEN (using NameXPtg), via LinkTable support</action> <action dev="POI-DEVELOPERS" type="fix">44504 - Improvements to FormulaParser - operators, precedence, error literals, quotes in string literals, range checking on IntPtg, formulas with extra un-parsed stuff at the end, improved parse error handling</action> <action dev="POI-DEVELOPERS" type="fix">44504 - Fixed number conversion inconsistencies in many functions, and improved RefEval</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=634318&r1=634317&r2=634318&view=diff ============================================================================== --- poi/trunk/src/documentation/content/xdocs/status.xml (original) +++ poi/trunk/src/documentation/content/xdocs/status.xml Thu Mar 6 07:54:06 2008 @@ -36,6 +36,9 @@ <action dev="POI-DEVELOPERS" type="fix">44504 - Added initial support for recognising external functions like YEARFRAC and ISEVEN (using NameXPtg), via LinkTable support</action> <action dev="POI-DEVELOPERS" type="fix">44504 - Improvements to FormulaParser - operators, precedence, error literals, quotes in string literals, range checking on IntPtg, formulas with extra un-parsed stuff at the end, improved parse error handling</action> <action dev="POI-DEVELOPERS" type="fix">44504 - Fixed number conversion inconsistencies in many functions, and improved RefEval</action> + <action dev="POI-DEVELOPERS" type="fix">44504 - Added initial support for recognising external functions like YEARFRAC and ISEVEN (using NameXPtg), via LinkTable support</action> + <action dev="POI-DEVELOPERS" type="fix">44504 - Improvements to FormulaParser - operators, precedence, error literals, quotes in string literals, range checking on IntPtg, formulas with extra un-parsed stuff at the end, improved parse error handling</action> + <action dev="POI-DEVELOPERS" type="fix">44504 - Fixed number conversion inconsistencies in many functions, and improved RefEval</action> <action dev="POI-DEVELOPERS" type="fix">44508 - Fix formula evaluation with evaluateInCell on boolean formulas</action> <action dev="POI-DEVELOPERS" type="fix">44510 - Fix how DVALRecord works with dropdowns</action> <action dev="POI-DEVELOPERS" type="fix">44495 - Handle named cell ranges in formulas that have lower case parts</action> Modified: poi/trunk/src/java/org/apache/poi/poifs/storage/RawDataBlock.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/storage/RawDataBlock.java?rev=634318&r1=634317&r2=634318&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/poifs/storage/RawDataBlock.java (original) +++ poi/trunk/src/java/org/apache/poi/poifs/storage/RawDataBlock.java Thu Mar 6 07:54:06 2008 @@ -21,6 +21,8 @@ import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.util.IOUtils; +import org.apache.poi.util.POILogFactory; +import org.apache.poi.util.POILogger; import java.io.*; @@ -35,6 +37,7 @@ { private byte[] _data; private boolean _eof; + private static POILogger log = POILogFactory.getLogger(RawDataBlock.class); /** * Constructor RawDataBlock @@ -75,9 +78,12 @@ String type = " byte" + ((count == 1) ? ("") : ("s")); - throw new IOException("Unable to read entire block; " + count - + type + " read before EOF; expected " - + blockSize + " bytes"); + log.log(POILogger.ERROR, + "Unable to read entire block; " + count + + type + " read before EOF; expected " + + blockSize + " bytes. Your document" + + " has probably been truncated!" + ); } else { _eof = false; Modified: poi/trunk/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlock.java URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlock.java?rev=634318&r1=634317&r2=634318&view=diff ============================================================================== --- poi/trunk/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlock.java (original) +++ poi/trunk/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlock.java Thu Mar 6 07:54:06 2008 @@ -22,6 +22,9 @@ import java.io.*; import java.util.Random; +import org.apache.poi.util.DummyPOILogger; +import org.apache.poi.util.POILogFactory; + import junit.framework.*; /** @@ -43,6 +46,13 @@ public TestRawDataBlock(String name) { super(name); + + // We always want to use our own + // logger + System.setProperty( + "org.apache.poi.util.POILogger", + "org.apache.poi.util.DummyPOILogger" + ); } /** @@ -99,11 +109,19 @@ /** * Test creating a short RawDataBlock + * Will trigger a warning, but no longer an IOException, + * as people seem to have "valid" truncated files */ - - public void testShortConstructor() + public void testShortConstructor() throws Exception { - for (int k = 1; k < 512; k++) + // Get the logger to be used + DummyPOILogger logger = (DummyPOILogger)POILogFactory.getLogger( + RawDataBlock.class + ); + assertEquals(0, logger.logged.size()); + + // Test for various data sizes + for (int k = 1; k <= 512; k++) { byte[] data = new byte[ k ]; @@ -112,16 +130,33 @@ data[ j ] = ( byte ) j; } RawDataBlock block = null; - - try - { - block = new RawDataBlock(new ByteArrayInputStream(data)); - fail("Should have thrown IOException creating short block"); - } - catch (IOException ignored) - { - - // as expected + + logger.reset(); + assertEquals(0, logger.logged.size()); + + // Have it created + block = new RawDataBlock(new ByteArrayInputStream(data)); + assertNotNull(block); + + // Check for the warning is there for <512 + if(k < 512) { + assertEquals( + "Warning on " + k + " byte short block", + 1, logger.logged.size() + ); + + // Build the expected warning message, and check + String bts = k + " byte"; + if(k > 1) { + bts += "s"; + } + + assertEquals( + "7 - Unable to read entire block; "+bts+" read before EOF; expected 512 bytes. Your document has probably been truncated!", + (String)(logger.logged.get(0)) + ); + } else { + assertEquals(0, logger.logged.size()); } } } @@ -132,6 +167,13 @@ * incorrectly think that there's not enough data */ public void testSlowInputStream() throws Exception { + // Get the logger to be used + DummyPOILogger logger = (DummyPOILogger)POILogFactory.getLogger( + RawDataBlock.class + ); + assertEquals(0, logger.logged.size()); + + // Test for various ok data sizes for (int k = 1; k < 512; k++) { byte[] data = new byte[ 512 ]; for (int j = 0; j < data.length; j++) { @@ -153,14 +195,17 @@ data[j] = (byte) j; } - // Shouldn't complain, as there is enough data - try { - RawDataBlock block = - new RawDataBlock(new SlowInputStream(data, k)); - fail(); - } catch(IOException e) { - // as expected - } + logger.reset(); + assertEquals(0, logger.logged.size()); + + // Should complain, as there isn't enough data + RawDataBlock block = + new RawDataBlock(new SlowInputStream(data, k)); + assertNotNull(block); + assertEquals( + "Warning on " + k + " byte short block", + 1, logger.logged.size() + ); } } Modified: poi/trunk/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlockList.java URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlockList.java?rev=634318&r1=634317&r2=634318&view=diff ============================================================================== --- poi/trunk/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlockList.java (original) +++ poi/trunk/src/testcases/org/apache/poi/poifs/storage/TestRawDataBlockList.java Thu Mar 6 07:54:06 2008 @@ -21,6 +21,9 @@ import java.io.*; +import org.apache.poi.util.DummyPOILogger; +import org.apache.poi.util.POILogFactory; + import junit.framework.*; /** @@ -42,6 +45,13 @@ public TestRawDataBlockList(String name) { super(name); + + // We always want to use our own + // logger + System.setProperty( + "org.apache.poi.util.POILogger", + "org.apache.poi.util.DummyPOILogger" + ); } /** @@ -78,8 +88,15 @@ * Test creating a short RawDataBlockList */ - public void testShortConstructor() + public void testShortConstructor() throws Exception { + // Get the logger to be used + DummyPOILogger logger = (DummyPOILogger)POILogFactory.getLogger( + RawDataBlock.class + ); + assertEquals(0, logger.logged.size()); + + // Test for various short sizes for (int k = 2049; k < 2560; k++) { byte[] data = new byte[ k ]; @@ -88,16 +105,11 @@ { data[ j ] = ( byte ) j; } - try - { - new RawDataBlockList(new ByteArrayInputStream(data)); - fail("Should have thrown IOException creating short block"); - } - catch (IOException ignored) - { - // as expected - } + // Check we logged the error + logger.reset(); + new RawDataBlockList(new ByteArrayInputStream(data)); + assertEquals(1, logger.logged.size()); } } Added: poi/trunk/src/testcases/org/apache/poi/util/DummyPOILogger.java URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/util/DummyPOILogger.java?rev=634318&view=auto ============================================================================== --- poi/trunk/src/testcases/org/apache/poi/util/DummyPOILogger.java (added) +++ poi/trunk/src/testcases/org/apache/poi/util/DummyPOILogger.java Thu Mar 6 07:54:06 2008 @@ -0,0 +1,46 @@ +/* ==================================================================== + 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.util; + +import java.util.ArrayList; +import java.util.List; + +/** + * POILogger which logs into an ArrayList, so that + * tests can see what got logged + */ +public class DummyPOILogger extends POILogger { + public List logged = new ArrayList(); + + public void reset() { + logged = new ArrayList(); + } + + public boolean check(int level) { + return true; + } + + public void initialize(String cat) {} + + public void log(int level, Object obj1) { + logged.add(new String(level + " - " + obj1)); + } + + public void log(int level, Object obj1, Throwable exception) { + logged.add(new String(level + " - " + obj1 + " - " + exception)); + } +} Propchange: poi/trunk/src/testcases/org/apache/poi/util/DummyPOILogger.java ------------------------------------------------------------------------------ svn:eol-style = native --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]