diff --git a/src/java/org/apache/poi/poifs/filesystem/EntryUtils.java b/src/java/org/apache/poi/poifs/filesystem/EntryUtils.java index f6525f954..b268fe0a3 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 8c6712c96..3cf452acf 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 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)); } }