poi-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From kiwiwi...@apache.org
Subject svn commit: r1793600 - in /poi/trunk/src: examples/src/org/apache/poi/hpsf/examples/CopyCompare.java integrationtest/org/apache/poi/stress/HPSFFileHandler.java java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java
Date Tue, 02 May 2017 23:29:20 GMT
Author: kiwiwings
Date: Tue May  2 23:29:19 2017
New Revision: 1793600

URL: http://svn.apache.org/viewvc?rev=1793600&view=rev
Log:
HPSF: Add CopyCompare to IntegrationTests

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

Modified: poi/trunk/src/examples/src/org/apache/poi/hpsf/examples/CopyCompare.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/examples/src/org/apache/poi/hpsf/examples/CopyCompare.java?rev=1793600&r1=1793599&r2=1793600&view=diff
==============================================================================
--- poi/trunk/src/examples/src/org/apache/poi/hpsf/examples/CopyCompare.java (original)
+++ poi/trunk/src/examples/src/org/apache/poi/hpsf/examples/CopyCompare.java Tue May  2 23:29:19
2017
@@ -47,6 +47,7 @@ import org.apache.poi.poifs.filesystem.D
 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) {

Modified: poi/trunk/src/integrationtest/org/apache/poi/stress/HPSFFileHandler.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/integrationtest/org/apache/poi/stress/HPSFFileHandler.java?rev=1793600&r1=1793599&r2=1793600&view=diff
==============================================================================
--- poi/trunk/src/integrationtest/org/apache/poi/stress/HPSFFileHandler.java (original)
+++ poi/trunk/src/integrationtest/org/apache/poi/stress/HPSFFileHandler.java Tue May  2 23:29:19
2017
@@ -16,33 +16,113 @@
 ==================================================================== */
 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();
 		}

Modified: poi/trunk/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java?rev=1793600&r1=1793599&r2=1793600&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java Tue May  2 23:29:19
2017
@@ -51,6 +51,7 @@ public class POIFSReader
 {
     private final POIFSReaderRegistry registry;
     private boolean registryClosed;
+    private boolean notifyEmptyDirectories = false;
 
     /**
      * Create a POIFSReader
@@ -181,6 +182,18 @@ public class POIFSReader
     }
 
     /**
+     * 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
      *
      * @param args names of the 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);
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org


Mime
View raw message