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/

Reply via email to