Author: yegor
Date: Sat May 26 00:22:51 2007
New Revision: 541867

URL: http://svn.apache.org/viewvc?view=rev&rev=541867
Log:
fixed bug 42520: NPE in Picture.getPictureData() and bug 42524:  NPE in 
Shape.getShapeType(); Also changed the code to write messages to POILogger 
instead of System.err/System.out

Added:
    
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/42520.ppt   
(with props)
Modified:
    jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java
    jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java
    jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Shape.java
    
jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/ShapeGroup.java
    jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java
    
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java
    
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java

Modified: 
jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java
URL: 
http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java?view=diff&rev=541867&r1=541866&r2=541867
==============================================================================
--- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java 
(original)
+++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java 
Sat May 26 00:22:51 2007
@@ -25,6 +25,8 @@
 
 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 @@
 
 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 @@
                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 @@
 
                        // 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 @@
                                        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!");
                                }
                        }
             

Modified: 
jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java
URL: 
http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java?view=diff&rev=541867&r1=541866&r2=541867
==============================================================================
--- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java 
(original)
+++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java 
Sat May 26 00:22:51 2007
@@ -21,6 +21,7 @@
 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 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 @@
         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;
     }
 

Modified: 
jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Shape.java
URL: 
http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Shape.java?view=diff&rev=541867&r1=541866&r2=541867
==============================================================================
--- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Shape.java 
(original)
+++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Shape.java 
Sat May 26 00:22:51 2007
@@ -19,6 +19,8 @@
 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 @@
  */
 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 @@
      * @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());
     }
 
     /**

Modified: 
jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/ShapeGroup.java
URL: 
http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/ShapeGroup.java?view=diff&rev=541867&r1=541866&r2=541867
==============================================================================
--- 
jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/ShapeGroup.java 
(original)
+++ 
jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/ShapeGroup.java 
Sat May 26 00:22:51 2007
@@ -18,6 +18,7 @@
 
 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 @@
                } 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 @@
         anchor.height = (spgr.getRectY2() - 
spgr.getRectY1())*POINT_DPI/MASTER_DPI;
         return anchor;
     }
+
+    /**
+     * Return type of the shape.
+     * In most cases shape group type is [EMAIL PROTECTED] 
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;
+    }
+
 }

Modified: 
jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java
URL: 
http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java?view=diff&rev=541867&r1=541866&r2=541867
==============================================================================
--- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java 
(original)
+++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java 
Sat May 26 00:22:51 2007
@@ -22,6 +22,7 @@
 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 @@
                _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");
         }
     }
 }

Added: 
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/42520.ppt
URL: 
http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/42520.ppt?view=auto&rev=541867
==============================================================================
Binary file - no diff available.

Propchange: 
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/42520.ppt
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: 
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java
URL: 
http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java?view=diff&rev=541867&r1=541866&r2=541867
==============================================================================
--- 
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java
 (original)
+++ 
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java
 Sat May 26 00:22:51 2007
@@ -71,6 +71,8 @@
     }
 
     private void verify(Sheet sheet){
+        assertNotNull(sheet.getSlideShow());
+
         ColorSchemeAtom colorscheme = sheet.getColorScheme();
         assertNotNull(colorscheme);
 
@@ -92,9 +94,11 @@
         Shape[] shape = sheet.getShapes();
         assertTrue(shape != null);
         for (int i = 0; i < shape.length; i++) {
+            assertNotNull(shape[i].getSpContainer());
             assertNotNull(shape[i].getSheet());
+            assertNotNull(shape[i].getShapeName());
+            assertNotNull(shape[i].getAnchor());
         }
 
-        assertNotNull(sheet.getSlideShow());
     }
 }

Modified: 
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java
URL: 
http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java?view=diff&rev=541867&r1=541866&r2=541867
==============================================================================
--- 
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java
 (original)
+++ 
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java
 Sat May 26 00:22:51 2007
@@ -20,10 +20,12 @@
 import junit.framework.TestCase;
 import org.apache.poi.hslf.HSLFSlideShow;
 import org.apache.poi.hslf.model.*;
+import org.apache.poi.hslf.model.Shape;
 
 import java.io.*;
 import java.util.HashSet;
 import java.util.HashMap;
+import java.awt.*;
 
 /**
  * Testcases for bugs entered in bugzilla
@@ -196,6 +198,72 @@
         Slide[] slide = ppt.getSlides();
         for (int i = 0; i < slide.length; i++) {
             Shape[] shape = slide[i].getShapes();
+        }
+        assertTrue("No Exceptions while reading file", true);
+
+    }
+
+    /**
+     * Bug 42524:  NPE in Shape.getShapeType()
+     */
+    public void test42524 () throws Exception {
+        FileInputStream is = new FileInputStream(new File(cwd, "42486.ppt")); 
//test file is the same as for Bug 42486
+        HSLFSlideShow hslf = new HSLFSlideShow(is);
+        is.close();
+
+        SlideShow ppt = new SlideShow(hslf);
+        //walk down the tree and see if there were no errors while reading
+        Slide[] slide = ppt.getSlides();
+        for (int i = 0; i < slide.length; i++) {
+            Shape[] shape = slide[i].getShapes();
+            for (int j = 0; j < shape.length; j++) {
+                assertNotNull(shape[j].getShapeName());
+                if (shape[j] instanceof ShapeGroup){
+                    ShapeGroup group = (ShapeGroup)shape[j];
+                    Shape[] comps = group.getShapes();
+                    for (int k = 0; k < comps.length; k++) {
+                        assertNotNull(comps[k].getShapeName());
+                   }
+                }
+            }
+
+        }
+        assertTrue("No Exceptions while reading file", true);
+
+    }
+
+    /**
+     * Bug 42520:  NPE in Picture.getPictureData()
+     */
+    public void test42520 () throws Exception {
+        FileInputStream is = new FileInputStream(new File(cwd, "42520.ppt")); 
//test file is the same as for Bug 42486
+        HSLFSlideShow hslf = new HSLFSlideShow(is);
+        is.close();
+
+        SlideShow ppt = new SlideShow(hslf);
+
+        //test case from the bug report
+        ShapeGroup shapeGroup = 
(ShapeGroup)ppt.getSlides()[11].getShapes()[10];
+        Picture picture = (Picture)shapeGroup.getShapes()[0];
+        picture.getPictureData();
+
+        //walk down the tree and see if there were no errors while reading
+        Slide[] slide = ppt.getSlides();
+        for (int i = 0; i < slide.length; i++) {
+            Shape[] shape = slide[i].getShapes();
+            for (int j = 0; j < shape.length; j++) {
+              if (shape[j] instanceof ShapeGroup){
+                    ShapeGroup group = (ShapeGroup)shape[j];
+                    Shape[] comps = group.getShapes();
+                    for (int k = 0; k < comps.length; k++) {
+                        Shape comp = comps[k];
+                        if (comp instanceof Picture){
+                            PictureData pict = 
((Picture)comp).getPictureData();
+                        }
+                    }
+                }
+            }
+
         }
         assertTrue("No Exceptions while reading file", true);
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
Mailing List:    http://jakarta.apache.org/site/mail2.html#poi
The Apache Jakarta POI Project: http://jakarta.apache.org/poi/

Reply via email to