]> source.dussan.org Git - poi.git/commitdiff
fixed bug 42520: NPE in Picture.getPictureData() and bug 42524: NPE in Shape.getShap...
authorYegor Kozlov <yegor@apache.org>
Sat, 26 May 2007 07:22:51 +0000 (07:22 +0000)
committerYegor Kozlov <yegor@apache.org>
Sat, 26 May 2007 07:22:51 +0000 (07:22 +0000)
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@541867 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java
src/scratchpad/src/org/apache/poi/hslf/model/Picture.java
src/scratchpad/src/org/apache/poi/hslf/model/Shape.java
src/scratchpad/src/org/apache/poi/hslf/model/ShapeGroup.java
src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java
src/scratchpad/testcases/org/apache/poi/hslf/data/42520.ppt [new file with mode: 0644]
src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java
src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java

index 83afe99615a6e9633d699a63d1c9b4203b08bdcb..84a03e7a52848c6c389731c1066d162e5484319c 100644 (file)
@@ -25,6 +25,8 @@ import java.io.*;
 
 import org.apache.poi.POIDocument;
 import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.POILogger;
+import org.apache.poi.util.POILogFactory;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 import org.apache.poi.poifs.filesystem.DocumentEntry;
 import org.apache.poi.poifs.filesystem.DocumentInputStream;
@@ -50,6 +52,9 @@ import org.apache.poi.hslf.usermodel.PictureData;
 
 public class HSLFSlideShow extends POIDocument
 {
+    // For logging
+    protected POILogger logger = POILogFactory.getLogger(this.getClass());
+
        private InputStream istream;
 
        // Holds metadata on where things are in our document
@@ -226,7 +231,7 @@ public class HSLFSlideShow extends POIDocument
                try {
                        currentUser = new CurrentUserAtom(filesystem);
                } catch(IOException ie) {
-                       System.err.println("Error finding Current User Atom:\n" + ie);
+                       logger.log(POILogger.ERROR, "Error finding Current User Atom:\n" + ie);
                        currentUser = new CurrentUserAtom();
                }
        }
@@ -281,8 +286,8 @@ public class HSLFSlideShow extends POIDocument
 
                        // If they type (including the bonus 0xF018) is 0, skip it
                        if(type == 0) {
-                               System.err.println("Problem reading picture: Invalid image type 0, on picture with length " + imgsize + ".\nYou document will probably become corrupted if you save it!");
-                               System.err.println(pos);
+                               logger.log(POILogger.ERROR, "Problem reading picture: Invalid image type 0, on picture with length " + imgsize + ".\nYou document will probably become corrupted if you save it!");
+                               logger.log(POILogger.ERROR, "" + pos);
                        } else {
                    // Copy the data, ready to pass to PictureData
                    byte[] imgdata = new byte[imgsize];
@@ -297,7 +302,7 @@ public class HSLFSlideShow extends POIDocument
                                        pict.setOffset(offset);
                                        p.add(pict);
                                } catch(IllegalArgumentException e) {
-                                       System.err.println("Problem reading picture: " + e + "\nYou document will probably become corrupted if you save it!");
+                                       logger.log(POILogger.ERROR, "Problem reading picture: " + e + "\nYou document will probably become corrupted if you save it!");
                                }
                        }
             
index 6de56b4035cac516eeca27b94e0b16ca900bae42..d6f4887e2733a16a58f925cece7ea683584a1773 100644 (file)
@@ -21,6 +21,7 @@ import org.apache.poi.hslf.usermodel.PictureData;
 import org.apache.poi.hslf.usermodel.SlideShow;
 import org.apache.poi.hslf.record.Document;
 import org.apache.poi.hslf.blip.Bitmap;
