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/