Author: nick
Date: Thu Mar 29 04:50:50 2007
New Revision: 523678

URL: http://svn.apache.org/viewvc?view=rev&rev=523678
Log:
Don't NPE if we have a reference to a note, where there's no core record to go 
with that note's RefID. Instead, just log it, and pretend the note wasn't there.

Added:
    
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/missing_core_records.ppt
   (with props)
Modified:
    
jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java
    
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TextExtractor.java

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=523678&r1=523677&r2=523678
==============================================================================
--- 
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 Mar 29 04:50:50 2007
@@ -273,8 +273,13 @@
        private Record getCoreRecordForRefID(int refID) {
                Integer coreRecordId = (Integer)
                        _sheetIdToCoreRecordsLookup.get(new Integer(refID));
-               Record r = _mostRecentCoreRecords[coreRecordId.intValue()];
-               return r;
+               if(coreRecordId != null) {
+                       Record r = 
_mostRecentCoreRecords[coreRecordId.intValue()];
+                       return r;
+               } else {
+                       logger.log(POILogger.ERROR, "We tried to look up a 
reference to a core record, but there was no core ID for reference ID " + 
refID);
+                       return null;
+               }
        }
 
   /**
@@ -352,23 +357,26 @@
        } else {
                // Match up the records and the SlideAtomSets
                notesSets = notesSLWT.getSlideAtomsSets();
-               notesRecords = new 
org.apache.poi.hslf.record.Notes[notesSets.length];
+               ArrayList notesRecordsL = new ArrayList();
                for(int i=0; i<notesSets.length; i++) {
                        // Get the right core record
                        Record r = getCoreRecordForSAS(notesSets[i]);
                        
                        // Ensure it really is a notes record
-                       if(r instanceof org.apache.poi.hslf.record.Notes) {
-                               notesRecords[i] = 
(org.apache.poi.hslf.record.Notes)r;
+                       if(r != null && r instanceof 
org.apache.poi.hslf.record.Notes) {
+                               notesRecordsL.add( 
(org.apache.poi.hslf.record.Notes)r );
+                               
+                               // 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));
                        } 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);
                        }
-                       
-                       // 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));
                }
+               notesRecords = new 
org.apache.poi.hslf.record.Notes[notesRecordsL.size()];
+               notesRecords = (org.apache.poi.hslf.record.Notes[])
+                       notesRecordsL.toArray(notesRecords);
        }
        
        // Now, do the same thing for our slides

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

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

Modified: 
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TextExtractor.java
URL: 
http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TextExtractor.java?view=diff&rev=523678&r1=523677&r2=523678
==============================================================================
--- 
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TextExtractor.java
 (original)
+++ 
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TextExtractor.java
 Thu Mar 29 04:50:50 2007
@@ -29,13 +29,15 @@
  * @author Nick Burch (nick at torchbox dot com)
  */
 public class TextExtractor extends TestCase {
-       // Extractor primed on the 2 page basic test data
+       /** Extractor primed on the 2 page basic test data */
        private PowerPointExtractor ppe;
-       // Extractor primed on the 1 page but text-box'd test data
+       /** Extractor primed on the 1 page but text-box'd test data */
        private PowerPointExtractor ppe2;
+       /** Where to go looking for our test files */
+       private String dirname;
 
     public TextExtractor() throws Exception {
-               String dirname = System.getProperty("HSLF.testdata.path");
+               dirname = System.getProperty("HSLF.testdata.path");
                String filename = dirname + "/basic_test_ppt_file.ppt";
                ppe = new PowerPointExtractor(filename);
                String filename2 = dirname + "/with_textbox.ppt";
@@ -69,6 +71,28 @@
                expectText = "";
                
                ensureTwoStringsTheSame(expectText, notesText);
+       }
+
+       /**
+        * Test that when presented with a PPT file missing the odd
+        *  core record, we can still get the rest of the text out
+        * @throws Exception
+        */
+       public void testMissingCoreRecords() throws Exception {
+               String filename = dirname + "/missing_core_records.ppt";
+               ppe = new PowerPointExtractor(filename);
+               
+               String text = ppe.getText(true, false);
+               String nText = ppe.getNotes();
+
+               assertNotNull(text);
+               assertNotNull(nText);
+               
+               // Notes record were corrupt, so don't expect any
+               assertEquals(nText.length(), 0);
+               
+               // Slide records were fine
+               assertTrue(text.startsWith("Using Disease Surveillance and 
Response"));
        }
        
     private void ensureTwoStringsTheSame(String exp, String act) throws 
Exception {



---------------------------------------------------------------------
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