aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/java/org/apache/poi/poifs/filesystem/EntryUtils.java9
-rw-r--r--src/testcases/org/apache/poi/poifs/filesystem/TestEntryUtils.java34
2 files changed, 35 insertions, 8 deletions
diff --git a/src/java/org/apache/poi/poifs/filesystem/EntryUtils.java b/src/java/org/apache/poi/poifs/filesystem/EntryUtils.java
index f6525f954c..b268fe0a3d 100644
--- a/src/java/org/apache/poi/poifs/filesystem/EntryUtils.java
+++ b/src/java/org/apache/poi/poifs/filesystem/EntryUtils.java
@@ -104,8 +104,9 @@ public class EntryUtils
* Checks to see if the two Directories hold the same contents.
* For this to be true, they must have entries with the same names,
* no entries in one but not the other, and the size+contents
- * of each entry must match, and they must share names
- * TODO Some sort of excepts support
+ * of each entry must match, and they must share names.
+ * To exclude certain parts of the Directory from being checked,
+ * use a {@link FilteringDirectoryNode}
*/
public static boolean areDirectoriesIdentical(DirectoryEntry dirA, DirectoryEntry dirB) {
// First, check names
@@ -162,10 +163,10 @@ public class EntryUtils
boolean match;
if (a.isDirectoryEntry()) {
match = areDirectoriesIdentical(
- (DirectoryNode)a, (DirectoryNode)b);
+ (DirectoryEntry)a, (DirectoryEntry)b);
} else {
match = areDocumentsIdentical(
- (DocumentNode)a, (DocumentNode)b);
+ (DocumentEntry)a, (DocumentEntry)b);
}
if (!match) return false;
} catch(FileNotFoundException e) {
diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestEntryUtils.java b/src/testcases/org/apache/poi/poifs/filesystem/TestEntryUtils.java
index 8c6712c96e..3cf452acff 100644
--- a/src/testcases/org/apache/poi/poifs/filesystem/TestEntryUtils.java
+++ b/src/testcases/org/apache/poi/poifs/filesystem/TestEntryUtils.java
@@ -20,13 +20,12 @@ package org.apache.poi.poifs.filesystem;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
import junit.framework.TestCase;
-import org.apache.poi.POIDataSamples;
-
public class TestEntryUtils extends TestCase {
- private static final POIDataSamples dataSamples = POIDataSamples.getPOIFSInstance();
private byte[] dataSmallA = new byte[] { 12, 42, 11, -12, -121 };
private byte[] dataSmallB = new byte[] { 11, 73, 21, -92, -103 };
@@ -160,6 +159,33 @@ public class TestEntryUtils extends TestCase {
assertEquals(true, EntryUtils.areDirectoriesIdentical(dirA1, dirB1));
- // TODO Excludes support
+ // Excludes support
+ List<String> excl = Arrays.asList(new String[] {"Ignore1", "IgnDir/Ign2"});
+ FilteringDirectoryNode fdA = new FilteringDirectoryNode(dirA1, excl);
+ FilteringDirectoryNode fdB = new FilteringDirectoryNode(dirB1, excl);
+
+ assertEquals(true, EntryUtils.areDirectoriesIdentical(fdA, fdB));
+
+ // Add an ignored doc, no notice is taken
+ fdA.createDocument("Ignore1", new ByteArrayInputStream(dataSmallA));
+ assertEquals(true, EntryUtils.areDirectoriesIdentical(fdA, fdB));
+
+ // Add a directory with filtered contents, not the same
+ DirectoryEntry dirAI = dirA1.createDirectory("IgnDir");
+ assertEquals(false, EntryUtils.areDirectoriesIdentical(fdA, fdB));
+
+ DirectoryEntry dirBI = dirB1.createDirectory("IgnDir");
+ assertEquals(true, EntryUtils.areDirectoriesIdentical(fdA, fdB));
+
+ // Add something to the filtered subdir that gets ignored
+ dirAI.createDocument("Ign2", new ByteArrayInputStream(dataSmallA));
+ assertEquals(true, EntryUtils.areDirectoriesIdentical(fdA, fdB));
+
+ // And something that doesn't
+ dirAI.createDocument("IgnZZ", new ByteArrayInputStream(dataSmallA));
+ assertEquals(false, EntryUtils.areDirectoriesIdentical(fdA, fdB));
+
+ dirBI.createDocument("IgnZZ", new ByteArrayInputStream(dataSmallA));
+ assertEquals(true, EntryUtils.areDirectoriesIdentical(fdA, fdB));
}
}