]> source.dussan.org Git - poi.git/commitdiff
fix bug #44770: RuntimeException: Couldn't instantiate the class for type with id...
authorYegor Kozlov <yegor@apache.org>
Tue, 8 Apr 2008 14:49:59 +0000 (14:49 +0000)
committerYegor Kozlov <yegor@apache.org>
Tue, 8 Apr 2008 14:49:59 +0000 (14:49 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@645952 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java
src/scratchpad/src/org/apache/poi/hslf/record/Record.java
src/scratchpad/testcases/org/apache/poi/hslf/data/44770.ppt [new file with mode: 0755]
src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java

index db0d434aee673ef1dec18aff1b5723e236e33b44..e42b358b89df78cf2230de8ac01e160473faa166 100644 (file)
@@ -119,6 +119,9 @@ public class PPDrawing extends RecordAtom
         * Tree walking way of finding Escher Child Records
         */
        private void findEscherChildren(DefaultEscherRecordFactory erf, byte[] source, int startPos, int lenToGo, Vector found) {
+
+        int escherBytes = LittleEndian.getInt( source, startPos + 4 ) + 8;
+
                // Find the record
                EscherRecord r = erf.createRecord(source,startPos);
                // Fill it in
@@ -131,6 +134,17 @@ public class PPDrawing extends RecordAtom
                if(size < 8) {
                        logger.log(POILogger.WARN, "Hit short DDF record at " + startPos + " - " + size);
                }
+
+        /**
+         * Sanity check. Always advance the cursor by the correct value.
+         *
+         * getRecordSize() must return exatcly the same number of bytes that was written in fillFields.
+         * Sometimes it is not so, see an example in bug #44770. Most likely reason is that one of ddf records calculates wrong size. 
+         */
+        if(size != escherBytes){
+            logger.log(POILogger.WARN, "Record length=" + escherBytes + " but getRecordSize() returned " + r.getRecordSize() + "; record: " + r.getClass());
+            size = escherBytes;
+        }
                startPos += size;
                lenToGo -= size;
                if(lenToGo >= 8) {
index 79d08ea65ea8e8ba4e9703b24304ce0349515c53..1aface94cdc19d449bde46bef5946b931662194b 100644 (file)
@@ -185,13 +185,13 @@ public abstract class Record
                        // Instantiate
                        toReturn = (Record)(con.newInstance(new Object[] { b, new Integer(start), new Integer(len) }));
                } catch(InstantiationException ie) {
-                       throw new RuntimeException("Couldn't instantiate the class for type with id " + type + " on class " + c + " : " + ie);
+                       throw new RuntimeException("Couldn't instantiate the class for type with id " + type + " on class " + c + " : " + ie, ie);
                } catch(java.lang.reflect.InvocationTargetException ite) {
-                       throw new RuntimeException("Couldn't instantiate the class for type with id " + type + " on class " + c + " : " + ite + "\nCause was : " + ite.getCause());
+                       throw new RuntimeException("Couldn't instantiate the class for type with id " + type + " on class " + c + " : " + ite + "\nCause was : " + ite.getCause(), ite);
                } catch(IllegalAccessException iae) {
-                       throw new RuntimeException("Couldn't access the constructor for type with id " + type + " on class " + c + " : " + iae);
+                       throw new RuntimeException("Couldn't access the constructor for type with id " + type + " on class " + c + " : " + iae, iae);
                } catch(NoSuchMethodException nsme) {
-                       throw new RuntimeException("Couldn't access the constructor for type with id " + type + " on class " + c + " : " + nsme);
+                       throw new RuntimeException("Couldn't access the constructor for type with id " + type + " on class " + c + " : " + nsme, nsme);
                }
 
                // Handling for special kinds of records follow
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/data/44770.ppt b/src/scratchpad/testcases/org/apache/poi/hslf/data/44770.ppt
new file mode 100755 (executable)
index 0000000..d7ae12b
Binary files /dev/null and b/src/scratchpad/testcases/org/apache/poi/hslf/data/44770.ppt differ
index f3f5f8e7ee8a653fca73bb309df4456c51668e72..36e45501ec7f94e6985450e11e85deba15471ff5 100644 (file)
@@ -350,4 +350,14 @@ public class TestBugs extends TestCase {
         assertEquals(Picture.JPEG, pict.getType());\r
     }\r
 \r
+    /**\r
+     * Bug 44770: java.lang.RuntimeException: Couldn't instantiate the class for type with id 1036 on class class org.apache.poi.hslf.record.PPDrawing\r
+     */\r
+    public void test44770() throws Exception {\r
+        FileInputStream is = new FileInputStream(new File(cwd, "44770.ppt"));\r
+        SlideShow ppt = new SlideShow(is);\r
+        is.close();\r
+\r
+        assertTrue("No Exceptions while reading file", true);\r
+    }\r
 }\r