]> source.dussan.org Git - poi.git/commitdiff
Bug 51351 - more progress with WordToFoExtractor: fix ListEntryNoListTable and MBD001...
authorYegor Kozlov <yegor@apache.org>
Thu, 23 Jun 2011 11:28:31 +0000 (11:28 +0000)
committerYegor Kozlov <yegor@apache.org>
Thu, 23 Jun 2011 11:28:31 +0000 (11:28 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1138836 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hwpf/extractor/AbstractToFoExtractor.java
src/scratchpad/src/org/apache/poi/hwpf/extractor/WordToFoExtractor.java
src/scratchpad/testcases/org/apache/poi/hwpf/extractor/TestWordToFoExtractorSuite.java [new file with mode: 0644]

index 4ac0eead7267b597b8fc6b4f8e3dfd290f3dccce..19608d80a50b55fd863275ee8ad43cac682e7804 100644 (file)
@@ -102,13 +102,6 @@ public abstract class AbstractToFoExtractor
         return simplePageMaster;
     }
 
-    protected Element addTable( Element flow )
-    {
-        final Element table = document.createElementNS( NS_XSLFO, "fo:table" );
-        flow.appendChild( table );
-        return table;
-    }
-
     protected Element createBasicLinkExternal( String externalDestination )
     {
         final Element basicLink = document.createElementNS( NS_XSLFO,
@@ -173,6 +166,11 @@ public abstract class AbstractToFoExtractor
         return result;
     }
 
+    protected Element createTable()
+    {
+        return document.createElementNS( NS_XSLFO, "fo:table" );
+    }
+
     protected Element createTableBody()
     {
         return document.createElementNS( NS_XSLFO, "fo:table-body" );
index b9022c916e24ca18a912f589d2f91012f0563897..4189d7c32d330e843178be1a61b6c5d31826629e 100644 (file)
@@ -560,14 +560,29 @@ public class WordToFoExtractor extends AbstractToFoExtractor
 
             if ( currentListInfo != 0 )
             {
-                final ListFormatOverride listFormatOverride = listTables
-                        .getOverride( paragraph.getIlfo() );
+                if ( listTables != null )
+                {
+                    final ListFormatOverride listFormatOverride = listTables
+                            .getOverride( paragraph.getIlfo() );
 
-                String label = WordToFoUtils.getBulletText( listTables,
-                        paragraph, listFormatOverride.getLsid() );
+                    String label = WordToFoUtils.getBulletText( listTables,
+                            paragraph, listFormatOverride.getLsid() );
 
-                processParagraph( hwpfDocument, flow, currentTableLevel,
-                        paragraph, label );
+                    processParagraph( hwpfDocument, flow, currentTableLevel,
+                            paragraph, label );
+                }
+                else
+                {
+                    logger.log( POILogger.WARN,
+                            "Paragraph #" + paragraph.getStartOffset() + "-"
+                                    + paragraph.getEndOffset()
+                                    + " has reference to list structure #"
+                                    + currentListInfo
+                                    + ", but listTables not defined in file" );
+
+                    processParagraph( hwpfDocument, flow, currentTableLevel,
+                            paragraph, WordToFoUtils.EMPTY );
+                }
             }
             else
             {
@@ -581,8 +596,6 @@ public class WordToFoExtractor extends AbstractToFoExtractor
     protected void processTable( HWPFDocument hwpfDocument, Element flow,
             Table table, int thisTableLevel )
     {
-        Element tableElement = addTable( flow );
-
         Element tableHeader = createTableHeader();
         Element tableBody = createTableBody();
 
@@ -681,6 +694,7 @@ public class WordToFoExtractor extends AbstractToFoExtractor
             }
         }
 
+        final Element tableElement = createTable();
         if ( tableHeader.hasChildNodes() )
         {
             tableElement.appendChild( tableHeader );
@@ -688,6 +702,7 @@ public class WordToFoExtractor extends AbstractToFoExtractor
         if ( tableBody.hasChildNodes() )
         {
             tableElement.appendChild( tableBody );
+            flow.appendChild( tableElement );
         }
         else
         {
diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/extractor/TestWordToFoExtractorSuite.java b/src/scratchpad/testcases/org/apache/poi/hwpf/extractor/TestWordToFoExtractorSuite.java
new file mode 100644 (file)
index 0000000..2239d55
--- /dev/null
@@ -0,0 +1,87 @@
+package org.apache.poi.hwpf.extractor;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FilenameFilter;
+import java.io.StringWriter;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.apache.poi.EncryptedDocumentException;
+
+import org.apache.poi.hwpf.OldWordFileFormatException;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.apache.poi.POIDataSamples;
+import org.apache.poi.hwpf.HWPFDocument;
+
+public class TestWordToFoExtractorSuite
+{
+    public static Test suite()
+    {
+        TestSuite suite = new TestSuite();
+
+        File directory = POIDataSamples.getDocumentInstance().getFile(
+                "../document" );
+        for ( final File child : directory.listFiles( new FilenameFilter()
+        {
+            public boolean accept( File dir, String name )
+            {
+                return name.endsWith( ".doc" );
+            }
+        } ) )
+        {
+            final String name = child.getName();
+            suite.addTest( new TestCase( name )
+            {
+                public void runTest() throws Exception
+                {
+                    test( child );
+                }
+            } );
+        }
+
+        return suite;
+    }
+
+    protected static void test( File child ) throws Exception
+    {
+        HWPFDocument hwpfDocument;
+        FileInputStream fileInputStream = new FileInputStream( child );
+        try
+        {
+            hwpfDocument = new HWPFDocument( fileInputStream );
+        }
+        catch ( Exception exc )
+        {
+            // unable to parse file -- not WordToFoExtractor fault
+            return;
+        }
+        finally
+        {
+            fileInputStream.close();
+        }
+
+        WordToFoExtractor wordToFoExtractor = new WordToFoExtractor(
+                DocumentBuilderFactory.newInstance().newDocumentBuilder()
+                        .newDocument() );
+        wordToFoExtractor.processDocument( hwpfDocument );
+
+        StringWriter stringWriter = new StringWriter();
+
+        Transformer transformer = TransformerFactory.newInstance()
+                .newTransformer();
+        transformer.setOutputProperty( OutputKeys.INDENT, "yes" );
+        transformer.transform(
+                new DOMSource( wordToFoExtractor.getDocument() ),
+                new StreamResult( stringWriter ) );
+        // no exceptions
+    }
+}