Copied: poi/trunk/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java (from r1839708, poi/trunk/src/java/org/apache/poi/poifs/filesystem/NDocumentInputStream.java) URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java?p2=poi/trunk/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java&p1=poi/trunk/src/java/org/apache/poi/poifs/filesystem/NDocumentInputStream.java&r1=1839708&r2=1839709&rev=1839709&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/poifs/filesystem/NDocumentInputStream.java (original) +++ poi/trunk/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java Fri Aug 31 00:25:50 2018 @@ -22,18 +22,23 @@ import static org.apache.poi.util.Little import static org.apache.poi.util.LittleEndianConsts.SHORT_SIZE; import java.io.IOException; +import java.io.InputStream; import java.nio.ByteBuffer; import java.util.Iterator; import org.apache.poi.poifs.property.DocumentProperty; import org.apache.poi.util.IOUtils; import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.LittleEndianInput; /** * This class provides methods to read a DocumentEntry managed by a - * {@link NPOIFSFileSystem} instance. + * {@link POIFSFileSystem} instance. */ -public final class NDocumentInputStream extends DocumentInputStream { +public final class DocumentInputStream extends InputStream implements LittleEndianInput { + /** returned by read operations if we're at end of document */ + private static final int EOF = -1; + /** current offset into the Document */ private int _current_offset; /** current block count */ @@ -51,7 +56,7 @@ public final class NDocumentInputStream private boolean _closed; /** the actual Document */ - private final NPOIFSDocument _document; + private final POIFSDocument _document; private Iterator<ByteBuffer> _data; private ByteBuffer _buffer; @@ -64,7 +69,7 @@ public final class NDocumentInputStream * @exception IOException if the DocumentEntry cannot be opened (like, maybe it has * been deleted?) */ - public NDocumentInputStream(DocumentEntry document) throws IOException { + public DocumentInputStream(DocumentEntry document) throws IOException { if (!(document instanceof DocumentNode)) { throw new IOException("Cannot open internal document storage, " + document + " not a Document Node"); } @@ -80,7 +85,7 @@ public final class NDocumentInputStream DocumentNode doc = (DocumentNode)document; DocumentProperty property = (DocumentProperty)doc.getProperty(); - _document = new NPOIFSDocument( + _document = new POIFSDocument( property, ((DirectoryNode)doc.getParent()).getNFileSystem() ); @@ -92,7 +97,7 @@ public final class NDocumentInputStream * * @param document the Document to be read */ - public NDocumentInputStream(NPOIFSDocument document) { + public DocumentInputStream(POIFSDocument document) { _current_offset = 0; _current_block_count = 0; _marked_offset = 0; @@ -125,6 +130,16 @@ public final class NDocumentInputStream _closed = true; } + /** + * Tests if this input stream supports the mark and reset methods. + * + * @return {@code true} always + */ + @Override + public boolean markSupported() { + return true; + } + @Override public void mark(int ignoredReadlimit) { _marked_offset = _current_offset; @@ -149,6 +164,11 @@ public final class NDocumentInputStream } @Override + public int read(byte[] b) throws IOException { + return read(b, 0, b.length); + } + + @Override public int read(byte[] b, int off, int len) throws IOException { dieIfClosed(); if (b == null) { @@ -254,7 +274,12 @@ public final class NDocumentInputStream } } - @Override + @Override + public void readFully(byte[] buf) { + readFully(buf, 0, buf.length); + } + + @Override public void readFully(byte[] buf, int off, int len) { if (len < 0) { throw new RuntimeException("Can't read negative number of bytes"); @@ -276,7 +301,13 @@ public final class NDocumentInputStream } } - @Override + @Override + public void readPlain(byte[] buf, int off, int len) { + readFully(buf, off, len); + } + + + @Override public byte readByte() { return (byte) readUByte(); } @@ -310,7 +341,12 @@ public final class NDocumentInputStream return LittleEndian.getInt(data); } - @Override + public long readUInt() { + int i = readInt(); + return i & 0xFFFFFFFFL; + } + + @Override public int readUShort() { checkAvaliable(SHORT_SIZE); byte[] data = new byte[SHORT_SIZE];
Modified: poi/trunk/src/java/org/apache/poi/poifs/filesystem/DocumentNode.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/filesystem/DocumentNode.java?rev=1839709&r1=1839708&r2=1839709&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/poifs/filesystem/DocumentNode.java (original) +++ poi/trunk/src/java/org/apache/poi/poifs/filesystem/DocumentNode.java Fri Aug 31 00:25:50 2018 @@ -35,7 +35,7 @@ public class DocumentNode { // underlying POIFSDocument instance - private NPOIFSDocument _document; + private POIFSDocument _document; /** * create a DocumentNode. This method is not public by design; it @@ -56,7 +56,7 @@ public class DocumentNode * * @return the internal POIFSDocument */ - NPOIFSDocument getDocument() + POIFSDocument getDocument() { return _document; } Copied: poi/trunk/src/java/org/apache/poi/poifs/filesystem/DocumentOutputStream.java (from r1839708, poi/trunk/src/java/org/apache/poi/poifs/filesystem/NDocumentOutputStream.java) URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/filesystem/DocumentOutputStream.java?p2=poi/trunk/src/java/org/apache/poi/poifs/filesystem/DocumentOutputStream.java&p1=poi/trunk/src/java/org/apache/poi/poifs/filesystem/NDocumentOutputStream.java&r1=1839708&r2=1839709&rev=1839709&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/poifs/filesystem/NDocumentOutputStream.java (original) +++ poi/trunk/src/java/org/apache/poi/poifs/filesystem/DocumentOutputStream.java Fri Aug 31 00:25:50 2018 @@ -27,17 +27,17 @@ import org.apache.poi.poifs.property.Doc /** * This class provides methods to write a DocumentEntry managed by a - * {@link NPOIFSFileSystem} instance. + * {@link POIFSFileSystem} instance. */ -public final class NDocumentOutputStream extends OutputStream { - /** the Document's size */ - private int _document_size; +public final class DocumentOutputStream extends OutputStream { + /** the Document's size, i.e. the size of the big block data - mini block data is cached and not counted */ + private int _document_size = 0; - /** have we been closed? */ - private boolean _closed; + /** have we been closed? */ + private boolean _closed = false; /** the actual Document */ - private NPOIFSDocument _document; + private POIFSDocument _document; /** and its Property */ private DocumentProperty _property; @@ -46,53 +46,68 @@ public final class NDocumentOutputStream new ByteArrayOutputStream(POIFSConstants.BIG_BLOCK_MINIMUM_DOCUMENT_SIZE); /** our main block stream, when we're into normal blocks */ - private NPOIFSStream _stream; + private POIFSStream _stream; private OutputStream _stream_output; - + + /** a write limit or -1 if unlimited */ + private final long _limit; + + /** * Create an OutputStream from the specified DocumentEntry. * The specified entry will be emptied. * * @param document the DocumentEntry to be written */ - public NDocumentOutputStream(DocumentEntry document) throws IOException { - if (!(document instanceof DocumentNode)) { - throw new IOException("Cannot open internal document storage, " + document + " not a Document Node"); - } - _document_size = 0; - _closed = false; - - _property = (DocumentProperty)((DocumentNode)document).getProperty(); - - _document = new NPOIFSDocument((DocumentNode)document); - _document.free(); + public DocumentOutputStream(DocumentEntry document) throws IOException { + this(document, -1); } - - /** + + /** * Create an OutputStream to create the specified new Entry * * @param parent Where to create the Entry * @param name Name of the new entry */ - public NDocumentOutputStream(DirectoryEntry parent, String name) throws IOException { + public DocumentOutputStream(DirectoryEntry parent, String name) throws IOException { + this(createDocument(parent, name), -1); + } + + /** + * Create a DocumentOutputStream + * + * @param document the DocumentEntry to which the data is actually written + * @param limit the maximum number of bytes that can be written + */ + DocumentOutputStream(DocumentEntry document, long limit) throws IOException { + this(getDocument(document), limit); + } + + DocumentOutputStream(POIFSDocument document, long limit) throws IOException { + _document = document; + _document.free(); + + _property = document.getDocumentProperty(); + + _limit = limit; + } + + private static POIFSDocument getDocument(DocumentEntry document) throws IOException { + if (!(document instanceof DocumentNode)) { + throw new IOException("Cannot open internal document storage, " + document + " not a Document Node"); + } + return new POIFSDocument((DocumentNode)document); + } + + private static DocumentEntry createDocument(DirectoryEntry parent, String name) throws IOException { if (!(parent instanceof DirectoryNode)) { throw new IOException("Cannot open internal directory storage, " + parent + " not a Directory Node"); } - _document_size = 0; - _closed = false; // Have an empty one created for now - DocumentEntry doc = parent.createDocument(name, new ByteArrayInputStream(new byte[0])); - _property = (DocumentProperty)((DocumentNode)doc).getProperty(); - _document = new NPOIFSDocument((DocumentNode)doc); - } - - private void dieIfClosed() throws IOException { - if (_closed) { - throw new IOException("cannot perform requested operation on a closed stream"); - } + return parent.createDocument(name, new ByteArrayInputStream(new byte[0])); } - + private void checkBufferSize() throws IOException { // Have we gone over the mini stream limit yet? if (_buffer.size() > POIFSConstants.BIG_BLOCK_MINIMUM_DOCUMENT_SIZE) { @@ -106,36 +121,24 @@ public final class NDocumentOutputStream } public void write(int b) throws IOException { - dieIfClosed(); - - if (_buffer != null) { - _buffer.write(b); - checkBufferSize(); - } else { - write(new byte[] { (byte)b }); - } + write(new byte[] { (byte)b }, 0, 1); } - public void write(byte[] b) throws IOException { - dieIfClosed(); - - if (_buffer != null) { - _buffer.write(b); - checkBufferSize(); - } else { - write(b, 0, b.length); + @Override + public void write(byte[] b, int off, int len) throws IOException { + if (_closed) { + throw new IOException("cannot perform requested operation on a closed stream"); + } + if (_limit > -1 && (size() + len) > _limit) { + throw new IOException("tried to write too much data"); } - } - public void write(byte[] b, int off, int len) throws IOException { - dieIfClosed(); - if (_buffer != null) { _buffer.write(b, off, len); checkBufferSize(); } else { if (_stream == null) { - _stream = new NPOIFSStream(_document.getFileSystem()); + _stream = new POIFSStream(_document.getFileSystem()); _stream_output = _stream.getOutputStream(); } _stream_output.write(b, off, len); @@ -146,7 +149,7 @@ public final class NDocumentOutputStream public void close() throws IOException { // Do we have a pending buffer for the mini stream? if (_buffer != null) { - // It's not much data, so ask NPOIFSDocument to do it for us + // It's not much data, so ask POIFSDocument to do it for us _document.replaceContents(new ByteArrayInputStream(_buffer.toByteArray())); } else { @@ -160,4 +163,11 @@ public final class NDocumentOutputStream // No more! _closed = true; } -} + + /** + * @return the amount of written bytes + */ + public long size() { + return _document_size + (_buffer == null ? 0 : _buffer.size()); + } +} \ No newline at end of file Modified: poi/trunk/src/java/org/apache/poi/poifs/filesystem/EntryUtils.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/filesystem/EntryUtils.java?rev=1839709&r1=1839708&r2=1839709&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/poifs/filesystem/EntryUtils.java (original) +++ poi/trunk/src/java/org/apache/poi/poifs/filesystem/EntryUtils.java Fri Aug 31 00:25:50 2018 @@ -81,7 +81,7 @@ public final class EntryUtils { * @param target * is the target POIFS to copy to */ - public static void copyNodes( NPOIFSFileSystem source, NPOIFSFileSystem target ) + public static void copyNodes(POIFSFileSystem source, POIFSFileSystem target ) throws IOException { copyNodes( source.getRoot(), target.getRoot() ); } @@ -96,7 +96,7 @@ public final class EntryUtils { * @param target is the target POIFS to copy to * @param excepts is a list of Entry Names to be excluded from the copy */ - public static void copyNodes( NPOIFSFileSystem source, NPOIFSFileSystem target, List<String> excepts ) + public static void copyNodes(POIFSFileSystem source, POIFSFileSystem target, List<String> excepts ) throws IOException { copyNodes( new FilteringDirectoryNode(source.getRoot(), excepts), Copied: poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSDocument.java (from r1839708, poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java) URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSDocument.java?p2=poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSDocument.java&p1=poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java&r1=1839708&r2=1839709&rev=1839709&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java (original) +++ poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSDocument.java Fri Aug 31 00:25:50 2018 @@ -36,23 +36,23 @@ import org.apache.poi.util.IOUtils; /** * This class manages a document in the NIO POIFS filesystem. - * This is the {@link NPOIFSFileSystem} version. + * This is the {@link POIFSFileSystem} version. */ -public final class NPOIFSDocument implements POIFSViewable, Iterable<ByteBuffer> { +public final class POIFSDocument implements POIFSViewable, Iterable<ByteBuffer> { //arbitrarily selected; may need to increase private static final int MAX_RECORD_LENGTH = 100_000; private DocumentProperty _property; - private NPOIFSFileSystem _filesystem; - private NPOIFSStream _stream; + private POIFSFileSystem _filesystem; + private POIFSStream _stream; private int _block_size; /** * Constructor for an existing Document */ - public NPOIFSDocument(DocumentNode document) { + public POIFSDocument(DocumentNode document) { this((DocumentProperty)document.getProperty(), ((DirectoryNode)document.getParent()).getNFileSystem()); } @@ -60,15 +60,15 @@ public final class NPOIFSDocument implem /** * Constructor for an existing Document */ - public NPOIFSDocument(DocumentProperty property, NPOIFSFileSystem filesystem) { + public POIFSDocument(DocumentProperty property, POIFSFileSystem filesystem) { this._property = property; this._filesystem = filesystem; if(property.getSize() < POIFSConstants.BIG_BLOCK_MINIMUM_DOCUMENT_SIZE) { - _stream = new NPOIFSStream(_filesystem.getMiniStore(), property.getStartBlock()); + _stream = new POIFSStream(_filesystem.getMiniStore(), property.getStartBlock()); _block_size = _filesystem.getMiniStore().getBlockStoreBlockSize(); } else { - _stream = new NPOIFSStream(_filesystem, property.getStartBlock()); + _stream = new POIFSStream(_filesystem, property.getStartBlock()); _block_size = _filesystem.getBlockStoreBlockSize(); } } @@ -79,7 +79,7 @@ public final class NPOIFSDocument implem * @param name the name of the POIFSDocument * @param stream the InputStream we read data from */ - public NPOIFSDocument(String name, NPOIFSFileSystem filesystem, InputStream stream) + public POIFSDocument(String name, POIFSFileSystem filesystem, InputStream stream) throws IOException { this._filesystem = filesystem; @@ -93,31 +93,29 @@ public final class NPOIFSDocument implem _property.setDocument(this); } - public NPOIFSDocument(String name, int size, NPOIFSFileSystem filesystem, POIFSWriterListener writer) + public POIFSDocument(String name, final int size, POIFSFileSystem filesystem, POIFSWriterListener writer) throws IOException { this._filesystem = filesystem; if (size < POIFSConstants.BIG_BLOCK_MINIMUM_DOCUMENT_SIZE) { - _stream = new NPOIFSStream(filesystem.getMiniStore()); + _stream = new POIFSStream(filesystem.getMiniStore()); _block_size = _filesystem.getMiniStore().getBlockStoreBlockSize(); } else { - _stream = new NPOIFSStream(filesystem); + _stream = new POIFSStream(filesystem); _block_size = _filesystem.getBlockStoreBlockSize(); } - OutputStream innerOs = _stream.getOutputStream(); - DocumentOutputStream os = new DocumentOutputStream(innerOs, size); - POIFSDocumentPath path = new POIFSDocumentPath(name.split("\\\\")); - String docName = path.getComponent(path.length()-1); - POIFSWriterEvent event = new POIFSWriterEvent(os, path, docName, size); - writer.processPOIFSWriterEvent(event); - innerOs.close(); - - // And build the property for it this._property = new DocumentProperty(name, size); _property.setStartBlock(_stream.getStartBlock()); _property.setDocument(this); + + try (DocumentOutputStream os = new DocumentOutputStream(this, size)) { + POIFSDocumentPath path = new POIFSDocumentPath(name.split("\\\\")); + String docName = path.getComponent(path.length() - 1); + POIFSWriterEvent event = new POIFSWriterEvent(os, path, docName, size); + writer.processPOIFSWriterEvent(event); + } } /** @@ -131,10 +129,10 @@ public final class NPOIFSDocument implem // Do we need to store as a mini stream or a full one? long streamBlockSize = IOUtils.skipFully(bis, bigBlockSize); if (streamBlockSize < bigBlockSize) { - _stream = new NPOIFSStream(_filesystem.getMiniStore()); + _stream = new POIFSStream(_filesystem.getMiniStore()); _block_size = _filesystem.getMiniStore().getBlockStoreBlockSize(); } else { - _stream = new NPOIFSStream(_filesystem); + _stream = new POIFSStream(_filesystem); _block_size = _filesystem.getBlockStoreBlockSize(); } @@ -167,7 +165,7 @@ public final class NPOIFSDocument implem _property.setStartBlock(POIFSConstants.END_OF_CHAIN); } - NPOIFSFileSystem getFileSystem() + POIFSFileSystem getFileSystem() { return _filesystem; } Copied: poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java (from r1839708, poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java) URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java?p2=poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java&p1=poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java&r1=1839708&r2=1839709&rev=1839709&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java (original) +++ poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java Fri Aug 31 00:25:50 2018 @@ -19,6 +19,7 @@ package org.apache.poi.poifs.filesystem; +import java.io.ByteArrayOutputStream; import java.io.Closeable; import java.io.File; import java.io.FileInputStream; @@ -44,14 +45,10 @@ import org.apache.poi.poifs.nio.DataSour import org.apache.poi.poifs.nio.FileBackedDataSource; 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.PropertyTable; import org.apache.poi.poifs.storage.BATBlock; import org.apache.poi.poifs.storage.BATBlock.BATBlockAndIndex; -import org.apache.poi.poifs.storage.BlockAllocationTableReader; -import org.apache.poi.poifs.storage.BlockAllocationTableWriter; import org.apache.poi.poifs.storage.HeaderBlock; -import org.apache.poi.poifs.storage.HeaderBlockWriter; -import org.apache.poi.util.CloseIgnoringInputStream; import org.apache.poi.util.IOUtils; import org.apache.poi.util.Internal; import org.apache.poi.util.POILogFactory; @@ -63,23 +60,29 @@ import org.apache.poi.util.POILogger; * <p>This is the new NIO version, which uses less memory</p> */ -public class NPOIFSFileSystem extends BlockStore +public class POIFSFileSystem extends BlockStore implements POIFSViewable, Closeable { //arbitrarily selected; may need to increase private static final int MAX_RECORD_LENGTH = 100_000; - private static final POILogger LOG = POILogFactory.getLogger(NPOIFSFileSystem.class); + private static final POILogger LOG = POILogFactory.getLogger(POIFSFileSystem.class); /** - * Convenience method for clients that want to avoid the auto-close behaviour of the constructor. + * Maximum number size (in blocks) of the allocation table as supported by + * POI.<p> + * + * This constant has been chosen to help POI identify corrupted data in the + * header block (rather than crash immediately with {@link OutOfMemoryError} + * ). It's not clear if the compound document format actually specifies any + * upper limits. For files with 512 byte blocks, having an allocation table + * of 65,335 blocks would correspond to a total file size of 4GB. Needless + * to say, POI probably cannot handle files anywhere near that size. */ - public static InputStream createNonClosingInputStream(InputStream is) { - return new CloseIgnoringInputStream(is); - } - - private NPOIFSMiniStore _mini_store; - private NPropertyTable _property_table; + private static final int MAX_BLOCK_COUNT = 65535; + + private POIFSMiniStore _mini_store; + private PropertyTable _property_table; private List<BATBlock> _xbat_blocks; private List<BATBlock> _bat_blocks; private HeaderBlock _header; @@ -94,11 +97,11 @@ public class NPOIFSFileSystem extends Bl private POIFSBigBlockSize bigBlockSize = POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS; - private NPOIFSFileSystem(boolean newFS) + private POIFSFileSystem(boolean newFS) { _header = new HeaderBlock(bigBlockSize); - _property_table = new NPropertyTable(_header); - _mini_store = new NPOIFSMiniStore(this, _property_table.getRoot(), new ArrayList<>(), _header); + _property_table = new PropertyTable(_header); + _mini_store = new POIFSMiniStore(this, _property_table.getRoot(), new ArrayList<>(), _header); _xbat_blocks = new ArrayList<>(); _bat_blocks = new ArrayList<>(); _root = null; @@ -114,7 +117,7 @@ public class NPOIFSFileSystem extends Bl /** * Constructor, intended for writing */ - public NPOIFSFileSystem() + public POIFSFileSystem() { this(true); @@ -144,7 +147,7 @@ public class NPOIFSFileSystem extends Bl * * @exception IOException on errors reading, or on invalid data */ - public NPOIFSFileSystem(File file) + public POIFSFileSystem(File file) throws IOException { this(file, true); @@ -163,7 +166,7 @@ public class NPOIFSFileSystem extends Bl * * @exception IOException on errors reading, or on invalid data */ - public NPOIFSFileSystem(File file, boolean readOnly) + public POIFSFileSystem(File file, boolean readOnly) throws IOException { this(null, file, readOnly, true); @@ -182,7 +185,7 @@ public class NPOIFSFileSystem extends Bl * * @exception IOException on errors reading, or on invalid data */ - public NPOIFSFileSystem(FileChannel channel) + public POIFSFileSystem(FileChannel channel) throws IOException { this(channel, true); @@ -201,13 +204,13 @@ public class NPOIFSFileSystem extends Bl * * @exception IOException on errors reading, or on invalid data */ - public NPOIFSFileSystem(FileChannel channel, boolean readOnly) + public POIFSFileSystem(FileChannel channel, boolean readOnly) throws IOException { this(channel, null, readOnly, false); } - private NPOIFSFileSystem(FileChannel channel, File srcFile, boolean readOnly, boolean closeChannelOnError) + private POIFSFileSystem(FileChannel channel, File srcFile, boolean readOnly, boolean closeChannelOnError) throws IOException { this(false); @@ -240,7 +243,6 @@ public class NPOIFSFileSystem extends Bl // still sticking to the iterator contract if (closeChannelOnError && channel != null) { channel.close(); - channel = null; } throw e; } @@ -275,53 +277,48 @@ public class NPOIFSFileSystem extends Bl * @exception IOException on errors reading, or on invalid data */ - public NPOIFSFileSystem(InputStream stream) + public POIFSFileSystem(InputStream stream) throws IOException { this(false); - - ReadableByteChannel channel = null; + boolean success = false; - - try { - // Turn our InputStream into something NIO based - channel = Channels.newChannel(stream); - - // Get the header - ByteBuffer headerBuffer = ByteBuffer.allocate(POIFSConstants.SMALLER_BIG_BLOCK_SIZE); - IOUtils.readFully(channel, headerBuffer); - - // Have the header processed - _header = new HeaderBlock(headerBuffer); - - // Sanity check the block count - BlockAllocationTableReader.sanityCheckBlockCount(_header.getBATCount()); - - // We need to buffer the whole file into memory when - // working with an InputStream. - // The max possible size is when each BAT block entry is used - long maxSize = BATBlock.calculateMaximumSize(_header); - if (maxSize > Integer.MAX_VALUE) { - throw new IllegalArgumentException("Unable read a >2gb file via an InputStream"); - } - ByteBuffer data = ByteBuffer.allocate((int)maxSize); - - // Copy in the header - headerBuffer.position(0); - data.put(headerBuffer); - data.position(headerBuffer.capacity()); - - // Now read the rest of the stream - IOUtils.readFully(channel, data); - success = true; - - // Turn it into a DataSource - _data = new ByteArrayBackedDataSource(data.array(), data.position()); + try (ReadableByteChannel channel = Channels.newChannel(stream)) { + // Turn our InputStream into something NIO based + + // Get the header + ByteBuffer headerBuffer = ByteBuffer.allocate(POIFSConstants.SMALLER_BIG_BLOCK_SIZE); + IOUtils.readFully(channel, headerBuffer); + + // Have the header processed + _header = new HeaderBlock(headerBuffer); + + // Sanity check the block count + sanityCheckBlockCount(_header.getBATCount()); + + // We need to buffer the whole file into memory when + // working with an InputStream. + // The max possible size is when each BAT block entry is used + long maxSize = BATBlock.calculateMaximumSize(_header); + if (maxSize > Integer.MAX_VALUE) { + throw new IllegalArgumentException("Unable read a >2gb file via an InputStream"); + } + ByteBuffer data = ByteBuffer.allocate((int) maxSize); + + // Copy in the header + headerBuffer.position(0); + data.put(headerBuffer); + data.position(headerBuffer.capacity()); + + // Now read the rest of the stream + IOUtils.readFully(channel, data); + success = true; + + // Turn it into a DataSource + _data = new ByteArrayBackedDataSource(data.array(), data.position()); } finally { - // As per the constructor contract, always close the stream - if(channel != null) - channel.close(); - closeInputStream(stream, success); + // As per the constructor contract, always close the stream + closeInputStream(stream, success); } // Now process the various entries @@ -388,12 +385,12 @@ public class NPOIFSFileSystem extends Bl // We're now able to load steams // Use this to read in the properties - _property_table = new NPropertyTable(_header, this); + _property_table = new PropertyTable(_header, this); // Finally read the Small Stream FAT (SBAT) blocks BATBlock sfat; List<BATBlock> sbats = new ArrayList<>(); - _mini_store = new NPOIFSMiniStore(this, _property_table.getRoot(), sbats, _header); + _mini_store = new POIFSMiniStore(this, _property_table.getRoot(), sbats, _header); nextAt = _header.getSBATStart(); for(int i=0; i<_header.getSBATCount() && nextAt != POIFSConstants.END_OF_CHAIN; i++) { loopDetector.claim(nextAt); @@ -589,7 +586,7 @@ public class NPOIFSFileSystem extends Bl * For unit testing only! Returns the underlying * properties table */ - NPropertyTable _get_property_table() { + PropertyTable _get_property_table() { return _property_table; } @@ -597,7 +594,7 @@ public class NPOIFSFileSystem extends Bl * Returns the MiniStore, which performs a similar low * level function to this, except for the small blocks. */ - public NPOIFSMiniStore getMiniStore() { + POIFSMiniStore getMiniStore() { return _mini_store; } @@ -606,7 +603,7 @@ public class NPOIFSFileSystem extends Bl * * @param document the POIFSDocument being added */ - void addDocument(final NPOIFSDocument document) + void addDocument(final POIFSDocument document) { _property_table.addProperty(document.getDocumentProperty()); } @@ -650,12 +647,10 @@ public class NPOIFSFileSystem extends Bl * * @return the new DocumentEntry * - * @exception IOException + * @exception IOException if the writer exceeds the given size */ - public DocumentEntry createDocument(final String name, final int size, - final POIFSWriterListener writer) - throws IOException - { + public DocumentEntry createDocument(final String name, final int size, final POIFSWriterListener writer) + throws IOException { return getRoot().createDocument(name, size, writer); } @@ -687,11 +682,9 @@ public class NPOIFSFileSystem extends Bl * * @exception IOException on error populating the POIFSDocument */ - - public DocumentEntry createOrUpdateDocument(final InputStream stream, - final String name) - throws IOException - { + @SuppressWarnings("UnusedReturnValue") + public DocumentEntry createOrUpdateDocument(final InputStream stream, final String name) + throws IOException { return getRoot().createOrUpdateDocument(name, stream); } @@ -702,12 +695,7 @@ public class NPOIFSFileSystem extends Bl * is supported. */ public boolean isInPlaceWriteable() { - if(_data instanceof FileBackedDataSource) { - if ( ((FileBackedDataSource)_data).isWriteable() ) { - return true; - } - } - return false; + return (_data instanceof FileBackedDataSource) && ((FileBackedDataSource) _data).isWriteable(); } /** @@ -718,9 +706,7 @@ public class NPOIFSFileSystem extends Bl * @exception IOException thrown on errors writing to the stream */ public void writeFilesystem() throws IOException { - if(_data instanceof FileBackedDataSource) { - // Good, correct type - } else { + if (!(_data instanceof FileBackedDataSource)) { throw new IllegalArgumentException( "POIFS opened from an inputstream, so writeFilesystem() may " + "not be called. Use writeFilesystem(OutputStream) instead" @@ -761,24 +747,28 @@ public class NPOIFSFileSystem extends Bl _mini_store.syncWithDataSource(); // Properties - NPOIFSStream propStream = new NPOIFSStream(this, _header.getPropertyStart()); + POIFSStream propStream = new POIFSStream(this, _header.getPropertyStart()); _property_table.preWrite(); _property_table.write(propStream); // _header.setPropertyStart has been updated on write ... - // HeaderBlock - HeaderBlockWriter hbw = new HeaderBlockWriter(_header); - hbw.writeBlock( getBlockAt(-1) ); + // HeaderBlock + ByteArrayOutputStream baos = new ByteArrayOutputStream( + _header.getBigBlockSize().getBigBlockSize() + ); + _header.writeData(baos); + getBlockAt(-1).put(baos.toByteArray()); + // BATs for(BATBlock bat : _bat_blocks) { ByteBuffer block = getBlockAt(bat.getOurBlockIndex()); - BlockAllocationTableWriter.writeBlock(bat, block); + bat.writeData(block); } // XBats for(BATBlock bat : _xbat_blocks) { ByteBuffer block = getBlockAt(bat.getOurBlockIndex()); - BlockAllocationTableWriter.writeBlock(bat, block); + bat.writeData(block); } } @@ -796,8 +786,6 @@ public class NPOIFSFileSystem extends Bl * * @param args names of the files; arg[ 0 ] is the input file, * arg[ 1 ] is the output file - * - * @exception IOException */ public static void main(String args[]) throws IOException { if (args.length != 2) { @@ -808,7 +796,7 @@ public class NPOIFSFileSystem extends Bl try (FileInputStream istream = new FileInputStream(args[0])) { try (FileOutputStream ostream = new FileOutputStream(args[1])) { - try (NPOIFSFileSystem fs = new NPOIFSFileSystem(istream)) { + try (POIFSFileSystem fs = new POIFSFileSystem(istream)) { fs.writeFilesystem(ostream); } } @@ -850,7 +838,7 @@ public class NPOIFSFileSystem extends Bl void remove(EntryNode entry) throws IOException { // If it's a document, free the blocks if (entry instanceof DocumentEntry) { - NPOIFSDocument doc = new NPOIFSDocument((DocumentProperty)entry.getProperty(), this); + POIFSDocument doc = new POIFSDocument((DocumentProperty)entry.getProperty(), this); doc.free(); } @@ -925,17 +913,37 @@ public class NPOIFSFileSystem extends Bl /** * @return The Big Block size, normally 512 bytes, sometimes 4096 bytes */ + @SuppressWarnings("WeakerAccess") public POIFSBigBlockSize getBigBlockSizeDetails() { return bigBlockSize; } + /** + * Creates a new {@link POIFSFileSystem} in a new {@link File}. + * Use {@link #POIFSFileSystem(File)} to open an existing File, + * this should only be used to create a new empty filesystem. + * + * @param file The file to create and open + * @return The created and opened {@link POIFSFileSystem} + */ + public static POIFSFileSystem create(File file) throws IOException { + // Create a new empty POIFS in the file + try (POIFSFileSystem tmp = new POIFSFileSystem(); + OutputStream out = new FileOutputStream(file)) { + tmp.writeFilesystem(out); + } + + // Open it up again backed by the file + return new POIFSFileSystem(file, false); + } + @Override protected int getBlockStoreBlockSize() { return getBigBlockSize(); } @Internal - public NPropertyTable getPropertyTable() { + public PropertyTable getPropertyTable() { return _property_table; } @@ -943,5 +951,22 @@ public class NPOIFSFileSystem extends Bl public HeaderBlock getHeaderBlock() { return _header; } + + + private static void sanityCheckBlockCount(int block_count) throws IOException { + if (block_count <= 0) { + throw new IOException( + "Illegal block count; minimum count is 1, got " + + block_count + " instead" + ); + } + if (block_count > MAX_BLOCK_COUNT) { + throw new IOException( + "Block count " + block_count + + " is too high. POI maximum is " + MAX_BLOCK_COUNT + "." + ); + } + } + } Copied: poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSMiniStore.java (from r1839708, poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSMiniStore.java) URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSMiniStore.java?p2=poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSMiniStore.java&p1=poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSMiniStore.java&r1=1839708&r2=1839709&rev=1839709&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSMiniStore.java (original) +++ poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSMiniStore.java Fri Aug 31 00:25:50 2018 @@ -28,36 +28,35 @@ import org.apache.poi.poifs.common.POIFS import org.apache.poi.poifs.property.RootProperty; import org.apache.poi.poifs.storage.BATBlock; import org.apache.poi.poifs.storage.BATBlock.BATBlockAndIndex; -import org.apache.poi.poifs.storage.BlockAllocationTableWriter; import org.apache.poi.poifs.storage.HeaderBlock; /** * This class handles the MiniStream (small block store) - * in the NIO case for {@link NPOIFSFileSystem} + * in the NIO case for {@link POIFSFileSystem} */ -public class NPOIFSMiniStore extends BlockStore +public class POIFSMiniStore extends BlockStore { - private NPOIFSFileSystem _filesystem; - private NPOIFSStream _mini_stream; + private POIFSFileSystem _filesystem; + private POIFSStream _mini_stream; private List<BATBlock> _sbat_blocks; private HeaderBlock _header; private RootProperty _root; - protected NPOIFSMiniStore(NPOIFSFileSystem filesystem, RootProperty root, - List<BATBlock> sbats, HeaderBlock header) + POIFSMiniStore(POIFSFileSystem filesystem, RootProperty root, + List<BATBlock> sbats, HeaderBlock header) { this._filesystem = filesystem; this._sbat_blocks = sbats; this._header = header; this._root = root; - this._mini_stream = new NPOIFSStream(filesystem, root.getStartBlock()); + this._mini_stream = new POIFSStream(filesystem, root.getStartBlock()); } /** * Load the block at the given offset. */ - protected ByteBuffer getBlockAt(final int offset) throws IOException { + protected ByteBuffer getBlockAt(final int offset) { // Which big block is this? int byteOffset = offset * POIFSConstants.SMALL_BLOCK_SIZE; int bigBlockNumber = byteOffset / _filesystem.getBigBlockSize(); @@ -109,7 +108,7 @@ public class NPOIFSMiniStore extends Blo // If we are the first block to be allocated, initialise the stream if (firstInStore) { _filesystem._get_property_table().getRoot().setStartBlock(newBigBlock); - _mini_stream = new NPOIFSStream(_filesystem, newBigBlock); + _mini_stream = new POIFSStream(_filesystem, newBigBlock); } else { // Tack it onto the end of our chain ChainLoopDetector loopDetector = _filesystem.getChainLoopDetector(); @@ -232,7 +231,7 @@ public class NPOIFSMiniStore extends Blo } @Override - protected ChainLoopDetector getChainLoopDetector() throws IOException { + protected ChainLoopDetector getChainLoopDetector() { return new ChainLoopDetector( _root.getSize() ); } @@ -245,12 +244,12 @@ public class NPOIFSMiniStore extends Blo * the mini-stream size in the properties. Stream size is * based on full blocks used, not the data within the streams */ - protected void syncWithDataSource() throws IOException { + void syncWithDataSource() throws IOException { int blocksUsed = 0; for (BATBlock sbat : _sbat_blocks) { ByteBuffer block = _filesystem.getBlockAt(sbat.getOurBlockIndex()); - BlockAllocationTableWriter.writeBlock(sbat, block); - + sbat.writeData(block); + if (!sbat.hasFreeSectors()) { blocksUsed += _filesystem.getBigBlockSizeDetails().getBATEntriesPerBlock(); } else { Copied: poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSStream.java (from r1839708, poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSStream.java) URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSStream.java?p2=poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSStream.java&p1=poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSStream.java&r1=1839708&r2=1839709&rev=1839709&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSStream.java (original) +++ poi/trunk/src/java/org/apache/poi/poifs/filesystem/POIFSStream.java Fri Aug 31 00:25:50 2018 @@ -31,7 +31,7 @@ import org.apache.poi.poifs.storage.Head /** * This handles reading and writing a stream within a - * {@link NPOIFSFileSystem}. It can supply an iterator + * {@link POIFSFileSystem}. It can supply an iterator * to read blocks, and way to write out to existing and * new blocks. * Most users will want a higher level version of this, @@ -44,7 +44,7 @@ import org.apache.poi.poifs.storage.Head * TODO Implement a streaming write method, and append */ -public class NPOIFSStream implements Iterable<ByteBuffer> +public class POIFSStream implements Iterable<ByteBuffer> { private BlockStore blockStore; private int startBlock; @@ -55,7 +55,7 @@ public class NPOIFSStream implements Ite * to know how to get the start block (eg from a * {@link HeaderBlock} or a {@link Property}) */ - public NPOIFSStream(BlockStore blockStore, int startBlock) { + public POIFSStream(BlockStore blockStore, int startBlock) { this.blockStore = blockStore; this.startBlock = startBlock; } @@ -64,7 +64,7 @@ public class NPOIFSStream implements Ite * Constructor for a new stream. A start block won't * be allocated until you begin writing to it. */ - public NPOIFSStream(BlockStore blockStore) { + public POIFSStream(BlockStore blockStore) { this.blockStore = blockStore; this.startBlock = POIFSConstants.END_OF_CHAIN; } @@ -86,7 +86,7 @@ public class NPOIFSStream implements Ite return getBlockIterator(); } - public Iterator<ByteBuffer> getBlockIterator() { + Iterator<ByteBuffer> getBlockIterator() { if(startBlock == POIFSConstants.END_OF_CHAIN) { throw new IllegalStateException( "Can't read from a new stream before it has been written to" @@ -101,7 +101,7 @@ public class NPOIFSStream implements Ite * Note - if this is property based, you'll still * need to update the size in the property yourself */ - public void updateContents(byte[] contents) throws IOException { + void updateContents(byte[] contents) throws IOException { OutputStream os = getOutputStream(); os.write(contents); os.close(); @@ -143,7 +143,7 @@ public class NPOIFSStream implements Ite private ChainLoopDetector loopDetector; private int nextBlock; - protected StreamBlockByteBufferIterator(int firstBlock) { + StreamBlockByteBufferIterator(int firstBlock) { this.nextBlock = firstBlock; try { this.loopDetector = blockStore.getChainLoopDetector(); @@ -153,10 +153,7 @@ public class NPOIFSStream implements Ite } public boolean hasNext() { - if(nextBlock == POIFSConstants.END_OF_CHAIN) { - return false; - } - return true; + return nextBlock != POIFSConstants.END_OF_CHAIN; } public ByteBuffer next() { @@ -187,13 +184,13 @@ public class NPOIFSStream implements Ite ChainLoopDetector loopDetector; int prevBlock, nextBlock; - protected StreamBlockByteBuffer() throws IOException { + StreamBlockByteBuffer() throws IOException { loopDetector = blockStore.getChainLoopDetector(); prevBlock = POIFSConstants.END_OF_CHAIN; nextBlock = startBlock; } - protected void createBlockIfNeeded() throws IOException { + void createBlockIfNeeded() throws IOException { if (buffer != null && buffer.hasRemaining()) return; int thisBlock = nextBlock; @@ -228,12 +225,14 @@ public class NPOIFSStream implements Ite // Update pointers prevBlock = thisBlock; } - + + @Override public void write(int b) throws IOException { oneByte[0] = (byte)(b & 0xFF); write(oneByte); } - + + @Override public void write(byte[] b, int off, int len) throws IOException { if ((off < 0) || (off > b.length) || (len < 0) || ((off + len) > b.length) || ((off + len) < 0)) { @@ -253,7 +252,7 @@ public class NPOIFSStream implements Ite public void close() throws IOException { // If we're overwriting, free any remaining blocks - NPOIFSStream toFree = new NPOIFSStream(blockStore, nextBlock); + POIFSStream toFree = new POIFSStream(blockStore, nextBlock); toFree.free(loopDetector); // Mark the end of the stream, if we have any data Modified: poi/trunk/src/java/org/apache/poi/poifs/macros/VBAMacroReader.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/macros/VBAMacroReader.java?rev=1839709&r1=1839708&r2=1839709&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/poifs/macros/VBAMacroReader.java (original) +++ poi/trunk/src/java/org/apache/poi/poifs/macros/VBAMacroReader.java Fri Aug 31 00:25:50 2018 @@ -32,7 +32,7 @@ import org.apache.poi.poifs.filesystem.D import org.apache.poi.poifs.filesystem.DocumentNode; import org.apache.poi.poifs.filesystem.Entry; import org.apache.poi.poifs.filesystem.FileMagic; -import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.poifs.filesystem.OfficeXmlFileException; import org.apache.poi.poifs.macros.Module.ModuleType; import org.apache.poi.util.CodePageUtil; @@ -59,13 +59,13 @@ public class VBAMacroReader implements C protected static final String VBA_PROJECT_OOXML = "vbaProject.bin"; protected static final String VBA_PROJECT_POIFS = "VBA"; - private NPOIFSFileSystem fs; + private POIFSFileSystem fs; public VBAMacroReader(InputStream rstream) throws IOException { InputStream is = FileMagic.prepareToCheckMagic(rstream); FileMagic fm = FileMagic.valueOf(is); if (fm == FileMagic.OLE2) { - fs = new NPOIFSFileSystem(is); + fs = new POIFSFileSystem(is); } else { openOOXML(is); } @@ -73,12 +73,12 @@ public class VBAMacroReader implements C public VBAMacroReader(File file) throws IOException { try { - this.fs = new NPOIFSFileSystem(file); + this.fs = new POIFSFileSystem(file); } catch (OfficeXmlFileException e) { openOOXML(new FileInputStream(file)); } } - public VBAMacroReader(NPOIFSFileSystem fs) { + public VBAMacroReader(POIFSFileSystem fs) { this.fs = fs; } @@ -89,7 +89,7 @@ public class VBAMacroReader implements C if (endsWithIgnoreCase(zipEntry.getName(), VBA_PROJECT_OOXML)) { try { // Make a NPOIFS from the contents, and close the stream - this.fs = new NPOIFSFileSystem(zis); + this.fs = new POIFSFileSystem(zis); return; } catch (IOException e) { // Tidy up Modified: poi/trunk/src/java/org/apache/poi/poifs/property/DocumentProperty.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/property/DocumentProperty.java?rev=1839709&r1=1839708&r2=1839709&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/poifs/property/DocumentProperty.java (original) +++ poi/trunk/src/java/org/apache/poi/poifs/property/DocumentProperty.java Fri Aug 31 00:25:50 2018 @@ -19,14 +19,14 @@ package org.apache.poi.poifs.property; -import org.apache.poi.poifs.filesystem.NPOIFSDocument; +import org.apache.poi.poifs.filesystem.POIFSDocument; /** * Trivial extension of Property for POIFSDocuments */ public class DocumentProperty extends Property { // the POIFSDocument this property is associated with - private NPOIFSDocument _document; + private POIFSDocument _document; /** * Constructor @@ -64,7 +64,7 @@ public class DocumentProperty extends Pr * * @param doc the associated POIFSDocument */ - public void setDocument(NPOIFSDocument doc) + public void setDocument(POIFSDocument doc) { _document = doc; } @@ -74,7 +74,7 @@ public class DocumentProperty extends Pr * * @return the associated document */ - public NPOIFSDocument getDocument() + public POIFSDocument getDocument() { return _document; } Modified: poi/trunk/src/java/org/apache/poi/poifs/property/PropertyFactory.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/property/PropertyFactory.java?rev=1839709&r1=1839708&r2=1839709&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/poifs/property/PropertyFactory.java (original) +++ poi/trunk/src/java/org/apache/poi/poifs/property/PropertyFactory.java Fri Aug 31 00:25:50 2018 @@ -19,12 +19,9 @@ package org.apache.poi.poifs.property; -import java.io.IOException; - -import java.util.*; +import java.util.List; import org.apache.poi.poifs.common.POIFSConstants; -import org.apache.poi.poifs.storage.ListManagedBlock; /** * Factory for turning an array of RawDataBlock instances containing @@ -38,37 +35,13 @@ import org.apache.poi.poifs.storage.List * @author Marc Johnson (mjohnson at apache dot org) */ -class PropertyFactory { +final class PropertyFactory { // no need for an accessible constructor private PropertyFactory() { } - /** - * Convert raw data blocks to an array of Property's - * - * @param blocks to be converted - * - * @return the converted List of Property objects. May contain - * nulls, but will not be null - * - * @exception IOException if any of the blocks are empty - */ - static List<Property> convertToProperties(ListManagedBlock [] blocks) - throws IOException - { - List<Property> properties = new ArrayList<>(); - - for (ListManagedBlock block : blocks) { - byte[] data = block.getData(); - convertToProperties(data, properties); - } - return properties; - } - - static void convertToProperties(byte[] data, List<Property> properties) - throws IOException - { + static void convertToProperties(byte[] data, List<Property> properties) { int property_count = data.length / POIFSConstants.PROPERTY_SIZE; int offset = 0; Copied: poi/trunk/src/java/org/apache/poi/poifs/property/PropertyTable.java (from r1839708, poi/trunk/src/java/org/apache/poi/poifs/property/NPropertyTable.java) URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/property/PropertyTable.java?p2=poi/trunk/src/java/org/apache/poi/poifs/property/PropertyTable.java&p1=poi/trunk/src/java/org/apache/poi/poifs/property/NPropertyTable.java&r1=1839708&r2=1839709&rev=1839709&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/poifs/property/NPropertyTable.java (original) +++ poi/trunk/src/java/org/apache/poi/poifs/property/PropertyTable.java Fri Aug 31 00:25:50 2018 @@ -21,35 +21,41 @@ import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; +import java.util.Stack; import org.apache.poi.poifs.common.POIFSBigBlockSize; import org.apache.poi.poifs.common.POIFSConstants; -import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; -import org.apache.poi.poifs.filesystem.NPOIFSStream; +import org.apache.poi.poifs.filesystem.BATManaged; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; +import org.apache.poi.poifs.filesystem.POIFSStream; import org.apache.poi.poifs.storage.HeaderBlock; import org.apache.poi.util.IOUtils; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; /** - * This class embodies the Property Table for a {@link NPOIFSFileSystem}; - * this is basically the directory for all of the documents in the - * filesystem. + * This class embodies the Property Table for a {@link POIFSFileSystem}; + * this is basically the directory for all of the documents in the + * filesystem and looks up entries in the filesystem to their + * chain of blocks. */ -public final class NPropertyTable extends PropertyTableBase { +public final class PropertyTable implements BATManaged { private static final POILogger _logger = - POILogFactory.getLogger(NPropertyTable.class); + POILogFactory.getLogger(PropertyTable.class); + //arbitrarily selected; may need to increase private static final int MAX_RECORD_LENGTH = 100_000; - private POIFSBigBlockSize _bigBigBlockSize; + private final HeaderBlock _header_block; + private final List<Property> _properties = new ArrayList<>(); + private final POIFSBigBlockSize _bigBigBlockSize; - public NPropertyTable(HeaderBlock headerBlock) + public PropertyTable(HeaderBlock headerBlock) { - super(headerBlock); + _header_block = headerBlock; _bigBigBlockSize = headerBlock.getBigBlockSize(); + addProperty(new RootProperty()); } /** @@ -63,60 +69,104 @@ public final class NPropertyTable extend * @exception IOException if anything goes wrong (which should be * a result of the input being NFG) */ - public NPropertyTable(final HeaderBlock headerBlock, - final NPOIFSFileSystem filesystem) - throws IOException - { - super( + public PropertyTable(final HeaderBlock headerBlock, final POIFSFileSystem filesystem) + throws IOException { + this( headerBlock, - buildProperties( - (new NPOIFSStream(filesystem, headerBlock.getPropertyStart())).iterator(), - headerBlock.getBigBlockSize() - ) + new POIFSStream(filesystem, headerBlock.getPropertyStart()) ); + } + + /* only invoked locally and from the junit tests */ + PropertyTable(final HeaderBlock headerBlock, final Iterable<ByteBuffer> dataSource) + throws IOException { + _header_block = headerBlock; _bigBigBlockSize = headerBlock.getBigBlockSize(); + + for (ByteBuffer bb : dataSource) { + // Turn it into an array + byte[] data; + if (bb.hasArray() && bb.arrayOffset() == 0 && + bb.array().length == _bigBigBlockSize.getBigBlockSize()) { + data = bb.array(); + } else { + data = IOUtils.safelyAllocate(_bigBigBlockSize.getBigBlockSize(), MAX_RECORD_LENGTH); + + int toRead = data.length; + if (bb.remaining() < _bigBigBlockSize.getBigBlockSize()) { + // Looks to be a truncated block + // This isn't allowed, but some third party created files + // sometimes do this, and we can normally read anyway + _logger.log(POILogger.WARN, "Short Property Block, ", bb.remaining(), + " bytes instead of the expected " + _bigBigBlockSize.getBigBlockSize()); + toRead = bb.remaining(); + } + + bb.get(data, 0, toRead); + } + + PropertyFactory.convertToProperties(data, _properties); + } + + populatePropertyTree( (DirectoryProperty)_properties.get(0)); } - - private static List<Property> buildProperties(final Iterator<ByteBuffer> dataSource, - final POIFSBigBlockSize bigBlockSize) throws IOException - { - List<Property> properties = new ArrayList<>(); - while(dataSource.hasNext()) { - ByteBuffer bb = dataSource.next(); - - // Turn it into an array - byte[] data; - if(bb.hasArray() && bb.arrayOffset() == 0 && - bb.array().length == bigBlockSize.getBigBlockSize()) { - data = bb.array(); - } else { - data = IOUtils.safelyAllocate(bigBlockSize.getBigBlockSize(), MAX_RECORD_LENGTH); - - int toRead = data.length; - if (bb.remaining() < bigBlockSize.getBigBlockSize()) { - // Looks to be a truncated block - // This isn't allowed, but some third party created files - // sometimes do this, and we can normally read anyway - _logger.log(POILogger.WARN, "Short Property Block, ", bb.remaining(), - " bytes instead of the expected " + bigBlockSize.getBigBlockSize()); - toRead = bb.remaining(); - } - - bb.get(data, 0, toRead); - } - - PropertyFactory.convertToProperties(data, properties); - } - return properties; + + + /** + * Add a property to the list of properties we manage + * + * @param property the new Property to manage + */ + public void addProperty(Property property) { + _properties.add(property); + } + + /** + * Remove a property from the list of properties we manage + * + * @param property the Property to be removed + */ + public void removeProperty(final Property property) { + _properties.remove(property); + } + + /** + * Get the root property + * + * @return the root property + */ + public RootProperty getRoot() { + // it's always the first element in the List + return ( RootProperty ) _properties.get(0); } /** + * Get the start block for the property table + * + * @return start block index + */ + public int getStartBlock() { + return _header_block.getPropertyStart(); + } + + /** + * Set the start block for this instance + * + * @param index index into the array of BigBlock instances making + * up the the filesystem + */ + public void setStartBlock(final int index) { + _header_block.setPropertyStart(index); + } + + + + /** * Return the number of BigBlock's this instance uses * * @return count of BigBlock instances */ - public int countBlocks() - { + public int countBlocks() { long rawSize = _properties.size() * (long)POIFSConstants.PROPERTY_SIZE; int blkSize = _bigBigBlockSize.getBigBlockSize(); int numBlocks = (int)(rawSize / blkSize); @@ -147,7 +197,7 @@ public final class NPropertyTable extend /** * Writes the properties out into the given low-level stream */ - public void write(NPOIFSStream stream) throws IOException { + public void write(POIFSStream stream) throws IOException { OutputStream os = stream.getOutputStream(); for(Property property : _properties) { if(property != null) { @@ -161,4 +211,47 @@ public final class NPropertyTable extend setStartBlock(stream.getStartBlock()); } } + + private void populatePropertyTree(DirectoryProperty root) throws IOException { + int index = root.getChildIndex(); + + if (!Property.isValidIndex(index)) { + // property has no children + return; + } + + final Stack<Property> children = new Stack<>(); + children.push(_properties.get(index)); + while (!children.empty()) { + Property property = children.pop(); + if (property == null) { + // unknown / unsupported / corrupted property, skip + continue; + } + + root.addChild(property); + if (property.isDirectory()) { + populatePropertyTree(( DirectoryProperty ) property); + } + index = property.getPreviousChildIndex(); + if (isValidIndex(index)) { + children.push(_properties.get(index)); + } + index = property.getNextChildIndex(); + if (isValidIndex(index)) { + children.push(_properties.get(index)); + } + } + } + + private boolean isValidIndex(int index) { + if (! Property.isValidIndex(index)) + return false; + if (index < 0 || index >= _properties.size()) { + _logger.log(POILogger.WARN, "Property index " + index + + "outside the valid range 0.."+_properties.size()); + return false; + } + return true; + } } Modified: poi/trunk/src/java/org/apache/poi/poifs/storage/BATBlock.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/storage/BATBlock.java?rev=1839709&r1=1839708&r2=1839709&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/poifs/storage/BATBlock.java (original) +++ poi/trunk/src/java/org/apache/poi/poifs/storage/BATBlock.java Fri Aug 31 00:25:50 2018 @@ -31,7 +31,13 @@ import org.apache.poi.util.LittleEndian; * A block of block allocation table entries. BATBlocks are created * only through a static factory method: createBATBlocks. */ -public final class BATBlock extends BigBlock { +public final class BATBlock implements BlockWritable { + /** + * Either 512 bytes ({@link POIFSConstants#SMALLER_BIG_BLOCK_SIZE}) + * or 4096 bytes ({@link POIFSConstants#LARGER_BIG_BLOCK_SIZE}) + */ + private POIFSBigBlockSize bigBlockSize; + /** * For a regular fat block, these are 128 / 1024 * next sector values. @@ -55,7 +61,7 @@ public final class BATBlock extends BigB */ private BATBlock(POIFSBigBlockSize bigBlockSize) { - super(bigBlockSize); + this.bigBlockSize = bigBlockSize; int _entries_per_block = bigBlockSize.getBATEntriesPerBlock(); _values = new int[_entries_per_block]; @@ -64,39 +70,14 @@ public final class BATBlock extends BigB Arrays.fill(_values, POIFSConstants.UNUSED_BLOCK); } - /** - * Create a single instance initialized (perhaps partially) with entries - * - * @param entries the array of block allocation table entries - * @param start_index the index of the first entry to be written - * to the block - * @param end_index the index, plus one, of the last entry to be - * written to the block (writing is for all index - * k, start_index <= k < end_index) - */ - - private BATBlock(POIFSBigBlockSize bigBlockSize, final int [] entries, - final int start_index, final int end_index) - { - this(bigBlockSize); - for (int k = start_index; k < end_index; k++) { - _values[k - start_index] = entries[k]; - } - - // Do we have any free sectors? - if(end_index - start_index == _values.length) { - recomputeFree(); - } - } - private void recomputeFree() { boolean hasFree = false; - for(int k=0; k<_values.length; k++) { - if(_values[k] == POIFSConstants.UNUSED_BLOCK) { - hasFree = true; - break; - } - } + for (int _value : _values) { + if (_value == POIFSConstants.UNUSED_BLOCK) { + hasFree = true; + break; + } + } _has_free_sectors = hasFree; } @@ -127,109 +108,13 @@ public final class BATBlock extends BigB public static BATBlock createEmptyBATBlock(final POIFSBigBlockSize bigBlockSize, boolean isXBAT) { BATBlock block = new BATBlock(bigBlockSize); if(isXBAT) { - block.setXBATChain(bigBlockSize, POIFSConstants.END_OF_CHAIN); + final int _entries_per_xbat_block = bigBlockSize.getXBATEntriesPerBlock(); + block._values[ _entries_per_xbat_block ] = POIFSConstants.END_OF_CHAIN; } return block; } /** - * Create an array of BATBlocks from an array of int block - * allocation table entries - * - * @param entries the array of int entries - * - * @return the newly created array of BATBlocks - */ - public static BATBlock [] createBATBlocks(final POIFSBigBlockSize bigBlockSize, final int [] entries) - { - int block_count = calculateStorageRequirements(bigBlockSize, entries.length); - BATBlock[] blocks = new BATBlock[ block_count ]; - int index = 0; - int remaining = entries.length; - - int _entries_per_block = bigBlockSize.getBATEntriesPerBlock(); - for (int j = 0; j < entries.length; j += _entries_per_block) - { - blocks[ index++ ] = new BATBlock(bigBlockSize, entries, j, - (remaining > _entries_per_block) - ? j + _entries_per_block - : entries.length); - remaining -= _entries_per_block; - } - return blocks; - } - - /** - * Create an array of XBATBlocks from an array of int block - * allocation table entries - * - * @param entries the array of int entries - * @param startBlock the start block of the array of XBAT blocks - * - * @return the newly created array of BATBlocks - */ - - public static BATBlock [] createXBATBlocks(final POIFSBigBlockSize bigBlockSize, - final int [] entries, - final int startBlock) - { - int block_count = - calculateXBATStorageRequirements(bigBlockSize, entries.length); - BATBlock[] blocks = new BATBlock[ block_count ]; - int index = 0; - int remaining = entries.length; - - int _entries_per_xbat_block = bigBlockSize.getXBATEntriesPerBlock(); - if (block_count != 0) - { - for (int j = 0; j < entries.length; j += _entries_per_xbat_block) - { - blocks[ index++ ] = - new BATBlock(bigBlockSize, entries, j, - (remaining > _entries_per_xbat_block) - ? j + _entries_per_xbat_block - : entries.length); - remaining -= _entries_per_xbat_block; - } - for (index = 0; index < blocks.length - 1; index++) - { - blocks[ index ].setXBATChain(bigBlockSize, startBlock + index + 1); - } - blocks[ index ].setXBATChain(bigBlockSize, POIFSConstants.END_OF_CHAIN); - } - return blocks; - } - - /** - * Calculate how many BATBlocks are needed to hold a specified - * number of BAT entries. - * - * @param entryCount the number of entries - * - * @return the number of BATBlocks needed - */ - public static int calculateStorageRequirements(final POIFSBigBlockSize bigBlockSize, final int entryCount) - { - int _entries_per_block = bigBlockSize.getBATEntriesPerBlock(); - return (entryCount + _entries_per_block - 1) / _entries_per_block; - } - - /** - * Calculate how many XBATBlocks are needed to hold a specified - * number of BAT entries. - * - * @param entryCount the number of entries - * - * @return the number of XBATBlocks needed - */ - public static int calculateXBATStorageRequirements(final POIFSBigBlockSize bigBlockSize, final int entryCount) - { - int _entries_per_xbat_block = bigBlockSize.getXBATEntriesPerBlock(); - return (entryCount + _entries_per_xbat_block - 1) - / _entries_per_xbat_block; - } - - /** * Calculates the maximum size of a file which is addressable given the * number of FAT (BAT) sectors specified. (We don't care if those BAT * blocks come from the 109 in the header, or from header + XBATS, it @@ -280,19 +165,7 @@ public final class BATBlock extends BigB */ public static BATBlockAndIndex getSBATBlockAndIndex(final int offset, final HeaderBlock header, final List<BATBlock> sbats) { - POIFSBigBlockSize bigBlockSize = header.getBigBlockSize(); - int entriesPerBlock = bigBlockSize.getBATEntriesPerBlock(); - - // SBATs are so much easier, as they're chained streams - int whichSBAT = offset / entriesPerBlock; - int index = offset % entriesPerBlock; - return new BATBlockAndIndex( index, sbats.get(whichSBAT) ); - } - - private void setXBATChain(final POIFSBigBlockSize bigBlockSize, int chainIndex) - { - int _entries_per_xbat_block = bigBlockSize.getXBATEntriesPerBlock(); - _values[ _entries_per_xbat_block ] = chainIndex; + return getBATBlockAndIndex(offset, header, sbats); } /** @@ -354,10 +227,7 @@ public final class BATBlock extends BigB return ourBlockIndex; } - - /* ********** START extension of BigBlock ********** */ - - /** + /** * Write the block's data to an OutputStream * * @param stream the OutputStream to which the stored data should @@ -366,16 +236,13 @@ public final class BATBlock extends BigB * @exception IOException on problems writing to the specified * stream */ - void writeData(final OutputStream stream) - throws IOException - { - // Save it out - stream.write( serialize() ); + + public void writeBlocks(final OutputStream stream) throws IOException { + // Save it out + stream.write( serialize() ); } - - void writeData(final ByteBuffer block) - throws IOException - { + + public void writeData(final ByteBuffer block) { // Save it out block.put( serialize() ); } @@ -384,21 +251,18 @@ public final class BATBlock extends BigB // Create the empty array byte[] data = new byte[ bigBlockSize.getBigBlockSize() ]; - // Fill in the values - int offset = 0; - for(int i=0; i<_values.length; i++) { - LittleEndian.putInt(data, offset, _values[i]); - offset += LittleEndian.INT_SIZE; - } + // Fill in the values + int offset = 0; + for (int _value : _values) { + LittleEndian.putInt(data, offset, _value); + offset += LittleEndian.INT_SIZE; + } // Done return data; } - /* ********** END extension of BigBlock ********** */ - - - public static class BATBlockAndIndex { + public static final class BATBlockAndIndex { private final int index; private final BATBlock block; private BATBlockAndIndex(int index, BATBlock block) { Modified: poi/trunk/src/java/org/apache/poi/poifs/storage/HeaderBlock.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/storage/HeaderBlock.java?rev=1839709&r1=1839708&r2=1839709&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/poifs/storage/HeaderBlock.java (original) +++ poi/trunk/src/java/org/apache/poi/poifs/storage/HeaderBlock.java Fri Aug 31 00:25:50 2018 @@ -214,12 +214,12 @@ public final class HeaderBlock implement byte[] data = new byte[512]; int bsCount = IOUtils.readFully(stream, data); if(bsCount != 512) { - throw alertShortRead(bsCount, 512); + throw alertShortRead(bsCount); } return data; } - private static IOException alertShortRead(int pRead, int expectedReadSize) { + private static IOException alertShortRead(int pRead) { int read; if (pRead < 0) { //Can't have -1 bytes read in the error message! @@ -230,8 +230,7 @@ public final class HeaderBlock implement String type = " byte" + (read == 1 ? (""): ("s")); return new IOException("Unable to read entire header; " - + read + type + " read; expected " - + expectedReadSize + " bytes"); + + read + type + " read; expected 512 bytes"); } /** @@ -372,7 +371,7 @@ public final class HeaderBlock implement * @exception IOException on problems writing to the specified * stream */ - void writeData(final OutputStream stream) throws IOException { + public void writeData(final OutputStream stream) throws IOException { // Update the counts and start positions new IntegerField(_bat_count_offset, _bat_count, _data); new IntegerField(_property_start_offset, _property_start, _data); Modified: poi/trunk/src/java/org/apache/poi/sl/usermodel/SlideShowFactory.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/sl/usermodel/SlideShowFactory.java?rev=1839709&r1=1839708&r2=1839709&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/sl/usermodel/SlideShowFactory.java (original) +++ poi/trunk/src/java/org/apache/poi/sl/usermodel/SlideShowFactory.java Fri Aug 31 00:25:50 2018 @@ -30,7 +30,7 @@ import org.apache.poi.poifs.crypt.Decryp import org.apache.poi.poifs.filesystem.DirectoryNode; import org.apache.poi.poifs.filesystem.DocumentFactoryHelper; import org.apache.poi.poifs.filesystem.FileMagic; -import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.poifs.filesystem.OfficeXmlFileException; import org.apache.poi.util.IOUtils; @@ -38,7 +38,7 @@ public class SlideShowFactory { /** * Creates a SlideShow from the given NPOIFSFileSystem. * - * @param fs The {@link NPOIFSFileSystem} to read the document from + * @param fs The {@link POIFSFileSystem} to read the document from * * @return The created SlideShow * @@ -47,7 +47,7 @@ public class SlideShowFactory { public static < S extends Shape<S,P>, P extends TextParagraph<S,P,? extends TextRun> - > SlideShow<S,P> create(NPOIFSFileSystem fs) throws IOException { + > SlideShow<S,P> create(POIFSFileSystem fs) throws IOException { return create(fs, null); } @@ -55,7 +55,7 @@ public class SlideShowFactory { * Creates a SlideShow from the given NPOIFSFileSystem, which may * be password protected * - * @param fs The {@link NPOIFSFileSystem} to read the document from + * @param fs The {@link POIFSFileSystem} to read the document from * @param password The password that should be used or null if no password is necessary. * * @return The created SlideShow @@ -65,7 +65,7 @@ public class SlideShowFactory { public static < S extends Shape<S,P>, P extends TextParagraph<S,P,? extends TextRun> - > SlideShow<S,P> create(final NPOIFSFileSystem fs, String password) throws IOException { + > SlideShow<S,P> create(final POIFSFileSystem fs, String password) throws IOException { return create(fs.getRoot(), password); } @@ -188,7 +188,7 @@ public class SlideShowFactory { switch (fm) { case OLE2: - NPOIFSFileSystem fs = new NPOIFSFileSystem(is); + POIFSFileSystem fs = new POIFSFileSystem(is); return create(fs, password); case OOXML: return createXSLFSlideShow(is); @@ -264,9 +264,9 @@ public class SlideShowFactory { throw new FileNotFoundException(file.toString()); } - NPOIFSFileSystem fs = null; + POIFSFileSystem fs = null; try { - fs = new NPOIFSFileSystem(file, readOnly); + fs = new POIFSFileSystem(file, readOnly); return create(fs, password); } catch(OfficeXmlFileException e) { IOUtils.closeQuietly(fs); Modified: poi/trunk/src/java/org/apache/poi/ss/usermodel/WorkbookFactory.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/WorkbookFactory.java?rev=1839709&r1=1839708&r2=1839709&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/ss/usermodel/WorkbookFactory.java (original) +++ poi/trunk/src/java/org/apache/poi/ss/usermodel/WorkbookFactory.java Fri Aug 31 00:25:50 2018 @@ -32,7 +32,7 @@ import org.apache.poi.poifs.crypt.Decryp import org.apache.poi.poifs.filesystem.DirectoryNode; import org.apache.poi.poifs.filesystem.DocumentFactoryHelper; import org.apache.poi.poifs.filesystem.FileMagic; -import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.poifs.filesystem.OfficeXmlFileException; import org.apache.poi.util.IOUtils; import org.apache.poi.util.Removal; @@ -49,13 +49,13 @@ public class WorkbookFactory { * Note that in order to properly release resources the * Workbook should be closed after use. * - * @param fs The {@link NPOIFSFileSystem} to read the document from + * @param fs The {@link POIFSFileSystem} to read the document from * * @return The created workbook * * @throws IOException if an error occurs while reading the data */ - public static Workbook create(NPOIFSFileSystem fs) throws IOException { + public static Workbook create(POIFSFileSystem fs) throws IOException { return create(fs, null); } @@ -63,14 +63,14 @@ public class WorkbookFactory { * Creates a Workbook from the given NPOIFSFileSystem, which may * be password protected * - * @param fs The {@link NPOIFSFileSystem} to read the document from + * @param fs The {@link POIFSFileSystem} to read the document from * @param password The password that should be used or null if no password is necessary. * * @return The created Workbook * * @throws IOException if an error occurs while reading the data */ - private static Workbook create(final NPOIFSFileSystem fs, String password) throws IOException { + private static Workbook create(final POIFSFileSystem fs, String password) throws IOException { return create(fs.getRoot(), password); } @@ -208,7 +208,7 @@ public class WorkbookFactory { switch (fm) { case OLE2: - NPOIFSFileSystem fs = new NPOIFSFileSystem(is); + POIFSFileSystem fs = new POIFSFileSystem(is); return create(fs, password); case OOXML: return createXSSFWorkbook(is); @@ -275,9 +275,9 @@ public class WorkbookFactory { throw new FileNotFoundException(file.toString()); } - NPOIFSFileSystem fs = null; + POIFSFileSystem fs = null; try { - fs = new NPOIFSFileSystem(file, readOnly); + fs = new POIFSFileSystem(file, readOnly); return create(fs, password); } catch(OfficeXmlFileException e) { IOUtils.closeQuietly(fs); Modified: poi/trunk/src/java/org/apache/poi/util/DrawingDump.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/util/DrawingDump.java?rev=1839709&r1=1839708&r2=1839709&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/util/DrawingDump.java (original) +++ poi/trunk/src/java/org/apache/poi/util/DrawingDump.java Fri Aug 31 00:25:50 2018 @@ -26,18 +26,20 @@ import java.nio.charset.Charset; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.ss.usermodel.Sheet; /** * Dump out the aggregated escher records */ -public class DrawingDump -{ +public final class DrawingDump { + private DrawingDump() { + } + public static void main( String[] args ) throws IOException { OutputStreamWriter osw = new OutputStreamWriter(System.out, Charset.defaultCharset()); PrintWriter pw = new PrintWriter(osw); - NPOIFSFileSystem fs = new NPOIFSFileSystem(new File(args[0])); + POIFSFileSystem fs = new POIFSFileSystem(new File(args[0])); HSSFWorkbook wb = new HSSFWorkbook(fs); try { pw.println( "Drawing group:" ); Modified: poi/trunk/src/ooxml/java/org/apache/poi/ooxml/extractor/ExtractorFactory.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/ooxml/extractor/ExtractorFactory.java?rev=1839709&r1=1839708&r2=1839709&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/ooxml/extractor/ExtractorFactory.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/ooxml/extractor/ExtractorFactory.java Fri Aug 31 00:25:50 2018 @@ -46,10 +46,9 @@ import org.apache.poi.poifs.filesystem.D import org.apache.poi.poifs.filesystem.DirectoryNode; import org.apache.poi.poifs.filesystem.Entry; import org.apache.poi.poifs.filesystem.FileMagic; -import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.poifs.filesystem.NotOLE2FileException; import org.apache.poi.poifs.filesystem.OfficeXmlFileException; -import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.sl.extractor.SlideShowExtractor; import org.apache.poi.util.IOUtils; import org.apache.poi.util.NotImplemented; @@ -132,9 +131,9 @@ public final class ExtractorFactory { @SuppressWarnings("unchecked") public static <T extends POITextExtractor> T createExtractor(File f) throws IOException, OpenXML4JException, XmlException { - NPOIFSFileSystem fs = null; + POIFSFileSystem fs = null; try { - fs = new NPOIFSFileSystem(f); + fs = new POIFSFileSystem(f); if (fs.getRoot().hasEntry(Decryptor.DEFAULT_POIFS_ENTRY)) { return (T)createEncryptedOOXMLExtractor(fs); } @@ -166,7 +165,7 @@ public final class ExtractorFactory { switch (fm) { case OLE2: - NPOIFSFileSystem fs = new NPOIFSFileSystem(is); + POIFSFileSystem fs = new POIFSFileSystem(is); boolean isEncrypted = fs.getRoot().hasEntry(Decryptor.DEFAULT_POIFS_ENTRY); return isEncrypted ? createEncryptedOOXMLExtractor(fs) : createExtractor(fs); case OOXML: @@ -262,9 +261,6 @@ public final class ExtractorFactory { public static <T extends POITextExtractor> T createExtractor(POIFSFileSystem fs) throws IOException, OpenXML4JException, XmlException { return createExtractor(fs.getRoot()); } - public static <T extends POITextExtractor> T createExtractor(NPOIFSFileSystem fs) throws IOException, OpenXML4JException, XmlException { - return createExtractor(fs.getRoot()); - } @SuppressWarnings("unchecked") public static <T extends POITextExtractor> T createExtractor(DirectoryNode poifsDir) throws IOException, OpenXML4JException, XmlException @@ -408,7 +404,7 @@ public final class ExtractorFactory { throw new IllegalStateException("Not yet supported"); } - private static POITextExtractor createEncryptedOOXMLExtractor(NPOIFSFileSystem fs) + private static POITextExtractor createEncryptedOOXMLExtractor(POIFSFileSystem fs) throws IOException { String pass = Biff8EncryptionKey.getCurrentUserPassword(); if (pass == null) { Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java?rev=1839709&r1=1839708&r2=1839709&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java Fri Aug 31 00:25:50 2018 @@ -1002,7 +1002,7 @@ public class XSSFCellStyle implements Ce @Override public void setFont(Font font) { if(font != null){ - long index = font.getIndex(); + long index = font.getIndexAsInt(); this._cellXf.setFontId(index); this._cellXf.setApplyFont(true); } else { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
