]> source.dussan.org Git - poi.git/commitdiff
HPSF: Add CopyCompare to IntegrationTests
authorAndreas Beeker <kiwiwings@apache.org>
Tue, 2 May 2017 23:29:19 +0000 (23:29 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Tue, 2 May 2017 23:29:19 +0000 (23:29 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1793600 13f79535-47bb-0310-9956-ffa450edef68

src/examples/src/org/apache/poi/hpsf/examples/CopyCompare.java
src/integrationtest/org/apache/poi/stress/HPSFFileHandler.java
src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java

index f4b5ba10d0342f75bf269c81310bbdb5047ae5bb..5d27c968dea25579245035a2c850b237949cd448 100644 (file)
@@ -47,6 +47,7 @@ import org.apache.poi.poifs.filesystem.DocumentInputStream;
 import org.apache.poi.poifs.filesystem.Entry;
 import org.apache.poi.poifs.filesystem.POIFSDocumentPath;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.util.IOUtils;
 import org.apache.poi.util.TempFile;
 
 /**
@@ -66,7 +67,7 @@ import org.apache.poi.util.TempFile;
  * exactly identical. However, both POI file systems must contain the same
  * files, and most of these files must be bitwise identical. Property set
  * streams, however, are compared logically: they must have the same sections
- * with the same attributs, and the sections must contain the same properties.
+ * with the same attributes, and the sections must contain the same properties.
  * Details like the ordering of the properties do not matter.</p>
  */
 public class CopyCompare
@@ -124,6 +125,7 @@ public class CopyCompare
         final POIFSReader r = new POIFSReader();
         final CopyFile cf = new CopyFile(copyFileName);
         r.registerListener(cf);
+        r.setNotifyEmptyDirectories(true);
         FileInputStream fis = new FileInputStream(originalFileName);
         r.read(fis);
         fis.close();
@@ -133,19 +135,23 @@ public class CopyCompare
 
         /* Read all documents from the original POI file system and compare them
          * with the equivalent document from the copy. */
-        final POIFSFileSystem opfs = new POIFSFileSystem(new File(originalFileName));
-        final POIFSFileSystem cpfs = new POIFSFileSystem(new File(copyFileName));
-
-        final DirectoryEntry oRoot = opfs.getRoot();
-        final DirectoryEntry cRoot = cpfs.getRoot();
-        final StringBuffer messages = new StringBuffer();
-        if (equal(oRoot, cRoot, messages)) {
-            System.out.println("Equal");
-        } else {
+        POIFSFileSystem opfs = null, cpfs = null;
+        try {
+            opfs = new POIFSFileSystem(new File(originalFileName));
+            cpfs = new POIFSFileSystem(new File(copyFileName));
+            
+            final DirectoryEntry oRoot = opfs.getRoot();
+            final DirectoryEntry cRoot = cpfs.getRoot();
+            final StringBuffer messages = new StringBuffer();
+            if (equal(oRoot, cRoot, messages)) {
+                System.out.println("Equal");
+            } else {
             System.out.println("Not equal: " + messages);
+            }
+        } finally {
+            IOUtils.closeQuietly(cpfs);
+            IOUtils.closeQuietly(opfs);
         }
-        cpfs.close();
-        opfs.close();
     }
 
 
@@ -179,15 +185,12 @@ public class CopyCompare
         /* Iterate over d1 and compare each entry with its counterpart in d2. */
         for (final Entry e1 : d1) {
             final String n1 = e1.getName();
-            Entry e2 = null;
-            try {
-                e2 = d2.getEntry(n1);
-            } catch (FileNotFoundException ex) {
-                msg.append("Document \"" + e1 + "\" exists, document \"" +
-                           e2 + "\" does not.\n");
+            if (!d2.hasEntry(n1)) {
+                msg.append("Document \"" + n1 + "\" exists only in the source.\n");
                 equal = false;
                 break;
             }
+            Entry e2 = d2.getEntry(n1);
 
             if (e1.isDirectoryEntry() && e2.isDirectoryEntry()) {
                 equal = equal((DirectoryEntry) e1, (DirectoryEntry) e2, msg);
@@ -320,7 +323,7 @@ public class CopyCompare
             try {
                 /* Find out whether the current document is a property set
                  * stream or not. */
-                if (PropertySet.isPropertySetStream(stream)) {
+                if (stream != null && PropertySet.isPropertySetStream(stream)) {
                     /* Yes, the current document is a property set stream.
                      * Let's create a PropertySet instance from it. */
                     PropertySet ps = null;
@@ -337,7 +340,7 @@ public class CopyCompare
                 } else {
                     /* No, the current document is not a property set stream. We
                      * copy it unmodified to the destination POIFS. */
-                    copy(poiFs, event.getPath(), event.getName(), stream);
+                    copy(poiFs, path, name, stream);
                 }
             } catch (MarkUnsupportedException ex) {
                 t = ex;
@@ -399,6 +402,10 @@ public class CopyCompare
                          final DocumentInputStream stream)
         throws IOException {
             final DirectoryEntry de = getPath(poiFs, path);
+            if (stream == null && name == null) {
+                // Empty directory
+                return;
+            }
             final ByteArrayOutputStream out = new ByteArrayOutputStream();
             int c;
             while ((c = stream.read()) != -1) {
index 1f3dc6905612900a9bb78215fde865848dd93d07..77ad5ef06120b8e225dcf24edeabdce37f0d401a 100644 (file)
 ==================================================================== */
 package org.apache.poi.stress;
 
-import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
 
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.IOException;
 import java.io.InputStream;
+import java.io.PrintStream;
+import java.nio.charset.Charset;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
 
+import org.apache.poi.hpsf.DocumentSummaryInformation;
 import org.apache.poi.hpsf.HPSFPropertiesOnlyDocument;
+import org.apache.poi.hpsf.MarkUnsupportedException;
+import org.apache.poi.hpsf.PropertySet;
+import org.apache.poi.hpsf.SummaryInformation;
+import org.apache.poi.hpsf.examples.CopyCompare;
+import org.apache.poi.poifs.filesystem.DirectoryNode;
+import org.apache.poi.poifs.filesystem.DocumentInputStream;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.util.TempFile;
+import org.junit.Assume;
 import org.junit.Test;
 
 public class HPSFFileHandler extends POIFSFileHandler {
-       @Override
-    public void handleFile(InputStream stream) throws Exception {
-               HPSFPropertiesOnlyDocument hpsf = new HPSFPropertiesOnlyDocument(new POIFSFileSystem(stream));
-               assertNotNull(hpsf.getDocumentSummaryInformation());
-               assertNotNull(hpsf.getSummaryInformation());
+    private static File copyOutput = null;
+    
+    static final Set<String> EXCLUDES_HANDLE_ADD = unmodifiableHashSet(
+        "spreadsheet/45290.xls",
+        "spreadsheet/46904.xls",
+        "spreadsheet/55982.xls",
+        "spreadsheet/testEXCEL_3.xls",
+        "spreadsheet/testEXCEL_4.xls",
+        "hpsf/Test_Humor-Generation.ppt"
+    );
+    
+    static final Set<String> EXCLUDES_HANDLE_FILE = unmodifiableHashSet(
+        "hpsf/Test_Humor-Generation.ppt"
+    );
+        
+    
+    private static final Set<String> unmodifiableHashSet(String... a) {
+        return Collections.unmodifiableSet(new HashSet<String>(Arrays.asList(a)));
+    }
+
+    
+    @Override
+    public void handleFile(InputStream stream, String path) throws Exception {
+        Assume.assumeFalse(EXCLUDES_HANDLE_FILE.contains(path));
+           POIFSFileSystem poifs = new POIFSFileSystem(stream);
+               HPSFPropertiesOnlyDocument hpsf = new HPSFPropertiesOnlyDocument(poifs);
+               DocumentSummaryInformation dsi = hpsf.getDocumentSummaryInformation();
+               SummaryInformation si = hpsf.getSummaryInformation();
+               boolean hasDSI = hasPropertyStream(poifs, DocumentSummaryInformation.DEFAULT_STREAM_NAME);
+               boolean hasSI = hasPropertyStream(poifs, SummaryInformation.DEFAULT_STREAM_NAME);
+               
+               assertEquals(hasDSI, dsi != null);
+        assertEquals(hasSI, si != null);
                
                handlePOIDocument(hpsf);
        }
+
+       private static boolean hasPropertyStream(POIFSFileSystem poifs, String streamName) throws IOException, MarkUnsupportedException {
+        DirectoryNode root = poifs.getRoot();
+           if (!root.hasEntry(streamName)) {
+               return false;
+           }
+           DocumentInputStream dis = root.createDocumentInputStream(streamName);
+           try {
+               return PropertySet.isPropertySetStream(dis);
+           } finally {
+               dis.close();;
+           }
+       }
+       
+    @Override
+    public void handleAdditional(File file) throws Exception {
+        Assume.assumeFalse(EXCLUDES_HANDLE_ADD.contains(file.getParentFile().getName()+"/"+file.getName()));
+        if (copyOutput == null) {
+            copyOutput = TempFile.createTempFile("hpsfCopy", "out");
+            copyOutput.deleteOnExit();
+        }
+
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        PrintStream psNew = new PrintStream(bos);
+        PrintStream ps = System.out;
+        try {
+            System.setOut(psNew);
+            CopyCompare.main(new String[]{file.getAbsolutePath(), copyOutput.getAbsolutePath()});
+            assertEquals("Equal\n", new String(bos.toByteArray(), Charset.forName("UTF-8")));
+        } finally {
+            System.setOut(ps);
+        }
+    }
+
        
        // a test-case to test this locally without executing the full TestAllFiles
        @Override
     @Test
        public void test() throws Exception {
-               InputStream stream = new FileInputStream("test-data/hpsf/Test0313rur.adm");
+           String path = "test-data/hpsf/Test0313rur.adm";
+               InputStream stream = new FileInputStream(path);
                try {
-                       handleFile(stream);
+                       handleFile(stream, path);
                } finally {
                        stream.close();
                }
index 633feba62d5ed3afa19f0d2802da6e914d5348e9..c236c4b83b85d1a97bb3a41e5419c2d73e449ce9 100644 (file)
@@ -51,6 +51,7 @@ public class POIFSReader
 {
     private final POIFSReaderRegistry registry;
     private boolean registryClosed;
+    private boolean notifyEmptyDirectories = false;
 
     /**
      * Create a POIFSReader
@@ -180,6 +181,18 @@ public class POIFSReader
                                                  : path, name);
     }
 
+    /**
+     * Activates the notification of empty directories.<p>
+     * If this flag is activated, the {@link POIFSReaderListener listener} receives
+     * {@link POIFSReaderEvent POIFSReaderEvents} with nulled {@code name} and {@code stream} 
+     *
+     * @param notifyEmptyDirectories
+     */
+    public void setNotifyEmptyDirectories(boolean notifyEmptyDirectories) {
+        this.notifyEmptyDirectories = notifyEmptyDirectories;
+    }
+    
+    
     /**
      * read in files
      *
@@ -216,27 +229,27 @@ public class POIFSReader
                                    final BlockList big_blocks,
                                    final Iterator<Property> properties,
                                    final POIFSDocumentPath path)
-        throws IOException
-    {
+    throws IOException {
+        if (!properties.hasNext() && notifyEmptyDirectories) {
+            Iterator<POIFSReaderListener> listeners  = registry.getListeners(path, ".");
+            while (listeners.hasNext()) {
+                POIFSReaderListener pl = listeners.next();
+                POIFSReaderEvent pe = new POIFSReaderEvent(null, path, null);
+                pl.processPOIFSReaderEvent(pe);
+            }
+            return;
+        }
+        
         while (properties.hasNext())
         {
             Property property = properties.next();
             String   name     = property.getName();
 
-            if (property.isDirectory())
-            {
-                POIFSDocumentPath new_path = new POIFSDocumentPath(path,
-                                                 new String[]
-                {
-                    name
-                });
-
-                processProperties(
-                    small_blocks, big_blocks,
-                    (( DirectoryProperty ) property).getChildren(), new_path);
-            }
-            else
-            {
+            if (property.isDirectory()) {
+                POIFSDocumentPath new_path = new POIFSDocumentPath(path,new String[]{name});
+                DirectoryProperty dp = (DirectoryProperty) property;
+                processProperties(small_blocks, big_blocks, dp.getChildren(), new_path);
+            } else {
                 int startBlock = property.getStartBlock();
                 Iterator<POIFSReaderListener> listeners  = registry.getListeners(path, name);