+import org.apache.poi.util.POILogger;
 
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
@@ -99,7 +100,7 @@ public class Picture extends SimpleShape {
     public int getPictureIndex(){
         EscherOptRecord opt = (EscherOptRecord)getEscherChild(_escherContainer, EscherOptRecord.RECORD_ID);
         EscherSimpleProperty prop = (EscherSimpleProperty)getEscherProperty(opt, EscherProperties.BLIP__BLIPTODISPLAY + 0x4000);
-        return prop.getPropertyValue();
+        return prop == null ? 0 : prop.getPropertyValue();
     }
 
     /**
@@ -166,14 +167,18 @@ public class Picture extends SimpleShape {
         EscherContainerRecord bstore = (EscherContainerRecord)Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
 
         List lst = bstore.getChildRecords();
-        int idx = getPictureIndex()-1;
-        EscherBSERecord bse = (EscherBSERecord)lst.get(idx);
-        for ( int i = 0; i < pict.length; i++ ) {
-                       if (pict[i].getOffset() ==  bse.getOffset()){
-                return pict[i];
+        int idx = getPictureIndex();
+        if (idx == 0){
+            logger.log(POILogger.ERROR, "no reference to picture data found ");
+        } else {
+            EscherBSERecord bse = (EscherBSERecord)lst.get(idx-1);
+            for ( int i = 0; i < pict.length; i++ ) {
+                if (pict[i].getOffset() ==  bse.getOffset()){
+                    return pict[i];
+                }
             }
+            logger.log(POILogger.ERROR, "no picture found for our BSE offset " + bse.getOffset());
         }
-               System.err.println("Warning - no picture found for our BSE offset " + bse.getOffset());
         return null;
     }
 
index f1826b528be03531b62ec684f910bc4420157150..65827bf94d1afcc9d217d02340a636d15dac6f5a 100644 (file)
@@ -19,6 +19,8 @@ package org.apache.poi.hslf.model;
 import org.apache.poi.ddf.*;
 import org.apache.poi.hslf.model.ShapeTypes;
 import org.apache.poi.hslf.record.ColorSchemeAtom;
+import org.apache.poi.util.POILogger;
+import org.apache.poi.util.POILogFactory;
 
 import java.util.Iterator;
 import java.awt.*;
@@ -41,6 +43,9 @@ import java.awt.*;
  */
 public abstract class Shape {
 
+    // For logging
+    protected POILogger logger = POILogFactory.getLogger(this.getClass());
+    
     /**
      * In Escher absolute distances are specified in
      * English Metric Units (EMUs), occasionally referred to as A units;
@@ -110,8 +115,7 @@ public abstract class Shape {
      * @return name of the shape.
      */
     public String getShapeName(){
-        EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID);
-        return ShapeTypes.typeName(spRecord.getOptions() >> 4);
+        return ShapeTypes.typeName(getShapeType());
     }
 
     /**
index caea86ae6e17a4d9441266b41a2889ae7df5963b..d474a22f6f926585568975e1f78b6e4b910826e5 100644 (file)
@@ -18,6 +18,7 @@ package org.apache.poi.hslf.model;
 
 import org.apache.poi.ddf.*;
 import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.POILogger;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -69,7 +70,7 @@ public class ShapeGroup extends Shape{
                } else {
                        // Should we do anything special with these non
                        //  Container records?
-                       System.err.println("Shape contained non container escher record, was " + r.getClass().getName());
+                       logger.log(POILogger.ERROR, "Shape contained non container escher record, was " + r.getClass().getName());
                }
         }
         
@@ -197,4 +198,17 @@ public class ShapeGroup extends Shape{
         anchor.height = (spgr.getRectY2() - spgr.getRectY1())*POINT_DPI/MASTER_DPI;
         return anchor;
     }
+
+    /**
+     * Return type of the shape.
+     * In most cases shape group type is {@link org.apache.poi.hslf.model.ShapeTypes#NotPrimitive}
+     *
+     * @return type of the shape.
+     */
+    public int getShapeType(){
+        EscherContainerRecord groupInfoContainer = (EscherContainerRecord)_escherContainer.getChild(0);
+        EscherSpRecord spRecord = groupInfoContainer.getChildById(EscherSpRecord.RECORD_ID);
+        return spRecord.getOptions() >> 4;
+    }
+
 }
index 67d2fee3a9082f4803184107db3d53e001227cb4..82d9a4de7f369f56ceaa333ac8158368e206be88 100644 (file)
@@ -22,6 +22,7 @@ import org.apache.poi.ddf.*;
 import org.apache.poi.hslf.record.*;
 import org.apache.poi.hslf.usermodel.RichTextRun;
 import org.apache.poi.hslf.exceptions.HSLFException;
+import org.apache.poi.util.POILogger;
 
 import java.awt.*;
 import java.awt.font.FontRenderContext;
