When deleting a document in NPOIFS, free the underlying blocks

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1590160 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2014-04-25 22:00:30 +00:00
parent fb89f2c2aa
commit 0bdc025279
3 changed files with 32 additions and 9 deletions

View File

@ -290,13 +290,17 @@ public class DirectoryNode
if (rval) if (rval)
{ {
_entries.remove(entry); _entries.remove(entry);
_byname.remove(entry.getName()); _byname.remove(entry.getName());
if(_ofilesystem != null) { if(_ofilesystem != null) {
_ofilesystem.remove(entry); _ofilesystem.remove(entry);
} else { } else {
_nfilesystem.remove(entry); try {
} _nfilesystem.remove(entry);
} catch (IOException e) {
// TODO Work out how to report this, given we can't change the method signature...
}
}
} }
return rval; return rval;
} }

View File

@ -128,6 +128,14 @@ public final class NPOIFSDocument implements POIFSViewable {
_property.setStartBlock(_stream.getStartBlock()); _property.setStartBlock(_stream.getStartBlock());
} }
/**
* Frees the underlying stream and property
*/
void free() throws IOException {
_stream.free();
_property.setStartBlock(POIFSConstants.END_OF_CHAIN);
}
int getDocumentBlockSize() { int getDocumentBlockSize() {
return _block_size; return _block_size;
} }

View File

@ -44,6 +44,7 @@ import org.apache.poi.poifs.nio.ByteArrayBackedDataSource;
import org.apache.poi.poifs.nio.DataSource; import org.apache.poi.poifs.nio.DataSource;
import org.apache.poi.poifs.nio.FileBackedDataSource; import org.apache.poi.poifs.nio.FileBackedDataSource;
import org.apache.poi.poifs.property.DirectoryProperty; import org.apache.poi.poifs.property.DirectoryProperty;
import org.apache.poi.poifs.property.DocumentProperty;
import org.apache.poi.poifs.property.NPropertyTable; import org.apache.poi.poifs.property.NPropertyTable;
import org.apache.poi.poifs.storage.BATBlock; import org.apache.poi.poifs.storage.BATBlock;
import org.apache.poi.poifs.storage.BATBlock.BATBlockAndIndex; import org.apache.poi.poifs.storage.BATBlock.BATBlockAndIndex;
@ -431,7 +432,11 @@ public class NPOIFSFileSystem extends BlockStore
// The header block doesn't count, so add one // The header block doesn't count, so add one
long blockWanted = offset + 1; long blockWanted = offset + 1;
long startAt = blockWanted * bigBlockSize.getBigBlockSize(); long startAt = blockWanted * bigBlockSize.getBigBlockSize();
return _data.read(bigBlockSize.getBigBlockSize(), startAt); try {
return _data.read(bigBlockSize.getBigBlockSize(), startAt);
} catch (IndexOutOfBoundsException e) {
throw new IndexOutOfBoundsException("Block " + offset + " not found - " + e);
}
} }
/** /**
@ -820,9 +825,15 @@ public class NPOIFSFileSystem extends BlockStore
* *
* @param entry to be removed * @param entry to be removed
*/ */
void remove(EntryNode entry) throws IOException
void remove(EntryNode entry)
{ {
// If it's a document, free the blocks
if (entry instanceof DocumentEntry) {
NPOIFSDocument doc = new NPOIFSDocument((DocumentProperty)entry.getProperty(), this);
doc.free();
}
// Now zap it from the properties list
_property_table.removeProperty(entry.getProperty()); _property_table.removeProperty(entry.getProperty());
} }