Author: yegor Date: Thu May 24 00:52:04 2007 New Revision: 541219 URL: http://svn.apache.org/viewvc?view=rev&rev=541219 Log: applied patches from bug 42474: (1) Incorrect matching of notes to slides and (2) NPE in RichTextRun.isBold() when the RichTextRun comes from a Notes model object
Added: jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/42474-1.ppt (with props) jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/42474-2.ppt (with props) Modified: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Notes.java jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.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/model/Notes.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Notes.java?view=diff&rev=541219&r1=541218&r2=541219 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Notes.java (original) +++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Notes.java Thu May 24 00:52:04 2007 @@ -56,6 +56,10 @@ // one of TextBytesAtom or TextCharsAtom, found inside // EscherTextboxWrapper's in the PPDrawing _runs = findTextRuns(_notes.getPPDrawing()); + + // Set the sheet on each TextRun + for (int i = 0; i < _runs.length; i++) + _runs[i].setSheet(this); } Modified: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java?view=diff&rev=541219&r1=541218&r2=541219 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java (original) +++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java Thu May 24 00:52:04 2007 @@ -170,7 +170,8 @@ Sheet sheet = parentRun.getSheet(); int txtype = parentRun.getRunType(); SlideMaster master = (SlideMaster)sheet.getMasterSheet(); - cftp = (CharFlagsTextProp)master.getStyleAttribute(txtype, getIndentLevel(), "char_flags", true); + if (master != null) + cftp = (CharFlagsTextProp)master.getStyleAttribute(txtype, getIndentLevel(), "char_flags", true); } return cftp == null ? false : cftp.getSubValue(index); @@ -223,7 +224,8 @@ Sheet sheet = parentRun.getSheet(); int txtype = parentRun.getRunType(); SlideMaster master = (SlideMaster)sheet.getMasterSheet(); - prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, true); + if (master != null) + prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, true); } return prop == null ? -1 : prop.getValue(); } @@ -242,7 +244,8 @@ Sheet sheet = parentRun.getSheet(); int txtype = parentRun.getRunType(); SlideMaster master = (SlideMaster)sheet.getMasterSheet(); - prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, false); + if (master != null) + prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, false); } return prop == null ? -1 : prop.getValue(); Modified: jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java?view=diff&rev=541219&r1=541218&r2=541219 ============================================================================== --- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java (original) +++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java Thu May 24 00:52:04 2007 @@ -30,21 +30,10 @@ import org.apache.poi.ddf.EscherRecord; import org.apache.poi.hslf.*; import org.apache.poi.hslf.model.*; -import org.apache.poi.hslf.record.Document; -import org.apache.poi.hslf.record.DocumentAtom; -import org.apache.poi.hslf.record.FontCollection; -import org.apache.poi.hslf.record.ParentAwareRecord; -import org.apache.poi.hslf.record.PositionDependentRecordContainer; -import org.apache.poi.hslf.record.Record; -import org.apache.poi.hslf.record.RecordContainer; -import org.apache.poi.hslf.record.RecordTypes; -import org.apache.poi.hslf.record.SlideAtom; -import org.apache.poi.hslf.record.SlideListWithText; -import org.apache.poi.hslf.record.SlidePersistAtom; -import org.apache.poi.hslf.record.UserEditAtom; +import org.apache.poi.hslf.model.Notes; +import org.apache.poi.hslf.model.Slide; import org.apache.poi.hslf.record.SlideListWithText.*; -import org.apache.poi.hslf.record.PersistPtrHolder; -import org.apache.poi.hslf.record.PositionDependentRecord; +import org.apache.poi.hslf.record.*; import org.apache.poi.hslf.exceptions.CorruptPowerPointFileException; import org.apache.poi.util.ArrayUtil; import org.apache.poi.util.POILogFactory; @@ -363,13 +352,14 @@ Record r = getCoreRecordForSAS(notesSets[i]); // Ensure it really is a notes record - if(r != null && r instanceof org.apache.poi.hslf.record.Notes) { - notesRecordsL.add( (org.apache.poi.hslf.record.Notes)r ); + if(r instanceof org.apache.poi.hslf.record.Notes) { + org.apache.poi.hslf.record.Notes notesRecord = (org.apache.poi.hslf.record.Notes)r; + notesRecordsL.add( notesRecord ); // Record the match between slide id and these notes - SlidePersistAtom spa = notesSets[i].getSlidePersistAtom(); - Integer slideId = new Integer(spa.getSlideIdentifier()); - slideIdToNotes.put(slideId, new Integer(i)); + SlidePersistAtom spa = notesSets[i].getSlidePersistAtom(); + Integer slideId = new Integer(spa.getSlideIdentifier()); + slideIdToNotes.put(slideId, new Integer(i)); } else { logger.log(POILogger.ERROR, "A Notes SlideAtomSet at " + i + " said its record was at refID " + notesSets[i].getSlidePersistAtom().getRefID() + ", but that was actually a " + r); } @@ -397,7 +387,7 @@ if(r instanceof org.apache.poi.hslf.record.Slide) { slidesRecords[i] = (org.apache.poi.hslf.record.Slide)r; } else { - System.err.println("A Slide SlideAtomSet at " + i + " said its record was at refID " + slidesSets[i].getSlidePersistAtom().getRefID() + ", but that was actually a " + r); + logger.log(POILogger.ERROR, "A Slide SlideAtomSet at " + i + " said its record was at refID " + slidesSets[i].getSlidePersistAtom().getRefID() + ", but that was actually a " + r); } } } @@ -422,15 +412,17 @@ for(int i=0; i<_slides.length; i++) { SlideAtomsSet sas = slidesSets[i]; int slideIdentifier = sas.getSlidePersistAtom().getSlideIdentifier(); - Integer slideIdentifierI = new Integer(slideIdentifier); - + // Do we have a notes for this? Notes notes = null; - if(slideIdToNotes.containsKey(slideIdentifierI)) { - Integer notesPos = (Integer)slideIdToNotes.get(slideIdentifierI); - notes = _notes[notesPos.intValue()]; - } - + //Slide.SlideAtom.notesId references the corresponding notes slide. 0 if slide has no notes. + int noteId = slidesRecords[i].getSlideAtom().getNotesID(); + if (noteId != 0){ + Integer notesPos = (Integer)slideIdToNotes.get(new Integer(noteId)); + if (notesPos != null) notes = _notes[notesPos.intValue()]; + else logger.log(POILogger.ERROR, "Notes not found for noteId=" + noteId); + } + // Now, build our slide _slides[i] = new Slide(slidesRecords[i], notes, sas, slideIdentifier, (i+1)); _slides[i].setSlideShow(this); Added: jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/42474-1.ppt URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/42474-1.ppt?view=auto&rev=541219 ============================================================================== Binary file - no diff available. Propchange: jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/42474-1.ppt ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/42474-2.ppt URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/42474-2.ppt?view=auto&rev=541219 ============================================================================== Binary file - no diff available. Propchange: jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/42474-2.ppt ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream 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=541219&r1=541218&r2=541219 ============================================================================== --- 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 Thu May 24 00:52:04 2007 @@ -20,8 +20,13 @@ import junit.framework.TestCase; import org.apache.poi.hslf.HSLFSlideShow; import org.apache.poi.hslf.model.Picture; +import org.apache.poi.hslf.model.Slide; +import org.apache.poi.hslf.model.Notes; +import org.apache.poi.hslf.model.TextRun; import java.io.*; +import java.util.HashSet; +import java.util.HashMap; /** * Testcases for bugs entered in bugzilla @@ -49,5 +54,68 @@ assertEquals(2, pict.length); assertEquals(Picture.JPEG, pict[0].getType()); assertEquals(Picture.JPEG, pict[1].getType()); + } + + /** + * First fix from Bug 42474: NPE in RichTextRun.isBold() + * when the RichTextRun comes from a Notes model object + */ + public void test42474_1() throws Exception { + FileInputStream is = new FileInputStream(new File(cwd, "42474-1.ppt")); + HSLFSlideShow hslf = new HSLFSlideShow(is); + is.close(); + + SlideShow ppt = new SlideShow(hslf); + assertTrue("No Exceptions while reading file", true); + assertEquals(2, ppt.getSlides().length); + + TextRun txrun; + Notes notes; + + notes = ppt.getSlides()[0].getNotesSheet(); + assertNotNull(notes); + txrun = notes.getTextRuns()[0]; + assertEquals("Notes-1", txrun.getRawText()); + assertEquals(false, txrun.getRichTextRuns()[0].isBold()); + + //notes for the second slide are in bold + notes = ppt.getSlides()[1].getNotesSheet(); + assertNotNull(notes); + txrun = notes.getTextRuns()[0]; + assertEquals("Notes-2", txrun.getRawText()); + assertEquals(true, txrun.getRichTextRuns()[0].isBold()); + + } + + /** + * Second fix from Bug 42474: Incorrect matching of notes to slides + */ + public void test42474_2() throws Exception { + FileInputStream is = new FileInputStream(new File(cwd, "42474-2.ppt")); + HSLFSlideShow hslf = new HSLFSlideShow(is); + is.close(); + + SlideShow ppt = new SlideShow(hslf); + + //map slide number and starting phrase of its notes + HashMap notesMap = new HashMap(); + notesMap.put(new Integer(4), "For decades before calculators"); + notesMap.put(new Integer(5), "Several commercial applications"); + notesMap.put(new Integer(6), "There are three variations of LNS that are discussed here"); + notesMap.put(new Integer(7), "Although multiply and square root are easier"); + notesMap.put(new Integer(8), "The bus Z is split into Z_H and Z_L"); + + Slide[] slide = ppt.getSlides(); + for (int i = 0; i < slide.length; i++) { + Integer slideNumber = new Integer(slide[i].getSlideNumber()); + Notes notes = slide[i].getNotesSheet(); + if (notesMap.containsKey(slideNumber)){ + assertNotNull(notes); + String text = notes.getTextRuns()[0].getRawText(); + String startingPhrase = (String)notesMap.get(slideNumber); + assertTrue("Notes for slide " + slideNumber + " must start with " + + startingPhrase , text.startsWith(startingPhrase)); + } + } } } --------------------------------------------------------------------- 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/