You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@poi.apache.org by ye...@apache.org on 2007/05/26 09:22:53 UTC

svn commit: r541867 - in /jakarta/poi/trunk/src/scratchpad: src/org/apache/poi/hslf/ src/org/apache/poi/hslf/model/ testcases/org/apache/poi/hslf/data/ testcases/org/apache/poi/hslf/model/ testcases/org/apache/poi/hslf/usermodel/

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 {@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;
+    }
+
 }

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: poi-dev-unsubscribe@jakarta.apache.org
Mailing List:    http://jakarta.apache.org/site/mail2.html#poi
The Apache Jakarta POI Project: http://jakarta.apache.org/poi/