@@ -500,7 +501,7 @@ public class TextBox extends SimpleShape {
                _txtrun = new TextRun(tha,tca,sta);
         } else {
                // Empty text box
-               System.err.println("Warning - no text records found for TextBox");
+               logger.log(POILogger.WARN, "no text records found for TextBox");
         }
     }
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/data/42520.ppt b/src/scratchpad/testcases/org/apache/poi/hslf/data/42520.ppt
new file mode 100644 (file)
index 0000000..15bcf64
Binary files /dev/null and b/src/scratchpad/testcases/org/apache/poi/hslf/data/42520.ppt differ
index b583e2340ac7eb6d9fdb76e946ff92e5929f5aa7..be22db0d54e8a62ba88630976e66182c596bc733 100644 (file)
@@ -71,6 +71,8 @@ public class TestSheet extends TestCase{
     }\r
 \r
     private void verify(Sheet sheet){\r
+        assertNotNull(sheet.getSlideShow());\r
+\r
         ColorSchemeAtom colorscheme = sheet.getColorScheme();\r
         assertNotNull(colorscheme);\r
 \r
@@ -92,9 +94,11 @@ public class TestSheet extends TestCase{
         Shape[] shape = sheet.getShapes();\r
         assertTrue(shape != null);\r
         for (int i = 0; i < shape.length; i++) {\r
+            assertNotNull(shape[i].getSpContainer());\r
             assertNotNull(shape[i].getSheet());\r
+            assertNotNull(shape[i].getShapeName());\r
+            assertNotNull(shape[i].getAnchor());\r
         }\r
 \r
-        assertNotNull(sheet.getSlideShow());\r
     }\r
 }\r
index 4e7f2ddaa28ad91df4a53286024df1b8917e9b21..800194e585746fc994d72b6df30d8ad999f26d8b 100644 (file)
@@ -20,10 +20,12 @@ package org.apache.poi.hslf.usermodel;
 import junit.framework.TestCase;\r
 import org.apache.poi.hslf.HSLFSlideShow;\r
 import org.apache.poi.hslf.model.*;\r
+import org.apache.poi.hslf.model.Shape;\r
 \r
 import java.io.*;\r
 import java.util.HashSet;\r
 import java.util.HashMap;\r
+import java.awt.*;\r
 \r
 /**\r
  * Testcases for bugs entered in bugzilla\r
@@ -201,4 +203,70 @@ public class TestBugs extends TestCase {
 \r
     }\r
 \r
+    /**\r
+     * Bug 42524:  NPE in Shape.getShapeType()\r
+     */\r
+    public void test42524 () throws Exception {\r
+        FileInputStream is = new FileInputStream(new File(cwd, "42486.ppt")); //test file is the same as for Bug 42486\r
+        HSLFSlideShow hslf = new HSLFSlideShow(is);\r
+        is.close();\r
+\r
+        SlideShow ppt = new SlideShow(hslf);\r
+        //walk down the tree and see if there were no errors while reading\r
+        Slide[] slide = ppt.getSlides();\r
+        for (int i = 0; i < slide.length; i++) {\r
+            Shape[] shape = slide[i].getShapes();\r
+            for (int j = 0; j < shape.length; j++) {\r
+                assertNotNull(shape[j].getShapeName());\r
+                if (shape[j] instanceof ShapeGroup){\r
+                    ShapeGroup group = (ShapeGroup)shape[j];\r
+                    Shape[] comps = group.getShapes();\r
+                    for (int k = 0; k < comps.length; k++) {\r
+                        assertNotNull(comps[k].getShapeName());\r
+                   }\r
+                }\r
+            }\r
+\r
+        }\r
+        assertTrue("No Exceptions while reading file", true);\r
+\r
+    }\r
+\r
+    /**\r
+     * Bug 42520:  NPE in Picture.getPictureData()\r
+     */\r
+    public void test42520 () throws Exception {\r
+        FileInputStream is = new FileInputStream(new File(cwd, "42520.ppt")); //test file is the same as for Bug 42486\r
+        HSLFSlideShow hslf = new HSLFSlideShow(is);\r
+        is.close();\r
+\r
+        SlideShow ppt = new SlideShow(hslf);\r
+\r
+        //test case from the bug report\r
+        ShapeGroup shapeGroup = (ShapeGroup)ppt.getSlides()[11].getShapes()[10];\r
+        Picture picture = (Picture)shapeGroup.getShapes()[0];\r
+        picture.getPictureData();\r
+\r
+        //walk down the tree and see if there were no errors while reading\r
+        Slide[] slide = ppt.getSlides();\r
+        for (int i = 0; i < slide.length; i++) {\r
+            Shape[] shape = slide[i].getShapes();\r
+            for (int j = 0; j < shape.length; j++) {\r
+              if (shape[j] instanceof ShapeGroup){\r
+                    ShapeGroup group = (ShapeGroup)shape[j];\r
+                    Shape[] comps = group.getShapes();\r
+                    for (int k = 0; k < comps.length; k++) {\r
+                        Shape comp = comps[k];\r
+                        if (comp instanceof Picture){\r
+                            PictureData pict = ((Picture)comp).getPictureData();\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+\r
+        }\r
+        assertTrue("No Exceptions while reading file", true);\r
+\r
+    }\r
+\r
 }\r