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:
parent
fb89f2c2aa
commit
0bdc025279
@ -295,7 +295,11 @@ public class DirectoryNode
|
|||||||
if(_ofilesystem != null) {
|
if(_ofilesystem != null) {
|
||||||
_ofilesystem.remove(entry);
|
_ofilesystem.remove(entry);
|
||||||
} else {
|
} else {
|
||||||
|
try {
|
||||||
_nfilesystem.remove(entry);
|
_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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
try {
|
||||||
return _data.read(bigBlockSize.getBigBlockSize(), startAt);
|
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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user