aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Burch <nick@apache.org>2015-07-06 21:15:57 +0000
committerNick Burch <nick@apache.org>2015-07-06 21:15:57 +0000
commit92764ff10d3059218b67fd5a15cb7c37db30bcd7 (patch)
treebc34f5f7ffd044a15ab23509393bb5ca1969afb8
parentdf179170a23934654ec8836fc6bc1139b9077bec (diff)
downloadpoi-92764ff10d3059218b67fd5a15cb7c37db30bcd7.tar.gz
poi-92764ff10d3059218b67fd5a15cb7c37db30bcd7.zip
Helper method to report the number of blocks used in a BAT
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1689504 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--src/java/org/apache/poi/poifs/storage/BATBlock.java17
-rw-r--r--src/testcases/org/apache/poi/poifs/storage/TestBATBlock.java54
2 files changed, 69 insertions, 2 deletions
diff --git a/src/java/org/apache/poi/poifs/storage/BATBlock.java b/src/java/org/apache/poi/poifs/storage/BATBlock.java
index 8712e65f6f..53099644ac 100644
--- a/src/java/org/apache/poi/poifs/storage/BATBlock.java
+++ b/src/java/org/apache/poi/poifs/storage/BATBlock.java
@@ -30,8 +30,6 @@ import org.apache.poi.util.LittleEndian;
/**
* A block of block allocation table entries. BATBlocks are created
* only through a static factory method: createBATBlocks.
- *
- * @author Marc Johnson (mjohnson at apache dot org)
*/
public final class BATBlock extends BigBlock {
/**
@@ -301,6 +299,21 @@ public final class BATBlock extends BigBlock {
public boolean hasFreeSectors() {
return _has_free_sectors;
}
+ /**
+ * How many sectors in this block are taken?
+ * Note that calling {@link #hasFreeSectors()} is much quicker
+ */
+ public int getUsedSectors(boolean isAnXBAT) {
+ int usedSectors = 0;
+ int toCheck = _values.length;
+ if (isAnXBAT) toCheck--; // Last is a chain location
+ for(int k=0; k<toCheck; k++) {
+ if(_values[k] != POIFSConstants.UNUSED_BLOCK) {
+ usedSectors ++;
+ }
+ }
+ return usedSectors;
+ }
public int getValueAt(int relativeOffset) {
if(relativeOffset >= _values.length) {
diff --git a/src/testcases/org/apache/poi/poifs/storage/TestBATBlock.java b/src/testcases/org/apache/poi/poifs/storage/TestBATBlock.java
index 3fc77b839c..11c7070e93 100644
--- a/src/testcases/org/apache/poi/poifs/storage/TestBATBlock.java
+++ b/src/testcases/org/apache/poi/poifs/storage/TestBATBlock.java
@@ -26,6 +26,7 @@ import java.util.List;
import junit.framework.TestCase;
+import org.apache.poi.poifs.common.POIFSBigBlockSize;
import org.apache.poi.poifs.common.POIFSConstants;
/**
@@ -283,6 +284,59 @@ public final class TestBATBlock extends TestCase {
);
}
+ public void testUsedSectors() throws Exception {
+ POIFSBigBlockSize b512 = POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS;
+ POIFSBigBlockSize b4096 = POIFSConstants.LARGER_BIG_BLOCK_SIZE_DETAILS;
+
+ // Try first with 512 block sizes, which can hold 128 entries
+ BATBlock block512 = BATBlock.createEmptyBATBlock(b512, false);
+ assertEquals(true, block512.hasFreeSectors());
+ assertEquals(0, block512.getUsedSectors(false));
+
+ // Allocate a few
+ block512.setValueAt(0, 42);
+ block512.setValueAt(10, 42);
+ block512.setValueAt(20, 42);
+ assertEquals(true, block512.hasFreeSectors());
+ assertEquals(3, block512.getUsedSectors(false));
+
+ // Allocate all
+ for (int i=0; i<b512.getBATEntriesPerBlock(); i++) {
+ block512.setValueAt(i, 82);
+ }
+ // Check
+ assertEquals(false, block512.hasFreeSectors());
+ assertEquals(128, block512.getUsedSectors(false));
+ assertEquals(127, block512.getUsedSectors(true));
+
+ // Release one
+ block512.setValueAt(10, POIFSConstants.UNUSED_BLOCK);
+ assertEquals(true, block512.hasFreeSectors());
+ assertEquals(127, block512.getUsedSectors(false));
+ assertEquals(126, block512.getUsedSectors(true));
+
+
+ // Now repeat with 4096 block sizes
+ BATBlock block4096 = BATBlock.createEmptyBATBlock(b4096, false);
+ assertEquals(true, block4096.hasFreeSectors());
+ assertEquals(0, block4096.getUsedSectors(false));
+
+ block4096.setValueAt(0, 42);
+ block4096.setValueAt(10, 42);
+ block4096.setValueAt(20, 42);
+ assertEquals(true, block4096.hasFreeSectors());
+ assertEquals(3, block4096.getUsedSectors(false));
+
+ // Allocate all
+ for (int i=0; i<b4096.getBATEntriesPerBlock(); i++) {
+ block4096.setValueAt(i, 82);
+ }
+ // Check
+ assertEquals(false, block4096.hasFreeSectors());
+ assertEquals(1024, block4096.getUsedSectors(false));
+ assertEquals(1023, block4096.getUsedSectors(true));
+ }
+
public void testGetBATBlockAndIndex() throws Exception {
HeaderBlock header = new HeaderBlock(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS);
List<BATBlock> blocks = new ArrayList<BATBlock>();